[tepl] StyleSchemeChooserWidget: listen to scheme manager changes
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] StyleSchemeChooserWidget: listen to scheme manager changes
- Date: Thu, 23 Apr 2020 13:33:09 +0000 (UTC)
commit 1bdd35bc8618b5b4bca756478d3238005feba164
Author: Sébastien Wilmet <swilmet gnome org>
Date: Thu Apr 23 14:17:31 2020 +0200
StyleSchemeChooserWidget: listen to scheme manager changes
tepl/tepl-style-scheme-chooser-widget.c | 78 +++++++++++++++++++++++++++++++--
1 file changed, 74 insertions(+), 4 deletions(-)
---
diff --git a/tepl/tepl-style-scheme-chooser-widget.c b/tepl/tepl-style-scheme-chooser-widget.c
index e2c2b9c..1db3b46 100644
--- a/tepl/tepl-style-scheme-chooser-widget.c
+++ b/tepl/tepl-style-scheme-chooser-widget.c
@@ -60,6 +60,21 @@ G_DEFINE_TYPE_WITH_CODE (TeplStyleSchemeChooserWidget,
G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_STYLE_SCHEME_CHOOSER,
gtk_source_style_scheme_chooser_interface_init))
+static void
+clear_list_box_foreach_cb (GtkWidget *child,
+ gpointer user_data)
+{
+ gtk_widget_destroy (child);
+}
+
+static void
+clear_list_box (GtkListBox *list_box)
+{
+ gtk_container_foreach (GTK_CONTAINER (list_box),
+ clear_list_box_foreach_cb,
+ NULL);
+}
+
static void
list_box_row_set_style_scheme (GtkListBoxRow *list_box_row,
GtkSourceStyleScheme *style_scheme)
@@ -313,6 +328,7 @@ append_style_scheme_to_list_box (TeplStyleSchemeChooserWidget *chooser,
list_box_row = gtk_list_box_row_new ();
gtk_container_add (GTK_CONTAINER (list_box_row), label);
list_box_row_set_style_scheme (GTK_LIST_BOX_ROW (list_box_row), style_scheme);
+ gtk_widget_show_all (list_box_row);
gtk_list_box_insert (chooser->priv->list_box, list_box_row, -1);
@@ -320,7 +336,7 @@ append_style_scheme_to_list_box (TeplStyleSchemeChooserWidget *chooser,
}
static void
-fill_list_box (TeplStyleSchemeChooserWidget *chooser)
+populate_list_box (TeplStyleSchemeChooserWidget *chooser)
{
GtkSourceStyleSchemeManager *manager;
const gchar * const *scheme_ids;
@@ -345,13 +361,66 @@ fill_list_box (TeplStyleSchemeChooserWidget *chooser)
}
static void
-list_box_selected_rows_changed_cb (GtkListBox *list_box,
- TeplStyleSchemeChooserWidget *chooser)
+notify_properties (TeplStyleSchemeChooserWidget *chooser)
{
g_object_notify (G_OBJECT (chooser), "style-scheme");
g_object_notify (G_OBJECT (chooser), "tepl-style-scheme-id");
}
+static void
+list_box_selected_rows_changed_cb (GtkListBox *list_box,
+ TeplStyleSchemeChooserWidget *chooser)
+{
+ notify_properties (chooser);
+}
+
+static void
+style_scheme_manager_notify_scheme_ids_cb (GtkSourceStyleSchemeManager *manager,
+ GParamSpec *pspec,
+ TeplStyleSchemeChooserWidget *chooser)
+{
+ gchar *style_scheme_id;
+
+ g_signal_handlers_block_by_func (chooser->priv->list_box,
+ list_box_selected_rows_changed_cb,
+ chooser);
+
+ style_scheme_id = tepl_style_scheme_chooser_widget_get_style_scheme_id (chooser);
+
+ clear_list_box (chooser->priv->list_box);
+ populate_list_box (chooser);
+
+ /* Note that the style_scheme_id may no longer exist, in which case no
+ * rows will be selected.
+ */
+ tepl_style_scheme_chooser_widget_set_style_scheme_id (chooser, style_scheme_id);
+
+ scroll_to_selected_row (chooser->priv->list_box);
+
+ g_signal_handlers_unblock_by_func (chooser->priv->list_box,
+ list_box_selected_rows_changed_cb,
+ chooser);
+
+ /* Notify properies in all cases, even if no rows are selected. */
+ notify_properties (chooser);
+
+ g_free (style_scheme_id);
+}
+
+static void
+listen_to_scheme_manager_changes (TeplStyleSchemeChooserWidget *chooser)
+{
+ GtkSourceStyleSchemeManager *manager;
+
+ manager = gtk_source_style_scheme_manager_get_default ();
+
+ g_signal_connect_object (manager,
+ "notify::scheme-ids",
+ G_CALLBACK (style_scheme_manager_notify_scheme_ids_cb),
+ chooser,
+ 0);
+}
+
static void
tepl_style_scheme_chooser_widget_init (TeplStyleSchemeChooserWidget *chooser)
{
@@ -363,7 +432,8 @@ tepl_style_scheme_chooser_widget_init (TeplStyleSchemeChooserWidget *chooser)
chooser->priv->list_box = GTK_LIST_BOX (gtk_list_box_new ());
gtk_list_box_set_selection_mode (chooser->priv->list_box, GTK_SELECTION_BROWSE);
- fill_list_box (chooser);
+ populate_list_box (chooser);
+ listen_to_scheme_manager_changes (chooser);
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_set_hexpand (scrolled_window, TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]