1 /*
2     Gpredict: Real-time satellite tracking and orbit prediction program
3 
4     Copyright (C)  2001-2017  Alexandru Csete, OZ9AEC
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, visit http://www.fsf.org/
18 */
19 #ifdef HAVE_CONFIG_H
20 #include <build-config.h>
21 #endif
22 #include <glib/gi18n.h>
23 #include <gtk/gtk.h>
24 
25 #include "config-keys.h"
26 #include "gpredict-utils.h"
27 #include "gtk-polar-view.h"
28 #include "mod-cfg-get-param.h"
29 #include "sat-cfg.h"
30 #include "sat-log.h"
31 #include "sat-pref-polar-view.h"
32 
33 /* orientation selectors */
34 static GtkWidget *nesw, *nwse, *senw, *swne;
35 
36 /* content selectors */
37 static GtkWidget *qth, *next, *curs, *xtick;
38 
39 /* colour selectors */
40 static GtkWidget *bgd, *axis, *tick, *sat, *ssat, *track, *info;
41 
42 /* Misc */
43 static GtkWidget *showtrack;
44 
45 /* misc bookkeeping */
46 static gint     orient = POLAR_VIEW_NESW;
47 static gboolean dirty = FALSE;
48 static gboolean reset = FALSE;
49 
50 
51 /**
52  * Manage orientation changes.
53  *
54  * @param but the button that received the signal
55  * @param data User data (always NULL).
56  *
57  * Note that this function is called also for the button that is unchecked,
58  *
59  */
orient_chganged(GtkToggleButton * but,gpointer data)60 static void orient_chganged(GtkToggleButton * but, gpointer data)
61 {
62     if (gtk_toggle_button_get_active(but))
63     {
64         orient = GPOINTER_TO_INT(data);
65         dirty = TRUE;
66     }
67 }
68 
69 /**
70  * Manage check-box actions.
71  *
72  * @param but The check-button that has been toggled.
73  * @param daya User data (always NULL).
74  *
75  * We don't need to do anything but set the dirty flag since the values can
76  * always be obtained from the global widgets.
77  */
content_changed(GtkToggleButton * but,gpointer data)78 static void content_changed(GtkToggleButton * but, gpointer data)
79 {
80     (void)but;
81     (void)data;
82 
83     dirty = TRUE;
84 }
85 
86 /**
87  * Manage color and font changes.
88  *
89  * @param but The color/font picker button that received the signal.
90  * @param data User data (always NULL).
91  *
92  * We don't need to do anything but set the dirty flag since the values can
93  * always be obtained from the global widgets.
94  */
colour_changed(GtkWidget * but,gpointer data)95 static void colour_changed(GtkWidget * but, gpointer data)
96 {
97     (void)but;
98     (void)data;
99 
100     dirty = TRUE;
101 }
102 
103 /**
104  * Manage RESET button signals.
105  *
106  * @param button The RESET button.
107  * @param cfg Pointer to the module configuration or NULL in global mode.
108  *
109  * This function is called when the user clicks on the RESET button. In global mode
110  * (when cfg = NULL) the function will reset the settings to the efault values, while
111  * in "local" mode (when cfg != NULL) the function will reset the module settings to
112  * the global settings. This is done by removing the corresponding key from the GKeyFile.
113  */
reset_cb(GtkWidget * button,gpointer cfg)114 static void reset_cb(GtkWidget * button, gpointer cfg)
115 {
116     guint           cfg_rgba;   /* 0xRRGGBBAA encoded color */
117     GdkRGBA         gdk_rgba;
118 
119     (void)button;
120 
121     if (cfg == NULL)
122     {
123         /* global mode, get defaults */
124 
125         /* extra contents */
126         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
127                                      sat_cfg_get_bool_def
128                                      (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
129         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
130                                      sat_cfg_get_bool_def
131                                      (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
132         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
133                                      sat_cfg_get_bool_def
134                                      (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
135         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
136                                      sat_cfg_get_bool_def
137                                      (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
138 
139         /* colours */
140         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_BGD_COL);
141         rgba_from_cfg(cfg_rgba, &gdk_rgba);
142         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
143 
144         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_AXIS_COL);
145         rgba_from_cfg(cfg_rgba, &gdk_rgba);
146         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
147 
148         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_TICK_COL);
149         rgba_from_cfg(cfg_rgba, &gdk_rgba);
150         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
151 
152         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_SAT_COL);
153         rgba_from_cfg(cfg_rgba, &gdk_rgba);
154         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
155 
156         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_SAT_SEL_COL);
157         rgba_from_cfg(cfg_rgba, &gdk_rgba);
158         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
159 
160         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_TRACK_COL);
161         rgba_from_cfg(cfg_rgba, &gdk_rgba);
162         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
163 
164         cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_INFO_COL);
165         rgba_from_cfg(cfg_rgba, &gdk_rgba);
166         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
167 
168         /* misc */
169         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
170                                      sat_cfg_get_bool_def
171                                      (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
172     }
173     else
174     {
175         /* local mode, get global value */
176 
177         /* extra contents */
178         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
179                                      sat_cfg_get_bool
180                                      (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
181         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
182                                      sat_cfg_get_bool
183                                      (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
184         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
185                                      sat_cfg_get_bool
186                                      (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
187         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
188                                      sat_cfg_get_bool
189                                      (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
190 
191         /* colours */
192         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_BGD_COL);
193         rgba_from_cfg(cfg_rgba, &gdk_rgba);
194         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
195 
196         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_AXIS_COL);
197         rgba_from_cfg(cfg_rgba, &gdk_rgba);
198         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
199 
200         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TICK_COL);
201         rgba_from_cfg(cfg_rgba, &gdk_rgba);
202         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
203 
204         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_COL);
205         rgba_from_cfg(cfg_rgba, &gdk_rgba);
206         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
207 
208         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
209         rgba_from_cfg(cfg_rgba, &gdk_rgba);
210         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
211 
212         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TRACK_COL);
213         rgba_from_cfg(cfg_rgba, &gdk_rgba);
214         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
215 
216         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_INFO_COL);
217         rgba_from_cfg(cfg_rgba, &gdk_rgba);
218         gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
219 
220         /* misc */
221         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
222                                      sat_cfg_get_bool
223                                      (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
224     }
225 
226     /* orientation needs some special attention */
227     if (cfg == NULL)
228     {
229         orient = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_ORIENTATION);
230     }
231     else
232     {
233         orient = sat_cfg_get_int(SAT_CFG_INT_POLAR_ORIENTATION);
234     }
235 
236     switch (orient)
237     {
238 
239     case POLAR_VIEW_NESW:
240         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
241         break;
242 
243     case POLAR_VIEW_NWSE:
244         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nwse), TRUE);
245         break;
246 
247     case POLAR_VIEW_SENW:
248         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(senw), TRUE);
249         break;
250 
251     case POLAR_VIEW_SWNE:
252         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(swne), TRUE);
253         break;
254 
255     default:
256         sat_log_log(SAT_LOG_LEVEL_ERROR,
257                     _("%s:%s: Invalid chart orientation %d (using N/E/S/W)"),
258                     __FILE__, __func__, orient);
259         orient = POLAR_VIEW_NESW;
260         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
261         break;
262     }
263 
264     /* reset flags */
265     reset = TRUE;
266     dirty = FALSE;
267 }
268 
269 
270 /**
271  * Create orientation chooser.
272  *
273  * @param cfg The module configuration or NULL in global mode.
274  * @param vbox The container box in which the widgets should be packed into.
275  *
276  * The orientation selector consists of a radio-group having four radio
277  * buttons: N/E/S/W, N/W/S/E, S/E/N/W, and S/W/N/E
278  */
create_orient_selector(GKeyFile * cfg,GtkBox * vbox)279 static void create_orient_selector(GKeyFile * cfg, GtkBox * vbox)
280 {
281     GtkWidget      *label;
282     GtkWidget      *hbox;
283 
284     /* create header */
285     label = gtk_label_new(NULL);
286     g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
287     gtk_label_set_markup(GTK_LABEL(label), _("<b>Orientation:</b>"));
288     gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
289 
290     /* horizontal box to contain the radio buttons */
291     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
292     gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
293     gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
294 
295     /* N/E/S/W */
296     nesw = gtk_radio_button_new_with_label(NULL, _("N/E/S/W"));
297     gtk_box_pack_start(GTK_BOX(hbox), nesw, FALSE, TRUE, 0);
298     gtk_widget_set_tooltip_text(nesw, _("\tN\n" "W\t\tE\n" "\tS"));
299 
300     /* N/W/S/E */
301     nwse =
302         gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
303                                                     _("N/W/S/E"));
304     gtk_box_pack_start(GTK_BOX(hbox), nwse, FALSE, TRUE, 0);
305     gtk_widget_set_tooltip_text(nwse, _("\tN\n" "E\t\tW\n" "\tS"));
306     /* S/E/N/W */
307     senw =
308         gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
309                                                     _("S/E/N/W"));
310     gtk_box_pack_start(GTK_BOX(hbox), senw, FALSE, TRUE, 0);
311     gtk_widget_set_tooltip_text(senw, _("\tS\n" "W\t\tE\n" "\tN"));
312 
313     /* S/W/N/E */
314     swne =
315         gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
316                                                     _("S/W/N/E"));
317     gtk_box_pack_start(GTK_BOX(hbox), swne, FALSE, TRUE, 0);
318     gtk_widget_set_tooltip_text(swne, _("\tS\n" "E\t\tW\n" "\tN"));
319 
320     /* read orientation */
321     if (cfg != NULL)
322     {
323         orient = mod_cfg_get_int(cfg,
324                                  MOD_CFG_POLAR_SECTION,
325                                  MOD_CFG_POLAR_ORIENTATION,
326                                  SAT_CFG_INT_POLAR_ORIENTATION);
327     }
328     else
329     {
330         sat_cfg_get_int(SAT_CFG_INT_POLAR_ORIENTATION);
331     }
332 
333     switch (orient)
334     {
335 
336     case POLAR_VIEW_NESW:
337         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
338         break;
339 
340     case POLAR_VIEW_NWSE:
341         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nwse), TRUE);
342         break;
343 
344     case POLAR_VIEW_SENW:
345         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(senw), TRUE);
346         break;
347 
348     case POLAR_VIEW_SWNE:
349         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(swne), TRUE);
350         break;
351 
352     default:
353         sat_log_log(SAT_LOG_LEVEL_ERROR,
354                     _("%f:%d: Invalid PolarView orientation (%d)"),
355                     __FILE__, __LINE__, orient);
356         orient = POLAR_VIEW_NESW;
357         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
358         break;
359     }
360 
361     /* finally, connect the signals */
362     g_signal_connect(nesw, "toggled",
363                      G_CALLBACK(orient_chganged),
364                      GINT_TO_POINTER(POLAR_VIEW_NESW));
365     g_signal_connect(nwse, "toggled",
366                      G_CALLBACK(orient_chganged),
367                      GINT_TO_POINTER(POLAR_VIEW_NWSE));
368     g_signal_connect(senw, "toggled",
369                      G_CALLBACK(orient_chganged),
370                      GINT_TO_POINTER(POLAR_VIEW_SENW));
371     g_signal_connect(swne, "toggled",
372                      G_CALLBACK(orient_chganged),
373                      GINT_TO_POINTER(POLAR_VIEW_SWNE));
374 }
375 
376 /**
377  * Create content selector widgets.
378  * @param cfg The module configuration or NULL in global mode.
379  * @param vbox The container box in which the widgets should be packed into.
380  *
381  * This function creates the widgets that are used to select what content, besides
382  * the satellites, should be drawn on the polar view. Choices are QTH info, next
383  * event, cursor coordinates, and extra tick marks.
384  */
create_bool_selectors(GKeyFile * cfg,GtkBox * vbox)385 static void create_bool_selectors(GKeyFile * cfg, GtkBox * vbox)
386 {
387     GtkWidget      *label;
388     GtkWidget      *hbox;
389 
390     /* create header */
391     label = gtk_label_new(NULL);
392     g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
393     gtk_label_set_markup(GTK_LABEL(label), _("<b>Extra Contents:</b>"));
394     gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
395 
396     /* horizontal box to contain the radio buttons */
397     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
398     gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
399     gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
400 
401     /* QTH info */
402     qth = gtk_check_button_new_with_label(_("QTH Info"));
403     gtk_widget_set_tooltip_text(qth,
404                                 _
405                                 ("Show location information on the polar plot"));
406     if (cfg != NULL)
407     {
408         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
409                                      mod_cfg_get_bool(cfg,
410                                                       MOD_CFG_POLAR_SECTION,
411                                                       MOD_CFG_POLAR_SHOW_QTH_INFO,
412                                                       SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
413     }
414     else
415     {
416         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
417                                      sat_cfg_get_bool
418                                      (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
419     }
420     g_signal_connect(qth, "toggled", G_CALLBACK(content_changed), NULL);
421     gtk_box_pack_start(GTK_BOX(hbox), qth, FALSE, TRUE, 0);
422 
423     /* Next Event */
424     next = gtk_check_button_new_with_label(_("Next Event"));
425     gtk_widget_set_tooltip_text(next,
426                                 _
427                                 ("Show which satellites comes up next and at what time"));
428     if (cfg != NULL)
429     {
430         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
431                                      mod_cfg_get_bool(cfg,
432                                                       MOD_CFG_POLAR_SECTION,
433                                                       MOD_CFG_POLAR_SHOW_NEXT_EVENT,
434                                                       SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
435     }
436     else
437     {
438         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
439                                      sat_cfg_get_bool
440                                      (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
441     }
442     g_signal_connect(next, "toggled", G_CALLBACK(content_changed), NULL);
443     gtk_box_pack_start(GTK_BOX(hbox), next, FALSE, TRUE, 0);
444 
445     /* Cursor position */
446     curs = gtk_check_button_new_with_label(_("Cursor Position"));
447     gtk_widget_set_tooltip_text(curs,
448                                 _
449                                 ("Show the azimuth and elevation of the mouse pointer"));
450     if (cfg != NULL)
451     {
452         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
453                                      mod_cfg_get_bool(cfg,
454                                                       MOD_CFG_POLAR_SECTION,
455                                                       MOD_CFG_POLAR_SHOW_CURS_TRACK,
456                                                       SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
457     }
458     else
459     {
460         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
461                                      sat_cfg_get_bool
462                                      (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
463     }
464     g_signal_connect(curs, "toggled", G_CALLBACK(content_changed), NULL);
465     gtk_box_pack_start(GTK_BOX(hbox), curs, FALSE, TRUE, 0);
466 
467     /* Extra tick marks */
468     xtick = gtk_check_button_new_with_label(_("Extra Az Ticks"));
469     gtk_widget_set_tooltip_text(xtick,
470                                 _
471                                 ("Show extra tick marks for every 30\302\260"));
472     if (cfg != NULL)
473     {
474         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
475                                      mod_cfg_get_bool(cfg,
476                                                       MOD_CFG_POLAR_SECTION,
477                                                       MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS,
478                                                       SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
479     }
480     else
481     {
482         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
483                                      sat_cfg_get_bool
484                                      (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
485     }
486     g_signal_connect(xtick, "toggled", G_CALLBACK(content_changed), NULL);
487     gtk_box_pack_start(GTK_BOX(hbox), xtick, FALSE, TRUE, 0);
488 }
489 
490 /**
491  * Create color selector widgets.
492  *
493  * @param cfg The module configuration or NULL in global mode.
494  * @param vbox The container box in which the widgets should be packed into.
495  *
496  * This function creates the widgets for selecting colours for the plot background,
497  * axes, tick labels, satellites, track, and info text.
498  */
create_colour_selectors(GKeyFile * cfg,GtkBox * vbox)499 static void create_colour_selectors(GKeyFile * cfg, GtkBox * vbox)
500 {
501     GtkWidget      *label;
502     GtkWidget      *table;
503     guint           cfg_rgba;   /* 0xRRGGBBAA encoded color */
504     GdkRGBA         gdk_rgba;
505 
506     /* create header */
507     label = gtk_label_new(NULL);
508     g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
509     gtk_label_set_markup(GTK_LABEL(label), _("<b>Colours:</b>"));
510     gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
511 
512     table = gtk_grid_new();
513     gtk_grid_set_column_homogeneous(GTK_GRID(table), FALSE);
514     gtk_grid_set_row_homogeneous(GTK_GRID(table), TRUE);
515     gtk_grid_set_column_spacing(GTK_GRID(table), 10);
516     gtk_grid_set_row_spacing(GTK_GRID(table), 3);
517     gtk_box_pack_start(vbox, table, FALSE, TRUE, 0);
518 
519     /* background */
520     label = gtk_label_new(_("Background:"));
521     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
522     gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
523     bgd = gtk_color_button_new();
524     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(bgd), TRUE);
525     gtk_grid_attach(GTK_GRID(table), bgd, 1, 0, 1, 1);
526     gtk_widget_set_tooltip_text(bgd, _("Click to select background colour"));
527     if (cfg != NULL)
528     {
529         cfg_rgba = mod_cfg_get_int(cfg,
530                                    MOD_CFG_POLAR_SECTION,
531                                    MOD_CFG_POLAR_BGD_COL,
532                                    SAT_CFG_INT_POLAR_BGD_COL);
533     }
534     else
535     {
536         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_BGD_COL);
537     }
538     rgba_from_cfg(cfg_rgba, &gdk_rgba);
539     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
540     g_signal_connect(bgd, "color-set", G_CALLBACK(colour_changed), NULL);
541 
542     /* Axis */
543     label = gtk_label_new(_("Axes/Circles:"));
544     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
545     gtk_grid_attach(GTK_GRID(table), label, 2, 0, 1, 1);
546     axis = gtk_color_button_new();
547     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(axis), TRUE);
548     gtk_grid_attach(GTK_GRID(table), axis, 3, 0, 1, 1);
549     gtk_widget_set_tooltip_text(axis, _("Click to select the axis colour"));
550     if (cfg != NULL)
551     {
552         cfg_rgba = mod_cfg_get_int(cfg,
553                                    MOD_CFG_POLAR_SECTION,
554                                    MOD_CFG_POLAR_AXIS_COL,
555                                    SAT_CFG_INT_POLAR_AXIS_COL);
556     }
557     else
558     {
559         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_AXIS_COL);
560     }
561     rgba_from_cfg(cfg_rgba, &gdk_rgba);
562     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
563     g_signal_connect(axis, "color-set", G_CALLBACK(colour_changed), NULL);
564 
565     /* tick labels */
566     label = gtk_label_new(_("Tick Labels:"));
567     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
568     gtk_grid_attach(GTK_GRID(table), label, 4, 0, 1, 1);
569     tick = gtk_color_button_new();
570     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(tick), TRUE);
571     gtk_grid_attach(GTK_GRID(table), tick, 5, 0, 1, 1);
572     gtk_widget_set_tooltip_text(tick,
573                                 _
574                                 ("Click to select the colour for tick labels"));
575     if (cfg != NULL)
576     {
577         cfg_rgba = mod_cfg_get_int(cfg,
578                                    MOD_CFG_POLAR_SECTION,
579                                    MOD_CFG_POLAR_TICK_COL,
580                                    SAT_CFG_INT_POLAR_TICK_COL);
581     }
582     else
583     {
584         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TICK_COL);
585     }
586     rgba_from_cfg(cfg_rgba, &gdk_rgba);
587     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
588     g_signal_connect(tick, "color-set", G_CALLBACK(colour_changed), NULL);
589 
590     /* satellite */
591     label = gtk_label_new(_("Satellite:"));
592     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
593     gtk_grid_attach(GTK_GRID(table), label, 0, 1, 1, 1);
594     sat = gtk_color_button_new();
595     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(sat), TRUE);
596     gtk_grid_attach(GTK_GRID(table), sat, 1, 1, 1, 1);
597     gtk_widget_set_tooltip_text(sat, _("Click to select satellite colour"));
598     if (cfg != NULL)
599     {
600         cfg_rgba = mod_cfg_get_int(cfg,
601                                    MOD_CFG_POLAR_SECTION,
602                                    MOD_CFG_POLAR_SAT_COL,
603                                    SAT_CFG_INT_POLAR_SAT_COL);
604     }
605     else
606     {
607         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_COL);
608     }
609     rgba_from_cfg(cfg_rgba, &gdk_rgba);
610     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
611     g_signal_connect(sat, "color-set", G_CALLBACK(colour_changed), NULL);
612 
613     /* selected satellite */
614     label = gtk_label_new(_("Selected Sat.:"));
615     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
616     gtk_grid_attach(GTK_GRID(table), label, 2, 1, 1, 1);
617     ssat = gtk_color_button_new();
618     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(ssat), TRUE);
619     gtk_grid_attach(GTK_GRID(table), ssat, 3, 1, 1, 1);
620     gtk_widget_set_tooltip_text(ssat,
621                                 _
622                                 ("Click to select colour for selected satellites"));
623     if (cfg != NULL)
624     {
625         cfg_rgba = mod_cfg_get_int(cfg,
626                                    MOD_CFG_POLAR_SECTION,
627                                    MOD_CFG_POLAR_SAT_SEL_COL,
628                                    SAT_CFG_INT_POLAR_SAT_SEL_COL);
629     }
630     else
631     {
632         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
633     }
634     rgba_from_cfg(cfg_rgba, &gdk_rgba);
635     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
636     g_signal_connect(ssat, "color-set", G_CALLBACK(colour_changed), NULL);
637 
638     /* track */
639     label = gtk_label_new(_("Sky Track:"));
640     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
641     gtk_grid_attach(GTK_GRID(table), label, 4, 1, 1, 1);
642     track = gtk_color_button_new();
643     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(track), TRUE);
644     gtk_grid_attach(GTK_GRID(table), track, 5, 1, 1, 1);
645     gtk_widget_set_tooltip_text(track, _("Click to select track colour"));
646     if (cfg != NULL)
647     {
648         cfg_rgba = mod_cfg_get_int(cfg,
649                                    MOD_CFG_POLAR_SECTION,
650                                    MOD_CFG_POLAR_TRACK_COL,
651                                    SAT_CFG_INT_POLAR_TRACK_COL);
652     }
653     else
654     {
655         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TRACK_COL);
656     }
657     rgba_from_cfg(cfg_rgba, &gdk_rgba);
658     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
659     g_signal_connect(track, "color-set", G_CALLBACK(colour_changed), NULL);
660 
661     /* Info */
662     label = gtk_label_new(_("Info Text:"));
663     g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
664     gtk_grid_attach(GTK_GRID(table), label, 0, 2, 1, 1);
665     info = gtk_color_button_new();
666     gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(info), TRUE);
667     gtk_grid_attach(GTK_GRID(table), info, 1, 2, 1, 1);
668     gtk_widget_set_tooltip_text(info, _("Click to select background colour"));
669     if (cfg != NULL)
670     {
671         cfg_rgba = mod_cfg_get_int(cfg,
672                                    MOD_CFG_POLAR_SECTION,
673                                    MOD_CFG_POLAR_INFO_COL,
674                                    SAT_CFG_INT_POLAR_INFO_COL);
675     }
676     else
677     {
678         cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_INFO_COL);
679     }
680     rgba_from_cfg(cfg_rgba, &gdk_rgba);
681     gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
682     g_signal_connect(info, "color-set", G_CALLBACK(colour_changed), NULL);
683 }
684 
685 /**
686  * Create miscellaneous config widgets.
687  * @param cfg The module configuration or NULL in global mode.
688  * @param vbox The container box in which the widgets should be packed into.
689  *
690  */
create_misc_selectors(GKeyFile * cfg,GtkBox * vbox)691 static void create_misc_selectors(GKeyFile * cfg, GtkBox * vbox)
692 {
693     GtkWidget      *label;
694     GtkWidget      *hbox;
695 
696     /* create header */
697     label = gtk_label_new(NULL);
698     g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
699     gtk_label_set_markup(GTK_LABEL(label), _("<b>Miscellaneous:</b>"));
700     gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
701 
702     /* horizontal box to contain the radio buttons */
703     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
704     gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
705     gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
706 
707     /* show sky tracks */
708     showtrack = gtk_check_button_new_with_label(_("Show the sky tracks "
709                                                   "automatically"));
710     gtk_widget_set_tooltip_text(showtrack,
711                                 _("Automatically show the sky track of a "
712                                   "satellite when it comes in range. You can always turn the "
713                                   "sky track OFF for each individual object"));
714     if (cfg != NULL)
715     {
716         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
717                                      mod_cfg_get_bool(cfg,
718                                                       MOD_CFG_POLAR_SECTION,
719                                                       MOD_CFG_POLAR_SHOW_TRACK_AUTO,
720                                                       SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
721     }
722     else
723     {
724         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
725                                      sat_cfg_get_bool
726                                      (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
727     }
728     g_signal_connect(showtrack, "toggled", G_CALLBACK(content_changed), NULL);
729     gtk_box_pack_start(GTK_BOX(hbox), showtrack, FALSE, TRUE, 0);
730 }
731 
732 /**
733  * Create RESET button.
734  * @param cfg Config data or NULL in global mode.
735  * @param vbox The container.
736  *
737  * This function creates and sets up the RESET button.
738  */
create_reset_button(GKeyFile * cfg,GtkBox * vbox)739 static void create_reset_button(GKeyFile * cfg, GtkBox * vbox)
740 {
741     GtkWidget      *button;
742     GtkWidget      *butbox;
743 
744     button = gtk_button_new_with_label(_("Reset"));
745     g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_cb), cfg);
746 
747     if (cfg == NULL)
748     {
749         gtk_widget_set_tooltip_text(button,
750                                     _
751                                     ("Reset settings to the default values."));
752 
753     }
754     else
755     {
756         gtk_widget_set_tooltip_text(button,
757                                     _
758                                     ("Reset module settings to the global values."));
759     }
760 
761     butbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
762     gtk_button_box_set_layout(GTK_BUTTON_BOX(butbox), GTK_BUTTONBOX_END);
763     gtk_box_pack_end(GTK_BOX(butbox), button, FALSE, TRUE, 10);
764 
765     gtk_box_pack_end(vbox, butbox, FALSE, TRUE, 0);
766 }
767 
768 /* User pressed cancel. Any changes to config must be cancelled. */
sat_pref_polar_view_cancel(GKeyFile * cfg)769 void sat_pref_polar_view_cancel(GKeyFile * cfg)
770 {
771     (void)cfg;
772 
773     dirty = FALSE;
774 }
775 
776 /* User pressed OK. Any changes should be stored in config. */
sat_pref_polar_view_ok(GKeyFile * cfg)777 void sat_pref_polar_view_ok(GKeyFile * cfg)
778 {
779     GdkRGBA         gdk_rgba;
780     guint           rgba;
781 
782     if (dirty)
783     {
784         if (cfg != NULL)
785         {
786             /* use g_key_file_set_xxx */
787 
788             /* orientation */
789             g_key_file_set_integer(cfg,
790                                    MOD_CFG_POLAR_SECTION,
791                                    MOD_CFG_POLAR_ORIENTATION, orient);
792             /* extra contents */
793             g_key_file_set_boolean(cfg,
794                                    MOD_CFG_POLAR_SECTION,
795                                    MOD_CFG_POLAR_SHOW_QTH_INFO,
796                                    gtk_toggle_button_get_active
797                                    (GTK_TOGGLE_BUTTON(qth)));
798             g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
799                                    MOD_CFG_POLAR_SHOW_NEXT_EVENT,
800                                    gtk_toggle_button_get_active
801                                    (GTK_TOGGLE_BUTTON(next)));
802             g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
803                                    MOD_CFG_POLAR_SHOW_CURS_TRACK,
804                                    gtk_toggle_button_get_active
805                                    (GTK_TOGGLE_BUTTON(curs)));
806             g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
807                                    MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS,
808                                    gtk_toggle_button_get_active
809                                    (GTK_TOGGLE_BUTTON(xtick)));
810 
811             /* colours */
812             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
813             rgba = rgba_to_cfg(&gdk_rgba);
814             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
815                                    MOD_CFG_POLAR_BGD_COL, rgba);
816 
817             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
818             rgba = rgba_to_cfg(&gdk_rgba);
819             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
820                                    MOD_CFG_POLAR_AXIS_COL, rgba);
821 
822             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
823             rgba = rgba_to_cfg(&gdk_rgba);
824             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
825                                    MOD_CFG_POLAR_TICK_COL, rgba);
826 
827             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
828             rgba = rgba_to_cfg(&gdk_rgba);
829             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
830                                    MOD_CFG_POLAR_SAT_COL, rgba);
831 
832             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
833             rgba = rgba_to_cfg(&gdk_rgba);
834             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
835                                    MOD_CFG_POLAR_SAT_SEL_COL, rgba);
836 
837             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
838             rgba = rgba_to_cfg(&gdk_rgba);
839             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
840                                    MOD_CFG_POLAR_INFO_COL, rgba);
841 
842             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
843             rgba = rgba_to_cfg(&gdk_rgba);
844             g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
845                                    MOD_CFG_POLAR_TRACK_COL, rgba);
846 
847             /* misc */
848             g_key_file_set_boolean(cfg,
849                                    MOD_CFG_POLAR_SECTION,
850                                    MOD_CFG_POLAR_SHOW_TRACK_AUTO,
851                                    gtk_toggle_button_get_active
852                                    (GTK_TOGGLE_BUTTON(showtrack)));
853 
854         }
855         else
856         {
857             /* use sat_cfg_set_xxx */
858 
859             /* orientation */
860             sat_cfg_set_int(SAT_CFG_INT_POLAR_ORIENTATION, orient);
861 
862             /* extra contents */
863             sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_QTH_INFO,
864                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
865                                                           (qth)));
866             sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_NEXT_EV,
867                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
868                                                           (next)));
869             sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_CURS_TRACK,
870                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
871                                                           (curs)));
872             sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS,
873                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
874                                                           (xtick)));
875 
876             /* colours */
877             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
878             rgba = rgba_to_cfg(&gdk_rgba);
879             sat_cfg_set_int(SAT_CFG_INT_POLAR_BGD_COL, rgba);
880 
881             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
882             rgba = rgba_to_cfg(&gdk_rgba);
883             sat_cfg_set_int(SAT_CFG_INT_POLAR_AXIS_COL, rgba);
884 
885             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
886             rgba = rgba_to_cfg(&gdk_rgba);
887             sat_cfg_set_int(SAT_CFG_INT_POLAR_TICK_COL, rgba);
888 
889             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
890             rgba = rgba_to_cfg(&gdk_rgba);
891             sat_cfg_set_int(SAT_CFG_INT_POLAR_SAT_COL, rgba);
892 
893             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
894             rgba = rgba_to_cfg(&gdk_rgba);
895             sat_cfg_set_int(SAT_CFG_INT_POLAR_SAT_SEL_COL, rgba);
896 
897             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
898             rgba = rgba_to_cfg(&gdk_rgba);
899             sat_cfg_set_int(SAT_CFG_INT_POLAR_INFO_COL, rgba);
900 
901             gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
902             rgba = rgba_to_cfg(&gdk_rgba);
903             sat_cfg_set_int(SAT_CFG_INT_POLAR_TRACK_COL, rgba);
904 
905             /* misc */
906             sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO,
907                              gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
908                                                           (showtrack)));
909         }
910 
911         dirty = FALSE;
912     }
913     else if (reset)
914     {
915         if (cfg != NULL)
916         {
917             /* use g_key_file_remove_key */
918             g_key_file_remove_key(cfg,
919                                   MOD_CFG_POLAR_SECTION,
920                                   MOD_CFG_POLAR_ORIENTATION, NULL);
921             g_key_file_remove_key(cfg,
922                                   MOD_CFG_POLAR_SECTION,
923                                   MOD_CFG_POLAR_SHOW_QTH_INFO, NULL);
924             g_key_file_remove_key(cfg,
925                                   MOD_CFG_POLAR_SECTION,
926                                   MOD_CFG_POLAR_SHOW_NEXT_EVENT, NULL);
927             g_key_file_remove_key(cfg,
928                                   MOD_CFG_POLAR_SECTION,
929                                   MOD_CFG_POLAR_SHOW_CURS_TRACK, NULL);
930             g_key_file_remove_key(cfg,
931                                   MOD_CFG_POLAR_SECTION,
932                                   MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS, NULL);
933             g_key_file_remove_key(cfg,
934                                   MOD_CFG_POLAR_SECTION,
935                                   MOD_CFG_POLAR_BGD_COL, NULL);
936             g_key_file_remove_key(cfg,
937                                   MOD_CFG_POLAR_SECTION,
938                                   MOD_CFG_POLAR_AXIS_COL, NULL);
939             g_key_file_remove_key(cfg,
940                                   MOD_CFG_POLAR_SECTION,
941                                   MOD_CFG_POLAR_TICK_COL, NULL);
942             g_key_file_remove_key(cfg,
943                                   MOD_CFG_POLAR_SECTION,
944                                   MOD_CFG_POLAR_SAT_COL, NULL);
945             g_key_file_remove_key(cfg,
946                                   MOD_CFG_POLAR_SECTION,
947                                   MOD_CFG_POLAR_SAT_SEL_COL, NULL);
948             g_key_file_remove_key(cfg,
949                                   MOD_CFG_POLAR_SECTION,
950                                   MOD_CFG_POLAR_INFO_COL, NULL);
951             g_key_file_remove_key(cfg,
952                                   MOD_CFG_POLAR_SECTION,
953                                   MOD_CFG_POLAR_TRACK_COL, NULL);
954             g_key_file_remove_key(cfg,
955                                   MOD_CFG_POLAR_SECTION,
956                                   MOD_CFG_POLAR_SHOW_TRACK_AUTO, NULL);
957         }
958         else
959         {
960 
961             /* use sat_cfg_reset_xxx */
962             /* orientation */
963             sat_cfg_reset_int(SAT_CFG_INT_POLAR_ORIENTATION);
964             /* extra contents */
965             sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_QTH_INFO);
966             sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_NEXT_EV);
967             sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_CURS_TRACK);
968             sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS);
969 
970             /* colours */
971             sat_cfg_reset_int(SAT_CFG_INT_POLAR_BGD_COL);
972             sat_cfg_reset_int(SAT_CFG_INT_POLAR_AXIS_COL);
973             sat_cfg_reset_int(SAT_CFG_INT_POLAR_TICK_COL);
974             sat_cfg_reset_int(SAT_CFG_INT_POLAR_SAT_COL);
975             sat_cfg_reset_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
976             sat_cfg_reset_int(SAT_CFG_INT_POLAR_INFO_COL);
977             sat_cfg_reset_int(SAT_CFG_INT_POLAR_TRACK_COL);
978 
979             /* misc */
980             sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO);
981         }
982         reset = FALSE;
983     }
984 }
985 
986 /*
987  * Create and initialise widgets for the polar view preferences tab.
988  *
989  * The widgets must be preloaded with values from config. If a config value
990  * is NULL, sensible default values, eg. those from defaults.h should
991  * be laoded.
992  */
sat_pref_polar_view_create(GKeyFile * cfg)993 GtkWidget      *sat_pref_polar_view_create(GKeyFile * cfg)
994 {
995     GtkWidget      *vbox;
996 
997     /* create vertical box */
998     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
999     gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
1000     gtk_container_set_border_width(GTK_CONTAINER(vbox), 20);
1001 
1002     /* create the components */
1003     create_orient_selector(cfg, GTK_BOX(vbox));
1004     gtk_box_pack_start(GTK_BOX(vbox),
1005                        gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1006                        FALSE, TRUE, 10);
1007     create_bool_selectors(cfg, GTK_BOX(vbox));
1008     gtk_box_pack_start(GTK_BOX(vbox),
1009                        gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1010                        FALSE, TRUE, 10);
1011     create_colour_selectors(cfg, GTK_BOX(vbox));
1012     gtk_box_pack_start(GTK_BOX(vbox),
1013                        gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1014                        FALSE, TRUE, 10);
1015     create_misc_selectors(cfg, GTK_BOX(vbox));
1016     gtk_box_pack_start(GTK_BOX(vbox),
1017                        gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1018                        FALSE, TRUE, 10);
1019     create_reset_button(cfg, GTK_BOX(vbox));
1020 
1021     reset = FALSE;
1022     dirty = FALSE;
1023 
1024     return vbox;
1025 }
1026