Thread: [Gpredict-svn] SF.net SVN: gpredict:[556] trunk/src/sat-pref-layout.c
Real time satellite tracking and orbit prediction
Status: Beta
Brought to you by:
csete
From: <cs...@us...> - 2009-12-26 22:58:01
|
Revision: 556 http://gpredict.svn.sourceforge.net/gpredict/?rev=556&view=rev Author: csete Date: 2009-12-26 22:57:52 +0000 (Sat, 26 Dec 2009) Log Message: ----------- Finished implementation of layout configurator. Modified Paths: -------------- trunk/src/sat-pref-layout.c Modified: trunk/src/sat-pref-layout.c =================================================================== --- trunk/src/sat-pref-layout.c 2009-12-26 00:21:15 UTC (rev 555) +++ trunk/src/sat-pref-layout.c 2009-12-26 22:57:52 UTC (rev 556) @@ -11,7 +11,7 @@ More details can be found at the project home page: http://gpredict.oz9aec.net/ - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -48,23 +48,32 @@ /* Text entry for layout string */ static GtkWidget *gridstr; +static gulong gridstr_sigid; +/* layout selector combo */ +static GtkWidget *selector; + +/* layout thumbnail */ +static GtkWidget *thumb; + + /* private functions */ static void create_layout_selector (GKeyFile *cfg, GtkTable *table); -static void layout_selected_cb (GtkToggleButton *but, gpointer data); +static void layout_selected_cb (GtkComboBox *combo, gpointer data); static void create_window_placement (GtkBox *vbox); static void create_reset_button (GKeyFile *cfg, GtkBox *vbox); -static GtkWidget *create_combo (void); -static void combo_changed_cb (GtkComboBox *widget, gpointer data); static void reset_cb (GtkWidget *button, gpointer cfg); static void window_pos_toggle_cb (GtkWidget *toggle, gpointer data); static void layout_code_changed (GtkWidget *widget, gpointer data); +static gchar *thumb_file_from_sel (guint sel); +/** \brief the number of predefined layouts (+1 for custom). */ #define PREDEF_NUM 10 +/** \brief Predefined layouts. */ gchar *predef_layout[PREDEF_NUM][3] = { - { "1;0;2;0;1;2;0;1;1;2;3;1;2;1;2", N_("World map, polar and single sat (default)"), "gpredict-layout-00.png" }, + { "1;0;2;0;1;2;0;1;1;2;3;1;2;1;2", N_("World map, polar and single sat"), "gpredict-layout-00.png" }, { "1;0;2;0;1", N_("World map"), "gpredict-layout-01.png" }, { "1;0;2;0;1", N_("Table"), "gpredict-layout-02.png" }, { "1;0;2;0;2;0;0;2;2;3", N_("World map and table"), "gpredict-layout-03.png" }, @@ -85,44 +94,44 @@ */ GtkWidget *sat_pref_layout_create (GKeyFile *cfg) { - GtkWidget *table; - GtkWidget *vbox; + GtkWidget *table; + GtkWidget *vbox; - /* create the table */ - table = gtk_table_new (8, 5, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), 10); - gtk_table_set_col_spacings (GTK_TABLE (table), 5); + /* create the table */ + table = gtk_table_new (8, 5, FALSE); + gtk_table_set_row_spacings (GTK_TABLE (table), 10); + gtk_table_set_col_spacings (GTK_TABLE (table), 5); - /* layout selector */ - create_layout_selector (cfg, GTK_TABLE (table)); + /* layout selector */ + create_layout_selector (cfg, GTK_TABLE (table)); - /* separator */ - gtk_table_attach (GTK_TABLE (table), - gtk_hseparator_new (), + /* separator */ + gtk_table_attach (GTK_TABLE (table), + gtk_hseparator_new (), 0, 5, 3, 4, - GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); + GTK_FILL | GTK_EXPAND, GTK_SHRINK, 0, 0); - /* create vertical box */ - vbox = gtk_vbox_new (FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 20); - gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); + /* create vertical box */ + vbox = gtk_vbox_new (FALSE, 5); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 20); + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0); - /* window placement */ - if (cfg == NULL) { - create_window_placement (GTK_BOX (vbox)); - } + /* window placement */ + if (cfg == NULL) { + create_window_placement (GTK_BOX (vbox)); + } - /* create RESET button */ - create_reset_button (cfg, GTK_BOX (vbox)); + /* create RESET button */ + create_reset_button (cfg, GTK_BOX (vbox)); - /* reset flags */ - dirty = FALSE; - reset = FALSE; + /* reset flags */ + dirty = FALSE; + reset = FALSE; - return vbox;; + return vbox;; } @@ -136,7 +145,7 @@ gtk_entry_set_text (GTK_ENTRY (gridstr), str); g_free (str); - dirty = FALSE; + dirty = FALSE; } @@ -144,74 +153,61 @@ */ void sat_pref_layout_ok (GKeyFile *cfg) { - if (dirty) { - /* we have new settings */ - if (cfg != NULL) { + if (dirty) { + /* we have new settings */ + if (cfg != NULL) { g_key_file_set_string (cfg, MOD_CFG_GLOBAL_SECTION, MOD_CFG_GRID, gtk_entry_get_text (GTK_ENTRY (gridstr))); - } - else { + } + else { sat_cfg_set_str (SAT_CFG_STR_MODULE_GRID, gtk_entry_get_text (GTK_ENTRY (gridstr))); - sat_cfg_set_bool (SAT_CFG_BOOL_MAIN_WIN_POS, - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mwin))); - sat_cfg_set_bool (SAT_CFG_BOOL_MOD_WIN_POS, - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mod))); + sat_cfg_set_bool (SAT_CFG_BOOL_MAIN_WIN_POS, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mwin))); + sat_cfg_set_bool (SAT_CFG_BOOL_MOD_WIN_POS, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (mod))); sat_cfg_set_bool (SAT_CFG_BOOL_MOD_STATE, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state))); } - } + } - else if (reset) { - /* we have to reset the values to global or default settings */ - if (cfg == NULL) { + else if (reset) { + /* we have to reset the values to global or default settings */ + if (cfg == NULL) { - /* layout */ + /* layout */ sat_cfg_reset_str (SAT_CFG_STR_MODULE_GRID); - /* window placement */ - sat_cfg_reset_bool (SAT_CFG_BOOL_MAIN_WIN_POS); - sat_cfg_reset_bool (SAT_CFG_BOOL_MOD_WIN_POS); + /* window placement */ + sat_cfg_reset_bool (SAT_CFG_BOOL_MAIN_WIN_POS); + sat_cfg_reset_bool (SAT_CFG_BOOL_MOD_WIN_POS); sat_cfg_reset_bool (SAT_CFG_BOOL_MOD_STATE); } - else { + else { g_key_file_remove_key ((GKeyFile *)(cfg), MOD_CFG_GLOBAL_SECTION, MOD_CFG_GRID, NULL); - } + } - } - dirty = FALSE; - reset = FALSE; + } + dirty = FALSE; + reset = FALSE; } /** \brief Create layout selector. */ static void create_layout_selector (GKeyFile *cfg, GtkTable *table) { - GtkWidget *label; + GtkWidget *label; gchar *buffer; - GtkWidget *image; - gchar *fname; + gchar *thumbfile; + guint i,sel=PREDEF_NUM-1; - /* create header */ - label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_label_set_markup (GTK_LABEL (label), - _("<b>Select Layout:</b>")); - gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1, - GTK_FILL, GTK_SHRINK, 0, 0); - - /* layout string */ - label = gtk_label_new (_("Layout code:")); - gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, - GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 0); - + /* get the current settings */ if (cfg != NULL) { buffer = mod_cfg_get_str (cfg, MOD_CFG_GLOBAL_SECTION, @@ -222,6 +218,49 @@ buffer = sat_cfg_get_str (SAT_CFG_STR_MODULE_GRID); } + /* create header */ + label = gtk_label_new (_("Select layout:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, + GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 0); + + /* layout selector */ + selector = gtk_combo_box_new_text (); + gtk_table_attach (GTK_TABLE (table), selector, 1, 3, 0, 1, + GTK_FILL, GTK_SHRINK, 0, 0); + + for (i = 0; i < PREDEF_NUM; i++) { + /* append default layout string to combo box */ + gtk_combo_box_append_text (GTK_COMBO_BOX (selector), predef_layout[i][1]); + + /* check if this layout corresponds to the settings */ + if (!g_ascii_strcasecmp (buffer, predef_layout[i][0])) { + sel = i; + } + } + + /* select settings */ + gtk_combo_box_set_active (GTK_COMBO_BOX (selector), sel); + + /* connect signal handler */ + g_signal_connect (selector, "changed", G_CALLBACK (layout_selected_cb), NULL); + + + /* layout preview thumbnail */ + thumbfile = thumb_file_from_sel (sel); + thumb = gtk_image_new_from_file (thumbfile); + g_free (thumbfile); + gtk_table_attach (GTK_TABLE (table), thumb, 1, 3, 1, 2, + GTK_EXPAND, GTK_EXPAND, 0, 5); + + + /* layout string */ + label = gtk_label_new (_("Layout code:")); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, + GTK_SHRINK | GTK_FILL, GTK_EXPAND | GTK_FILL, 5, 0); + + gridstr = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (gridstr), buffer); g_free (buffer); @@ -231,24 +270,79 @@ "Consult the user manual for how to create custom layouts "\ "using layout codes.")); + /* disable if it is a predefined layout */ + if (sel < PREDEF_NUM-1) { + gtk_widget_set_sensitive (gridstr, FALSE); + } + /* connect changed signal handler */ - g_signal_connect (gridstr, "changed", G_CALLBACK (layout_code_changed), NULL); + gridstr_sigid = g_signal_connect (gridstr, "changed", G_CALLBACK (layout_code_changed), NULL); - gtk_table_attach_defaults (GTK_TABLE (table), gridstr, 1, 2, 2, 3); + gtk_table_attach_defaults (GTK_TABLE (table), gridstr, 1, 4, 2, 3); } -/** \brief Callback to manage radio button clicks. + +/** \brief Get thumbnail icon filename from selection ID. + * \param sel The ID of the predefined layout or PREDEF_NUM-1 for custom. + * \return A newly allocated string containing the full path of the icon. + * + * This function generates an icon file name from the ID of a predefined + * layout. PREDEF_NUM-1 corresponds to the last entry in predef_layout[][], + * which is the custom layout. The returned string should be freed when no + * longer needed. + * + * The function checks that sel is within valid range (0...PREDEF_NUM-1). If + * sel is outside the range, the custom layout icon is returned. + */ +static gchar *thumb_file_from_sel (guint sel) +{ + gchar *fname; + + if (sel < PREDEF_NUM) { + fname = icon_file_name (predef_layout[sel][2]); + } + else { + fname = icon_file_name (predef_layout[PREDEF_NUM-1][2]); + } + + return fname; +} + + +/** \brief Callback to manage layout selection via combo box. * - * This function is called when the user makes a new layout selection, - * i.e. a radio button is clicked. The function is called for both the - * newly selected radio button and the de-selected radio button. It must - * therefore check whether the button is currently active or not + * This function is called when the user selects a new layout using the + * layout selector combo box. The function updates the thumbnail and the + * layout code text entry. */ -static void layout_selected_cb (GtkToggleButton *but, gpointer data) +static void layout_selected_cb (GtkComboBox *combo, gpointer data) { + gint idx; + gchar *icon; + + idx = gtk_combo_box_get_active (combo); + if (idx < PREDEF_NUM) { + dirty = TRUE; + + /* update icon */ + icon = thumb_file_from_sel (idx); + gtk_image_set_from_file (GTK_IMAGE (thumb), icon); + g_free (icon); + + /* update layout code, unless Custom is selected */ + if (idx < PREDEF_NUM-1) { + g_signal_handler_block (gridstr, gridstr_sigid); + gtk_entry_set_text (GTK_ENTRY (gridstr), predef_layout[idx][0]); + g_signal_handler_unblock (gridstr, gridstr_sigid); + gtk_widget_set_sensitive (gridstr, FALSE); + } + else { + gtk_widget_set_sensitive (gridstr, TRUE); + } + } } @@ -260,46 +354,46 @@ */ static void create_window_placement (GtkBox *vbox) { - GtkWidget *label; - GtkTooltips *tips; + GtkWidget *label; + GtkTooltips *tips; - /* create header */ - label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_label_set_markup (GTK_LABEL (label), - _("<b>Window Placements:</b>")); - gtk_box_pack_start (vbox, label, FALSE, FALSE, 0); + /* create header */ + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_label_set_markup (GTK_LABEL (label), + _("<b>Window Placements:</b>")); + gtk_box_pack_start (vbox, label, FALSE, FALSE, 0); - /* main window setting */ - mwin = gtk_check_button_new_with_label (_("Restore position of main window")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mwin), - sat_cfg_get_bool (SAT_CFG_BOOL_MAIN_WIN_POS)); - tips = gtk_tooltips_new (); - gtk_tooltips_set_tip (tips, mwin, - _("If you check this button, gpredict will try to "\ - "place the main window at the position it was "\ - "during the last session.\n"\ - "Note that window managers can ignore this request."), - NULL); - g_signal_connect (G_OBJECT (mwin), "toggled", - G_CALLBACK (window_pos_toggle_cb), NULL); - gtk_box_pack_start (vbox, mwin, FALSE, FALSE, 0); + /* main window setting */ + mwin = gtk_check_button_new_with_label (_("Restore position of main window")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mwin), + sat_cfg_get_bool (SAT_CFG_BOOL_MAIN_WIN_POS)); + tips = gtk_tooltips_new (); + gtk_tooltips_set_tip (tips, mwin, + _("If you check this button, gpredict will try to "\ + "place the main window at the position it was "\ + "during the last session.\n"\ + "Note that window managers can ignore this request."), + NULL); + g_signal_connect (G_OBJECT (mwin), "toggled", + G_CALLBACK (window_pos_toggle_cb), NULL); + gtk_box_pack_start (vbox, mwin, FALSE, FALSE, 0); - /* module window setting */ - mod = gtk_check_button_new_with_label (_("Restore position of module windows")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mod), - sat_cfg_get_bool (SAT_CFG_BOOL_MOD_WIN_POS)); - tips = gtk_tooltips_new (); - gtk_tooltips_set_tip (tips, mod, - _("If you check this button, gpredict will try to "\ - "place the module windows at the position they were "\ - "the last time.\n"\ - "Note that window managers can ignore this request."), - NULL); - g_signal_connect (G_OBJECT (mod), "toggled", - G_CALLBACK (window_pos_toggle_cb), NULL); - gtk_box_pack_start (vbox, mod, FALSE, FALSE, 0); + /* module window setting */ + mod = gtk_check_button_new_with_label (_("Restore position of module windows")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mod), + sat_cfg_get_bool (SAT_CFG_BOOL_MOD_WIN_POS)); + tips = gtk_tooltips_new (); + gtk_tooltips_set_tip (tips, mod, + _("If you check this button, gpredict will try to "\ + "place the module windows at the position they were "\ + "the last time.\n"\ + "Note that window managers can ignore this request."), + NULL); + g_signal_connect (G_OBJECT (mod), "toggled", + G_CALLBACK (window_pos_toggle_cb), NULL); + gtk_box_pack_start (vbox, mod, FALSE, FALSE, 0); /* module state */ state = gtk_check_button_new_with_label (_("Restore the state of modules when reopened (docked or window)")); @@ -325,32 +419,32 @@ */ static void create_reset_button (GKeyFile *cfg, GtkBox *vbox) { - GtkWidget *button; - GtkWidget *butbox; - GtkTooltips *tips; + GtkWidget *button; + GtkWidget *butbox; + GtkTooltips *tips; - button = gtk_button_new_with_label (_("Reset")); - g_signal_connect (G_OBJECT (button), "clicked", - G_CALLBACK (reset_cb), cfg); + button = gtk_button_new_with_label (_("Reset")); + g_signal_connect (G_OBJECT (button), "clicked", + G_CALLBACK (reset_cb), cfg); - tips = gtk_tooltips_new (); - if (cfg == NULL) { - gtk_tooltips_set_tip (tips, button, - _("Reset settings to the default values."), - NULL); - } - else { - gtk_tooltips_set_tip (tips, button, - _("Reset module settings to the global values."), - NULL); - } + tips = gtk_tooltips_new (); + if (cfg == NULL) { + gtk_tooltips_set_tip (tips, button, + _("Reset settings to the default values."), + NULL); + } + else { + gtk_tooltips_set_tip (tips, button, + _("Reset module settings to the global values."), + NULL); + } - butbox = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX (butbox), GTK_BUTTONBOX_END); - gtk_box_pack_end (GTK_BOX (butbox), button, FALSE, TRUE, 10); + butbox = gtk_hbutton_box_new (); + gtk_button_box_set_layout (GTK_BUTTON_BOX (butbox), GTK_BUTTONBOX_END); + gtk_box_pack_end (GTK_BOX (butbox), button, FALSE, TRUE, 10); - gtk_box_pack_end (vbox, butbox, FALSE, TRUE, 0); + gtk_box_pack_end (vbox, butbox, FALSE, TRUE, 0); } @@ -366,38 +460,47 @@ */ static void reset_cb (GtkWidget *button, gpointer cfg) { - gint idx; + guint i,sel=PREDEF_NUM-1; gchar *buffer; - /* views */ - if (cfg == NULL) { - /* global mode, get defaults */ + /* views */ + if (cfg == NULL) { + /* global mode, get defaults */ buffer = sat_cfg_get_str_def (SAT_CFG_STR_MODULE_GRID); gtk_entry_set_text (GTK_ENTRY (gridstr), buffer); - g_free (buffer); - } - else { - /* local mode, get global value */ + } + else { + /* local mode, get global value */ buffer = sat_cfg_get_str (SAT_CFG_STR_MODULE_GRID); gtk_entry_set_text (GTK_ENTRY (gridstr), buffer); - g_free (buffer); - } + } - /* window placement settings */ - if (cfg == NULL) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mwin), - sat_cfg_get_bool_def (SAT_CFG_BOOL_MAIN_WIN_POS)); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mod), - sat_cfg_get_bool_def (SAT_CFG_BOOL_MOD_WIN_POS)); + /* findcombo box setting */ + for (i = 0; i < PREDEF_NUM; i++) { + /* check if this layout corresponds to the settings */ + if (!g_ascii_strcasecmp (buffer, predef_layout[i][0])) { + sel = i; + } + } + gtk_combo_box_set_active (GTK_COMBO_BOX(selector),sel); + g_free (buffer); + + + /* window placement settings */ + if (cfg == NULL) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mwin), + sat_cfg_get_bool_def (SAT_CFG_BOOL_MAIN_WIN_POS)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mod), + sat_cfg_get_bool_def (SAT_CFG_BOOL_MOD_WIN_POS)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state), sat_cfg_get_bool_def (SAT_CFG_BOOL_MOD_STATE)); } - /* reset flags */ - reset = TRUE; - dirty = FALSE; + /* reset flags */ + reset = TRUE; + dirty = FALSE; } @@ -406,7 +509,7 @@ /** \brief Toggle window positioning settings. */ static void window_pos_toggle_cb (GtkWidget *toggle, gpointer data) { - dirty = TRUE; + dirty = TRUE; } /** \brief Manage layout code changes. @@ -432,6 +535,10 @@ case '0' ... '9': case ';': dirty = TRUE; + /* ensure combo box is set to custom */ + if (gtk_combo_box_get_active (GTK_COMBO_BOX(selector)) != PREDEF_NUM-1) { + gtk_combo_box_set_active (GTK_COMBO_BOX(selector), PREDEF_NUM-1); + } break; default: gdk_beep (); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cs...@us...> - 2009-12-30 20:29:45
|
Revision: 568 http://gpredict.svn.sourceforge.net/gpredict/?rev=568&view=rev Author: csete Date: 2009-12-30 20:29:36 +0000 (Wed, 30 Dec 2009) Log Message: ----------- Fixed a bug in the predefined layouts table. Modified Paths: -------------- trunk/src/sat-pref-layout.c Modified: trunk/src/sat-pref-layout.c =================================================================== --- trunk/src/sat-pref-layout.c 2009-12-30 18:45:18 UTC (rev 567) +++ trunk/src/sat-pref-layout.c 2009-12-30 20:29:36 UTC (rev 568) @@ -75,7 +75,7 @@ gchar *predef_layout[PREDEF_NUM][3] = { { "1;0;2;0;1;2;0;1;1;2;3;1;2;1;2", N_("World map, polar and single sat"), "gpredict-layout-00.png" }, { "1;0;2;0;1", N_("World map"), "gpredict-layout-01.png" }, - { "1;0;2;0;1", N_("Table"), "gpredict-layout-02.png" }, + { "0;0;2;0;1", N_("Table"), "gpredict-layout-02.png" }, { "1;0;2;0;2;0;0;2;2;3", N_("World map and table"), "gpredict-layout-03.png" }, { "2;0;1;0;1;3;1;2;0;1", N_("Polar and single sat"), "gpredict-layout-04.png" }, { "2;0;1;0;1;4;1;2;0;1", N_("Polar and upcoming passes"), "gpredict-layout-05.png" }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |