[gtksourceview/gtksourcecompletion] Added GHashTable starting to work.
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: svn-commits-list gnome org
- Subject: [gtksourceview/gtksourcecompletion] Added GHashTable starting to work.
- Date: Tue, 23 Jun 2009 05:32:06 -0400 (EDT)
commit 8fe8d74b3ce958139224a8afe349529a1511ed09
Author: Ignacio Casal Quinteiro <icq gnome org>
Date: Tue Jun 9 00:45:35 2009 +0200
Added GHashTable starting to work.
gtksourceview/gtksourcecompletionmodel.c | 122 +++++++++++++++++++++++++----
1 files changed, 105 insertions(+), 17 deletions(-)
---
diff --git a/gtksourceview/gtksourcecompletionmodel.c b/gtksourceview/gtksourcecompletionmodel.c
index 31f9452..20d1fca 100644
--- a/gtksourceview/gtksourcecompletionmodel.c
+++ b/gtksourceview/gtksourcecompletionmodel.c
@@ -47,6 +47,7 @@ struct _GtkSourceCompletionModelPrivate
GType column_types[GTK_SOURCE_COMPLETION_MODEL_N_COLUMNS];
GList *store;
GList *last;
+ GHashTable *hash_store;
guint num;
GHashTable *num_per_provider;
@@ -270,6 +271,7 @@ tree_model_iter_children (GtkTreeModel *tree_model,
g_return_val_if_fail (iter != NULL, FALSE);
g_return_val_if_fail (parent == NULL || parent->user_data != NULL, FALSE);
+ /* FIXME: not sure if this should be: (GList *)iter->user_data, iter */
return get_next_element (GTK_SOURCE_COMPLETION_MODEL (tree_model)->priv->store, iter);
}
@@ -425,6 +427,12 @@ gtk_source_completion_model_dispose (GObject *object)
model->priv->num_per_provider = NULL;
}
+ if (model->priv->hash_store != NULL)
+ {
+ g_hash_table_destroy (model->priv->hash_store);
+ model->priv->hash_store = NULL;
+ }
+
g_list_foreach (model->priv->store, (GFunc)free_node, NULL);
g_list_free (model->priv->store);
model->priv->store = NULL;
@@ -466,6 +474,61 @@ free_num (gpointer data)
g_slice_free (HeaderInfo, data);
}
+/* We are going to compare only the label, if the label is the same the elements
+ * are the same, but in case anything else changed like the pixbuf or the changed
+ * we are going to substitute the previous element by the new one */
+ /* FIXME: add a equal func to be implemented by the user */
+static gboolean
+compare_nodes (gconstpointer a,
+ gconstpointer b)
+{
+ ProposalNode *p1 = (ProposalNode *)a;
+ ProposalNode *p2 = (ProposalNode *)b;
+ const gchar *label1, *label2;
+
+ label1 = gtk_source_completion_proposal_get_markup (p1->proposal);
+ label2 = gtk_source_completion_proposal_get_markup (p2->proposal);
+
+ if (label1 != NULL && label2 == NULL)
+ {
+ return FALSE;
+ }
+ else if (label2 != NULL && label1 == NULL)
+ {
+ return FALSE;
+ }
+ else if (label1 == NULL && label2 == NULL)
+ {
+ label1 = gtk_source_completion_proposal_get_label (p1->proposal);
+ label2 = gtk_source_completion_proposal_get_label (p2->proposal);
+ }
+
+ if (g_strcmp0 (label1, label2) == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static guint
+hash_node (gconstpointer v)
+{
+ ProposalNode *node = (ProposalNode *)v;
+ const gchar *label;
+
+ label = gtk_source_completion_proposal_get_markup (node->proposal);
+
+ if (label == NULL)
+ {
+ label = gtk_source_completion_proposal_get_label (node->proposal);
+ }
+
+ return g_str_hash (label);
+}
+
static void
gtk_source_completion_model_init (GtkSourceCompletionModel *self)
{
@@ -482,6 +545,9 @@ gtk_source_completion_model_init (GtkSourceCompletionModel *self)
NULL,
free_num);
+ self->priv->hash_store = g_hash_table_new (hash_node,
+ compare_nodes);
+
self->priv->idle_id = 0;
self->priv->item_queue = g_queue_new ();
g_queue_init (self->priv->item_queue);
@@ -594,24 +660,43 @@ gtk_source_completion_model_new (void)
return g_object_new (GTK_TYPE_SOURCE_COMPLETION_MODEL, NULL);
}
-static void
+static GList *
append_list (GtkSourceCompletionModel *model,
- ProposalNode *node)
+ ProposalNode *node,
+ gboolean *inserted)
{
GList *item;
- item = g_list_append (model->priv->last, node);
+ item = g_hash_table_lookup (model->priv->hash_store, node);
- if (model->priv->store == NULL)
+ if (item == NULL)
{
- model->priv->store = item;
+ item = g_list_append (model->priv->last, node);
+
+ if (model->priv->store == NULL)
+ {
+ model->priv->store = item;
+ }
+ else
+ {
+ item = item->next;
+ }
+
+ g_hash_table_insert (model->priv->hash_store,
+ node, item);
+ *inserted = TRUE;
}
else
{
- item = item->next;
+ /*g_hash_table_replace (model->priv->hash_store, node, item);
+ free_node (item->data);
+ item->data = node;*/
+ *inserted = FALSE;
}
model->priv->last = item;
+
+ return item;
}
static void
@@ -645,6 +730,7 @@ idle_append (gpointer data)
ProposalNode *node = (ProposalNode *)g_queue_pop_head (model->priv->item_queue);
ProposalNode *header = NULL;
GtkTreeIter iter;
+ gboolean inserted;
if (node == NULL)
{
@@ -657,7 +743,7 @@ idle_append (gpointer data)
}
/* Check if it is a header */
- if (g_hash_table_lookup (model->priv->num_per_provider, node->provider) == NULL)
+ /*if (g_hash_table_lookup (model->priv->num_per_provider, node->provider) == NULL)
{
header = g_slice_new (ProposalNode);
header->provider = g_object_ref (node->provider);
@@ -670,20 +756,21 @@ idle_append (gpointer data)
info->num = 0;
g_hash_table_insert (model->priv->num_per_provider, node->provider, info);
- }
+ }*/
- append_list (model, node);
+ item = append_list (model, node, &inserted);
- item = model->priv->last;
- iter.user_data = item;
+ if (inserted)
+ {
+ iter.user_data = item;
- num_inc (model, node->provider);
+ num_inc (model, node->provider);
- path = path_from_list (model, item);
- g_warning ("path: %s", gtk_tree_path_to_string (path));
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
- gtk_tree_path_free (path);
- return FALSE;
+ path = path_from_list (model, item);
+ gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
+ gtk_tree_path_free (path);
+ }
+
if (header != NULL)
{
g_warning ("header");
@@ -769,6 +856,7 @@ gtk_source_completion_model_clear (GtkSourceCompletionModel *model)
gtk_tree_path_free (path);
g_hash_table_remove_all (model->priv->num_per_provider);
+ g_hash_table_remove_all (model->priv->hash_store);
}
gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]