@@ -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 ;
@@ -269,6 +272,80 @@ install_remote (GtkButton *button,
269
272
"(sb)" , self -> uuid , warn );
270
273
}
271
274
275
+ static void
276
+ delete_donation_rows (ExmDetailView * self )
277
+ {
278
+ GList * iter ;
279
+
280
+ iter = self -> donation_rows_list ;
281
+
282
+ while (iter != NULL ) {
283
+ GtkWidget * row = GTK_WIDGET (iter -> data );
284
+
285
+ adw_expander_row_remove (self -> links_donations , row );
286
+
287
+ iter = g_list_next (iter );
288
+ }
289
+
290
+ g_list_free (self -> donation_rows_list );
291
+ self -> donation_rows_list = NULL ;
292
+ }
293
+
294
+ static void
295
+ new_donation_row (ExmDetailView * self ,
296
+ int num_donation )
297
+ {
298
+ GtkWidget * row ;
299
+ GtkWidget * external_link_icon ;
300
+
301
+ row = adw_action_row_new ();
302
+
303
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row ), self -> uri_donations [num_donation ]);
304
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row ), TRUE);
305
+
306
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row ), "detail.open-donation" );
307
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row ), g_variant_new_int32 (num_donation ));
308
+
309
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic" );
310
+ gtk_widget_add_css_class (external_link_icon , "dim-label" );
311
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row ), external_link_icon );
312
+
313
+ adw_expander_row_add_row (self -> links_donations , row );
314
+
315
+ self -> donation_rows_list = g_list_append (self -> donation_rows_list , row );
316
+ }
317
+
318
+ static void
319
+ update_donation_rows (ExmDetailView * self ,
320
+ gchar * * donation_urls )
321
+ {
322
+ int donation_urls_length ;
323
+
324
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), FALSE);
325
+ g_strfreev (self -> uri_donations );
326
+ delete_donation_rows (self );
327
+
328
+ donation_urls_length = g_strv_length (donation_urls );
329
+
330
+ if (donation_urls_length > 0 )
331
+ {
332
+ self -> uri_donations = g_new0 (gchar * , donation_urls_length );
333
+
334
+ for (int i = 0 ; i < donation_urls_length ; i ++ )
335
+ {
336
+ self -> uri_donations [i ] = g_uri_resolve_relative (donation_urls [i ],
337
+ "" ,
338
+ G_URI_FLAGS_NONE ,
339
+ NULL );
340
+
341
+ new_donation_row (self , i );
342
+ }
343
+
344
+ adw_expander_row_set_expanded (self -> links_donations , FALSE);
345
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), TRUE);
346
+ }
347
+ }
348
+
272
349
static void
273
350
on_data_loaded (GObject * source ,
274
351
GAsyncResult * result ,
@@ -290,6 +367,7 @@ on_data_loaded (GObject *source,
290
367
gint pk , downloads ;
291
368
gboolean is_installed , is_supported ;
292
369
gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
370
+ gchar * * donation_urls ;
293
371
g_object_get (data ,
294
372
"uuid" , & uuid ,
295
373
"name" , & name ,
@@ -302,6 +380,7 @@ on_data_loaded (GObject *source,
302
380
"pk" , & pk ,
303
381
"url" , & url ,
304
382
"downloads" , & downloads ,
383
+ "donation_urls" , & donation_urls ,
305
384
NULL );
306
385
307
386
adw_window_title_set_title (self -> title , name );
@@ -352,6 +431,8 @@ on_data_loaded (GObject *source,
352
431
G_URI_FLAGS_NONE ,
353
432
NULL );
354
433
434
+ update_donation_rows (self , donation_urls );
435
+
355
436
self -> uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/" ,
356
437
link ,
357
438
G_URI_FLAGS_NONE ,
@@ -464,6 +545,12 @@ open_link (ExmDetailView *self,
464
545
uri = gtk_uri_launcher_new (self -> uri_extensions );
465
546
else if (strcmp (action_name , "detail.open-homepage" ) == 0 )
466
547
uri = gtk_uri_launcher_new (self -> uri_homepage );
548
+ else if (strcmp (action_name , "detail.open-donation" ) == 0 )
549
+ {
550
+ guint val ;
551
+ g_variant_get (param , "i" , & val );
552
+ uri = gtk_uri_launcher_new (self -> uri_donations [val ]);
553
+ }
467
554
else
468
555
g_critical ("open_link() invalid action: %s" , action_name );
469
556
@@ -557,6 +644,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
557
644
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_screenshot_popin_button );
558
645
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_info_bar );
559
646
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_homepage );
647
+ gtk_widget_class_bind_template_child (widget_class , ExmDetailView , links_donations );
560
648
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_extensions );
561
649
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , scroll_area );
562
650
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , comment_box );
@@ -567,6 +655,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
567
655
568
656
gtk_widget_class_install_action (widget_class , "detail.open-extensions" , NULL , open_link );
569
657
gtk_widget_class_install_action (widget_class , "detail.open-homepage" , NULL , open_link );
658
+ gtk_widget_class_install_action (widget_class , "detail.open-donation" , "i" , open_link );
570
659
}
571
660
572
661
static void
@@ -590,6 +679,8 @@ exm_detail_view_init (ExmDetailView *self)
590
679
self -> resolver = exm_image_resolver_new ();
591
680
self -> comment_provider = exm_comment_provider_new ();
592
681
682
+ self -> donation_rows_list = NULL ;
683
+
593
684
self -> zoom_in = g_simple_action_new ("zoom-in" , NULL );
594
685
g_signal_connect_swapped (self -> zoom_in , "activate" , G_CALLBACK (exm_zoom_picture_zoom_in ), self -> overlay_screenshot );
595
686
0 commit comments