region: Use a filter model on input sources
This allows us to hide some entries which for whatever reason we can't display without removing them from gsettings. This reverts commit54835c8f44
. This reverts commit953cc81b0f
. This reverts commitab0594239c
. This reverts commit03f08fd36c
. https://bugzilla.gnome.org/show_bug.cgi?id=682864
This commit is contained in:
parent
14dde72dfe
commit
dee8e0917a
1 changed files with 99 additions and 24 deletions
|
@ -77,6 +77,7 @@ static GtkWidget *input_chooser_new (GtkWindow *main_window,
|
||||||
static gboolean input_chooser_get_selected (GtkWidget *chooser,
|
static gboolean input_chooser_get_selected (GtkWidget *chooser,
|
||||||
GtkTreeModel **model,
|
GtkTreeModel **model,
|
||||||
GtkTreeIter *iter);
|
GtkTreeIter *iter);
|
||||||
|
static GtkTreeModel *tree_view_get_actual_model (GtkTreeView *tv);
|
||||||
|
|
||||||
#ifdef HAVE_IBUS
|
#ifdef HAVE_IBUS
|
||||||
static void
|
static void
|
||||||
|
@ -129,7 +130,7 @@ update_ibus_active_sources (GtkBuilder *builder)
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
tv = GTK_TREE_VIEW (WID ("active_input_sources"));
|
tv = GTK_TREE_VIEW (WID ("active_input_sources"));
|
||||||
model = gtk_tree_view_get_model (tv);
|
model = tree_view_get_actual_model (tv);
|
||||||
|
|
||||||
ret = gtk_tree_model_get_iter_first (model, &iter);
|
ret = gtk_tree_model_get_iter_first (model, &iter);
|
||||||
while (ret)
|
while (ret)
|
||||||
|
@ -142,17 +143,22 @@ update_ibus_active_sources (GtkBuilder *builder)
|
||||||
if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
|
if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
|
||||||
{
|
{
|
||||||
IBusEngineDesc *engine_desc = NULL;
|
IBusEngineDesc *engine_desc = NULL;
|
||||||
|
GDesktopAppInfo *app_info = NULL;
|
||||||
gchar *display_name = NULL;
|
gchar *display_name = NULL;
|
||||||
|
|
||||||
engine_desc = g_hash_table_lookup (ibus_engines, id);
|
engine_desc = g_hash_table_lookup (ibus_engines, id);
|
||||||
if (engine_desc)
|
if (engine_desc)
|
||||||
{
|
{
|
||||||
display_name = engine_get_display_name (engine_desc);
|
display_name = engine_get_display_name (engine_desc);
|
||||||
|
app_info = setup_app_info_for_id (id);
|
||||||
|
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
|
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
|
||||||
NAME_COLUMN, display_name,
|
NAME_COLUMN, display_name,
|
||||||
|
SETUP_COLUMN, app_info,
|
||||||
-1);
|
-1);
|
||||||
g_free (display_name);
|
g_free (display_name);
|
||||||
|
if (app_info)
|
||||||
|
g_object_unref (app_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,9 +345,10 @@ populate_with_active_sources (GtkListStore *store)
|
||||||
engine_desc = g_hash_table_lookup (ibus_engines, id);
|
engine_desc = g_hash_table_lookup (ibus_engines, id);
|
||||||
|
|
||||||
if (engine_desc)
|
if (engine_desc)
|
||||||
display_name = engine_get_display_name (engine_desc);
|
{
|
||||||
|
display_name = engine_get_display_name (engine_desc);
|
||||||
app_info = setup_app_info_for_id (id);
|
app_info = setup_app_info_for_id (id);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
g_warning ("IBus input source type specified but IBus support was not compiled");
|
g_warning ("IBus input source type specified but IBus support was not compiled");
|
||||||
continue;
|
continue;
|
||||||
|
@ -355,7 +362,7 @@ populate_with_active_sources (GtkListStore *store)
|
||||||
|
|
||||||
gtk_list_store_append (store, &tree_iter);
|
gtk_list_store_append (store, &tree_iter);
|
||||||
gtk_list_store_set (store, &tree_iter,
|
gtk_list_store_set (store, &tree_iter,
|
||||||
NAME_COLUMN, display_name ? display_name : id,
|
NAME_COLUMN, display_name,
|
||||||
TYPE_COLUMN, type,
|
TYPE_COLUMN, type,
|
||||||
ID_COLUMN, id,
|
ID_COLUMN, id,
|
||||||
SETUP_COLUMN, app_info,
|
SETUP_COLUMN, app_info,
|
||||||
|
@ -518,6 +525,16 @@ set_selected_path (GtkBuilder *builder,
|
||||||
gtk_tree_selection_select_path (selection, path);
|
gtk_tree_selection_select_path (selection, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GtkTreeModel *
|
||||||
|
tree_view_get_actual_model (GtkTreeView *tv)
|
||||||
|
{
|
||||||
|
GtkTreeModel *filtered_store;
|
||||||
|
|
||||||
|
filtered_store = gtk_tree_view_get_model (tv);
|
||||||
|
|
||||||
|
return gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filtered_store));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
chooser_response (GtkWidget *chooser, gint response_id, gpointer data)
|
chooser_response (GtkWidget *chooser, gint response_id, gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -531,8 +548,8 @@ chooser_response (GtkWidget *chooser, gint response_id, gpointer data)
|
||||||
if (input_chooser_get_selected (chooser, &model, &iter))
|
if (input_chooser_get_selected (chooser, &model, &iter))
|
||||||
{
|
{
|
||||||
GtkTreeView *tv;
|
GtkTreeView *tv;
|
||||||
GtkListStore *my_model;
|
GtkListStore *child_model;
|
||||||
GtkTreeIter child_iter;
|
GtkTreeIter child_iter, filter_iter;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
gchar *type;
|
gchar *type;
|
||||||
gchar *id;
|
gchar *id;
|
||||||
|
@ -550,24 +567,29 @@ chooser_response (GtkWidget *chooser, gint response_id, gpointer data)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tv = GTK_TREE_VIEW (WID ("active_input_sources"));
|
tv = GTK_TREE_VIEW (WID ("active_input_sources"));
|
||||||
my_model = GTK_LIST_STORE (gtk_tree_view_get_model (tv));
|
child_model = GTK_LIST_STORE (tree_view_get_actual_model (tv));
|
||||||
|
|
||||||
gtk_list_store_insert_with_values (my_model, &child_iter, -1,
|
gtk_list_store_append (child_model, &child_iter);
|
||||||
NAME_COLUMN, name,
|
|
||||||
TYPE_COLUMN, type,
|
gtk_list_store_set (child_model, &child_iter,
|
||||||
ID_COLUMN, id,
|
NAME_COLUMN, name,
|
||||||
SETUP_COLUMN, app_info,
|
TYPE_COLUMN, type,
|
||||||
-1);
|
ID_COLUMN, id,
|
||||||
|
SETUP_COLUMN, app_info,
|
||||||
|
-1);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
g_free (type);
|
g_free (type);
|
||||||
g_free (id);
|
g_free (id);
|
||||||
if (app_info)
|
if (app_info)
|
||||||
g_object_unref (app_info);
|
g_object_unref (app_info);
|
||||||
|
|
||||||
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (tv), &child_iter);
|
gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (gtk_tree_view_get_model (tv)),
|
||||||
|
&filter_iter,
|
||||||
|
&child_iter);
|
||||||
|
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (tv), &filter_iter);
|
||||||
|
|
||||||
update_button_sensitivity (builder);
|
update_button_sensitivity (builder);
|
||||||
update_configuration (GTK_TREE_MODEL (my_model));
|
update_configuration (GTK_TREE_MODEL (child_model));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -591,7 +613,7 @@ add_input (GtkButton *button, gpointer data)
|
||||||
|
|
||||||
toplevel = gtk_widget_get_toplevel (WID ("region_notebook"));
|
toplevel = gtk_widget_get_toplevel (WID ("region_notebook"));
|
||||||
treeview = WID ("active_input_sources");
|
treeview = WID ("active_input_sources");
|
||||||
active_sources = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (treeview)));
|
active_sources = GTK_LIST_STORE (tree_view_get_actual_model (GTK_TREE_VIEW (treeview)));
|
||||||
|
|
||||||
chooser = input_chooser_new (GTK_WINDOW (toplevel), active_sources);
|
chooser = input_chooser_new (GTK_WINDOW (toplevel), active_sources);
|
||||||
g_signal_connect (chooser, "response",
|
g_signal_connect (chooser, "response",
|
||||||
|
@ -603,7 +625,9 @@ remove_selected_input (GtkButton *button, gpointer data)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder = data;
|
GtkBuilder *builder = data;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
|
GtkTreeModel *child_model;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
GtkTreeIter child_iter;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
|
||||||
g_debug ("remove selected input source");
|
g_debug ("remove selected input source");
|
||||||
|
@ -613,7 +637,11 @@ remove_selected_input (GtkButton *button, gpointer data)
|
||||||
|
|
||||||
path = gtk_tree_model_get_path (model, &iter);
|
path = gtk_tree_model_get_path (model, &iter);
|
||||||
|
|
||||||
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
|
child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
|
||||||
|
&child_iter,
|
||||||
|
&iter);
|
||||||
|
gtk_list_store_remove (GTK_LIST_STORE (child_model), &child_iter);
|
||||||
|
|
||||||
if (!gtk_tree_model_get_iter (model, &iter, path))
|
if (!gtk_tree_model_get_iter (model, &iter, path))
|
||||||
gtk_tree_path_prev (path);
|
gtk_tree_path_prev (path);
|
||||||
|
@ -623,7 +651,7 @@ remove_selected_input (GtkButton *button, gpointer data)
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
update_button_sensitivity (builder);
|
update_button_sensitivity (builder);
|
||||||
update_configuration (model);
|
update_configuration (child_model);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -631,7 +659,9 @@ move_selected_input_up (GtkButton *button, gpointer data)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder = data;
|
GtkBuilder *builder = data;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
|
GtkTreeModel *child_model;
|
||||||
GtkTreeIter iter, prev;
|
GtkTreeIter iter, prev;
|
||||||
|
GtkTreeIter child_iter, child_prev;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
|
||||||
g_debug ("move selected input source up");
|
g_debug ("move selected input source up");
|
||||||
|
@ -645,13 +675,20 @@ move_selected_input_up (GtkButton *button, gpointer data)
|
||||||
|
|
||||||
path = gtk_tree_model_get_path (model, &prev);
|
path = gtk_tree_model_get_path (model, &prev);
|
||||||
|
|
||||||
gtk_list_store_swap (GTK_LIST_STORE (model), &iter, &prev);
|
child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
|
||||||
|
&child_iter,
|
||||||
|
&iter);
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
|
||||||
|
&child_prev,
|
||||||
|
&prev);
|
||||||
|
gtk_list_store_swap (GTK_LIST_STORE (child_model), &child_iter, &child_prev);
|
||||||
|
|
||||||
set_selected_path (builder, path);
|
set_selected_path (builder, path);
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
update_button_sensitivity (builder);
|
update_button_sensitivity (builder);
|
||||||
update_configuration (model);
|
update_configuration (child_model);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -659,7 +696,9 @@ move_selected_input_down (GtkButton *button, gpointer data)
|
||||||
{
|
{
|
||||||
GtkBuilder *builder = data;
|
GtkBuilder *builder = data;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
|
GtkTreeModel *child_model;
|
||||||
GtkTreeIter iter, next;
|
GtkTreeIter iter, next;
|
||||||
|
GtkTreeIter child_iter, child_next;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
|
||||||
g_debug ("move selected input source down");
|
g_debug ("move selected input source down");
|
||||||
|
@ -673,13 +712,20 @@ move_selected_input_down (GtkButton *button, gpointer data)
|
||||||
|
|
||||||
path = gtk_tree_model_get_path (model, &next);
|
path = gtk_tree_model_get_path (model, &next);
|
||||||
|
|
||||||
gtk_list_store_swap (GTK_LIST_STORE (model), &iter, &next);
|
child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
|
||||||
|
&child_iter,
|
||||||
|
&iter);
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model),
|
||||||
|
&child_next,
|
||||||
|
&next);
|
||||||
|
gtk_list_store_swap (GTK_LIST_STORE (child_model), &child_iter, &child_next);
|
||||||
|
|
||||||
set_selected_path (builder, path);
|
set_selected_path (builder, path);
|
||||||
gtk_tree_path_free (path);
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
update_button_sensitivity (builder);
|
update_button_sensitivity (builder);
|
||||||
update_configuration (model);
|
update_configuration (child_model);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -821,7 +867,7 @@ input_sources_changed (GSettings *settings,
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
|
|
||||||
treeview = WID("active_input_sources");
|
treeview = WID("active_input_sources");
|
||||||
store = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
|
store = tree_view_get_actual_model (GTK_TREE_VIEW (treeview));
|
||||||
|
|
||||||
if (get_selected_iter (builder, &model, &iter))
|
if (get_selected_iter (builder, &model, &iter))
|
||||||
path = gtk_tree_model_get_path (model, &iter);
|
path = gtk_tree_model_get_path (model, &iter);
|
||||||
|
@ -883,6 +929,23 @@ update_shortcuts (GtkBuilder *builder)
|
||||||
g_free (next);
|
g_free (next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
active_sources_visible_func (GtkTreeModel *model,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
gchar *display_name;
|
||||||
|
|
||||||
|
gtk_tree_model_get (model, iter, NAME_COLUMN, &display_name, -1);
|
||||||
|
|
||||||
|
if (!display_name)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
g_free (display_name);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setup_input_tabs (GtkBuilder *builder,
|
setup_input_tabs (GtkBuilder *builder,
|
||||||
CcRegionPanel *panel)
|
CcRegionPanel *panel)
|
||||||
|
@ -891,6 +954,7 @@ setup_input_tabs (GtkBuilder *builder,
|
||||||
GtkTreeViewColumn *column;
|
GtkTreeViewColumn *column;
|
||||||
GtkCellRenderer *cell;
|
GtkCellRenderer *cell;
|
||||||
GtkListStore *store;
|
GtkListStore *store;
|
||||||
|
GtkTreeModel *filtered_store;
|
||||||
GtkTreeSelection *selection;
|
GtkTreeSelection *selection;
|
||||||
|
|
||||||
/* set up the list of active inputs */
|
/* set up the list of active inputs */
|
||||||
|
@ -937,6 +1001,17 @@ setup_input_tabs (GtkBuilder *builder,
|
||||||
g_signal_connect_swapped (selection, "changed",
|
g_signal_connect_swapped (selection, "changed",
|
||||||
G_CALLBACK (update_button_sensitivity), builder);
|
G_CALLBACK (update_button_sensitivity), builder);
|
||||||
|
|
||||||
|
/* Some input source types might have their info loaded
|
||||||
|
* asynchronously. In that case we don't want to show them
|
||||||
|
* immediately so we use a filter model on top of the real model
|
||||||
|
* which mirrors the GSettings key. */
|
||||||
|
filtered_store = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
|
||||||
|
gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filtered_store),
|
||||||
|
active_sources_visible_func,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), filtered_store);
|
||||||
|
|
||||||
/* set up the buttons */
|
/* set up the buttons */
|
||||||
g_signal_connect (WID("input_source_add"), "clicked",
|
g_signal_connect (WID("input_source_add"), "clicked",
|
||||||
G_CALLBACK (add_input), builder);
|
G_CALLBACK (add_input), builder);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue