1 /* font-manager-license-pane.c
2 *
3 * Copyright (C) 2009 - 2021 Jerry Casiano
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program.
17 *
18 * If not, see <http://www.gnu.org/licenses/gpl-3.0.txt>.
19 */
20
21 #include "font-manager-license-pane.h"
22
23 /**
24 * SECTION: font-manager-license-pane
25 * @short_description: Font licensing details
26 * @title: License Pane
27 * @include: font-manager-license-pane.h
28 *
29 * Widget which displays embedded or detected font licensing data.
30 */
31
32 struct _FontManagerLicensePane
33 {
34 GtkEventBox parent_instance;
35
36 gint _fsType;
37 GtkWidget *fsType;
38 GtkWidget *license_data;
39 GtkWidget *license_url;
40 GtkWidget *placeholder;
41
42 };
43
44 G_DEFINE_TYPE(FontManagerLicensePane, font_manager_license_pane, GTK_TYPE_EVENT_BOX)
45
46 enum
47 {
48 PROP_RESERVED,
49 PROP_FSTYPE,
50 PROP_LICENSE_DATA,
51 PROP_LICENSE_URL,
52 N_PROPERTIES
53 };
54
55 static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
56
57 static void
font_manager_license_pane_get_property(GObject * gobject,guint property_id,GValue * value,GParamSpec * pspec)58 font_manager_license_pane_get_property (GObject *gobject,
59 guint property_id,
60 GValue *value,
61 GParamSpec *pspec)
62 {
63 g_return_if_fail(gobject != NULL);
64 FontManagerLicensePane *self = FONT_MANAGER_LICENSE_PANE(gobject);
65 g_autofree gchar *data = NULL;
66 switch (property_id) {
67 case PROP_FSTYPE:
68 g_value_set_enum(value, self->_fsType);
69 break;
70 case PROP_LICENSE_DATA:
71 data = font_manager_license_pane_get_license_data(self);
72 g_value_set_string(value, data);
73 break;
74 case PROP_LICENSE_URL:
75 data = font_manager_license_pane_get_license_url(self);
76 g_value_set_string(value, data);
77 break;
78 default:
79 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
80 }
81 return;
82 }
83
84 static void
font_manager_license_pane_set_property(GObject * gobject,guint property_id,const GValue * value,GParamSpec * pspec)85 font_manager_license_pane_set_property (GObject *gobject,
86 guint property_id,
87 const GValue *value,
88 GParamSpec *pspec)
89 {
90 g_return_if_fail(gobject != NULL);
91 FontManagerLicensePane *self = FONT_MANAGER_LICENSE_PANE(gobject);
92 switch (property_id) {
93 case PROP_FSTYPE:
94 font_manager_license_pane_set_fsType(self, g_value_get_int(value));
95 break;
96 case PROP_LICENSE_DATA:
97 font_manager_license_pane_set_license_data(self, g_value_get_string(value));
98 break;
99 case PROP_LICENSE_URL:
100 font_manager_license_pane_set_license_url(self, g_value_get_string(value));
101 break;
102 default:
103 G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, property_id, pspec);
104 }
105 return;
106 }
107
108 static void
font_manager_license_pane_class_init(FontManagerLicensePaneClass * klass)109 font_manager_license_pane_class_init (FontManagerLicensePaneClass *klass)
110 {
111 GObjectClass *object_class = G_OBJECT_CLASS(klass);
112
113 object_class->get_property = font_manager_license_pane_get_property;
114 object_class->set_property = font_manager_license_pane_set_property;
115
116 /**
117 * FontManagerLicensePane:fstype:
118 *
119 * Font embedding information
120 */
121 obj_properties[PROP_FSTYPE] = g_param_spec_int("fstype",
122 NULL,
123 "Font embedding information",
124 G_MININT, G_MAXINT, 0,
125 G_PARAM_STATIC_STRINGS |
126 G_PARAM_READWRITE |
127 G_PARAM_EXPLICIT_NOTIFY);
128
129 /**
130 * FontManagerLicensePane:license-data:
131 *
132 * Embedded or detected license text
133 */
134 obj_properties[PROP_LICENSE_DATA] = g_param_spec_string("license-data",
135 NULL,
136 "Embedded or detected license text",
137 NULL,
138 G_PARAM_STATIC_STRINGS |
139 G_PARAM_READWRITE |
140 G_PARAM_EXPLICIT_NOTIFY);
141
142 /**
143 * FontManagerLicensePane:license-url:
144 *
145 * Embedded or detected license url
146 */
147 obj_properties[PROP_LICENSE_URL] = g_param_spec_string("license-url",
148 NULL,
149 "Embedded or detected license url",
150 NULL,
151 G_PARAM_STATIC_STRINGS |
152 G_PARAM_READWRITE |
153 G_PARAM_EXPLICIT_NOTIFY);
154
155 g_object_class_install_properties(object_class, N_PROPERTIES, obj_properties);
156 return;
157 }
158
159 static gboolean
on_event(GtkWidget * widget,GdkEvent * event,G_GNUC_UNUSED gpointer user_data)160 on_event (GtkWidget *widget, GdkEvent *event, G_GNUC_UNUSED gpointer user_data)
161 {
162 g_return_val_if_fail(widget != NULL, GDK_EVENT_PROPAGATE);
163 g_return_val_if_fail(event != NULL, GDK_EVENT_PROPAGATE);
164 if (event->type == GDK_SCROLL)
165 return GDK_EVENT_PROPAGATE;
166 GdkWindow *text_window = gtk_text_view_get_window(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT);
167 gdk_window_set_cursor(text_window, NULL);
168 return GDK_EVENT_STOP;
169 }
170
171 static void
font_manager_license_pane_init(FontManagerLicensePane * self)172 font_manager_license_pane_init (FontManagerLicensePane *self)
173 {
174 g_return_if_fail(self != NULL);
175 GtkStyleContext *ctx = gtk_widget_get_style_context(GTK_WIDGET(self));
176 gtk_style_context_add_class(ctx, GTK_STYLE_CLASS_VIEW);
177 gtk_widget_set_name(GTK_WIDGET(self), "FontManagerLicensePane");
178 self->fsType = gtk_label_new(NULL);
179 PangoAttrList *attrs = pango_attr_list_new();
180 PangoAttribute *attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
181 pango_attr_list_insert(attrs, attr);
182 gtk_label_set_attributes(GTK_LABEL(self->fsType), attrs);
183 g_clear_pointer(&attrs, pango_attr_list_unref);
184 gtk_widget_set_opacity(self->fsType, 0.55);
185 const gchar *msg = _("File does not contain license information.");
186 self->placeholder = font_manager_place_holder_new(NULL, NULL, msg, "dialog-question-symbolic");
187 font_manager_widget_set_expand(self->placeholder, TRUE);
188 font_manager_widget_set_margin(self->placeholder, FONT_MANAGER_DEFAULT_MARGIN * 4);
189 gtk_widget_set_halign(self->placeholder, GTK_ALIGN_CENTER);
190 gtk_widget_set_valign(self->placeholder, GTK_ALIGN_START);
191 self->license_data = gtk_text_view_new();
192 gtk_drag_dest_unset(self->license_data);
193 g_signal_connect(self->license_data, "event", G_CALLBACK(on_event), NULL);
194 self->license_url = gtk_link_button_new("");
195 GtkWidget *overlay = gtk_overlay_new();
196 gtk_overlay_add_overlay(GTK_OVERLAY(overlay), self->placeholder);
197 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(self->license_data), GTK_WRAP_WORD_CHAR);
198 gtk_text_view_set_editable(GTK_TEXT_VIEW(self->license_data), FALSE);
199 font_manager_widget_set_margin(self->fsType, FONT_MANAGER_DEFAULT_MARGIN * 2);
200 font_manager_widget_set_margin(self->license_url, FONT_MANAGER_DEFAULT_MARGIN * 1.25);
201 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
202 gtk_container_add(GTK_CONTAINER(scroll), self->license_data);
203 font_manager_widget_set_expand(scroll, TRUE);
204 font_manager_widget_set_margin(self->license_data, FONT_MANAGER_DEFAULT_MARGIN * 2);
205 GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2);
206 gtk_box_pack_start(GTK_BOX(box), self->fsType, FALSE, FALSE, 0);
207 gtk_container_add(GTK_CONTAINER(overlay), scroll);
208 gtk_box_pack_start(GTK_BOX(box), overlay, TRUE, TRUE, 0);
209 gtk_box_pack_end(GTK_BOX(box), self->license_url, FALSE, FALSE, 0);
210 gtk_container_add(GTK_CONTAINER(self), box);
211 gtk_widget_show(scroll);
212 gtk_widget_show(self->fsType);
213 gtk_widget_show(self->license_data);
214 gtk_widget_show(self->license_url);
215 gtk_widget_show(self->placeholder);
216 gtk_widget_show(overlay);
217 gtk_widget_show(box);
218 return;
219 }
220
221 /**
222 * font_manager_license_pane_get_fsType:
223 * @self: #FontManagerLicensePane
224 *
225 * Returns: #FontManagerfsType
226 */
227 gint
font_manager_license_pane_get_fsType(FontManagerLicensePane * self)228 font_manager_license_pane_get_fsType (FontManagerLicensePane *self)
229 {
230 g_return_val_if_fail(self != NULL, 0);
231 return self->_fsType;
232 }
233
234 /**
235 * font_manager_license_pane_get_license_data:
236 * @self: #FontManagerLicensePane
237 *
238 * Returns: (transfer none) (nullable):
239 * A newly allocated string that must be freed with #g_free or %NULL
240 */
241 gchar *
font_manager_license_pane_get_license_data(FontManagerLicensePane * self)242 font_manager_license_pane_get_license_data (FontManagerLicensePane *self)
243 {
244 g_return_val_if_fail(self != NULL, NULL);
245 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->license_data));
246 GtkTextIter start, end;
247 gtk_text_buffer_get_bounds(buffer, &start, &end);
248 return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
249 }
250
251 /**
252 * font_manager_license_pane_get_license_url:
253 * @self: #FontManagerLicensePane
254 *
255 * Returns: (transfer none) (nullable):
256 * A newly allocated string that must be freed with #g_free or %NULL
257 */
258 gchar *
font_manager_license_pane_get_license_url(FontManagerLicensePane * self)259 font_manager_license_pane_get_license_url (FontManagerLicensePane *self)
260 {
261 g_return_val_if_fail(self != NULL, NULL);
262 return g_strdup(gtk_link_button_get_uri(GTK_LINK_BUTTON(self->license_url)));
263 }
264
265 /**
266 * font_manager_license_pane_set_fsType:
267 * @self: #FontManagerLicensePane
268 * @fstype: #FontManagerfsType
269 */
270 void
font_manager_license_pane_set_fsType(FontManagerLicensePane * self,gint fstype)271 font_manager_license_pane_set_fsType (FontManagerLicensePane *self, gint fstype)
272 {
273 g_return_if_fail(self != NULL);
274 self->_fsType = fstype;
275 gtk_label_set_label(GTK_LABEL(self->fsType), font_manager_fsType_to_string(fstype));
276 return;
277 }
278
279 /**
280 * font_manager_license_pane_set_license_data:
281 * @self: #FontManagerLicensePane
282 * @license_data: (nullable): License data embedded in font file or %NULL
283 */
284 void
font_manager_license_pane_set_license_data(FontManagerLicensePane * self,const gchar * license_data)285 font_manager_license_pane_set_license_data (FontManagerLicensePane *self, const gchar *license_data)
286 {
287 g_return_if_fail(self != NULL);
288 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->license_data));
289 gtk_text_buffer_set_text(buffer, license_data ? license_data : "", -1);
290 gtk_widget_set_visible(self->placeholder, license_data == NULL);
291 return;
292 }
293
294 /**
295 * font_manager_license_pane_set_license_url:
296 * @self: #FontManagerLicensePane
297 * @url: (nullable): URL to latest version of license or %NULL
298 */
299 void
font_manager_license_pane_set_license_url(FontManagerLicensePane * self,const gchar * url)300 font_manager_license_pane_set_license_url (FontManagerLicensePane *self, const gchar *url)
301 {
302 g_return_if_fail(self != NULL);
303 gtk_button_set_label(GTK_BUTTON(self->license_url), url);
304 gtk_link_button_set_uri(GTK_LINK_BUTTON(self->license_url), url ? url : "");
305 gtk_widget_set_visible(self->license_url, url != NULL);
306 return;
307 }
308
309 /**
310 * font_manager_license_pane_new:
311 *
312 * Returns: (transfer full): A newly created #FontManagerLicensePane.
313 * Free the returned object using #g_object_unref().
314 */
315 GtkWidget *
font_manager_license_pane_new(void)316 font_manager_license_pane_new (void)
317 {
318 return g_object_new(FONT_MANAGER_TYPE_LICENSE_PANE, NULL);
319 }
320
321