summaryrefslogtreecommitdiff
path: root/gladeui
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-08-24 17:48:05 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2020-08-24 17:50:24 -0300
commitc3c577f0c91e1e1285435031b718e5107e95a9bc (patch)
treedb368cff9c0c6595f4a0ae0dd14046929c94b0d8 /gladeui
parentfb27376d896d6b10e7d63efb0352f1b4318980a9 (diff)
downloadglade-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.c99
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