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