[Gpredict-svn] SF.net SVN: gpredict:[810] trunk
Real time satellite tracking and orbit prediction
Status: Beta
Brought to you by:
csete
From: <cs...@us...> - 2011-04-03 14:41:31
|
Revision: 810 http://gpredict.svn.sourceforge.net/gpredict/?rev=810&view=rev Author: csete Date: 2011-04-03 14:41:24 +0000 (Sun, 03 Apr 2011) Log Message: ----------- Allow changing radio frequency and rotator position using mouse buttons and wheel (feature req 2130926). Up/down arrows are kept for now. Modified Paths: -------------- trunk/ChangeLog trunk/src/gtk-freq-knob.c trunk/src/gtk-freq-knob.h trunk/src/gtk-rot-knob.c trunk/src/gtk-rot-knob.h Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2011-04-03 13:21:00 UTC (rev 809) +++ trunk/ChangeLog 2011-04-03 14:41:24 UTC (rev 810) @@ -1,3 +1,13 @@ +2011-04-03 Alexandru Csete <oz9aec at gmail.com> + + * src/gtk-rot-knob.c + * src/gtk-rot-knob.h + * src/gtk-freq-knob.c + * src/gtk-freq-knob.h + Allow changing radio frequency and rotator position using mouse buttons + and wheel (feature req 2130926). Up/down arrows are kept for now. + + 2011-04-01 Charles Suprin <hamaa1vs at gmail.com> * win32/gpredict.rc @@ -5,6 +15,7 @@ * win32/build-config.h Apply Alan Moffet's changes for win32 build. + 2011-04-01 Alexandru Csete <oz9aec at gmail.com> * src/pass-to-txt.c @@ -30,6 +41,7 @@ * src/gtk-sat-selector.c Remove strverscmp reference. + 2011-03-27 Charles Suprin <hamaa1vs at gmail.com> * src/gtk-azel-plot.c Modified: trunk/src/gtk-freq-knob.c =================================================================== --- trunk/src/gtk-freq-knob.c 2011-04-03 13:21:00 UTC (rev 809) +++ trunk/src/gtk-freq-knob.c 2011-04-03 14:41:24 UTC (rev 810) @@ -49,7 +49,10 @@ static void gtk_freq_knob_destroy (GtkObject *object); static void gtk_freq_knob_update (GtkFreqKnob *knob); static void button_clicked_cb (GtkWidget *button, gpointer data); +static gboolean on_button_press (GtkWidget *digit, GdkEventButton *event, gpointer data); +static gboolean on_button_scroll (GtkWidget *digit, GdkEventScroll *event, gpointer data); + static GtkHBoxClass *parent_class = NULL; #define FMTSTR "<span size='xx-large'>%c</span>" @@ -164,7 +167,7 @@ gint delta; - widget = g_object_new (GTK_TYPE_FREQ_KNOB, NULL); + widget = g_object_new (GTK_TYPE_FREQ_KNOB, NULL); GTK_FREQ_KNOB(widget)->value = val; @@ -174,10 +177,32 @@ for (i = 0; i < 10; i++) { /* labels */ GTK_FREQ_KNOB(widget)->digits[i] = gtk_label_new (NULL); - gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->digits[i], - idx[i], idx[i]+1, 1, 2, GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0); - - if (buttons) { + + if (!buttons) { + /* passive display widget without event boxes or buttons */ + gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->digits[i], + idx[i], idx[i]+1, 1, 2, GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0); + } + else { + /* active widget that allows changing the value */ + + gtk_widget_set_tooltip_text(GTK_FREQ_KNOB(widget)->digits[i], + _("Use mouse buttons and wheel to change value")); + + /* Event boxes for catching mouse evetns */ + GTK_FREQ_KNOB(widget)->evtbox[i] = gtk_event_box_new (); + g_object_set_data(G_OBJECT(GTK_FREQ_KNOB(widget)->evtbox[i]), "index", GUINT_TO_POINTER(i)); + gtk_container_add(GTK_CONTAINER(GTK_FREQ_KNOB(widget)->evtbox[i]), + GTK_FREQ_KNOB(widget)->digits[i]); + gtk_table_attach (GTK_TABLE (table), GTK_FREQ_KNOB(widget)->evtbox[i], + idx[i], idx[i]+1, 1, 2, GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0); + + g_signal_connect (GTK_FREQ_KNOB(widget)->evtbox[i], "button_press_event", + (GtkSignalFunc) on_button_press, widget); + g_signal_connect (GTK_FREQ_KNOB(widget)->evtbox[i], "scroll_event", + (GtkSignalFunc) on_button_scroll, widget); + + /* UP buttons */ GTK_FREQ_KNOB(widget)->buttons[i] = gtk_button_new (); @@ -232,12 +257,12 @@ gtk_container_add (GTK_CONTAINER (widget), table); gtk_widget_show_all (widget); - return widget; + return widget; } /** \brief Set the value of the frequency control widget. - * \param[in] knob THe frequency control widget. + * \param[in] knob The frequency control widget. * \param[in] val The new value. * */ @@ -316,3 +341,138 @@ g_signal_emit (G_OBJECT (data), freq_changed_signal, 0); } + +/** \brief Manage button press events + * \param digit Pointer to the event box that received the event + * \param event Pointer to the GdkEventButton that contains details for te event + * \param data Pointer to the GtkFreqKnob widget (we need it to update the value) + * \return Always TRUE to prevent further propagation of the event + * + * This function is called when a mouse button is pressed on a digit. This is used + * to increment or decrement the value: + * - Left button: up + * - Right button: down + * - Middle button: set digit to 0 (TBC) + * + * Wheel up/down are managed in a separate callback since these are treated as scroll events + * rather than button press events (they used to be button press events though) + * + * The digit labels are stored in an array. To get the amount of change corresponding to the + * clicked label we can convert the index (attached to the evtbox): delta = 10^(9-index) + * + * Whether the delta is positive or negative depends on which mouse button triggered the event. + */ +static gboolean on_button_press (GtkWidget *evtbox, + GdkEventButton *event, + gpointer data) +{ + GtkFreqKnob *knob = GTK_FREQ_KNOB(data); + guint idx = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (evtbox), "index")); + gdouble delta = pow(10, 9-idx); + gdouble value; + + + if (delta < 1.0) { + /* no change */ + return TRUE; + } + + if (event->type != GDK_BUTTON_PRESS) { + /* wrong event (not possible?) */ + return TRUE; + } + + + switch (event->button) { + + /* left button */ + case 1: + value = gtk_freq_knob_get_value(knob) + delta; + gtk_freq_knob_set_value(knob, value); + g_signal_emit(G_OBJECT (data), freq_changed_signal, 0); + break; + + /* middle button */ + case 2: + break; + + /* right button */ + case 3: + value = gtk_freq_knob_get_value(knob) - delta; + gtk_freq_knob_set_value(knob, value); + g_signal_emit(G_OBJECT (data), freq_changed_signal, 0); + break; + + default: + break; + } + + + return TRUE; +} + +/** \brief Manage scroll wheel events + * \param digit Pointer to the event box that received the event + * \param event Pointer to the GdkEventScroll that contains details for te event + * \param data Pointer to the GtkFreqKnob widget (we need it to update the value) + * \return Always TRUE to prevent further propagation of the event + * + * This function is called when the mouse wheel is moved up or down. This is used to increment + * or decrement the value. + * + * Button presses are managed in a separate callback since these are treated as different + * events. + * + * The digit labels are stored in an array. To get the amount of change corresponding to the + * clicked label we can convert the index (attached to the evtbox): delta = 10^(9-index) + * + * Whether the delta is positive or negative depends on the scroll direction. + */ +static gboolean on_button_scroll (GtkWidget *evtbox, + GdkEventScroll *event, + gpointer data) +{ + GtkFreqKnob *knob = GTK_FREQ_KNOB(data); + guint idx = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (evtbox), "index")); + gdouble delta = pow(10, 9-idx); + gdouble value; + + + if (delta < 0.01) { + /* no change, user clicked on sign or decimal separator */ + return TRUE; + } + + if (event->type != GDK_SCROLL) { + /* wrong event (not possible?) */ + return TRUE; + } + + + switch (event->direction) { + + /* decrease value by delta */ + case GDK_SCROLL_DOWN: + case GDK_SCROLL_LEFT: + value = gtk_freq_knob_get_value(knob) - delta; + gtk_freq_knob_set_value(knob, value); + g_signal_emit(G_OBJECT (data), freq_changed_signal, 0); + break; + + /* increase value by delta */ + case GDK_SCROLL_UP: + case GDK_SCROLL_RIGHT: + value = gtk_freq_knob_get_value(knob) + delta; + gtk_freq_knob_set_value(knob, value); + g_signal_emit(G_OBJECT (data), freq_changed_signal, 0); + break; + + default: + break; + } + + + return TRUE; +} + + Modified: trunk/src/gtk-freq-knob.h =================================================================== --- trunk/src/gtk-freq-knob.h 2011-04-03 13:21:00 UTC (rev 809) +++ trunk/src/gtk-freq-knob.h 2011-04-03 14:41:24 UTC (rev 810) @@ -62,6 +62,7 @@ GtkVBox vbox; GtkWidget *digits[10]; /*!< Labels for the digits */ + GtkWidget *evtbox[10]; /*!< Event boxes to catch mouse events over the digits */ GtkWidget *buttons[20]; /*!< Buttons; 0..9 up; 10..19 down */ gdouble min; Modified: trunk/src/gtk-rot-knob.c =================================================================== --- trunk/src/gtk-rot-knob.c 2011-04-03 13:21:00 UTC (rev 809) +++ trunk/src/gtk-rot-knob.c 2011-04-03 14:41:24 UTC (rev 810) @@ -52,13 +52,15 @@ static void gtk_rot_knob_update (GtkRotKnob *knob); static void button_clicked_cb (GtkWidget *button, gpointer data); +static gboolean on_button_press (GtkWidget *digit, GdkEventButton *event, gpointer data); +static gboolean on_button_scroll (GtkWidget *digit, GdkEventScroll *event, gpointer data); - static GtkHBoxClass *parent_class = NULL; +/** \brief Convert digit index (in the digit array) to amount of change. */ +const gdouble INDEX_TO_DELTA[] = {0.0, 100.0, 10.0, 1.0, 0.0, 0.1, 0.01}; - GType gtk_rot_knob_get_type () @@ -145,10 +147,10 @@ GTK_ROT_KNOB(widget)->min = min; GTK_ROT_KNOB(widget)->max = max; GTK_ROT_KNOB(widget)->value = val; - + /* create table */ table = gtk_table_new (3, 8, FALSE); - + /* create buttons */ /* +100 deg */ GTK_ROT_KNOB(widget)->buttons[0] = gtk_button_new (); @@ -282,9 +284,23 @@ /* create labels */ for (i = 0; i < 7; i++) { + /* labels showing the digits */ GTK_ROT_KNOB(widget)->digits[i] = gtk_label_new (NULL); - gtk_table_attach (GTK_TABLE (table), GTK_ROT_KNOB(widget)->digits[i], + gtk_widget_set_tooltip_text(GTK_ROT_KNOB(widget)->digits[i], + _("Use mouse buttons and wheel to change value")); + + /* Event boxes for catching mouse evetns */ + GTK_ROT_KNOB(widget)->evtbox[i] = gtk_event_box_new (); + g_object_set_data(G_OBJECT(GTK_ROT_KNOB(widget)->evtbox[i]), "index", GUINT_TO_POINTER(i)); + gtk_container_add(GTK_CONTAINER(GTK_ROT_KNOB(widget)->evtbox[i]), GTK_ROT_KNOB(widget)->digits[i]); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_KNOB(widget)->evtbox[i], i, i+1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); + + g_signal_connect (GTK_ROT_KNOB(widget)->evtbox[i], "button_press_event", + (GtkSignalFunc) on_button_press, widget); + g_signal_connect (GTK_ROT_KNOB(widget)->evtbox[i], "scroll_event", + (GtkSignalFunc) on_button_scroll, widget); + } /* degree sign */ @@ -296,10 +312,9 @@ gtk_rot_knob_update (GTK_ROT_KNOB(widget)); gtk_container_add (GTK_CONTAINER (widget), table); - gtk_widget_show_all (widget); + gtk_widget_show_all (widget); - - return widget; + return widget; } @@ -474,3 +489,130 @@ } +/** \brief Manage button press events + * \param digit Pointer to the event box that received the event + * \param event Pointer to the GdkEventButton that contains details for te event + * \param data Pointer to the GtkRotKnob widget (we need it to update the value) + * \return Always TRUE to prevent further propagation of the event + * + * This function is called when a mouse button is pressed on a digit. This is used + * to increment or decrement the value: + * - Left button: up + * - Right button: down + * - Middle button: set digit to 0 (TBC) + * + * Wheel up/down are managed in a separate callback since these are treated as scroll events + * rather than button press events (they used to be button press events though) + * + * The digit labels are stored in an array that also contains the sign and the + * decimal separator. To get the amount of change corresponding to the clicked label we + * can use the INDEX_TO_DELTA[] array. The index to this table is attached to the evtbox. + * Whether the delta is positive or negative depends on which mouse button triggered the event. + */ +static gboolean on_button_press (GtkWidget *evtbox, + GdkEventButton *event, + gpointer data) +{ + GtkRotKnob *knob = GTK_ROT_KNOB(data); + guint idx = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (evtbox), "index")); + gdouble delta = INDEX_TO_DELTA[idx]; + gdouble value; + + if (delta < 0.01) { + /* no change, user clicked on sign or decimal separator */ + return TRUE; + } + + if (event->type != GDK_BUTTON_PRESS) { + /* wrong event (not possible?) */ + return TRUE; + } + + + switch (event->button) { + + /* left button */ + case 1: + value = gtk_rot_knob_get_value(knob) + delta; + gtk_rot_knob_set_value(knob, value); + break; + + /* middle button */ + case 2: + break; + + /* right button */ + case 3: + value = gtk_rot_knob_get_value(knob) - delta; + gtk_rot_knob_set_value(knob, value); + break; + + default: + break; + } + + + return TRUE; +} + +/** \brief Manage scroll wheel events + * \param digit Pointer to the event box that received the event + * \param event Pointer to the GdkEventScroll that contains details for te event + * \param data Pointer to the GtkRotKnob widget (we need it to update the value) + * \return Always TRUE to prevent further propagation of the event + * + * This function is called when the mouse wheel is moved up or down. This is used to increment + * or decrement the value. + * + * Button presses are managed in a separate callback since these are treated as different + * events. + * + * The digit labels are stored in an array that also contains the sign and the + * decimal separator. To get the amount of change corresponding to the clicked label we + * can use the INDEX_TO_DELTA[] array. The index is attached to the evtbox. + * Whether the delta is positive or negative depends on the scroll direction. + */ +static gboolean on_button_scroll (GtkWidget *evtbox, + GdkEventScroll *event, + gpointer data) +{ + GtkRotKnob *knob = GTK_ROT_KNOB(data); + guint idx = GPOINTER_TO_UINT(g_object_get_data (G_OBJECT (evtbox), "index")); + gdouble delta = INDEX_TO_DELTA[idx]; + gdouble value; + + if (delta < 0.01) { + /* no change, user clicked on sign or decimal separator */ + return TRUE; + } + + if (event->type != GDK_SCROLL) { + /* wrong event (not possible?) */ + return TRUE; + } + + + switch (event->direction) { + + /* decrease value by delta */ + case GDK_SCROLL_DOWN: + case GDK_SCROLL_LEFT: + value = gtk_rot_knob_get_value(knob) - delta; + gtk_rot_knob_set_value(knob, value); + break; + + /* increase value by delta */ + case GDK_SCROLL_UP: + case GDK_SCROLL_RIGHT: + value = gtk_rot_knob_get_value(knob) + delta; + gtk_rot_knob_set_value(knob, value); + break; + + default: + break; + } + + + return TRUE; +} + Modified: trunk/src/gtk-rot-knob.h =================================================================== --- trunk/src/gtk-rot-knob.h 2011-04-03 13:21:00 UTC (rev 809) +++ trunk/src/gtk-rot-knob.h 2011-04-03 14:41:24 UTC (rev 810) @@ -59,9 +59,10 @@ struct _gtk_rot_knob { - GtkVBox vbox; + GtkVBox vbox; GtkWidget *digits[7]; /*!< Labels for the digits */ + GtkWidget *evtbox[7]; /*!< Event boxes to catch mouse events over the digits */ GtkWidget *buttons[10]; /*!< Buttons; 0..4 up; 5..9 down */ gdouble min; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |