1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4 
5 #include <stdio.h>
6 #include <string.h>
7 #include <errno.h>
8 
9 #include <glib/gi18n.h>
10 #include <glib/gstdio.h>
11 #include <gtk/gtk.h>
12 
13 #include "ev-preferences-dialog.h"
14 
15 enum
16 {
17     PROP_0,
18     PROP_WINDOW,
19 };
20 
21 /*
22  * The preferences dialog is a singleton since we don't want two dialogs showing an inconsistent state of the
23  * preferences.
24  * When ev_preferences_dialog_show is called and there is already a prefs dialog dialog open, it is reparented
25  * and shown.
26  */
27 static GtkWidget *preferences_dialog = NULL;
28 
29 #define EV_TYPE_PREFERENCES_DIALOG    (ev_preferences_dialog_get_type())
30 
31 G_DECLARE_FINAL_TYPE(EvPreferencesDialog, ev_preferences_dialog, EV, PREFERENCES_DIALOG, XAppPreferencesWindow)
32 
33 struct _EvPreferencesDialog
34 {
35     XAppPreferencesWindow  parent_instance;
36 
37     GSettings             *toolbar_settings;
38 
39     /* Main pages */
40     GtkWidget             *toolbar_page;
41 
42     /* Toolbar page */
43     GtkWidget             *show_history_buttons_switch;
44     GtkWidget             *show_expand_window_button_switch;
45     GtkWidget             *show_zoom_action_switch;
46 };
47 
G_DEFINE_TYPE(EvPreferencesDialog,ev_preferences_dialog,XAPP_TYPE_PREFERENCES_WINDOW)48 G_DEFINE_TYPE(EvPreferencesDialog, ev_preferences_dialog, XAPP_TYPE_PREFERENCES_WINDOW)
49 
50 static void
51 ev_preferences_dialog_dispose(GObject *object)
52 {
53     EvPreferencesDialog *dlg = EV_PREFERENCES_DIALOG(object);
54 
55     g_clear_object(&dlg->toolbar_settings);
56 
57     G_OBJECT_CLASS(ev_preferences_dialog_parent_class)->dispose(object);
58 }
59 
60 static void
ev_preferences_dialog_class_init(EvPreferencesDialogClass * klass)61 ev_preferences_dialog_class_init(EvPreferencesDialogClass *klass)
62 {
63     GObjectClass *object_class = G_OBJECT_CLASS(klass);
64     GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
65 
66     object_class->dispose = ev_preferences_dialog_dispose;
67 
68     gtk_widget_class_set_template_from_resource(widget_class, "/org/x/reader/shell/ui/ev-preferences-dialog.ui");
69 
70     /* Pages */
71     gtk_widget_class_bind_template_child(widget_class, EvPreferencesDialog, toolbar_page);
72 
73     /* Editor Page widgets */
74     gtk_widget_class_bind_template_child(widget_class, EvPreferencesDialog, show_history_buttons_switch);
75     gtk_widget_class_bind_template_child(widget_class, EvPreferencesDialog, show_expand_window_button_switch);
76     gtk_widget_class_bind_template_child(widget_class, EvPreferencesDialog, show_zoom_action_switch);
77 }
78 
79 static void
close_button_clicked(GtkButton * button,gpointer data)80 close_button_clicked(GtkButton *button,
81                      gpointer   data)
82 {
83     EvPreferencesDialog *dlg = EV_PREFERENCES_DIALOG(data);
84 
85     gtk_widget_destroy(GTK_WIDGET(dlg));
86 }
87 
88 static void
help_button_clicked(GtkButton * button,gpointer data)89 help_button_clicked(GtkButton *button,
90                     gpointer   data)
91 {
92     EvPreferencesDialog *dlg = EV_PREFERENCES_DIALOG(data);
93     ev_window_show_help(EV_WINDOW(dlg), NULL);
94 }
95 
96 static void
setup_editor_page(EvPreferencesDialog * dlg)97 setup_editor_page(EvPreferencesDialog *dlg)
98 {
99     g_settings_bind(dlg->toolbar_settings,
100                      GS_SHOW_HISTORY_BUTTONS,
101                      dlg->show_history_buttons_switch,
102                      "active",
103                      G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
104 
105     g_settings_bind(dlg->toolbar_settings,
106                      GS_SHOW_EXPAND_WINDOW,
107                      dlg->show_expand_window_button_switch,
108                      "active",
109                      G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
110 
111     g_settings_bind(dlg->toolbar_settings,
112                      GS_SHOW_ZOOM_ACTION,
113                      dlg->show_zoom_action_switch,
114                      "active",
115                      G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
116 
117     xapp_preferences_window_add_page(XAPP_PREFERENCES_WINDOW(dlg), dlg->toolbar_page, "toolbar", _("Toolbar"));
118 }
119 
120 static void
setup_buttons(EvPreferencesDialog * dlg)121 setup_buttons(EvPreferencesDialog *dlg)
122 {
123     GtkWidget *button;
124 
125     button = gtk_button_new_with_label(_("Help"));
126     xapp_preferences_window_add_button(XAPP_PREFERENCES_WINDOW(dlg), button, GTK_PACK_START);
127     g_signal_connect(button, "clicked", G_CALLBACK(help_button_clicked), dlg);
128 
129     button = gtk_button_new_with_label(_("Close"));
130     xapp_preferences_window_add_button(XAPP_PREFERENCES_WINDOW(dlg), button, GTK_PACK_END);
131     g_signal_connect(button, "clicked", G_CALLBACK(close_button_clicked), dlg);
132 }
133 
134 static void
ev_preferences_dialog_init(EvPreferencesDialog * dlg)135 ev_preferences_dialog_init(EvPreferencesDialog *dlg)
136 {
137     dlg->toolbar_settings = g_settings_new(GS_SCHEMA_NAME_TOOLBAR);
138 
139     gtk_window_set_title(GTK_WINDOW(dlg), _("Preferences"));
140 
141     gtk_widget_init_template(GTK_WIDGET(dlg));
142 
143     setup_buttons(dlg);
144     setup_editor_page(dlg);
145     gtk_widget_show_all(GTK_WIDGET(dlg));
146 }
147 
148 GtkWidget *
ev_preferences_dialog_new(EvWindow * parent)149 ev_preferences_dialog_new(EvWindow *parent)
150 {
151     g_return_val_if_fail(EV_IS_WINDOW(parent), NULL);
152 
153     return GTK_WIDGET(g_object_new(EV_TYPE_PREFERENCES_DIALOG,
154                                    "transient-for", parent,
155                                    NULL));
156 }
157 
158 void
ev_preferences_dialog_show(EvWindow * parent)159 ev_preferences_dialog_show(EvWindow *parent)
160 {
161     g_return_if_fail(EV_IS_WINDOW(parent));
162 
163     if (preferences_dialog == NULL) {
164         preferences_dialog = ev_preferences_dialog_new(parent);
165         g_signal_connect(preferences_dialog, "destroy", G_CALLBACK(gtk_widget_destroyed), &preferences_dialog);
166     }
167 
168     if (GTK_WINDOW(parent) != gtk_window_get_transient_for(GTK_WINDOW(preferences_dialog))) {
169         gtk_window_set_transient_for(GTK_WINDOW(preferences_dialog), GTK_WINDOW(parent));
170     }
171 
172     gtk_window_present(GTK_WINDOW(preferences_dialog));
173 }
174 
175