@@ -74,6 +74,9 @@ struct _ExmDetailView
74
74
75
75
AdwActionRow * link_homepage ;
76
76
gchar * uri_homepage ;
77
+ AdwExpanderRow * links_donations ;
78
+ gchar * * uri_donations ;
79
+ GList * donation_rows_list ;
77
80
AdwActionRow * link_extensions ;
78
81
gchar * uri_extensions ;
79
82
int pk ;
@@ -293,6 +296,66 @@ install_remote (GtkButton *button,
293
296
"(sb)" , self -> uuid , warn );
294
297
}
295
298
299
+ static void
300
+ delete_donation_rows (ExmDetailView * self )
301
+ {
302
+ for (GList * iter = self -> donation_rows_list ; iter != NULL ; iter = g_list_next (iter )) {
303
+ GtkWidget * row = GTK_WIDGET (iter -> data );
304
+ adw_expander_row_remove (self -> links_donations , row );
305
+ }
306
+ g_list_free (self -> donation_rows_list );
307
+ self -> donation_rows_list = NULL ;
308
+ }
309
+
310
+ static void
311
+ new_donation_row (ExmDetailView * self ,
312
+ int num_donation )
313
+ {
314
+ GtkWidget * row ;
315
+ GtkWidget * external_link_icon ;
316
+
317
+ row = adw_action_row_new ();
318
+
319
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row ), self -> uri_donations [num_donation ]);
320
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row ), TRUE);
321
+
322
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row ), "detail.open-donation" );
323
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row ), g_variant_new_int32 (num_donation ));
324
+
325
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic" );
326
+ gtk_widget_add_css_class (external_link_icon , "dim-label" );
327
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row ), external_link_icon );
328
+
329
+ adw_expander_row_add_row (self -> links_donations , row );
330
+
331
+ self -> donation_rows_list = g_list_append (self -> donation_rows_list , row );
332
+ }
333
+
334
+ static void
335
+ update_donation_rows (ExmDetailView * self ,
336
+ gchar * * donation_urls )
337
+ {
338
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), FALSE);
339
+ delete_donation_rows (self );
340
+
341
+ if (donation_urls == NULL || donation_urls [0 ] == NULL )
342
+ return ;
343
+
344
+ self -> uri_donations = g_new0 (gchar * , g_strv_length (donation_urls ));
345
+
346
+ for (int i = 0 ; donation_urls [i ] != NULL ; i ++ )
347
+ {
348
+ self -> uri_donations [i ] = g_uri_resolve_relative (donation_urls [i ],
349
+ "" ,
350
+ G_URI_FLAGS_NONE ,
351
+ NULL );
352
+ new_donation_row (self , i );
353
+ }
354
+
355
+ adw_expander_row_set_expanded (self -> links_donations , FALSE);
356
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), TRUE);
357
+ }
358
+
296
359
static void
297
360
on_data_loaded (GObject * source ,
298
361
GAsyncResult * result ,
@@ -312,6 +375,7 @@ on_data_loaded (GObject *source,
312
375
gint pk , downloads ;
313
376
gboolean is_installed , is_supported ;
314
377
gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
378
+ gchar * * donation_urls ;
315
379
g_object_get (data ,
316
380
"uuid" , & uuid ,
317
381
"name" , & name ,
@@ -324,6 +388,7 @@ on_data_loaded (GObject *source,
324
388
"pk" , & pk ,
325
389
"url" , & url ,
326
390
"downloads" , & downloads ,
391
+ "donation_urls" , & donation_urls ,
327
392
NULL );
328
393
329
394
adw_window_title_set_title (self -> title , name );
@@ -382,6 +447,8 @@ on_data_loaded (GObject *source,
382
447
G_URI_FLAGS_NONE ,
383
448
NULL );
384
449
450
+ update_donation_rows (self , donation_urls );
451
+
385
452
self -> uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/" ,
386
453
link ,
387
454
G_URI_FLAGS_NONE ,
@@ -479,6 +546,12 @@ open_link (ExmDetailView *self,
479
546
uri = gtk_uri_launcher_new (self -> uri_extensions );
480
547
else if (strcmp (action_name , "detail.open-homepage" ) == 0 )
481
548
uri = gtk_uri_launcher_new (self -> uri_homepage );
549
+ else if (strcmp (action_name , "detail.open-donation" ) == 0 )
550
+ {
551
+ guint val ;
552
+ g_variant_get (param , "i" , & val );
553
+ uri = gtk_uri_launcher_new (self -> uri_donations [val ]);
554
+ }
482
555
else
483
556
g_critical ("open_link() invalid action: %s" , action_name );
484
557
@@ -583,6 +656,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
583
656
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_screenshot_popout_button );
584
657
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_info_bar );
585
658
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_homepage );
659
+ gtk_widget_class_bind_template_child (widget_class , ExmDetailView , links_donations );
586
660
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_extensions );
587
661
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , scroll_area );
588
662
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , comment_box );
@@ -595,6 +669,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
595
669
596
670
gtk_widget_class_install_action (widget_class , "detail.open-extensions" , NULL , open_link );
597
671
gtk_widget_class_install_action (widget_class , "detail.open-homepage" , NULL , open_link );
672
+ gtk_widget_class_install_action (widget_class , "detail.open-donation" , "i" , open_link );
598
673
}
599
674
600
675
static void
0 commit comments