@@ -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,79 @@ 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
+ GList * iter ;
303
+
304
+ iter = self -> donation_rows_list ;
305
+
306
+ while (iter != NULL ) {
307
+ GtkWidget * row = GTK_WIDGET (iter -> data );
308
+
309
+ adw_expander_row_remove (self -> links_donations , row );
310
+
311
+ iter = g_list_next (iter );
312
+ }
313
+
314
+ g_list_free (self -> donation_rows_list );
315
+ self -> donation_rows_list = NULL ;
316
+ }
317
+
318
+ static void
319
+ new_donation_row (ExmDetailView * self ,
320
+ int num_donation )
321
+ {
322
+ GtkWidget * row ;
323
+ GtkWidget * external_link_icon ;
324
+
325
+ row = adw_action_row_new ();
326
+
327
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row ), self -> uri_donations [num_donation ]);
328
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row ), TRUE);
329
+
330
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row ), "detail.open-donation" );
331
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row ), g_variant_new_int32 (num_donation ));
332
+
333
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic" );
334
+ gtk_widget_add_css_class (external_link_icon , "dim-label" );
335
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row ), external_link_icon );
336
+
337
+ adw_expander_row_add_row (self -> links_donations , row );
338
+
339
+ self -> donation_rows_list = g_list_append (self -> donation_rows_list , row );
340
+ }
341
+
342
+ static void
343
+ update_donation_rows (ExmDetailView * self ,
344
+ gchar * * donation_urls )
345
+ {
346
+ int donation_urls_length ;
347
+
348
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), FALSE);
349
+ delete_donation_rows (self );
350
+
351
+ donation_urls_length = g_strv_length (donation_urls );
352
+
353
+ if (donation_urls_length > 0 )
354
+ {
355
+ self -> uri_donations = g_new0 (gchar * , donation_urls_length );
356
+
357
+ for (int i = 0 ; i < donation_urls_length ; i ++ )
358
+ {
359
+ self -> uri_donations [i ] = g_uri_resolve_relative (donation_urls [i ],
360
+ "" ,
361
+ G_URI_FLAGS_NONE ,
362
+ NULL );
363
+
364
+ new_donation_row (self , i );
365
+ }
366
+
367
+ adw_expander_row_set_expanded (self -> links_donations , FALSE);
368
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), TRUE);
369
+ }
370
+ }
371
+
296
372
static void
297
373
on_data_loaded (GObject * source ,
298
374
GAsyncResult * result ,
@@ -312,6 +388,7 @@ on_data_loaded (GObject *source,
312
388
gint pk , downloads ;
313
389
gboolean is_installed , is_supported ;
314
390
gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
391
+ gchar * * donation_urls ;
315
392
g_object_get (data ,
316
393
"uuid" , & uuid ,
317
394
"name" , & name ,
@@ -324,6 +401,7 @@ on_data_loaded (GObject *source,
324
401
"pk" , & pk ,
325
402
"url" , & url ,
326
403
"downloads" , & downloads ,
404
+ "donation_urls" , & donation_urls ,
327
405
NULL );
328
406
329
407
adw_window_title_set_title (self -> title , name );
@@ -382,6 +460,8 @@ on_data_loaded (GObject *source,
382
460
G_URI_FLAGS_NONE ,
383
461
NULL );
384
462
463
+ update_donation_rows (self , donation_urls );
464
+
385
465
self -> uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/" ,
386
466
link ,
387
467
G_URI_FLAGS_NONE ,
@@ -479,6 +559,12 @@ open_link (ExmDetailView *self,
479
559
uri = gtk_uri_launcher_new (self -> uri_extensions );
480
560
else if (strcmp (action_name , "detail.open-homepage" ) == 0 )
481
561
uri = gtk_uri_launcher_new (self -> uri_homepage );
562
+ else if (strcmp (action_name , "detail.open-donation" ) == 0 )
563
+ {
564
+ guint val ;
565
+ g_variant_get (param , "i" , & val );
566
+ uri = gtk_uri_launcher_new (self -> uri_donations [val ]);
567
+ }
482
568
else
483
569
g_critical ("open_link() invalid action: %s" , action_name );
484
570
@@ -583,6 +669,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
583
669
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_screenshot_popout_button );
584
670
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_info_bar );
585
671
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_homepage );
672
+ gtk_widget_class_bind_template_child (widget_class , ExmDetailView , links_donations );
586
673
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_extensions );
587
674
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , scroll_area );
588
675
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , comment_box );
@@ -595,6 +682,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
595
682
596
683
gtk_widget_class_install_action (widget_class , "detail.open-extensions" , NULL , open_link );
597
684
gtk_widget_class_install_action (widget_class , "detail.open-homepage" , NULL , open_link );
685
+ gtk_widget_class_install_action (widget_class , "detail.open-donation" , "i" , open_link );
598
686
}
599
687
600
688
static void
@@ -608,6 +696,8 @@ exm_detail_view_init (ExmDetailView *self)
608
696
self -> resolver = exm_image_resolver_new ();
609
697
self -> comment_provider = exm_comment_provider_new ();
610
698
699
+ self -> donation_rows_list = NULL ;
700
+
611
701
g_signal_connect (self -> ext_install ,
612
702
"clicked" ,
613
703
G_CALLBACK (install_remote ),
0 commit comments