Map completion models to 'history' objects
This trick avoids having to create a full copy of the completion model in each window, which makes opening of new windows a lot faster.
This commit is contained in:
parent
28ed75e017
commit
ff7092b601
1 changed files with 44 additions and 20 deletions
|
@ -34,7 +34,6 @@ struct _MidoriLocationAction
|
|||
GtkTreeModel* model;
|
||||
GtkTreeModel* filter_model;
|
||||
GtkTreeModel* sort_model;
|
||||
GtkEntryCompletion* completion;
|
||||
GdkPixbuf* default_icon;
|
||||
GHashTable* items;
|
||||
KatzeNet* net;
|
||||
|
@ -107,6 +106,10 @@ static void
|
|||
midori_location_action_disconnect_proxy (GtkAction* action,
|
||||
GtkWidget* proxy);
|
||||
|
||||
static void
|
||||
midori_location_action_completion_init (MidoriLocationAction* location_action,
|
||||
GtkEntry* entry);
|
||||
|
||||
static void
|
||||
midori_location_action_class_init (MidoriLocationActionClass* class)
|
||||
{
|
||||
|
@ -239,9 +242,7 @@ midori_location_action_set_model (MidoriLocationAction* location_action,
|
|||
entry = gtk_bin_get_child (GTK_BIN (location_entry));
|
||||
|
||||
g_object_set (location_entry, "model", model, NULL);
|
||||
gtk_entry_completion_set_model (
|
||||
gtk_entry_get_completion (GTK_ENTRY (entry)),
|
||||
model ? location_action->filter_model : NULL);
|
||||
midori_location_action_completion_init (location_action, GTK_ENTRY (entry));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -306,10 +307,10 @@ midori_location_action_thaw (MidoriLocationAction* location_action)
|
|||
filter_model = gtk_tree_model_filter_new (sort_model, NULL);
|
||||
gtk_tree_model_filter_set_visible_column (
|
||||
GTK_TREE_MODEL_FILTER (filter_model), VISIBLE_COL);
|
||||
midori_location_action_set_model (location_action, location_action->model);
|
||||
|
||||
location_action->filter_model = filter_model;
|
||||
location_action->sort_model = sort_model;
|
||||
midori_location_action_set_model (location_action, location_action->model);
|
||||
|
||||
i = MAX_ITEMS;
|
||||
while (gtk_tree_model_iter_nth_child (sort_model, &iter, NULL, i++))
|
||||
|
@ -329,7 +330,6 @@ midori_location_action_init (MidoriLocationAction* location_action)
|
|||
location_action->progress = 0.0;
|
||||
location_action->secondary_icon = NULL;
|
||||
location_action->default_icon = NULL;
|
||||
location_action->completion = NULL;
|
||||
|
||||
location_action->model = (GtkTreeModel*)gtk_list_store_new (N_COLS,
|
||||
GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING,
|
||||
|
@ -352,7 +352,6 @@ midori_location_action_finalize (GObject* object)
|
|||
katze_assign (location_action->uri, NULL);
|
||||
katze_assign (location_action->search_engines, NULL);
|
||||
|
||||
katze_object_assign (location_action->completion, NULL);
|
||||
katze_object_assign (location_action->model, NULL);
|
||||
katze_object_assign (location_action->sort_model, NULL);
|
||||
katze_object_assign (location_action->filter_model, NULL);
|
||||
|
@ -426,12 +425,26 @@ midori_location_action_set_property (GObject* object,
|
|||
g_value_get_string (value));
|
||||
break;
|
||||
case PROP_HISTORY:
|
||||
{
|
||||
KatzeArray* history;
|
||||
GtkTreeModel* model;
|
||||
|
||||
history = g_value_get_object (value);
|
||||
model = g_object_get_data (G_OBJECT (history), "midori-location-model");
|
||||
midori_location_action_freeze (location_action);
|
||||
if (model != NULL)
|
||||
{
|
||||
katze_object_assign (location_action->model, g_object_ref (model));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* FIXME: MidoriBrowser is essentially making up for the lack
|
||||
of synchronicity of newly added items. */
|
||||
midori_location_action_freeze (location_action);
|
||||
midori_location_action_insert_history_item (location_action,
|
||||
KATZE_ITEM (g_value_get_object (value)));
|
||||
g_object_set_data (G_OBJECT (history),
|
||||
"midori-location-model", location_action->model);
|
||||
}
|
||||
midori_location_action_thaw (location_action);
|
||||
break;
|
||||
}
|
||||
|
@ -898,17 +911,26 @@ midori_location_action_add_actions (GtkEntryCompletion* completion,
|
|||
|
||||
static void
|
||||
midori_location_action_completion_init (MidoriLocationAction* location_action,
|
||||
GtkWidget* location_entry)
|
||||
GtkEntry* entry)
|
||||
{
|
||||
GtkWidget* entry;
|
||||
GtkEntryCompletion* completion;
|
||||
GtkCellRenderer* renderer;
|
||||
|
||||
entry = gtk_bin_get_child (GTK_BIN (location_entry));
|
||||
completion = gtk_entry_completion_new ();
|
||||
location_action->completion = completion;
|
||||
if ((completion = gtk_entry_get_completion (entry)))
|
||||
{
|
||||
gtk_entry_completion_set_model (completion,
|
||||
midori_location_action_is_frozen (location_action)
|
||||
? NULL : location_action->filter_model);
|
||||
return;
|
||||
}
|
||||
|
||||
completion = gtk_entry_completion_new ();
|
||||
gtk_entry_set_completion (entry, completion);
|
||||
g_object_unref (completion);
|
||||
gtk_entry_completion_set_model (completion,
|
||||
midori_location_action_is_frozen (location_action)
|
||||
? NULL : location_action->filter_model);
|
||||
|
||||
gtk_entry_completion_set_model (completion, location_action->sort_model);
|
||||
gtk_entry_completion_set_text_column (completion, URI_COL);
|
||||
#if GTK_CHECK_VERSION (2, 12, 0)
|
||||
gtk_entry_completion_set_inline_selection (completion, TRUE);
|
||||
|
@ -928,7 +950,7 @@ midori_location_action_completion_init (MidoriLocationAction* location_action,
|
|||
gtk_entry_completion_set_match_func (completion,
|
||||
midori_location_entry_completion_match_cb, NULL, NULL);
|
||||
|
||||
gtk_entry_set_completion (GTK_ENTRY (entry), completion);
|
||||
|
||||
g_signal_connect (completion, "match-selected",
|
||||
G_CALLBACK (midori_location_entry_match_selected_cb), location_action);
|
||||
|
||||
|
@ -1008,7 +1030,8 @@ midori_location_action_connect_proxy (GtkAction* action,
|
|||
renderer, midori_location_entry_render_text_cb, NULL, NULL);
|
||||
|
||||
gtk_combo_box_set_active (GTK_COMBO_BOX (entry), -1);
|
||||
midori_location_action_completion_init (location_action, entry);
|
||||
midori_location_action_completion_init (location_action,
|
||||
GTK_ENTRY (gtk_bin_get_child (GTK_BIN (entry))));
|
||||
g_signal_connect (entry, "changed",
|
||||
G_CALLBACK (midori_location_action_entry_changed_cb), action);
|
||||
|
||||
|
@ -1348,7 +1371,8 @@ midori_location_action_set_search_engines (MidoriLocationAction* location_action
|
|||
entry = midori_location_action_entry_for_proxy (proxies->data);
|
||||
child = gtk_bin_get_child (GTK_BIN (entry));
|
||||
|
||||
completion = location_action->completion;
|
||||
midori_location_action_completion_init (location_action, GTK_ENTRY (child));
|
||||
completion = gtk_entry_get_completion (GTK_ENTRY (child));
|
||||
i = 0;
|
||||
if (location_action->search_engines)
|
||||
while ((item = katze_array_get_nth_item (location_action->search_engines, i++)))
|
||||
|
|
Loading…
Reference in a new issue