region: Improved selection handling on the input chooser
This makes the input chooser list always have a selected row and be centered on it when the filter is applied. https://bugzilla.gnome.org/show_bug.cgi?id=662489
This commit is contained in:
parent
0fb0d6139b
commit
e38f9acf39
1 changed files with 32 additions and 13 deletions
|
@ -360,12 +360,13 @@ static void
|
||||||
filter_changed (GtkBuilder *builder)
|
filter_changed (GtkBuilder *builder)
|
||||||
{
|
{
|
||||||
GtkTreeModelFilter *filtered_model;
|
GtkTreeModelFilter *filtered_model;
|
||||||
|
GtkTreeView *tree_view;
|
||||||
|
GtkTreeSelection *selection;
|
||||||
|
GtkTreeIter selected_iter;
|
||||||
GtkWidget *filter_entry;
|
GtkWidget *filter_entry;
|
||||||
const gchar *pattern;
|
const gchar *pattern;
|
||||||
gchar *upattern;
|
gchar *upattern;
|
||||||
|
|
||||||
filtered_model = GTK_TREE_MODEL_FILTER (gtk_builder_get_object (builder,
|
|
||||||
"filtered_input_source_model"));
|
|
||||||
filter_entry = WID ("input_source_filter");
|
filter_entry = WID ("input_source_filter");
|
||||||
pattern = gtk_entry_get_text (GTK_ENTRY (filter_entry));
|
pattern = gtk_entry_get_text (GTK_ENTRY (filter_entry));
|
||||||
upattern = g_utf8_strup (pattern, -1);
|
upattern = g_utf8_strup (pattern, -1);
|
||||||
|
@ -388,7 +389,24 @@ filter_changed (GtkBuilder *builder)
|
||||||
search_pattern_list = g_strsplit (upattern, " ", -1);
|
search_pattern_list = g_strsplit (upattern, " ", -1);
|
||||||
g_free (upattern);
|
g_free (upattern);
|
||||||
|
|
||||||
|
filtered_model = GTK_TREE_MODEL_FILTER (gtk_builder_get_object (builder, "filtered_input_source_model"));
|
||||||
gtk_tree_model_filter_refilter (filtered_model);
|
gtk_tree_model_filter_refilter (filtered_model);
|
||||||
|
|
||||||
|
tree_view = GTK_TREE_VIEW (WID ("filtered_input_source_list"));
|
||||||
|
selection = gtk_tree_view_get_selection (tree_view);
|
||||||
|
if (gtk_tree_selection_get_selected (selection, NULL, &selected_iter))
|
||||||
|
{
|
||||||
|
GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (filtered_model),
|
||||||
|
&selected_iter);
|
||||||
|
gtk_tree_view_scroll_to_cell (tree_view, path, NULL, TRUE, 0.5, 0.5);
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (filtered_model), &iter))
|
||||||
|
gtk_tree_selection_select_iter (selection, &iter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -464,6 +482,7 @@ input_chooser_new (GtkWindow *main_window)
|
||||||
GtkTreeSelection *selection;
|
GtkTreeSelection *selection;
|
||||||
GtkListStore *model;
|
GtkListStore *model;
|
||||||
GtkTreeModelFilter *filtered_model;
|
GtkTreeModelFilter *filtered_model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
builder = gtk_builder_new ();
|
builder = gtk_builder_new ();
|
||||||
gtk_builder_add_from_file (builder,
|
gtk_builder_add_from_file (builder,
|
||||||
|
@ -493,17 +512,6 @@ input_chooser_new (GtkWindow *main_window)
|
||||||
g_signal_connect (G_OBJECT (filter_entry), "icon-release",
|
g_signal_connect (G_OBJECT (filter_entry), "icon-release",
|
||||||
G_CALLBACK (filter_clear), NULL);
|
G_CALLBACK (filter_clear), NULL);
|
||||||
|
|
||||||
selection =
|
|
||||||
gtk_tree_view_get_selection (GTK_TREE_VIEW (filtered_list));
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (selection), "changed",
|
|
||||||
G_CALLBACK (selection_changed), builder);
|
|
||||||
|
|
||||||
selection_changed (selection, builder);
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (filtered_list), "row-activated",
|
|
||||||
G_CALLBACK (row_activated), builder);
|
|
||||||
|
|
||||||
filtered_model = GTK_TREE_MODEL_FILTER (gtk_builder_get_object (builder, "filtered_input_source_model"));
|
filtered_model = GTK_TREE_MODEL_FILTER (gtk_builder_get_object (builder, "filtered_input_source_model"));
|
||||||
model = GTK_LIST_STORE (gtk_builder_get_object (builder, "input_source_model"));
|
model = GTK_LIST_STORE (gtk_builder_get_object (builder, "input_source_model"));
|
||||||
|
|
||||||
|
@ -514,6 +522,17 @@ input_chooser_new (GtkWindow *main_window)
|
||||||
filter_func,
|
filter_func,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
|
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (filtered_list));
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (selection), "changed",
|
||||||
|
G_CALLBACK (selection_changed), builder);
|
||||||
|
|
||||||
|
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (filtered_model), &iter))
|
||||||
|
gtk_tree_selection_select_iter (selection, &iter);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (filtered_list), "row-activated",
|
||||||
|
G_CALLBACK (row_activated), builder);
|
||||||
|
|
||||||
gtk_widget_grab_focus (filter_entry);
|
gtk_widget_grab_focus (filter_entry);
|
||||||
|
|
||||||
gtk_widget_show (chooser);
|
gtk_widget_show (chooser);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue