[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.
|