diff options
author | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2020-08-24 17:48:05 -0300 |
---|---|---|
committer | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2020-08-24 17:50:24 -0300 |
commit | c3c577f0c91e1e1285435031b718e5107e95a9bc (patch) | |
tree | db368cff9c0c6595f4a0ae0dd14046929c94b0d8 /gladeui | |
parent | fb27376d896d6b10e7d63efb0352f1b4318980a9 (diff) | |
download | glade-c3c577f0c91e1e1285435031b718e5107e95a9bc.tar.gz |
GladeWidgetAdaptorChooser: update automatically
Update choosers when a new adaptor is registered
Diffstat (limited to 'gladeui')
-rw-r--r-- | gladeui/glade-adaptor-chooser.c | 99 |
1 files changed, 83 insertions, 16 deletions
diff --git a/gladeui/glade-adaptor-chooser.c b/gladeui/glade-adaptor-chooser.c index 2249b6f5..f7b2b09d 100644 --- a/gladeui/glade-adaptor-chooser.c +++ b/gladeui/glade-adaptor-chooser.c @@ -36,7 +36,11 @@ typedef struct GtkLabel *class_label; GtkWidget *all_button; + GtkWidget *others_chooser; + GtkWidget *all_chooser; GList *choosers; + + gboolean needs_update; } GladeAdaptorChooserPrivate; struct _GladeAdaptorChooser @@ -142,13 +146,17 @@ on_adaptor_selected (GtkWidget *widget, static void glade_adaptor_chooser_button_add_chooser (GtkWidget *button, GtkWidget *chooser) { - GtkWidget *popover; + GtkPopover *popover = gtk_menu_button_get_popover (GTK_MENU_BUTTON (button)); + + if (!popover) + { + popover = GTK_POPOVER (gtk_popover_new (button)); + gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), + GTK_WIDGET (popover)); + } - popover = gtk_popover_new (button); gtk_container_add (GTK_CONTAINER (popover), chooser); gtk_widget_show (chooser); - - gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), popover); } static GtkWidget * @@ -213,33 +221,92 @@ button_box_populate_from_catalog (GladeAdaptorChooser *chooser, } static void -glade_adaptor_chooser_constructed (GObject *object) +remove_chooser_widget (GladeAdaptorChooser *chooser, GtkWidget *widget) { - GladeAdaptorChooser *chooser = GLADE_ADAPTOR_CHOOSER (object); - GladeAdaptorChooserPrivate *priv = GET_PRIVATE (object); - GtkWidget *others_chooser, *all_chooser; + if (widget) + { + GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser); + priv->choosers = g_list_remove (priv->choosers, widget); + gtk_widget_destroy (widget); + } +} + +static void +update_all_others_chooser (GladeAdaptorChooser *chooser) +{ + GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser); GladeCatalog *gtk_catalog; GList *l; - /* GTK+ catalog goes first subdivided by group */ + priv->needs_update = FALSE; + gtk_catalog = glade_app_get_catalog ("gtk+"); - button_box_populate_from_catalog (chooser, gtk_catalog); - others_chooser = glade_adaptor_chooser_add_chooser (chooser, TRUE); - all_chooser = glade_adaptor_chooser_add_chooser (chooser, TRUE); - glade_adaptor_chooser_button_add_chooser (priv->others_button, others_chooser); - glade_adaptor_chooser_button_add_chooser (priv->all_button, all_chooser); + remove_chooser_widget (chooser, priv->others_chooser); + remove_chooser_widget (chooser, priv->all_chooser); + + priv->others_chooser = glade_adaptor_chooser_add_chooser (chooser, TRUE); + priv->all_chooser = glade_adaptor_chooser_add_chooser (chooser, TRUE); + + glade_adaptor_chooser_button_add_chooser (priv->others_button, priv->others_chooser); + glade_adaptor_chooser_button_add_chooser (priv->all_button, priv->all_chooser); /* then the rest */ for (l = glade_app_get_catalogs (); l; l = g_list_next (l)) { GladeCatalog *catalog = l->data; - _glade_adaptor_chooser_widget_add_catalog (GLADE_ADAPTOR_CHOOSER_WIDGET (all_chooser), catalog); + _glade_adaptor_chooser_widget_add_catalog (GLADE_ADAPTOR_CHOOSER_WIDGET (priv->all_chooser), catalog); if (catalog != gtk_catalog) - _glade_adaptor_chooser_widget_add_catalog (GLADE_ADAPTOR_CHOOSER_WIDGET (others_chooser), catalog); + _glade_adaptor_chooser_widget_add_catalog (GLADE_ADAPTOR_CHOOSER_WIDGET (priv->others_chooser), catalog); } + + _glade_adaptor_chooser_widget_set_project (GLADE_ADAPTOR_CHOOSER_WIDGET (priv->others_chooser), priv->project); + _glade_adaptor_chooser_widget_set_project (GLADE_ADAPTOR_CHOOSER_WIDGET (priv->all_chooser), priv->project); +} + +static void +on_widget_adaptor_registered (GladeApp *app, + GladeWidgetAdaptor *adaptor, + GladeAdaptorChooser *chooser) +{ + GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser); + priv->needs_update = TRUE; +} + +static void +on_button_clicked (GtkButton *button, GladeAdaptorChooser *chooser) +{ + GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser); + + if (priv->needs_update) + update_all_others_chooser (chooser); +} + +static void +glade_adaptor_chooser_constructed (GObject *object) +{ + GladeAdaptorChooser *chooser = GLADE_ADAPTOR_CHOOSER (object); + GladeAdaptorChooserPrivate *priv = GET_PRIVATE (chooser); + GladeCatalog *gtk_catalog; + + /* GTK+ catalog goes first subdivided by group */ + gtk_catalog = glade_app_get_catalog ("gtk+"); + button_box_populate_from_catalog (chooser, gtk_catalog); + + update_all_others_chooser (chooser); + + g_signal_connect (glade_app_get(), "widget-adaptor-registered", + G_CALLBACK (on_widget_adaptor_registered), + chooser); + + g_signal_connect (priv->others_button, "clicked", + G_CALLBACK (on_button_clicked), + chooser); + g_signal_connect (priv->all_button, "clicked", + G_CALLBACK (on_button_clicked), + chooser); } static void |