summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2023-04-11 04:46:40 +0200
committerBenjamin Otte <otte@redhat.com>2023-04-12 14:36:50 +0200
commit290eda6243a455326cc416926b4746f7577e6418 (patch)
tree636326d22c548d14e5c006ff3e14f29b8308b0d6
parentf0335c71b305d98f406b2ba06d8b5ccd02ae2486 (diff)
downloadgtk+-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.c139
-rw-r--r--demos/gtk-demo/listview_settings.ui295
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 (&current_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>