From 010f06b7efc68ae750c73c165f91879e30528d58 Mon Sep 17 00:00:00 2001
From: oscfdezdz <42654671+oscfdezdz@users.noreply.github.com>
Date: Thu, 28 Dec 2023 00:09:37 +0100
Subject: [PATCH] detail-view: Add donation row
---
.../scalable/actions/donation-symbolic.svg | 2 +
src/exm-detail-view.blp | 9 ++
src/exm-detail-view.c | 88 +++++++++++++++++++
src/exm.gresource.xml.in | 1 +
4 files changed, 100 insertions(+)
create mode 100644 data/icons/hicolor/scalable/actions/donation-symbolic.svg
diff --git a/data/icons/hicolor/scalable/actions/donation-symbolic.svg b/data/icons/hicolor/scalable/actions/donation-symbolic.svg
new file mode 100644
index 000000000..62328a0f5
--- /dev/null
+++ b/data/icons/hicolor/scalable/actions/donation-symbolic.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/exm-detail-view.blp b/src/exm-detail-view.blp
index 00a4f318a..6f23e2ef1 100644
--- a/src/exm-detail-view.blp
+++ b/src/exm-detail-view.blp
@@ -201,6 +201,15 @@ template $ExmDetailView : Adw.NavigationPage {
}
}
+ Adw.ExpanderRow links_donations {
+ [prefix]
+ Gtk.Image {
+ icon-name: "donation-symbolic";
+ }
+
+ title: _("Donate");
+ }
+
Adw.ActionRow link_extensions {
[prefix]
Gtk.Image {
diff --git a/src/exm-detail-view.c b/src/exm-detail-view.c
index 9211de3d6..a0c9840bf 100644
--- a/src/exm-detail-view.c
+++ b/src/exm-detail-view.c
@@ -74,6 +74,9 @@ struct _ExmDetailView
AdwActionRow *link_homepage;
gchar *uri_homepage;
+ AdwExpanderRow *links_donations;
+ gchar **uri_donations;
+ GList *donation_rows_list;
AdwActionRow *link_extensions;
gchar *uri_extensions;
int pk;
@@ -269,6 +272,78 @@ install_remote (GtkButton *button,
"(sb)", self->uuid, warn);
}
+static void
+delete_donation_rows (ExmDetailView *self)
+{
+ GList *iter = self->donation_rows_list;
+
+ while (iter != NULL) {
+ GtkWidget *row = GTK_WIDGET (iter->data);
+
+ adw_expander_row_remove (self->links_donations, row);
+
+ iter = g_list_next (iter);
+ }
+
+ g_list_free (self->donation_rows_list);
+ self->donation_rows_list = NULL;
+}
+
+static void
+new_donation_row (ExmDetailView *self,
+ int num_donation)
+{
+ GtkWidget *row;
+ GtkWidget *external_link_icon;
+
+ row = adw_action_row_new ();
+
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), self->uri_donations[num_donation]);
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
+
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row), "detail.open-donation");
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row), g_variant_new_int32 (num_donation));
+
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic");
+ gtk_widget_add_css_class (external_link_icon, "dim-label");
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row), external_link_icon);
+
+ adw_expander_row_add_row (self->links_donations, row);
+
+ self->donation_rows_list = g_list_append (self->donation_rows_list, row);
+}
+
+static void
+update_donation_rows (ExmDetailView *self,
+ gchar **donation_urls)
+{
+ int donation_urls_length;
+ int i;
+
+ gtk_widget_set_visible (GTK_WIDGET (self->links_donations), FALSE);
+ g_strfreev (self->uri_donations);
+ delete_donation_rows (self);
+
+ donation_urls_length = g_strv_length (donation_urls);
+ self->uri_donations = g_new0 (gchar *, donation_urls_length);
+
+ if (donation_urls_length > 0)
+ {
+ gtk_widget_set_visible (GTK_WIDGET (self->links_donations), TRUE);
+ adw_expander_row_set_expanded (self->links_donations, FALSE);
+
+ for (i = 0; i < donation_urls_length; i++)
+ {
+ self->uri_donations[i] = g_uri_resolve_relative (donation_urls[i],
+ "",
+ G_URI_FLAGS_NONE,
+ NULL);
+
+ new_donation_row (self, i);
+ }
+ }
+}
+
static void
on_data_loaded (GObject *source,
GAsyncResult *result,
@@ -290,6 +365,7 @@ on_data_loaded (GObject *source,
gint pk, downloads;
gboolean is_installed, is_supported;
gchar *uuid, *name, *creator, *icon_uri, *screenshot_uri, *link, *description, *url;
+ gchar **donation_urls;
g_object_get (data,
"uuid", &uuid,
"name", &name,
@@ -302,6 +378,7 @@ on_data_loaded (GObject *source,
"pk", &pk,
"url", &url,
"downloads", &downloads,
+ "donation_urls", &donation_urls,
NULL);
adw_window_title_set_title (self->title, name);
@@ -352,6 +429,8 @@ on_data_loaded (GObject *source,
G_URI_FLAGS_NONE,
NULL);
+ update_donation_rows (self, donation_urls);
+
self->uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/",
link,
G_URI_FLAGS_NONE,
@@ -464,6 +543,12 @@ open_link (ExmDetailView *self,
uri = gtk_uri_launcher_new (self->uri_extensions);
else if (strcmp (action_name, "detail.open-homepage") == 0)
uri = gtk_uri_launcher_new (self->uri_homepage);
+ else if (strcmp (action_name, "detail.open-donation") == 0)
+ {
+ guint val;
+ g_variant_get (param, "i", &val);
+ uri = gtk_uri_launcher_new (self->uri_donations[val]);
+ }
else
g_critical ("open_link() invalid action: %s", action_name);
@@ -557,6 +642,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_screenshot_popin_button);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, ext_info_bar);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
+ gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, scroll_area);
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, comment_box);
@@ -590,6 +676,8 @@ exm_detail_view_init (ExmDetailView *self)
self->resolver = exm_image_resolver_new ();
self->comment_provider = exm_comment_provider_new ();
+ self->donation_rows_list = NULL;
+
self->zoom_in = g_simple_action_new ("zoom-in", NULL);
g_signal_connect_swapped (self->zoom_in, "activate", G_CALLBACK (exm_zoom_picture_zoom_in), self->overlay_screenshot);
diff --git a/src/exm.gresource.xml.in b/src/exm.gresource.xml.in
index e1b7605e3..14d2e24d8 100644
--- a/src/exm.gresource.xml.in
+++ b/src/exm.gresource.xml.in
@@ -23,6 +23,7 @@
../data/icons/hicolor/scalable/actions/clock-alt-symbolic.svg
../data/icons/hicolor/scalable/actions/dialog-error-symbolic.svg
+ ../data/icons/hicolor/scalable/actions/donation-symbolic.svg
../data/icons/hicolor/scalable/actions/external-link-symbolic.svg
../data/icons/hicolor/scalable/actions/globe-symbolic.svg
../data/icons/hicolor/scalable/actions/go-next-symbolic.svg