@@ -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,69 @@ 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
+ GtkWidget * row ;
303
+
304
+ for (GList * iter = self -> donation_rows_list ; iter != NULL ; iter = g_list_next (iter )) {
305
+ row = GTK_WIDGET (iter -> data );
306
+ adw_expander_row_remove (self -> links_donations , row );
307
+ }
308
+
309
+ g_list_free (self -> donation_rows_list );
310
+ self -> donation_rows_list = NULL ;
311
+ }
312
+
313
+ static void
314
+ new_donation_row (ExmDetailView * self ,
315
+ int num_donation )
316
+ {
317
+ GtkWidget * row ;
318
+ GtkWidget * external_link_icon ;
319
+
320
+ row = adw_action_row_new ();
321
+
322
+ adw_preferences_row_set_title (ADW_PREFERENCES_ROW (row ), self -> uri_donations [num_donation ]);
323
+ gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (row ), TRUE);
324
+
325
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (row ), "detail.open-donation" );
326
+ gtk_actionable_set_action_target_value (GTK_ACTIONABLE (row ), g_variant_new_int32 (num_donation ));
327
+
328
+ external_link_icon = gtk_image_new_from_icon_name ("external-link-symbolic" );
329
+ gtk_widget_add_css_class (external_link_icon , "dim-label" );
330
+ adw_action_row_add_suffix (ADW_ACTION_ROW (row ), external_link_icon );
331
+
332
+ adw_expander_row_add_row (self -> links_donations , row );
333
+
334
+ self -> donation_rows_list = g_list_append (self -> donation_rows_list , row );
335
+ }
336
+
337
+ static void
338
+ update_donation_rows (ExmDetailView * self ,
339
+ gchar * * donation_urls )
340
+ {
341
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), FALSE);
342
+ delete_donation_rows (self );
343
+
344
+ if (donation_urls == NULL || donation_urls [0 ] == NULL )
345
+ return ;
346
+
347
+ self -> uri_donations = g_new0 (gchar * , g_strv_length (donation_urls ));
348
+
349
+ for (int i = 0 ; donation_urls [i ] != NULL ; i ++ )
350
+ {
351
+ self -> uri_donations [i ] = g_uri_resolve_relative (donation_urls [i ],
352
+ "" ,
353
+ G_URI_FLAGS_NONE ,
354
+ NULL );
355
+ new_donation_row (self , i );
356
+ }
357
+
358
+ adw_expander_row_set_expanded (self -> links_donations , FALSE);
359
+ gtk_widget_set_visible (GTK_WIDGET (self -> links_donations ), TRUE);
360
+ }
361
+
296
362
static void
297
363
on_data_loaded (GObject * source ,
298
364
GAsyncResult * result ,
@@ -312,6 +378,7 @@ on_data_loaded (GObject *source,
312
378
gint pk , downloads ;
313
379
gboolean is_installed , is_supported ;
314
380
gchar * uuid , * name , * creator , * icon_uri , * screenshot_uri , * link , * description , * url ;
381
+ gchar * * donation_urls ;
315
382
g_object_get (data ,
316
383
"uuid" , & uuid ,
317
384
"name" , & name ,
@@ -324,6 +391,7 @@ on_data_loaded (GObject *source,
324
391
"pk" , & pk ,
325
392
"url" , & url ,
326
393
"downloads" , & downloads ,
394
+ "donation_urls" , & donation_urls ,
327
395
NULL );
328
396
329
397
adw_window_title_set_title (self -> title , name );
@@ -382,6 +450,8 @@ on_data_loaded (GObject *source,
382
450
G_URI_FLAGS_NONE ,
383
451
NULL );
384
452
453
+ update_donation_rows (self , donation_urls );
454
+
385
455
self -> uri_extensions = g_uri_resolve_relative ("https://extensions.gnome.org/" ,
386
456
link ,
387
457
G_URI_FLAGS_NONE ,
@@ -481,6 +551,12 @@ open_link (ExmDetailView *self,
481
551
uri = gtk_uri_launcher_new (self -> uri_extensions );
482
552
else if (strcmp (action_name , "detail.open-homepage" ) == 0 )
483
553
uri = gtk_uri_launcher_new (self -> uri_homepage );
554
+ else if (strcmp (action_name , "detail.open-donation" ) == 0 )
555
+ {
556
+ guint val ;
557
+ g_variant_get (param , "i" , & val );
558
+ uri = gtk_uri_launcher_new (self -> uri_donations [val ]);
559
+ }
484
560
else
485
561
g_critical ("open_link() invalid action: %s" , action_name );
486
562
@@ -585,6 +661,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
585
661
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_screenshot_popout_button );
586
662
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , ext_info_bar );
587
663
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_homepage );
664
+ gtk_widget_class_bind_template_child (widget_class , ExmDetailView , links_donations );
588
665
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , link_extensions );
589
666
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , scroll_area );
590
667
gtk_widget_class_bind_template_child (widget_class , ExmDetailView , comment_box );
@@ -597,6 +674,7 @@ exm_detail_view_class_init (ExmDetailViewClass *klass)
597
674
598
675
gtk_widget_class_install_action (widget_class , "detail.open-extensions" , NULL , (GtkWidgetActionActivateFunc ) open_link );
599
676
gtk_widget_class_install_action (widget_class , "detail.open-homepage" , NULL , (GtkWidgetActionActivateFunc ) open_link );
677
+ gtk_widget_class_install_action (widget_class , "detail.open-donation" , "i" , (GtkWidgetActionActivateFunc ) open_link );
600
678
}
601
679
602
680
static void
0 commit comments