Skip to content

Commit 776b684

Browse files
committed
detail-view: Add donation row
1 parent 040486b commit 776b684

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
@@ -182,6 +182,15 @@ template $ExmDetailView : Adw.NavigationPage {
182182
}
183183
}
184184

185+
Adw.ExpanderRow links_donations {
186+
[prefix]
187+
Gtk.Image {
188+
icon-name: "donation-symbolic";
189+
}
190+
191+
title: _("Donate");
192+
}
193+
185194
Adw.ActionRow link_extensions {
186195
[prefix]
187196
Gtk.Image {

src/exm-detail-view.c

Lines changed: 90 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;
@@ -293,6 +296,79 @@ install_remote (GtkButton *button,
293296
"(sb)", self->uuid, warn);
294297
}
295298

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

329407
adw_window_title_set_title (self->title, name);
@@ -382,6 +460,8 @@ on_data_loaded (GObject *source,
382460
G_URI_FLAGS_NONE,
383461
NULL);
384462

463+
update_donation_rows (self, donation_urls);
464+
385465
self->uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/",
386466
link,
387467
G_URI_FLAGS_NONE,
@@ -479,6 +559,12 @@ open_link (ExmDetailView *self,
479559
uri = gtk_uri_launcher_new (self->uri_extensions);
480560
else if (strcmp (action_name, "detail.open-homepage") == 0)
481561
uri = gtk_uri_launcher_new (self->uri_homepage);
562+
else if (strcmp (action_name, "detail.open-donation") == 0)
563+
{
564+
guint val;
565+
g_variant_get (param, "i", &val);
566+
uri = gtk_uri_launcher_new (self->uri_donations[val]);
567+
}
482568
else
483569
g_critical ("open_link() invalid action: %s", action_name);
484570

@@ -583,6 +669,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
583669
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popout_button);
584670
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar);
585671
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
672+
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
586673
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions);
587674
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, scroll_area);
588675
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_box);
@@ -595,6 +682,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
595682

596683
gtk_widget_class_install_action (widget_class, "detail.open-extensions", NULL, open_link);
597684
gtk_widget_class_install_action (widget_class, "detail.open-homepage", NULL, open_link);
685+
gtk_widget_class_install_action (widget_class, "detail.open-donation", "i", open_link);
598686
}
599687

600688
static void
@@ -608,6 +696,8 @@ exm_detail_view_init (ExmDetailView *self)
608696
self->resolver = exm_image_resolver_new ();
609697
self->comment_provider = exm_comment_provider_new ();
610698

699+
self->donation_rows_list = NULL;
700+
611701
g_signal_connect (self->ext_install,
612702
"clicked",
613703
G_CALLBACK (install_remote),

src/exm.gresource.xml.in

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

0 commit comments

Comments
 (0)