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