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