@@ -75,6 +75,9 @@ struct _ExmDetailView
75
75
76
76
AdwActionRow * link_homepage ;
77
77
gchar * uri_homepage ;
78
+ AdwExpanderRow * links_donations ;
79
+ gchar * * uri_donations ;
80
+ GList * donation_rows_list ;
78
81
AdwActionRow * link_extensions ;
79
82
gchar * uri_extensions ;
80
83
int pk ;
@@ -292,6 +295,79 @@ install_remote (GtkButton *button,
292
295
"(sb)" , self -> uuid , warn );
293
296
}
294
297
298
+ static void
299
+ delete_donation_rows (ExmDetailView * self )
300
+ {
301
+ GList * iter ;
302
+
303
+ iter = self -> donation_rows_list ;
304
+
305
+ while (iter != NULL ) {
306
+ GtkWidget * row = GTK_WIDGET (iter -> data );
307
+
308
+ adw_expander_row_remove (self -> links_donations , row );
309
+
310
+ iter = g_list_next (iter );
311
+ }
312
+
313
+ g_list_free (self -> donation_rows_list );
314
+ self -> donation_rows_list = NULL ;
315
+ }
316
+
317
+ static void
318
+ new_donation_row (ExmDetailView * self ,
319
+ int num_donation )
320
+ {
321
+ GtkWidget * row ;
322
+ GtkWidget * external_link_icon ;
323
+
324
+ row = adw_action_row_new ();
325
+
326
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row ), self -> uri_donations [num_donation ]);
327
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row ), TRUE);
328
+
329
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row ), "detail.open-donation" );
330
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row ), g_variant_new_int32 (num_donation ));
331
+
332
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic" );
333
+ gtk_widget_add_css_class (external_link_icon , "dim-label" );
334
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row ), external_link_icon );
335
+
336
+ adw_expander_row_add_row (self -> links_donations , row );
337
+
338
+ self -> donation_rows_list = g_list_append (self -> donation_rows_list , row );
339
+ }
340
+
341
+ static void
342
+ update_donation_rows (ExmDetailView * self ,
343
+ gchar * * donation_urls )
344
+ {
345
+ int donation_urls_length ;
346
+
347
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), FALSE);
348
+ delete_donation_rows (self );
349
+
350
+ donation_urls_length = g_strv_length (donation_urls );
351
+
352
+ if (donation_urls_length > 0 )
353
+ {
354
+ self -> uri_donations = g_new0 (gchar * , donation_urls_length );
355
+
356
+ for (int i = 0 ; i < donation_urls_length ; i ++ )
357
+ {
358
+ self -> uri_donations [i ] = g_uri_resolve_relative (donation_urls [i ],
359
+ "" ,
360
+ G_URI_FLAGS_NONE ,
361
+ NULL );
362
+
363
+ new_donation_row (self , i );
364
+ }
365
+
366
+ adw_expander_row_set_expanded (self -> links_donations , FALSE);
367
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), TRUE);
368
+ }
369
+ }
370
+
295
371
static void
296
372
on_data_loaded (GObject * source ,
297
373
GAsyncResult * result ,
@@ -313,6 +389,7 @@ on_data_loaded (GObject *source,
313
389
gint pk , downloads ;
314
390
gboolean is_installed , is_supported ;
315
391
gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
392
+ gchar * * donation_urls ;
316
393
g_object_get (data ,
317
394
"uuid" , & uuid ,
318
395
"name" , & name ,
@@ -325,6 +402,7 @@ on_data_loaded (GObject *source,
325
402
"pk" , & pk ,
326
403
"url" , & url ,
327
404
"downloads" , & downloads ,
405
+ "donation_urls" , & donation_urls ,
328
406
NULL );
329
407
330
408
adw_window_title_set_title (self -> title , name );
@@ -383,6 +461,8 @@ on_data_loaded (GObject *source,
383
461
G_URI_FLAGS_NONE ,
384
462
NULL );
385
463
464
+ update_donation_rows (self , donation_urls );
465
+
386
466
self -> uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/" ,
387
467
link ,
388
468
G_URI_FLAGS_NONE ,
@@ -495,6 +575,12 @@ open_link (ExmDetailView *self,
495
575
uri = gtk_uri_launcher_new (self -> uri_extensions );
496
576
else if (strcmp (action_name , "detail.open-homepage" ) == 0 )
497
577
uri = gtk_uri_launcher_new (self -> uri_homepage );
578
+ else if (strcmp (action_name , "detail.open-donation" ) == 0 )
579
+ {
580
+ guint val ;
581
+ g_variant_get (param , "i" , & val );
582
+ uri = gtk_uri_launcher_new (self -> uri_donations [val ]);
583
+ }
498
584
else
499
585
g_critical ("open_link() invalid action: %s" , action_name );
500
586
@@ -589,6 +675,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
589
675
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_screenshot_popin_button );
590
676
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_info_bar );
591
677
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_homepage );
678
+ gtk_widget_class_bind_template_child (widget_class , ExmDetailView , links_donations );
592
679
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_extensions );
593
680
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , scroll_area );
594
681
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , comment_box );
@@ -599,6 +686,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
599
686
600
687
gtk_widget_class_install_action (widget_class , "detail.open-extensions" , NULL , open_link );
601
688
gtk_widget_class_install_action (widget_class , "detail.open-homepage" , NULL , open_link );
689
+ gtk_widget_class_install_action (widget_class , "detail.open-donation" , "i" , open_link );
602
690
}
603
691
604
692
static void
@@ -622,6 +710,8 @@ exm_detail_view_init (ExmDetailView *self)
622
710
self -> resolver = exm_image_resolver_new ();
623
711
self -> comment_provider = exm_comment_provider_new ();
624
712
713
+ self -> donation_rows_list = NULL ;
714
+
625
715
self -> zoom_in = g_simple_action_new ("zoom-in" , NULL );
626
716
g_signal_connect_swapped (self -> zoom_in , "activate" , G_CALLBACK (exm_zoom_picture_zoom_in ), self -> overlay_screenshot );
627
717
0 commit comments