diff --git a/src/ui/setting.c b/src/ui/setting.c index a25f1a6..c44688f 100644 --- a/src/ui/setting.c +++ b/src/ui/setting.c @@ -19,6 +19,8 @@ #include "thread.h" #include "version.h" +#include + struct Setting { char *id; GtkToggleButton *button; @@ -36,7 +38,7 @@ struct Setting settings[] = { }, { .id = "local_time", - .val = &gs_gmt, + .val = &gs_localtime, }, { .id = "invert_scroll", @@ -44,12 +46,15 @@ struct Setting settings[] = { }, }; -gboolean gs_gmt = FALSE; +gboolean gs_localtime = TRUE; gboolean gs_clouds = TRUE; gboolean gs_lighting = TRUE; gboolean gs_invert_scroll = FALSE; enum ReferenceFrame gs_reference_frame = REFERENCE_FRAME_FIXED; +static const char *SETTINGS_FILENAME = ".orbvis.conf"; +static gchar *settings_filepath; + static GtkWindow *window_settings; static void on_settings_clicked(GtkToolButton *toolbutton, gpointer user_data); @@ -58,6 +63,9 @@ static void on_setting_toggled(GtkToggleButton *togglebutton, gpointer user_data static void on_fetch_data_clicked(GtkButton *button, gpointer user_data); static gboolean on_reference_frame_state_set(GtkSwitch *widget, gboolean state, gpointer user_data); +static void settings_load(void); +static void settings_save(void); + void on_settings_clicked(GtkToolButton *toolbutton, gpointer user_data) { (void)toolbutton; @@ -105,6 +113,30 @@ gboolean on_reference_frame_state_set(GtkSwitch *widget, gboolean state, gpointe return FALSE; } +void settings_save(void) +{ + g_autoptr(GKeyFile) settings_file = g_key_file_new(); + unsigned i; + for (i = 0; i < 4; i++) + g_key_file_set_boolean(settings_file, "settings", settings[i].id, *settings[i].val); + g_key_file_save_to_file(settings_file, settings_filepath, NULL); +} + +void settings_load(void) +{ + settings_filepath = g_build_filename(g_get_user_config_dir(), SETTINGS_FILENAME, NULL); + g_autoptr(GKeyFile) settings_file = g_key_file_new(); + if (g_key_file_load_from_file(settings_file, settings_filepath, G_KEY_FILE_NONE, NULL)) { + unsigned i; + for (i = 0; i < 4; i++) { + g_autoptr(GError) error = NULL; + gboolean val = g_key_file_get_boolean(settings_file, "settings", settings[i].id, &error); + if (!error) + *settings[i].val = val; + } + } +} + void setting_init(GtkBuilder *builder) { gtk_builder_add_callback_symbols(builder, @@ -120,7 +152,17 @@ void setting_init(GtkBuilder *builder) GtkLabel *about = GTK_LABEL(gtk_builder_get_object(builder, "about")); gtk_label_set_text(about, ABOUT_STRING); + settings_load(); + unsigned i; - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { settings[i].button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, settings[i].id)); + gtk_toggle_button_set_active(settings[i].button, *settings[i].val); + } +} + +void setting_deinit(void) +{ + settings_save(); + g_free(settings_filepath); } diff --git a/src/ui/setting.h b/src/ui/setting.h index 2b0523e..d1adf86 100644 --- a/src/ui/setting.h +++ b/src/ui/setting.h @@ -23,12 +23,13 @@ enum ReferenceFrame { REFERENCE_FRAME_INERTIAL, }; -extern gboolean gs_gmt; +extern gboolean gs_localtime; extern gboolean gs_clouds; extern gboolean gs_lighting; extern gboolean gs_invert_scroll; extern enum ReferenceFrame gs_reference_frame; void setting_init(GtkBuilder *builder); +void setting_deinit(void); #endif /* __SETTING_H__ */ diff --git a/src/ui/toolbar.c b/src/ui/toolbar.c index 5a9bbe3..bc53b78 100644 --- a/src/ui/toolbar.c +++ b/src/ui/toolbar.c @@ -147,7 +147,7 @@ void toolbar_init(GtkBuilder *builder) void toolbar_tic(void) { if (!gtk_widget_has_focus(GTK_WIDGET(time_entry))) - gtk_entry_set_text(time_entry, epoch_to_iso8601(e_phys.epoch_ms, gs_gmt, TRUE)); + gtk_entry_set_text(time_entry, epoch_to_iso8601(e_phys.epoch_ms, !gs_localtime, TRUE)); if (!gtk_widget_has_focus(GTK_WIDGET(speed_entry))) { char buf[16]; g_snprintf(buf, 16, "%.3fx", (double)e_timescale); diff --git a/src/ui/ui.c b/src/ui/ui.c index 3364c50..d5c985d 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -93,4 +93,5 @@ void ui_init(int argc, char ***argv) void ui_deinit(void) { catalog_deinit(); + setting_deinit(); }