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