Skip to content

Commit 2abd844

Browse files
committed
detail-view: Add donation row
1 parent f8ecd9b commit 2abd844

File tree

4 files changed

+103
-0
lines changed

4 files changed

+103
-0
lines changed
Lines changed: 2 additions & 0 deletions
Loading

src/exm-detail-view.blp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,15 @@ template $ExmDetailView : Adw.NavigationPage {
201201
}
202202
}
203203

204+
Adw.ExpanderRow links_donations {
205+
[prefix]
206+
Gtk.Image {
207+
icon-name: "donation-symbolic";
208+
}
209+
210+
title: _("Donate");
211+
}
212+
204213
Adw.ActionRow link_extensions {
205214
[prefix]
206215
Gtk.Image {

src/exm-detail-view.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ struct _ExmDetailView
7474

7575
AdwActionRow *link_homepage;
7676
gchar *uri_homepage;
77+
AdwExpanderRow *links_donations;
78+
gchar **uri_donations;
79+
GList *donation_rows_list;
7780
AdwActionRow *link_extensions;
7881
gchar *uri_extensions;
7982
int pk;
@@ -269,6 +272,80 @@ install_remote (GtkButton *button,
269272
"(sb)", self->uuid, warn);
270273
}
271274

275+
static void
276+
delete_donation_rows (ExmDetailView *self)
277+
{
278+
GList *iter;
279+
280+
iter = self->donation_rows_list;
281+
282+
while (iter != NULL) {
283+
GtkWidget *row = GTK_WIDGET (iter->data);
284+
285+
adw_expander_row_remove (self->links_donations, row);
286+
287+
iter = g_list_next (iter);
288+
}
289+
290+
g_list_free (self->donation_rows_list);
291+
self->donation_rows_list = NULL;
292+
}
293+
294+
static void
295+
new_donation_row (ExmDetailView *self,
296+
int num_donation)
297+
{
298+
GtkWidget *row;
299+
GtkWidget *external_link_icon;
300+
301+
row = adw_action_row_new ();
302+
303+
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), self->uri_donations[num_donation]);
304+
gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
305+
306+
gtk_actionable_set_action_name (GTK_ACTIONABLE (row), "detail.open-donation");
307+
gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row), g_variant_new_int32 (num_donation));
308+
309+
external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic");
310+
gtk_widget_add_css_class (external_link_icon, "dim-label");
311+
adw_action_row_add_suffix (ADW_ACTION_ROW (row), external_link_icon);
312+
313+
adw_expander_row_add_row (self->links_donations, row);
314+
315+
self->donation_rows_list = g_list_append (self->donation_rows_list, row);
316+
}
317+
318+
static void
319+
update_donation_rows (ExmDetailView *self,
320+
gchar **donation_urls)
321+
{
322+
int donation_urls_length;
323+
324+
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), FALSE);
325+
g_strfreev (self->uri_donations);
326+
delete_donation_rows (self);
327+
328+
donation_urls_length = g_strv_length (donation_urls);
329+
330+
if (donation_urls_length > 0)
331+
{
332+
self->uri_donations = g_new0 (gchar *, donation_urls_length);
333+
334+
for (int i = 0; i < donation_urls_length; i++)
335+
{
336+
self->uri_donations[i] = g_uri_resolve_relative (donation_urls[i],
337+
"",
338+
G_URI_FLAGS_NONE,
339+
NULL);
340+
341+
new_donation_row (self, i);
342+
}
343+
344+
adw_expander_row_set_expanded (self->links_donations, FALSE);
345+
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), TRUE);
346+
}
347+
}
348+
272349
static void
273350
on_data_loaded (GObject *source,
274351
GAsyncResult *result,
@@ -290,6 +367,7 @@ on_data_loaded (GObject *source,
290367
gint pk, downloads;
291368
gboolean is_installed, is_supported;
292369
gchar *uuid, *name, *creator, *icon_uri, *screenshot_uri, *link, *description, *url;
370+
gchar **donation_urls;
293371
g_object_get (data,
294372
"uuid", &uuid,
295373
"name", &name,
@@ -302,6 +380,7 @@ on_data_loaded (GObject *source,
302380
"pk", &pk,
303381
"url", &url,
304382
"downloads", &downloads,
383+
"donation_urls", &donation_urls,
305384
NULL);
306385

307386
adw_window_title_set_title (self->title, name);
@@ -352,6 +431,8 @@ on_data_loaded (GObject *source,
352431
G_URI_FLAGS_NONE,
353432
NULL);
354433

434+
update_donation_rows (self, donation_urls);
435+
355436
self->uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/",
356437
link,
357438
G_URI_FLAGS_NONE,
@@ -464,6 +545,12 @@ open_link (ExmDetailView *self,
464545
uri = gtk_uri_launcher_new (self->uri_extensions);
465546
else if (strcmp (action_name, "detail.open-homepage") == 0)
466547
uri = gtk_uri_launcher_new (self->uri_homepage);
548+
else if (strcmp (action_name, "detail.open-donation") == 0)
549+
{
550+
guint val;
551+
g_variant_get (param, "i", &val);
552+
uri = gtk_uri_launcher_new (self->uri_donations[val]);
553+
}
467554
else
468555
g_critical ("open_link() invalid action: %s", action_name);
469556

@@ -557,6 +644,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
557644
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popin_button);
558645
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar);
559646
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
647+
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
560648
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions);
561649
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, scroll_area);
562650
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_box);
@@ -567,6 +655,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
567655

568656
gtk_widget_class_install_action (widget_class, "detail.open-extensions", NULL, open_link);
569657
gtk_widget_class_install_action (widget_class, "detail.open-homepage", NULL, open_link);
658+
gtk_widget_class_install_action (widget_class, "detail.open-donation", "i", open_link);
570659
}
571660

572661
static void
@@ -590,6 +679,8 @@ exm_detail_view_init (ExmDetailView *self)
590679
self->resolver = exm_image_resolver_new ();
591680
self->comment_provider = exm_comment_provider_new ();
592681

682+
self->donation_rows_list = NULL;
683+
593684
self->zoom_in = g_simple_action_new ("zoom-in", NULL);
594685
g_signal_connect_swapped (self->zoom_in, "activate", G_CALLBACK (exm_zoom_picture_zoom_in), self->overlay_screenshot);
595686

src/exm.gresource.xml.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<gresource prefix="/com/mattjakeman/ExtensionManager/icons/scalable/actions">
2424
<file preprocess="xml-stripblanks" alias="clock-alt-symbolic.svg">../data/icons/hicolor/scalable/actions/clock-alt-symbolic.svg</file>
2525
<file preprocess="xml-stripblanks" alias="dialog-error-symbolic.svg">../data/icons/hicolor/scalable/actions/dialog-error-symbolic.svg</file>
26+
<file preprocess="xml-stripblanks" alias="donation-symbolic.svg">../data/icons/hicolor/scalable/actions/donation-symbolic.svg</file>
2627
<file preprocess="xml-stripblanks" alias="external-link-symbolic.svg">../data/icons/hicolor/scalable/actions/external-link-symbolic.svg</file>
2728
<file preprocess="xml-stripblanks" alias="globe-symbolic.svg">../data/icons/hicolor/scalable/actions/globe-symbolic.svg</file>
2829
<file preprocess="xml-stripblanks" alias="go-next-symbolic.svg">../data/icons/hicolor/scalable/actions/go-next-symbolic.svg</file>

0 commit comments

Comments
 (0)