[gnome-control-center] region: Use a filter model on input sources
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] region: Use a filter model on input sources
- Date: Tue, 28 Aug 2012 13:05:26 +0000 (UTC)
commit dee8e0917abdc2ec9b33baf571b944508ae42447
Author: Rui Matos <tiagomatos gmail com>
Date: Sun Aug 26 15:33:24 2012 +0200
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 54835c8f4486309c1517a7f71735fbdd7e098c5f.
This reverts commit 953cc81b0f07c0e5f4e1f34a139efafe6d61fea1.
This reverts commit ab0594239c5e43b3a14a0cf40ab2cce039a17a53.
This reverts commit 03f08fd36c059c17f3af723ca29e0ad931fc6a26.
https://bugzilla.gnome.org/show_bug.cgi?id=682864
panels/region/gnome-region-panel-input.c | 125 ++++++++++++++++++++++++------
1 files changed, 100 insertions(+), 25 deletions(-)
---
diff --git a/panels/region/gnome-region-panel-input.c b/panels/region/gnome-region-panel-input.c
index 6fdccd4..eee5f12 100644
--- a/panels/region/gnome-region-panel-input.c
+++ b/panels/region/gnome-region-panel-input.c
@@ -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));
-
- 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);
+ child_model = GTK_LIST_STORE (tree_view_get_actual_model (tv));
+
+ 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]