Skip to content

Commit b4881f0

Browse files
committed
detail-view: Add donation row
1 parent ed77ba2 commit b4881f0

File tree

4 files changed

+102
-0
lines changed

4 files changed

+102
-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
@@ -208,6 +208,15 @@ template $ExmDetailView : Adw.NavigationPage {
208208
}
209209
}
210210

211+
Adw.ExpanderRow links_donations {
212+
[prefix]
213+
Gtk.Image {
214+
icon-name: "donation-symbolic";
215+
}
216+
217+
title: _("Donate");
218+
}
219+
211220
Adw.ActionRow link_extensions {
212221
[prefix]
213222
Gtk.Image {

src/exm-detail-view.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ struct _ExmDetailView
7575

7676
AdwActionRow *link_homepage;
7777
gchar *uri_homepage;
78+
AdwExpanderRow *links_donations;
79+
gchar **uri_donations;
80+
GList *donation_rows_list;
7881
AdwActionRow *link_extensions;
7982
gchar *uri_extensions;
8083
int pk;
@@ -292,6 +295,79 @@ install_remote (GtkButton *button,
292295
"(sb)", self->uuid, warn);
293296
}
294297

298+
static void
299+
delete_donation_rows (ExmDetailView *self)
300+
{
301+
GList *iter;
302+
303+
iter = self->donation_rows_list;
304+
305+
while (iter != NULL) {
306+
GtkWidget *row = GTK_WIDGET (iter->data);
307+
308+
adw_expander_row_remove (self->links_donations, row);
309+
310+
iter = g_list_next (iter);
311+
}
312+
313+
g_list_free (self->donation_rows_list);
314+
self->donation_rows_list = NULL;
315+
}
316+
317+
static void
318+
new_donation_row (ExmDetailView *self,
319+
int num_donation)
320+
{
321+
GtkWidget *row;
322+
GtkWidget *external_link_icon;
323+
324+
row = adw_action_row_new ();
325+
326+
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), self->uri_donations[num_donation]);
327+
gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
328+
329+
gtk_actionable_set_action_name (GTK_ACTIONABLE (row), "detail.open-donation");
330+
gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row), g_variant_new_int32 (num_donation));
331+
332+
external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic");
333+
gtk_widget_add_css_class (external_link_icon, "dim-label");
334+
adw_action_row_add_suffix (ADW_ACTION_ROW (row), external_link_icon);
335+
336+
adw_expander_row_add_row (self->links_donations, row);
337+
338+
self->donation_rows_list = g_list_append (self->donation_rows_list, row);
339+
}
340+
341+
static void
342+
update_donation_rows (ExmDetailView *self,
343+
gchar **donation_urls)
344+
{
345+
int donation_urls_length;
346+
347+
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), FALSE);
348+
delete_donation_rows (self);
349+
350+
donation_urls_length = g_strv_length (donation_urls);
351+
352+
if (donation_urls_length > 0)
353+
{
354+
self->uri_donations = g_new0 (gchar *, donation_urls_length);
355+
356+
for (int i = 0; i < donation_urls_length; i++)
357+
{
358+
self->uri_donations[i] = g_uri_resolve_relative (donation_urls[i],
359+
"",
360+
G_URI_FLAGS_NONE,
361+
NULL);
362+
363+
new_donation_row (self, i);
364+
}
365+
366+
adw_expander_row_set_expanded (self->links_donations, FALSE);
367+
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), TRUE);
368+
}
369+
}
370+
295371
static void
296372
on_data_loaded (GObject *source,
297373
GAsyncResult *result,
@@ -313,6 +389,7 @@ on_data_loaded (GObject *source,
313389
gint pk, downloads;
314390
gboolean is_installed, is_supported;
315391
gchar *uuid, *name, *creator, *icon_uri, *screenshot_uri, *link, *description, *url;
392+
gchar **donation_urls;
316393
g_object_get (data,
317394
"uuid", &uuid,
318395
"name", &name,
@@ -325,6 +402,7 @@ on_data_loaded (GObject *source,
325402
"pk", &pk,
326403
"url", &url,
327404
"downloads", &downloads,
405+
"donation_urls", &donation_urls,
328406
NULL);
329407

330408
adw_window_title_set_title (self->title, name);
@@ -383,6 +461,8 @@ on_data_loaded (GObject *source,
383461
G_URI_FLAGS_NONE,
384462
NULL);
385463

464+
update_donation_rows (self, donation_urls);
465+
386466
self->uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/",
387467
link,
388468
G_URI_FLAGS_NONE,
@@ -495,6 +575,12 @@ open_link (ExmDetailView *self,
495575
uri = gtk_uri_launcher_new (self->uri_extensions);
496576
else if (strcmp (action_name, "detail.open-homepage") == 0)
497577
uri = gtk_uri_launcher_new (self->uri_homepage);
578+
else if (strcmp (action_name, "detail.open-donation") == 0)
579+
{
580+
guint val;
581+
g_variant_get (param, "i", &val);
582+
uri = gtk_uri_launcher_new (self->uri_donations[val]);
583+
}
498584
else
499585
g_critical ("open_link() invalid action: %s", action_name);
500586

@@ -589,6 +675,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
589675
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popin_button);
590676
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar);
591677
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
678+
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
592679
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions);
593680
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, scroll_area);
594681
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_box);
@@ -599,6 +686,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
599686

600687
gtk_widget_class_install_action (widget_class, "detail.open-extensions", NULL, open_link);
601688
gtk_widget_class_install_action (widget_class, "detail.open-homepage", NULL, open_link);
689+
gtk_widget_class_install_action (widget_class, "detail.open-donation", "i", open_link);
602690
}
603691

604692
static void
@@ -622,6 +710,8 @@ exm_detail_view_init (ExmDetailView *self)
622710
self->resolver = exm_image_resolver_new ();
623711
self->comment_provider = exm_comment_provider_new ();
624712

713+
self->donation_rows_list = NULL;
714+
625715
self->zoom_in = g_simple_action_new ("zoom-in", NULL);
626716
g_signal_connect_swapped (self->zoom_in, "activate", G_CALLBACK (exm_zoom_picture_zoom_in), self->overlay_screenshot);
627717

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)