[Gpredict-svn] SF.net SVN: gpredict: [34] trunk/src
Real time satellite tracking and orbit prediction
Status: Beta
Brought to you by:
csete
From: <cs...@us...> - 2008-04-22 20:15:36
|
Revision: 34 http://gpredict.svn.sourceforge.net/gpredict/?rev=34&view=rev Author: csete Date: 2008-04-22 13:15:34 -0700 (Tue, 22 Apr 2008) Log Message: ----------- First fully functional implementation. Modified Paths: -------------- trunk/src/gtk-rot-ctrl.c trunk/src/gtk-rot-ctrl.h Modified: trunk/src/gtk-rot-ctrl.c =================================================================== --- trunk/src/gtk-rot-ctrl.c 2008-04-20 13:28:01 UTC (rev 33) +++ trunk/src/gtk-rot-ctrl.c 2008-04-22 20:15:34 UTC (rev 34) @@ -26,6 +26,7 @@ along with this program; if not, visit http://www.fsf.org/ */ /** \brief ROTOR control. + * \ingroup widgets * * More info... * @@ -34,20 +35,25 @@ */ #include <gtk/gtk.h> #include <glib/gi18n.h> +#include <math.h> #include "gtk-rot-ctrl.h" #ifdef HAVE_CONFIG_H # include <build-config.h> #endif +#define FMTSTR "<span size='xx-large'>%c</span>" + static void gtk_rot_ctrl_class_init (GtkRotCtrlClass *class); static void gtk_rot_ctrl_init (GtkRotCtrl *list); static void gtk_rot_ctrl_destroy (GtkObject *object); static void gtk_rot_ctrl_update (GtkRotCtrl *ctrl); +static void button_clicked_cb (GtkWidget *button, gpointer data); + static GtkHBoxClass *parent_class = NULL; @@ -128,20 +134,162 @@ { GtkWidget *widget; GtkWidget *table; + guint i; - widget = g_object_new (GTK_TYPE_ROT_CTRL, NULL); GTK_ROT_CTRL(widget)->min = min; GTK_ROT_CTRL(widget)->max = max; GTK_ROT_CTRL(widget)->value = val; + /* create table */ + table = gtk_table_new (3, 7, FALSE); + + /* create buttons */ + /* +100 deg */ + GTK_ROT_CTRL(widget)->buttons[0] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[0]), + gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[0]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[0]), + "delta", GINT_TO_POINTER(10000)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[0], + 1, 2, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[0], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* +10 deg */ + GTK_ROT_CTRL(widget)->buttons[1] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[1]), + gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[1]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[1]), + "delta", GINT_TO_POINTER(1000)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[1], + 2, 3, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[1], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* +1 deg */ + GTK_ROT_CTRL(widget)->buttons[2] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[2]), + gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[2]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[2]), + "delta", GINT_TO_POINTER(100)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[2], + 3, 4, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[2], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* +0.1 deg */ + GTK_ROT_CTRL(widget)->buttons[3] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[3]), + gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[3]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[3]), + "delta", GINT_TO_POINTER(10)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[3], + 5, 6, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[3], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* +0.01 deg */ + GTK_ROT_CTRL(widget)->buttons[4] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[4]), + gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[4]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[4]), + "delta", GINT_TO_POINTER(1)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[4], + 6, 7, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[4], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* -100 deg */ + GTK_ROT_CTRL(widget)->buttons[5] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[5]), + gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[5]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[5]), + "delta", GINT_TO_POINTER(-10000)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[5], + 1, 2, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[5], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* -10 deg */ + GTK_ROT_CTRL(widget)->buttons[6] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[6]), + gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[6]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[6]), + "delta", GINT_TO_POINTER(-1000)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[6], + 2, 3, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[6], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* -1 deg */ + GTK_ROT_CTRL(widget)->buttons[7] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[7]), + gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[7]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[7]), + "delta", GINT_TO_POINTER(-100)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[7], + 3, 4, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[7], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* -0.1 deg */ + GTK_ROT_CTRL(widget)->buttons[8] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[8]), + gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[8]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[8]), + "delta", GINT_TO_POINTER(-10)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[8], + 5, 6, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[8], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* -0.01 deg */ + GTK_ROT_CTRL(widget)->buttons[9] = gtk_button_new (); + gtk_container_add (GTK_CONTAINER(GTK_ROT_CTRL(widget)->buttons[9]), + gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE)); + gtk_button_set_relief (GTK_BUTTON(GTK_ROT_CTRL(widget)->buttons[9]), + GTK_RELIEF_NONE); + g_object_set_data (G_OBJECT (GTK_ROT_CTRL(widget)->buttons[9]), + "delta", GINT_TO_POINTER(-1)); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->buttons[9], + 6, 7, 2, 3, GTK_SHRINK, GTK_SHRINK, 0, 0); + g_signal_connect (GTK_ROT_CTRL(widget)->buttons[9], "clicked", + G_CALLBACK (button_clicked_cb), widget); + + /* create labels */ + for (i = 0; i < 7; i++) { + GTK_ROT_CTRL(widget)->digits[i] = gtk_label_new (NULL); + gtk_table_attach (GTK_TABLE (table), GTK_ROT_CTRL(widget)->digits[i], + i, i+1, 1, 2, GTK_SHRINK, GTK_SHRINK, 0, 0); + } + gtk_rot_ctrl_update (GTK_ROT_CTRL(widget)); + + gtk_container_add (GTK_CONTAINER (widget), table); gtk_widget_show_all (widget); - return widget; } @@ -179,11 +327,54 @@ /** \brief Update rotor display widget. - * \param[in] ctrl The rottor control widget. + * \param[in] ctrl The rotor control widget. * */ static void gtk_rot_ctrl_update (GtkRotCtrl *ctrl) { + gchar b[7]; + gchar *buff; + guint i; + g_ascii_formatd (b, 8, "%6.2f", fabs(ctrl->value)); + + /* set label markups */ + for (i = 0; i < 6; i++) { + buff = g_strdup_printf (FMTSTR, b[i]); + gtk_label_set_markup (GTK_LABEL(ctrl->digits[i+1]), buff); + g_free (buff); + } + + if (ctrl->value <= 0) + buff = g_strdup_printf (FMTSTR, '-'); + else + buff = g_strdup_printf (FMTSTR, ' '); + + gtk_label_set_markup (GTK_LABEL(ctrl->digits[0]), buff); + g_free (buff); } + + +/** \brief Button clicked event. + * \param button The button that was clicked. + * \param data Pointer to the GtkRotCtrl widget. + * + */ +static void +button_clicked_cb (GtkWidget *button, gpointer data) +{ + GtkRotCtrl *ctrl = GTK_ROT_CTRL (data); + gfloat delta = GPOINTER_TO_INT(g_object_get_data (G_OBJECT (button), "delta")) / 100.0; + + if ((delta > 0.0) && ((ctrl->value + delta) <= ctrl->max)) { + ctrl->value += delta; + } + else if ((delta < 0.0) && ((ctrl->value + delta) >= ctrl->min)) { + ctrl->value += delta; + } + + gtk_rot_ctrl_update (ctrl); + + g_print ("VAL: %.2f\n", ctrl->value); +} Modified: trunk/src/gtk-rot-ctrl.h =================================================================== --- trunk/src/gtk-rot-ctrl.h 2008-04-20 13:28:01 UTC (rev 33) +++ trunk/src/gtk-rot-ctrl.h 2008-04-22 20:15:34 UTC (rev 34) @@ -60,6 +60,9 @@ struct _gtk_rot_ctrl { GtkVBox vbox; + + GtkWidget *digits[7]; /*!< Labels for the digits */ + GtkWidget *buttons[10]; /*!< Buttons; 0..4 up; 5..9 down */ gfloat min; gfloat max; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |