Skip to content

Commit 1fc2789

Browse files
authored
Merge pull request #956 from mjakeman/donations-fixes
Donations fixes
2 parents 49da4f1 + 1ce131c commit 1fc2789

3 files changed

Lines changed: 69 additions & 12 deletions

File tree

src/exm-detail-view.blp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,21 @@ template $ExmDetailView: Adw.NavigationPage {
266266
}
267267
}
268268

269+
Adw.ActionRow link_donation {
270+
[prefix]
271+
Gtk.Image {
272+
icon-name: "donation-symbolic";
273+
}
274+
275+
title: _("Donate");
276+
activatable: true;
277+
278+
[suffix]
279+
Gtk.Image {
280+
icon-name: "external-link-symbolic";
281+
}
282+
}
283+
269284
Adw.ExpanderRow links_donations {
270285
[prefix]
271286
Gtk.Image {

src/exm-detail-view.c

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ struct _ExmDetailView
8282

8383
AdwActionRow *link_homepage;
8484
gchar *uri_homepage;
85+
AdwActionRow *link_donation;
8586
AdwExpanderRow *links_donations;
8687
gchar **uri_donations;
8788
GList *donation_rows_list;
@@ -340,7 +341,7 @@ new_donation_row (ExmDetailView *self,
340341
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row), self->uri_donations[num_donation]);
341342
gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row), TRUE);
342343

343-
gtk_actionable_set_action_name (GTK_ACTIONABLE (row), "detail.open-donation");
344+
gtk_actionable_set_action_name (GTK_ACTIONABLE (row), "detail.open-donations");
344345
gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row), g_variant_new_int32 (num_donation));
345346

346347
external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic");
@@ -365,25 +366,41 @@ static void
365366
update_donation_rows (ExmDetailView *self,
366367
gchar **donation_urls)
367368
{
369+
guint n_urls;
370+
371+
gtk_widget_set_visible (GTK_WIDGET (self->link_donation), FALSE);
368372
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), FALSE);
369373
delete_donation_rows (self);
370374

371375
if (donation_urls == NULL || donation_urls[0] == NULL)
372376
return;
373377

374-
self->uri_donations = g_new0 (gchar *, g_strv_length (donation_urls));
378+
n_urls = g_strv_length (donation_urls);
379+
380+
self->uri_donations = g_new0 (gchar *, n_urls);
375381

376-
for (int i = 0; donation_urls[i] != NULL; i++)
382+
for (guint i = 0; donation_urls[i] != NULL; i++)
377383
{
378384
self->uri_donations[i] = g_uri_resolve_relative (donation_urls[i],
379385
"",
380386
G_URI_FLAGS_NONE,
381387
NULL);
382-
new_donation_row (self, i);
383388
}
384389

385-
adw_expander_row_set_expanded (self->links_donations, FALSE);
386-
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), TRUE);
390+
if (n_urls == 1)
391+
{
392+
adw_action_row_set_subtitle (self->link_donation, self->uri_donations[0]);
393+
gtk_actionable_set_action_name (GTK_ACTIONABLE (self->link_donation), "detail.open-donation");
394+
gtk_widget_set_visible (GTK_WIDGET (self->link_donation), TRUE);
395+
}
396+
else
397+
{
398+
for (guint i = 0; donation_urls[i] != NULL; i++)
399+
new_donation_row (self, i);
400+
401+
adw_expander_row_set_expanded (self->links_donations, FALSE);
402+
gtk_widget_set_visible (GTK_WIDGET (self->links_donations), TRUE);
403+
}
387404
}
388405

389406
static gchar *
@@ -782,12 +799,16 @@ open_link (ExmDetailView *self,
782799
{
783800
uri = gtk_uri_launcher_new (self->uri_homepage);
784801
}
785-
else if (strcmp (action_name, "detail.open-donation") == 0)
802+
else if (strcmp (action_name, "detail.open-donations") == 0)
786803
{
787804
guint val;
788805
g_variant_get (param, "i", &val);
789806
uri = gtk_uri_launcher_new (self->uri_donations[val]);
790807
}
808+
else if (strcmp (action_name, "detail.open-donation") == 0)
809+
{
810+
uri = gtk_uri_launcher_new (self->uri_donations[0]);
811+
}
791812
else
792813
{
793814
g_critical ("open_link() invalid action: %s", action_name);
@@ -904,6 +925,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
904925
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, session_modes_row);
905926
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, session_modes_label);
906927
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_homepage);
928+
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_donation);
907929
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, links_donations);
908930
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, link_extensions);
909931
gtk_widget_class_bind_template_child (widget_class, ExmDetailView, scroll_area);
@@ -918,7 +940,8 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
918940
gtk_widget_class_install_action (widget_class, "detail.show-versions", NULL, show_versions);
919941
gtk_widget_class_install_action (widget_class, "detail.open-extensions", NULL, (GtkWidgetActionActivateFunc) open_link);
920942
gtk_widget_class_install_action (widget_class, "detail.open-homepage", NULL, (GtkWidgetActionActivateFunc) open_link);
921-
gtk_widget_class_install_action (widget_class, "detail.open-donation", "i", (GtkWidgetActionActivateFunc) open_link);
943+
gtk_widget_class_install_action (widget_class, "detail.open-donations", "i", (GtkWidgetActionActivateFunc) open_link);
944+
gtk_widget_class_install_action (widget_class, "detail.open-donation", NULL, (GtkWidgetActionActivateFunc) open_link);
922945
}
923946

924947
static void

src/local/exm-manager.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ parse_single_extension (ExmExtension **extension,
547547
gboolean is_user = FALSE;
548548
ExmExtensionType type = EXM_EXTENSION_TYPE_SYSTEM;
549549
GPtrArray *session_modes = g_ptr_array_new_with_free_func (g_free);
550-
GHashTable *donations = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
550+
GHashTable *donations = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref);
551551

552552
if (extension && *extension)
553553
{
@@ -643,12 +643,31 @@ parse_single_extension (ExmExtension **extension,
643643
else if (g_strcmp0 (prop_name, "donations") == 0)
644644
{
645645
GVariantIter iter;
646+
GVariant *donation_entry;
646647
gchar *key;
647648
g_variant_iter_init (&iter, prop_value);
648-
while (g_variant_iter_loop (&iter, "{sv}", &key, &prop_value))
649+
650+
while (g_variant_iter_loop (&iter, "{sv}", &key, &donation_entry))
649651
{
650-
const gchar *donation_value = g_variant_get_string (prop_value, NULL);
651-
g_hash_table_insert (donations, g_strdup (key), g_strdup (donation_value));
652+
GPtrArray *usernames = g_ptr_array_new_with_free_func (g_free);
653+
654+
if (g_variant_is_of_type (donation_entry, G_VARIANT_TYPE_STRING))
655+
{
656+
g_ptr_array_add (usernames, g_variant_dup_string (donation_entry, NULL));
657+
}
658+
else if (g_variant_is_container (donation_entry))
659+
{
660+
for (gsize j = 0; j < g_variant_n_children (donation_entry); j++)
661+
{
662+
GVariant *child_v = g_variant_get_child_value (donation_entry, j);
663+
GVariant *child_s = g_variant_get_variant (child_v);
664+
g_ptr_array_add (usernames, g_variant_dup_string (child_s, NULL));
665+
g_variant_unref (child_s);
666+
g_variant_unref (child_v);
667+
}
668+
}
669+
670+
g_hash_table_insert (donations, g_strdup (key), usernames);
652671
}
653672
}
654673
}

0 commit comments

Comments
 (0)