diff --git a/src/Makefile.am b/src/Makefile.am index 7f0e672..153d8b9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,11 +12,12 @@ BUILT_SOURCES = \ $(NULL) astrognome_source_files = \ - ag-app.c \ - ag-window.c \ - ag-chart.c \ - ag-settings.c \ - astrognome.c \ + ag-app.c \ + ag-window.c \ + ag-chart.c \ + ag-settings.c \ + ag-preferences.c \ + astrognome.c \ $(NULL) EXTRA_DIST = \ diff --git a/src/ag-app.c b/src/ag-app.c index b010f4d..fff9627 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -2,6 +2,7 @@ #include "ag-app.h" #include "ag-window.h" #include "ag-chart.h" +#include "ag-preferences.h" #include "config.h" #include "astrognome.h" @@ -62,7 +63,11 @@ new_window_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) static void preferences_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - //ag_preferences_show_dialog(); + AgApp *app = AG_APP(user_data); + GtkWindow *window; + + window = ag_app_peek_first_window(app); + ag_preferences_show_dialog(window); } static void diff --git a/src/ag-preferences.c b/src/ag-preferences.c new file mode 100644 index 0000000..5615d4a --- /dev/null +++ b/src/ag-preferences.c @@ -0,0 +1,77 @@ +#include + +#include "ag-settings.h" +#include "ag-preferences.h" + +static GtkWidget *prefs_dialog = NULL; + +typedef struct _AgPreferencesPrivate { + GtkCheckButton *maximized; + AgSettings *settings; +} AgPreferencesPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE(AgPreferences, ag_preferences, GTK_TYPE_DIALOG); + +static void +ag_preferences_finalize(GObject *gobject) +{ + AgPreferencesPrivate *priv; + + priv = ag_preferences_get_instance_private(AG_PREFERENCES(gobject)); + + g_clear_object(&priv->settings); + + G_OBJECT_CLASS(ag_preferences_parent_class)->finalize(gobject); +} + +static void +ag_preferences_response(GtkDialog *dlg, gint response_id) +{ + gtk_widget_destroy(GTK_WIDGET(dlg)); +} + +static void +ag_preferences_class_init(AgPreferencesClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + GtkDialogClass *dialog_class = GTK_DIALOG_CLASS(klass); + + object_class->finalize = ag_preferences_finalize; + dialog_class->response = ag_preferences_response; + + gtk_widget_class_set_template_from_resource(widget_class, "/eu/polonkai/gergely/astrognome/ag-preferences.ui"); + gtk_widget_class_bind_template_child_private(widget_class, AgPreferences, maximized); +} + +static void +ag_preferences_init(AgPreferences *prefs) +{ + AgPreferencesPrivate *priv; + GSettings *settings_window; + + priv = ag_preferences_get_instance_private(prefs); + gtk_widget_init_template(GTK_WIDGET(prefs)); + + priv->settings = ag_settings_get(); + + settings_window = ag_settings_peek_window_settings(priv->settings); + g_settings_bind(settings_window, "maximized", priv->maximized, "active", G_SETTINGS_BIND_DEFAULT); +} + +void +ag_preferences_show_dialog(GtkWindow *parent) +{ + g_return_if_fail(GTK_IS_WINDOW(parent)); + + if (prefs_dialog == NULL) { + prefs_dialog = GTK_WIDGET(g_object_new(AG_TYPE_PREFERENCES, NULL)); + g_signal_connect(prefs_dialog, "destroy", G_CALLBACK(gtk_widget_destroyed), &prefs_dialog); + } + + if (parent != gtk_window_get_transient_for(GTK_WINDOW(prefs_dialog))) { + gtk_window_set_transient_for(GTK_WINDOW(prefs_dialog), parent); + } + + gtk_window_present(GTK_WINDOW(prefs_dialog)); +} diff --git a/src/ag-preferences.h b/src/ag-preferences.h new file mode 100644 index 0000000..686d9e7 --- /dev/null +++ b/src/ag-preferences.h @@ -0,0 +1,32 @@ +#ifndef __AG_PREFERENCES_H__ +#define __AG_PREFERENCES_H__ + +#include + +G_BEGIN_DECLS + +#define AG_TYPE_PREFERENCES (ag_preferences_get_type()) +#define AG_PREFERENCES(o) (G_TYPE_CHECK_INSTANCE_CAST((o), AG_TYPE_PREFERENCES, AgPreferences)) +#define AG_PREFERENCES_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), AG_TYPE_PREFERENCES, AgPreferencesClass)) +#define AG_IS_PREFERENCES(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), AG_TYPE_PREFERENCES)) +#define AG_IS_PREFERENCES_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), AG_TYPE_PREFERENCES)) +#define AG_PREFERENCES_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), AG_TYPE_PREFERENCES, AgPreferencesClass)) + +typedef struct _AgPreferences AgPreferences; +typedef struct _AgPreferencesClass AgPreferencesClass; + +struct _AgPreferences { + GtkDialog parent; +}; + +struct _AgPreferencesClass { + GtkDialogClass parent_class; +}; + +GType ag_preferences_get_type(void); + +void ag_preferences_show_dialog(GtkWindow *parent); + +G_END_DECLS + +#endif /* __AG_PREFERENCES_H__ */ diff --git a/src/ag-preferences.ui b/src/ag-preferences.ui new file mode 100644 index 0000000..1f5a2a7 --- /dev/null +++ b/src/ag-preferences.ui @@ -0,0 +1,59 @@ + + + + + + diff --git a/src/ag.gresource.xml b/src/ag.gresource.xml index 6466ba3..61f3916 100644 --- a/src/ag.gresource.xml +++ b/src/ag.gresource.xml @@ -2,5 +2,6 @@ astrognome.ui + ag-preferences.ui