@eht16 I've just tested the PR briefly but I didn't like that parents not
containing any children were still displayed - when filtering for something in
the last group, one would have to scroll the tree to see it for the empty
groups above.
I think it's hard/impossible to achieve that with the filter function but I
tried adding an extra column to the store indicating visibility and then using
`gtk_tree_model_filter_set_visible_column()` and it seems to work. I also added
`expand_all()` to the result because the collapsed entries weren't very nice.
The patch is below (created very quickly by reusing code from `kb_update()` for
the update function, possibly needs improving).
What do you think?
```diff
diff --git a/src/prefs.c b/src/prefs.c
index 57e95837e..7b8129089 100644
--- a/src/prefs.c
+++ b/src/prefs.c
@@ -87,7 +87,6 @@ static gboolean kb_find_duplicate(GtkTreeStore *store,
GtkWidget *parent, GtkTre
static void kb_filter_entry_changed_cb(GtkEntry *entry, gpointer user_data);
static void kb_filter_entry_icon_release_cb(GtkEntry *entry,
GtkEntryIconPosition icon_pos,
GdkEvent *event, gpointer user_data);
-static gboolean kb_tree_filter_func(GtkTreeModel *model, GtkTreeIter *iter,
gpointer user_data);
static gboolean kb_tree_key_press_cb(GtkWidget *widget, GdkEventKey *event,
gpointer user_data);
static void on_toolbar_show_toggled(GtkToggleButton *togglebutton, gpointer
user_data);
static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton,
gpointer user_data);
@@ -146,6 +145,7 @@ enum
KB_TREE_INDEX,
KB_TREE_EDITABLE,
KB_TREE_WEIGHT,
+ KB_TREE_VISIBLE,
KB_TREE_COLUMNS
};
@@ -276,10 +276,9 @@ static void kb_init_tree(KbData *kbdata, GtkWidget
*kb_filter_entry)
kbdata->tree = GTK_TREE_VIEW(ui_lookup_widget(ui_widgets.prefs_dialog,
"treeview7"));
kbdata->store = gtk_tree_store_new(KB_TREE_COLUMNS,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN,
G_TYPE_INT);
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN,
G_TYPE_INT, G_TYPE_BOOLEAN);
filter_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(kbdata->store),
NULL);
- gtk_tree_model_filter_set_visible_func(
- GTK_TREE_MODEL_FILTER(filter_model), kb_tree_filter_func,
kb_filter_entry, NULL);
+
gtk_tree_model_filter_set_visible_column(GTK_TREE_MODEL_FILTER(filter_model),
KB_TREE_VISIBLE);
/* set model to tree view */
gtk_tree_view_set_model(GTK_TREE_VIEW(kbdata->tree), filter_model);
g_object_unref(filter_model);
@@ -376,14 +375,14 @@ static void kb_init(KbData *kbdata, GtkWidget
*kb_filter_entry)
{
gtk_tree_store_append(kbdata->store, &parent, NULL);
gtk_tree_store_set(kbdata->store, &parent, KB_TREE_ACTION,
group->label,
- KB_TREE_INDEX, g, -1);
+ KB_TREE_INDEX, g, KB_TREE_VISIBLE, TRUE, -1);
foreach_ptr_array(kb, i, group->key_items)
{
label = keybindings_get_label(kb);
gtk_tree_store_append(kbdata->store, &iter, &parent);
gtk_tree_store_set(kbdata->store, &iter,
KB_TREE_ACTION, label,
- KB_TREE_EDITABLE, TRUE, KB_TREE_INDEX, kb->id,
-1);
+ KB_TREE_EDITABLE, TRUE, KB_TREE_INDEX, kb->id,
KB_TREE_VISIBLE, TRUE, -1);
kb_set_shortcut(kbdata->store, &iter, kb->key,
kb->mods);
g_free(label);
}
@@ -1413,10 +1412,62 @@ static void kb_cell_edited_cb(GtkCellRendererText
*cellrenderertext,
}
+static void update_visibility(GtkTreeStore *store, const gchar *entry_text)
+{
+ GtkTreeModel *model = GTK_TREE_MODEL(store);
+ GtkTreeIter child, parent;
+
+ /* get first parent */
+ if (! gtk_tree_model_iter_children(model, &parent, NULL))
+ return;
+
+ /* foreach parent */
+ while (TRUE)
+ {
+ gboolean visible_children = FALSE;
+
+ /* get first child */
+ if (! gtk_tree_model_iter_children(model, &child, &parent))
+ return;
+
+ /* foreach child */
+ while (TRUE)
+ {
+ gboolean visible;
+ gchar *action_name;
+
+ gtk_tree_model_get(model, &child, KB_TREE_ACTION,
&action_name, -1);
+ if (!action_name || EMPTY(entry_text))
+ visible = TRUE;
+ else
+ visible =
utils_utf8_substring_match(entry_text, action_name);
+ g_free(action_name);
+
+ if (visible)
+ visible_children = TRUE;
+
+ gtk_tree_store_set(store, &child, KB_TREE_VISIBLE,
visible, -1);
+
+ if (! gtk_tree_model_iter_next(model, &child))
+ break;
+ }
+
+ gtk_tree_store_set(store, &parent, KB_TREE_VISIBLE,
visible_children, -1);
+
+ if (! gtk_tree_model_iter_next(model, &parent))
+ return;
+ }
+}
+
+
static void kb_filter_entry_changed_cb(GtkEntry *entry, gpointer user_data)
{
GtkTreeModel *filter_model =
gtk_tree_view_get_model(GTK_TREE_VIEW(global_kb_data.tree));
+ const gchar *entry_text = gtk_entry_get_text(entry);
+
+ update_visibility(global_kb_data.store, entry_text);
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(filter_model));
+ gtk_tree_view_expand_all(global_kb_data.tree);
}
@@ -1428,31 +1479,6 @@ static void kb_filter_entry_icon_release_cb(GtkEntry
*entry, GtkEntryIconPositio
}
-static gboolean kb_tree_filter_func(GtkTreeModel *model, GtkTreeIter *iter,
gpointer user_data)
-{
- const gchar *key;
- gboolean matched;
- gchar *action_name;
- GtkWidget *kb_filter_entry = user_data;
-
- // always show categories
- if (gtk_tree_model_iter_has_child(model, iter))
- return TRUE;
-
- gtk_tree_model_get(model, iter, KB_TREE_ACTION, &action_name, -1);
- if (!action_name)
- return TRUE;
-
- key = gtk_entry_get_text(GTK_ENTRY(kb_filter_entry));
- if (EMPTY(key))
- return TRUE;
-
- matched = utils_utf8_substring_match(key, action_name);
- g_free(action_name);
- return matched;
-}
-
-
static gboolean kb_tree_key_press_cb(GtkWidget *widget, GdkEventKey *event,
gpointer user_data)
{
if (event->keyval == GDK_KEY_f && (event->state &
GEANY_PRIMARY_MOD_MASK))
```
--
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany/pull/4192#issuecomment-2574098572
You are receiving this because you are subscribed to this thread.
Message ID: <geany/geany/pull/4192/[email protected]>