/ src / sat-pref-formats.c
sat-pref-formats.c
  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  #include <time.h>
 25  
 26  #include "sat-cfg.h"
 27  #include "sat-pref-formats.h"
 28  #include "sat-pref-qth.h"
 29  
 30  /* *INDENT-OFF* */
 31  static const gchar *tztips =
 32      N_("Display local time instead of UTC. Note: The local time is "
 33         "that of your operating system and not the local time at the "
 34         "location, which you select as " "tracking reference.");
 35  
 36  static const gchar *tftips =
 37      N_("Enter a format string using the following codes:\n\n"
 38         "\t%Y\tYear with century.\n" "\t%m\tMonth (01-12).\n"
 39         "\t%d\tDay of the month (01-31).\n" "\t%j\tDay of the year (001-366).\n"
 40         "\t%H\tHour (00-23).\n" "\t%M\tMinute (00-59).\n"
 41         "\t%S\tSeconds (00-59).\n\n"
 42         "See the user manual for more codes and examples.");
 43  
 44  static const gchar *nsewtips =
 45      N_("Checking this box will cause geographical "
 46         "coordinates to be displayed using a suffix "
 47         "instead of sign (eg. 23.43\302\260W "
 48         "instead of -23.43\302\260).");
 49  
 50  static const gchar *imptips =
 51      N_("Display distances using Imperial units, for "
 52         "example miles instead of kilometres.");
 53  /* *INDENT-ON* */
 54  
 55  
 56  static GtkWidget *tzcheck;      /* "time zone" check button */
 57  static GtkWidget *tfentry;      /* time format entry */
 58  static GtkWidget *tflabel;      /* time format label, preview */
 59  static GtkWidget *tfreset;      /* time format reset button */
 60  static GtkWidget *nsewcheck;    /* N/S/W/E check button */
 61  static GtkWidget *impcheck;     /* Use imperial units */
 62  static guint    timer;
 63  static gboolean useimporg;      /* original value for use imperial */
 64  
 65  static gboolean tfprev_cb(gpointer data);
 66  static void     systog_cb(GtkToggleButton * togglebutton, gpointer user_data);
 67  static void     reset_cb(GtkWidget * button, gpointer data);
 68  
 69  /** Create and initialise widgets for number formats tab. */
 70  GtkWidget      *sat_pref_formats_create()
 71  {
 72      GtkWidget      *vbox, *tfbox;
 73      gchar          *text;
 74  
 75      /* use local time */
 76      tzcheck =
 77          gtk_check_button_new_with_label(_("Show local time instead of UTC."));
 78      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tzcheck),
 79                                   sat_cfg_get_bool
 80                                   (SAT_CFG_BOOL_USE_LOCAL_TIME));
 81      gtk_widget_set_tooltip_text(tzcheck, _(tztips));
 82  
 83      /* time format */
 84      tfentry = gtk_entry_new();
 85      gtk_entry_set_max_length(GTK_ENTRY(tfentry), TIME_FORMAT_MAX_LENGTH);
 86      gtk_widget_set_tooltip_text(tfentry, _(tftips));
 87  
 88      text = sat_cfg_get_str(SAT_CFG_STR_TIME_FORMAT);
 89      gtk_entry_set_text(GTK_ENTRY(tfentry), text);
 90      g_free(text);
 91  
 92      tflabel = gtk_label_new("--/--/-- --:--:--");
 93  
 94      /* periodic update of preview label */
 95      timer = g_timeout_add(1000, tfprev_cb, NULL);
 96  
 97      /* reset button */
 98      tfreset = gtk_button_new_with_label(_("Reset"));
 99      g_signal_connect(tfreset, "clicked", G_CALLBACK(reset_cb), NULL);
