1 /*
2 * Copyright (C) 2013 Tristan Van Berkom.
3 *
4 * This library is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU Lesser General Public License as
6 * published by the Free Software Foundation; either version 2.1 of
7 * the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
unit_struct()12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 *
18 * Authors:
19 * Tristan Van Berkom <tvb@gnome.org>
20 */
21
22 #include <config.h>
23 #include <gladeui/glade.h>
24 #include <glib/gi18n-lib.h>
25
26 #include "glade-about-dialog-editor.h"
27
28 static void glade_about_dialog_editor_editable_init (GladeEditableIface *iface);
29
30 /* Callbacks */
31 static void license_type_pre_commit (GladePropertyShell *shell,
32 GValue *value,
33 GladeAboutDialogEditor *editor);
tuple_struct()34 static void license_type_post_commit (GladePropertyShell *shell,
35 GValue *value,
36 GladeAboutDialogEditor *editor);
37 static void logo_file_toggled (GtkWidget *widget,
38 GladeAboutDialogEditor *editor);
39 static void logo_icon_toggled (GtkWidget *widget,
40 GladeAboutDialogEditor *editor);
41
42
43 struct _GladeAboutDialogEditorPrivate
44 {
45 GtkWidget *license_label;
46 GtkWidget *license_editor;
47 GtkWidget *wrap_license_editor;
48
49 GtkWidget *logo_file_radio;
enum_error()50 GtkWidget *logo_icon_radio;
51 };
52
53 static GladeEditableIface *parent_editable_iface;
54
55 G_DEFINE_TYPE_WITH_CODE (GladeAboutDialogEditor, glade_about_dialog_editor, GLADE_TYPE_WINDOW_EDITOR,
56 G_ADD_PRIVATE (GladeAboutDialogEditor)
57 G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
58 glade_about_dialog_editor_editable_init));
59
60 static void
61 glade_about_dialog_editor_class_init (GladeAboutDialogEditorClass * klass)
62 {
63 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
64
65 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladegtk/glade-about-dialog-editor.ui");
66
67 gtk_widget_class_bind_template_child_private (widget_class, GladeAboutDialogEditor, license_label);
68 gtk_widget_class_bind_template_child_private (widget_class, GladeAboutDialogEditor, license_editor);
69 gtk_widget_class_bind_template_child_private (widget_class, GladeAboutDialogEditor, wrap_license_editor);
70 gtk_widget_class_bind_template_child_private (widget_class, GladeAboutDialogEditor, logo_file_radio);
71 gtk_widget_class_bind_template_child_private (widget_class, GladeAboutDialogEditor, logo_icon_radio);
72
73 gtk_widget_class_bind_template_callback (widget_class, license_type_pre_commit);
74 gtk_widget_class_bind_template_callback (widget_class, license_type_post_commit);
75 gtk_widget_class_bind_template_callback (widget_class, logo_file_toggled);
76 gtk_widget_class_bind_template_callback (widget_class, logo_icon_toggled);
77 }
78
79 static void
80 glade_about_dialog_editor_init (GladeAboutDialogEditor *self)
81 {
82 self->priv = glade_about_dialog_editor_get_instance_private (self);
83
84 gtk_widget_init_template (GTK_WIDGET (self));
85 }
86
87 static void
88 glade_about_dialog_editor_load (GladeEditable *editable, GladeWidget *widget)
89 {
90 GladeAboutDialogEditor *dialog_editor = GLADE_ABOUT_DIALOG_EDITOR (editable);
91 GladeAboutDialogEditorPrivate *priv = dialog_editor->priv;
92
93 /* Chain up to default implementation */
94 parent_editable_iface->load (editable, widget);
95
96 if (widget)
97 {
98 GtkLicense license = GTK_LICENSE_UNKNOWN;
99 gboolean as_file;
100 gboolean sensitive;
101
102 /* Set sensitivity of the custom license text */
103 glade_widget_property_get (widget, "license-type", &license);
104
105 sensitive = (license == GTK_LICENSE_UNKNOWN || license == GTK_LICENSE_CUSTOM);
106 gtk_widget_set_sensitive (priv->license_label, sensitive);
107 gtk_widget_set_sensitive (priv->license_editor, sensitive);
108 gtk_widget_set_sensitive (priv->wrap_license_editor, sensitive);
109
110 /* Set the radio button state to our virtual property */
111 glade_widget_property_get (widget, "glade-logo-as-file", &as_file);
112
113 glade_widget_property_set_enabled (widget, "logo-icon-name", !as_file);
114 glade_widget_property_set_enabled (widget, "logo", as_file);
115
116 if (as_file)
117 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->logo_file_radio), TRUE);
118 else
119 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->logo_icon_radio), TRUE);
120 }
121 }
122
123 static void
124 glade_about_dialog_editor_editable_init (GladeEditableIface *iface)
125 {
126 parent_editable_iface = g_type_interface_peek_parent (iface);
127
128 iface->load = glade_about_dialog_editor_load;
129 }
130
131
132 static void
133 license_type_pre_commit (GladePropertyShell *shell,
134 GValue *value,
135 GladeAboutDialogEditor *editor)
136 {
137 GladeWidget *widget = glade_editable_loaded_widget (GLADE_EDITABLE (editor));
138 GladeProperty *property;
139 GtkLicense license;
140
141 glade_command_push_group (_("Setting License type of %s"),
142 glade_widget_get_name (widget));
143
144 license = g_value_get_enum (value);
145
146 if (!(license == GTK_LICENSE_UNKNOWN || license == GTK_LICENSE_CUSTOM))
147 {
148 property = glade_widget_get_property (widget, "license");
149 glade_command_set_property (property, NULL);
150
151 property = glade_widget_get_property (widget, "wrap-license");
152 glade_command_set_property (property, FALSE);
153 }
154 }
155
156 static void
157 license_type_post_commit (GladePropertyShell *shell,
158 GValue *value,
159 GladeAboutDialogEditor *editor)
160 {
161 glade_command_pop_group ();
162 }
163
164 static void
165 glade_about_dialog_editor_set_logo_as_file (GladeAboutDialogEditor *editor,
166 gboolean logo_as_file)
167 {
168 GladeWidget *gwidget = glade_editable_loaded_widget (GLADE_EDITABLE (editor));
169 GladeProperty *property;
170
171 if (glade_editable_loading (GLADE_EDITABLE (editor)) || !gwidget)
172 return;
173
174 glade_editable_block (GLADE_EDITABLE (editor));
175
176 glade_command_push_group (logo_as_file ? _("Setting %s to use logo file") :
177 _("Setting %s to use a logo icon"),
178 glade_widget_get_name (gwidget));
179
180 property = glade_widget_get_property (gwidget, "glade-logo-as-file");
181 glade_command_set_property (property, logo_as_file);
182
183 glade_command_pop_group ();
184
185 glade_editable_unblock (GLADE_EDITABLE (editor));
186
187 /* reload buttons and sensitivity and stuff... */
188 glade_editable_load (GLADE_EDITABLE (editor), gwidget);
189 }
190
191 static void
192 logo_icon_toggled (GtkWidget *widget, GladeAboutDialogEditor *editor)
193 {
194 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
195 return;
196
197 glade_about_dialog_editor_set_logo_as_file (editor, FALSE);
198 }
199
200 static void
201 logo_file_toggled (GtkWidget *widget, GladeAboutDialogEditor *editor)
202 {
203 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
204 return;
205
206 glade_about_dialog_editor_set_logo_as_file (editor, TRUE);
207 }
208
209 GtkWidget *
210 glade_about_dialog_editor_new (void)
211 {
212 return g_object_new (GLADE_TYPE_ABOUT_DIALOG_EDITOR, NULL);
213 }
214