diff options
author | Benjamin Otte <otte@redhat.com> | 2023-04-11 04:46:40 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-04-12 14:36:50 +0200 |
commit | 290eda6243a455326cc416926b4746f7577e6418 (patch) | |
tree | 636326d22c548d14e5c006ff3e14f29b8308b0d6 | |
parent | f0335c71b305d98f406b2ba06d8b5ccd02ae2486 (diff) | |
download | gtk+-290eda6243a455326cc416926b4746f7577e6418.tar.gz |
gtk-demo: Change the settings demo
Now it displays a long list of all settings with sections and allows
filtering the list to quickly search keys.
We might want to keep the old example, too, maybe?
-rw-r--r-- | demos/gtk-demo/listview_settings.c | 139 | ||||
-rw-r--r-- | demos/gtk-demo/listview_settings.ui | 295 |
2 files changed, 113 insertions, 321 deletions
diff --git a/demos/gtk-demo/listview_settings.c b/demos/gtk-demo/listview_settings.c index 4e8e69bfbf..bc0c8e08d7 100644 --- a/demos/gtk-demo/listview_settings.c +++ b/demos/gtk-demo/listview_settings.c @@ -29,6 +29,7 @@ struct _SettingsKey enum { PROP_0, PROP_NAME, + PROP_SETTINGS, PROP_SUMMARY, PROP_DESCRIPTION, PROP_VALUE, @@ -89,6 +90,10 @@ settings_key_get_property (GObject *object, } break; + case PROP_SETTINGS: + g_value_set_object (value, self->settings); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -118,6 +123,8 @@ settings_key_class_init (SettingsKeyClass *klass) g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READABLE); properties[PROP_NAME] = g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE); + properties[PROP_SETTINGS] = + g_param_spec_object ("settings", NULL, NULL, G_TYPE_SETTINGS, G_PARAM_READABLE); properties[PROP_SUMMARY] = g_param_spec_string ("summary", NULL, NULL, NULL, G_PARAM_READABLE); properties[PROP_VALUE] = @@ -147,6 +154,23 @@ settings_key_new (GSettings *settings, return result; } +static char * +settings_key_get_search_string (SettingsKey *self) +{ + char *schema, *result; + + g_object_get (self->settings, "schema-id", &schema, NULL); + + result = g_strconcat (g_settings_schema_key_get_name (self->key), " ", + g_settings_schema_key_get_summary (self->key), " ", + schema, + NULL); + + g_free (schema); + + return result; +} + static void item_value_changed (GtkEditableLabel *label, GParamSpec *pspec, @@ -203,28 +227,16 @@ strvcmp (gconstpointer p1, return strcmp (*s1, *s2); } -static GtkFilter *current_filter; - -static gboolean -transform_settings_to_keys (GBinding *binding, - const GValue *from_value, - GValue *to_value, - gpointer data) +static gpointer +map_settings_to_keys (gpointer item, + gpointer unused) { - GtkTreeListRow *treelistrow; - GSettings *settings; + GSettings *settings = item; GSettingsSchema *schema; GListStore *store; - GtkSortListModel *sort_model; - GtkFilterListModel *filter_model; - GtkFilter *filter; char **keys; guint i; - treelistrow = g_value_get_object (from_value); - if (treelistrow == NULL) - return TRUE; - settings = gtk_tree_list_row_get_item (treelistrow); g_object_get (settings, "settings-schema", &schema, NULL); store = g_list_store_new (SETTINGS_TYPE_KEY); @@ -244,16 +256,7 @@ transform_settings_to_keys (GBinding *binding, g_settings_schema_unref (schema); g_object_unref (settings); - sort_model = gtk_sort_list_model_new (G_LIST_MODEL (store), - g_object_ref (gtk_column_view_get_sorter (GTK_COLUMN_VIEW (data)))); - - filter = GTK_FILTER (gtk_string_filter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"))); - g_set_object (¤t_filter, filter); - filter_model = gtk_filter_list_model_new (G_LIST_MODEL (sort_model), filter); - - g_value_take_object (to_value, gtk_no_selection_new (G_LIST_MODEL (filter_model))); - - return TRUE; + return store; } static GListModel * @@ -311,23 +314,10 @@ search_enabled (GtkSearchEntry *entry) } static void -search_changed (GtkSearchEntry *entry, - gpointer data) -{ - const char *text = gtk_editable_get_text (GTK_EDITABLE (entry)); - - if (current_filter) - gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), text); -} - -static void stop_search (GtkSearchEntry *entry, gpointer data) { gtk_editable_set_text (GTK_EDITABLE (entry), ""); - - if (current_filter) - gtk_string_filter_set_search (GTK_STRING_FILTER (current_filter), ""); } static GtkWidget *window = NULL; @@ -337,94 +327,53 @@ do_listview_settings (GtkWidget *do_widget) { if (window == NULL) { - GtkWidget *listview, *columnview; + GtkListView *listview; GListModel *model; GtkTreeListModel *treemodel; - GtkSingleSelection *selection; + GtkNoSelection *selection; GtkBuilderScope *scope; GtkBuilder *builder; - GtkColumnViewColumn *name_column; - GtkColumnViewColumn *type_column; - GtkColumnViewColumn *default_column; - GtkColumnViewColumn *summary_column; - GtkColumnViewColumn *description_column; - GtkSorter *sorter; - GActionGroup *actions; - GAction *action; + GError *error = NULL; + GtkFilter *filter; g_type_ensure (SETTINGS_TYPE_KEY); scope = gtk_builder_cscope_new (); gtk_builder_cscope_add_callback (scope, search_enabled); - gtk_builder_cscope_add_callback (scope, search_changed); gtk_builder_cscope_add_callback (scope, stop_search); + gtk_builder_cscope_add_callback (scope, settings_key_get_search_string); gtk_builder_cscope_add_callback (scope, item_value_changed); builder = gtk_builder_new (); gtk_builder_set_scope (builder, scope); g_object_unref (scope); - gtk_builder_add_from_resource (builder, "/listview_settings/listview_settings.ui", NULL); + gtk_builder_add_from_resource (builder, "/listview_settings/listview_settings.ui", &error); + g_assert_no_error (error); window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window); - listview = GTK_WIDGET (gtk_builder_get_object (builder, "listview")); - columnview = GTK_WIDGET (gtk_builder_get_object (builder, "columnview")); - type_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "type_column")); - default_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "default_column")); - summary_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "summary_column")); - description_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "description_column")); - - actions = G_ACTION_GROUP (g_simple_action_group_new ()); - - action = G_ACTION (g_property_action_new ("show-type", type_column, "visible")); - g_action_map_add_action (G_ACTION_MAP (actions), action); - g_object_unref (action); - - action = G_ACTION (g_property_action_new ("show-default", default_column, "visible")); - g_action_map_add_action (G_ACTION_MAP (actions), action); - g_object_unref (action); - - action = G_ACTION (g_property_action_new ("show-summary", summary_column, "visible")); - g_action_map_add_action (G_ACTION_MAP (actions), action); - g_object_unref (action); - - action = G_ACTION (g_property_action_new ("show-description", description_column, "visible")); - g_action_map_add_action (G_ACTION_MAP (actions), action); - g_object_unref (action); - - gtk_widget_insert_action_group (columnview, "columnview", actions); - g_object_unref (actions); + listview = GTK_LIST_VIEW (gtk_builder_get_object (builder, "listview")); + filter = GTK_FILTER (gtk_builder_get_object (builder, "filter")); model = create_settings_model (NULL, NULL); treemodel = gtk_tree_list_model_new (model, - FALSE, + TRUE, TRUE, create_settings_model, NULL, NULL); - selection = gtk_single_selection_new (G_LIST_MODEL (treemodel)); - g_object_bind_property_full (selection, "selected-item", - columnview, "model", - G_BINDING_SYNC_CREATE, - transform_settings_to_keys, - NULL, - columnview, NULL); + model = G_LIST_MODEL (gtk_map_list_model_new (G_LIST_MODEL (treemodel), map_settings_to_keys, NULL, NULL)); + model = G_LIST_MODEL (gtk_flatten_list_model_new (model)); + model = G_LIST_MODEL (gtk_filter_list_model_new (model, g_object_ref (filter))); + selection = gtk_no_selection_new (model); + gtk_list_view_set_model (GTK_LIST_VIEW (listview), GTK_SELECTION_MODEL (selection)); g_object_unref (selection); - name_column = GTK_COLUMN_VIEW_COLUMN (gtk_builder_get_object (builder, "name_column")); - sorter = GTK_SORTER (gtk_string_sorter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "name"))); - gtk_column_view_column_set_sorter (name_column, sorter); - g_object_unref (sorter); - - sorter = GTK_SORTER (gtk_string_sorter_new (gtk_property_expression_new (SETTINGS_TYPE_KEY, NULL, "type"))); - gtk_column_view_column_set_sorter (type_column, sorter); - g_object_unref (sorter); - g_object_unref (builder); } diff --git a/demos/gtk-demo/listview_settings.ui b/demos/gtk-demo/listview_settings.ui index 49080e5df2..0600f63582 100644 --- a/demos/gtk-demo/listview_settings.ui +++ b/demos/gtk-demo/listview_settings.ui @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <interface> + <object class="GtkStringFilter" id="filter"> + <property name="expression"> + <closure type="gchararray" function="settings_key_get_search_string" /> + </property> + <property name="search" bind-source="entry" bind-property="text" /> + </object> <object class="GtkWindow" id="window"> <property name="title" translatable="yes">Settings</property> <property name="default-width">640</property> @@ -14,15 +20,26 @@ </object> </child> <child> - <object class="GtkPaned"> - <property name="position">300</property> + <object class="GtkBox"> + <property name="orientation">vertical</property> + <child> + <object class="GtkSearchBar"> + <property name="search-mode-enabled" bind-source="search_button" bind-property="active" bind-flags="bidirectional"/> + <signal name="notify::search-mode-enabled" handler="search_enabled" object="entry"/> + <child> + <object class="GtkSearchEntry" id="entry"> + <signal name="stop-search" handler="stop_search"/> + </object> + </child> + </object> + </child> <child> <object class="GtkScrolledWindow"> <child> <object class="GtkListView" id="listview"> - <property name="tab-behavior">item</property> + <property name="vexpand">1</property> <style> - <class name="navigation-sidebar"/> + <class name="rich-list"/> </style> <property name="factory"> <object class="GtkBuilderListItemFactory"> @@ -31,232 +48,78 @@ <interface> <template class="GtkListItem"> <property name="child"> - <object class="GtkTreeExpander" id="expander"> - <binding name="list-row"> - <lookup name="item">GtkListItem</lookup> - </binding> - <property name="child"> - <object class="GtkLabel"> - <property name="xalign">0</property> - <binding name="label"> - <lookup name="schema" type="GSettings"> - <lookup name="item">expander</lookup> - </lookup> - </binding> - </object> - </property> - </object> - </property> - </template> -</interface> - ]]></property> - </object> - </property> - </object> - </child> - </object> - </child> + <object class="GtkBox"> <child> <object class="GtkBox"> <property name="orientation">vertical</property> <child> - <object class="GtkSearchBar"> - <property name="search-mode-enabled" bind-source="search_button" bind-property="active" bind-flags="bidirectional"/> - <signal name="notify::search-mode-enabled" handler="search_enabled" object="entry"/> - <child> - <object class="GtkSearchEntry" id="entry"> - <signal name="search-changed" handler="search_changed"/> - <signal name="stop-search" handler="stop_search"/> - </object> - </child> + <object class="GtkLabel"> + <property name="xalign">0</property> + <binding name="label"> + <lookup name="name" type="SettingsKey"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </binding> </object> </child> <child> - <object class="GtkScrolledWindow"> - <property name="hexpand">1</property> - <property name="vexpand">1</property> - <child> - <object class="GtkColumnView" id="columnview"> - <property name="tab-behavior">cell</property> - <style> - <class name="data-table"/> - </style> - <child> - <object class="GtkColumnViewColumn" id="name_column"> - <property name="title">Name</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <template class="GtkColumnViewCell"> - <property name="child"> - <object class="GtkLabel"> - <property name="xalign">0</property> - <binding name="label"> - <lookup name="name" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> - </lookup> - </binding> - </object> - </property> - </template> -</interface> - ]]></property> - </object> - </property> - </object> - </child> - <child> - <object class="GtkColumnViewColumn"> - <property name="title">Value</property> - <property name="resizable">1</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <template class="GtkColumnViewCell"> - <property name="child"> - <object class="GtkEditableLabel"> - <binding name="text"> - <lookup name="value" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> - </lookup> - </binding> - <signal name="notify::label" handler="item_value_changed"/> - </object> - </property> - </template> -</interface> - ]]></property> - </object> - </property> - </object> - </child> - <child> - <object class="GtkColumnViewColumn" id="type_column"> - <property name="title">Type</property> - <property name="resizable">1</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <template class="GtkColumnViewCell"> - <property name="child"> - <object class="GtkLabel"> - <property name="xalign">0</property> - <binding name="label"> - <lookup name="type" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> - </lookup> - </binding> - </object> - </property> - </template> -</interface> - ]]></property> - </object> - </property> - </object> - </child> - <child> - <object class="GtkColumnViewColumn" id="default_column"> - <property name="title">Default</property> - <property name="resizable">1</property> - <property name="expand">1</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <template class="GtkColumnViewCell"> - <property name="child"> - <object class="GtkLabel"> - <property name="xalign">0</property> - <binding name="label"> - <lookup name="default-value" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> - </lookup> - </binding> - </object> - </property> - </template> -</interface> - ]]></property> - </object> - </property> - </object> - </child> - <child> - <object class="GtkColumnViewColumn" id="summary_column"> - <property name="title">Summary</property> - <property name="resizable">1</property> - <property name="visible">0</property> - <property name="expand">1</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <template class="GtkColumnViewCell"> - <property name="child"> - <object class="GtkLabel"> - <property name="xalign">0</property> - <property name="wrap">1</property> - <binding name="label"> - <lookup name="summary" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> - </lookup> - </binding> + <object class="GtkLabel"> + <style> + <class name="dim-label"/> + </style> + <property name="xalign">0</property> + <property name="ellipsize">end</property> + <binding name="label"> + <lookup name="summary" type="SettingsKey"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </binding> + </object> + </child> + </object> + </child> + <child> + <object class="GtkEntry"> + <property name="hexpand">1</property> + <property name="halign">end</property> + <binding name="text"> + <lookup name="value" type="SettingsKey"> + <lookup name="item">GtkListItem</lookup> + </lookup> + </binding> + <signal name="notify::label" handler="item_value_changed"/> + </object> + </child> </object> </property> </template> </interface> - ]]></property> - </object> - </property> - </object> - </child> - <child> - <object class="GtkColumnViewColumn" id="description_column"> - <property name="title">Description</property> - <property name="resizable">1</property> - <property name="visible">0</property> - <property name="expand">1</property> - <property name="header-menu">header_menu</property> - <property name="factory"> - <object class="GtkBuilderListItemFactory"> - <property name="bytes"><![CDATA[ + ]]></property> + </object> + </property> + <property name="header-factory"> + <object class="GtkBuilderListItemFactory"> + <property name="bytes"><![CDATA[ <?xml version="1.0" encoding="UTF-8"?> <interface> - <template class="GtkColumnViewCell"> + <template class="GtkListHeader"> <property name="child"> <object class="GtkLabel"> <property name="xalign">0</property> - <property name="wrap">1</property> <binding name="label"> - <lookup name="description" type="SettingsKey"> - <lookup name="item">GtkColumnViewCell</lookup> + <lookup name="schema" type="GSettings"> + <lookup name="settings" type="SettingsKey"> + <lookup name="item">GtkListHeader</lookup> + </lookup> </lookup> </binding> </object> </property> </template> </interface> - ]]></property> - </object> - </property> - </object> - </child> + ]]></property> </object> - </child> + </property> </object> </child> </object> @@ -264,24 +127,4 @@ </object> </child> </object> - <menu id="header_menu"> - <section> - <item> - <attribute name="label" translatable="yes">Type</attribute> - <attribute name="action">columnview.show-type</attribute> - </item> - <item> - <attribute name="label" translatable="yes">Default value</attribute> - <attribute name="action">columnview.show-default</attribute> - </item> - <item> - <attribute name="label" translatable="yes">Summary</attribute> - <attribute name="action">columnview.show-summary</attribute> - </item> - <item> - <attribute name="label" translatable="yes">Description</attribute> - <attribute name="action">columnview.show-description</attribute> - </item> - </section> - </menu> </interface> |