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 commit 54835c8f44.
This reverts commit 953cc81b0f.
This reverts commit ab0594239c.
This reverts commit 03f08fd36c.

https://bugzilla.gnome.org/show_bug.cgi?id=682864
This commit is contained in:
Rui Matos 2012-08-26 15:33:24 +02:00
parent 14dde72dfe
commit dee8e0917a

View file

@ -77,6 +77,7 @@ static GtkWidget *input_chooser_new (GtkWindow *main_window,
static gboolean input_chooser_get_selected (GtkWidget *chooser,
GtkTreeModel **model,
GtkTreeIter *iter);
static GtkTreeModel *tree_view_get_actual_model (GtkTreeView *tv);
#ifdef HAVE_IBUS
static void
@ -129,7 +130,7 @@ update_ibus_active_sources (GtkBuilder *builder)
gboolean ret;
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);
while (ret)
@ -142,17 +143,22 @@ update_ibus_active_sources (GtkBuilder *builder)
if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
{
IBusEngineDesc *engine_desc = NULL;
GDesktopAppInfo *app_info = NULL;
gchar *display_name = NULL;
engine_desc = g_hash_table_lookup (ibus_engines, id);
if (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,
NAME_COLUMN, display_name,
SETUP_COLUMN, app_info,
-1);
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);
if (engine_desc)
display_name = engine_get_display_name (engine_desc);
app_info = setup_app_info_for_id (id);
{
display_name = engine_get_display_name (engine_desc);
app_info = setup_app_info_for_id (id);
}
#else
g_warning ("IBus input source type specified but IBus support was not compiled");
continue;
@ -355,7 +362,7 @@ populate_with_active_sources (GtkListStore *store)
gtk_list_store_append (store, &tree_iter);
gtk_list_store_set (store, &tree_iter,
NAME_COLUMN, display_name ? display_name : id,
NAME_COLUMN, display_name,
TYPE_COLUMN, type,
ID_COLUMN, id,
SETUP_COLUMN, app_info,
@ -518,6 +525,16 @@ set_selected_path (GtkBuilder *builder,
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
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))
{
GtkTreeView *tv;
GtkListStore *my_model;
GtkTreeIter child_iter;
GtkListStore *child_model;
GtkTreeIter child_iter, filter_iter;
gchar *name;
gchar *type;
gchar *id;
@ -550,24 +567,29 @@ chooser_response (GtkWidget *chooser, gint response_id, gpointer data)
#endif
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,
NAME_COLUMN, name,
TYPE_COLUMN, type,
ID_COLUMN, id,
SETUP_COLUMN, app_info,
-1);
gtk_list_store_append (child_model, &child_iter);
gtk_list_store_set (child_model, &child_iter,
NAME_COLUMN, name,
TYPE_COLUMN, type,
ID_COLUMN, id,
SETUP_COLUMN, app_info,
-1);
g_free (name);
g_free (type);
g_free (id);
if (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_configuration (GTK_TREE_MODEL (my_model));
update_configuration (GTK_TREE_MODEL (child_model));
}
else
{
@ -591,7 +613,7 @@ add_input (GtkButton *button, gpointer data)
toplevel = gtk_widget_get_toplevel (WID ("region_notebook"));
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);
g_signal_connect (chooser, "response",
@ -603,7 +625,9 @@ remove_selected_input (GtkButton *button, gpointer data)
{
GtkBuilder *builder = data;
GtkTreeModel *model;
GtkTreeModel *child_model;
GtkTreeIter iter;
GtkTreeIter child_iter;
GtkTreePath *path;
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);
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))
gtk_tree_path_prev (path);
@ -623,7 +651,7 @@ remove_selected_input (GtkButton *button, gpointer data)
gtk_tree_path_free (path);
update_button_sensitivity (builder);
update_configuration (model);
update_configuration (child_model);
}
static void
@ -631,7 +659,9 @@ move_selected_input_up (GtkButton *button, gpointer data)
{
GtkBuilder *builder = data;
GtkTreeModel *model;
GtkTreeModel *child_model;
GtkTreeIter iter, prev;
GtkTreeIter child_iter, child_prev;
GtkTreePath *path;
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);
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);
gtk_tree_path_free (path);
update_button_sensitivity (builder);
update_configuration (model);
update_configuration (child_model);
}
static void
@ -659,7 +696,9 @@ move_selected_input_down (GtkButton *button, gpointer data)
{
GtkBuilder *builder = data;
GtkTreeModel *model;
GtkTreeModel *child_model;
GtkTreeIter iter, next;
GtkTreeIter child_iter, child_next;
GtkTreePath *path;
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);
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);
gtk_tree_path_free (path);
update_button_sensitivity (builder);
update_configuration (model);
update_configuration (child_model);
}
static void
@ -821,7 +867,7 @@ input_sources_changed (GSettings *settings,
GtkTreeModel *model;
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))
path = gtk_tree_model_get_path (model, &iter);
@ -883,6 +929,23 @@ update_shortcuts (GtkBuilder *builder)
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
setup_input_tabs (GtkBuilder *builder,
CcRegionPanel *panel)
@ -891,6 +954,7 @@ setup_input_tabs (GtkBuilder *builder,
GtkTreeViewColumn *column;
GtkCellRenderer *cell;
GtkListStore *store;
GtkTreeModel *filtered_store;
GtkTreeSelection *selection;
/* set up the list of active inputs */
@ -937,6 +1001,17 @@ setup_input_tabs (GtkBuilder *builder,
g_signal_connect_swapped (selection, "changed",
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 */
g_signal_connect (WID("input_source_add"), "clicked",
G_CALLBACK (add_input), builder);