100      gtk_widget_set_tooltip_text(tfreset, _("Reset to default value"));
101  
102      tfbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
103      gtk_box_set_homogeneous(GTK_BOX(tfbox), FALSE);
104      gtk_box_pack_start(GTK_BOX(tfbox), gtk_label_new(_("Time format:")),
105                         FALSE, FALSE, 0);
106      gtk_box_pack_start(GTK_BOX(tfbox), tfentry, TRUE, TRUE, 0);
107      gtk_box_pack_start(GTK_BOX(tfbox), tflabel, FALSE, FALSE, 0);
108      gtk_box_pack_start(GTK_BOX(tfbox), tfreset, FALSE, FALSE, 5);
109  
110      /* N/S/W/E */
111      nsewcheck =
112          gtk_check_button_new_with_label(_
113                                          ("Use N/S/E/W for geographical coordinates."));
114      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nsewcheck),
115                                   sat_cfg_get_bool(SAT_CFG_BOOL_USE_NSEW));
116      gtk_widget_set_tooltip_text(nsewcheck, _(nsewtips));
117  
118      /* unit */
119      useimporg = sat_cfg_get_bool(SAT_CFG_BOOL_USE_IMPERIAL);
120      impcheck =
121          gtk_check_button_new_with_label(_
122                                          ("Use Imperial units instead of Metric."));
123      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(impcheck), useimporg);
124      gtk_widget_set_tooltip_text(impcheck, _(imptips));
125      /* connect sat-pref-qth hook */
126      g_signal_connect(impcheck, "toggled", G_CALLBACK(systog_cb), NULL);
127  
128      vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
129      gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
130      gtk_container_set_border_width(GTK_CONTAINER(vbox), 20);
131      gtk_box_pack_start(GTK_BOX(vbox), tzcheck, FALSE, FALSE, 0);
132      gtk_box_pack_start(GTK_BOX(vbox), tfbox, FALSE, FALSE, 0);
133      gtk_box_pack_start(GTK_BOX(vbox),
134                         gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
135                         FALSE, FALSE, 0);
136      gtk_box_pack_start(GTK_BOX(vbox), nsewcheck, FALSE, FALSE, 0);
137      gtk_box_pack_start(GTK_BOX(vbox),
138                         gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
139                         FALSE, FALSE, 0);
140      gtk_box_pack_start(GTK_BOX(vbox), impcheck, FALSE, FALSE, 0);
141  
142      return vbox;
143  }
144  
145  /** User pressed cancel. Any changes to config must be cancelled. */
146  void sat_pref_formats_cancel()
147  {
148      /* restore imperial setting to it's original value */
149      sat_cfg_set_bool(SAT_CFG_BOOL_USE_IMPERIAL, useimporg);
150  
151      g_source_remove(timer);
152  }
153  
154  /** User pressed OK. Any changes should be stored in config. */
155  void sat_pref_formats_ok()
156  {
157      g_source_remove(timer);
158  
159      sat_cfg_set_bool(SAT_CFG_BOOL_USE_LOCAL_TIME,
160                       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tzcheck)));
161      sat_cfg_set_str(SAT_CFG_STR_TIME_FORMAT,
162                      gtk_entry_get_text(GTK_ENTRY(tfentry)));
163      sat_cfg_set_bool(SAT_CFG_BOOL_USE_NSEW,
164                       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
165                                                    (nsewcheck)));
166      sat_cfg_set_bool(SAT_CFG_BOOL_USE_IMPERIAL,
167                       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
168                                                    (impcheck)));
169  }
170  
171  static gboolean tfprev_cb(gpointer data)
172  {
173      const gchar    *fmtstr;
174      GDateTime      *now;
175      gchar          *text;
176  
177      (void)data;
178  
179      fmtstr = gtk_entry_get_text(GTK_ENTRY(tfentry));
180  
181      /* get either local time or UTC depending on check box */
182      if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tzcheck)))
183  	now = g_date_time_new_now_local();
184      else
185  	now = g_date_time_new_now_utc();
186  
187      text = g_date_time_format(now, fmtstr);
188      gtk_label_set_text(GTK_LABEL(tflabel), text);
189  
190      g_date_time_unref(now);
191      g_free(text);
192  
193      return TRUE;
194  }
195  
196  /** Manage system toggle button signals */
197  static void systog_cb(GtkToggleButton * togglebutton, gpointer user_data)
198  {
199      (void)user_data;
200  
201      sat_cfg_set_bool(SAT_CFG_BOOL_USE_IMPERIAL,
202                       gtk_toggle_button_get_active(togglebutton));
203      sat_pref_qth_sys_changed(gtk_toggle_button_get_active(togglebutton));
204  }
205  
206  /** Reset time format string to default */
207  static void reset_cb(GtkWidget * button, gpointer data)
208  {
209      gchar          *fmtstr;
210  
211      (void)button;
212      (void)data;
213  
214      fmtstr = sat_cfg_get_str_def(SAT_CFG_STR_TIME_FORMAT);
215      gtk_entry_set_text(GTK_ENTRY(tfentry), fmtstr);
216      g_free(fmtstr);
217  }