diff options
author | Shaun McCance <shaunm@src.gnome.org> | 2005-01-01 00:11:57 +0000 |
---|---|---|
committer | Shaun McCance <shaunm@src.gnome.org> | 2005-01-01 00:11:57 +0000 |
commit | 9de907d07a17843d6eb19ea0124f5558dca4c8a4 (patch) | |
tree | 86a6a9b9ac4397da54b584d0a8050a8b1bfe7cd5 | |
parent | 06d52e333e51584ad3b6c5e9f8ee76c57141766f (diff) | |
download | yelp-9de907d07a17843d6eb19ea0124f5558dca4c8a4.tar.gz |
- Make a hash of section ids and do resolve_frag properly
* src/yelp-info-pager.c:
- Make a hash of section ids and do resolve_frag properly
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/yelp-info-pager.c | 47 |
2 files changed, 49 insertions, 3 deletions
@@ -1,6 +1,11 @@ 2004-12-31 Shaun McCance <shaunm@gnome.org> * src/yelp-info-pager.c: + - Make a hash of section ids and do resolve_frag properly + +2004-12-31 Shaun McCance <shaunm@gnome.org> + + * src/yelp-info-pager.c: - Put the GtkTreeStore in the YelpInfoPagerPriv - Return "Top" in resolve_frag, just so something will show up diff --git a/src/yelp-info-pager.c b/src/yelp-info-pager.c index 5e0d1f76..8d346926 100644 --- a/src/yelp-info-pager.c +++ b/src/yelp-info-pager.c @@ -45,6 +45,7 @@ struct _YelpInfoPagerPriv { GtkTreeStore *tree; + GHashTable *frags_hash; }; static void info_pager_class_init (YelpInfoPagerClass *klass); @@ -55,9 +56,14 @@ static xmlDocPtr info_pager_parse (YelpPager *pager); static gchar ** info_pager_params (YelpPager *pager); static const gchar * info_pager_resolve_frag (YelpPager *pager, - const gchar *frag_id); + const gchar *frag_id); static GtkTreeModel * info_pager_get_sections (YelpPager *pager); +static gboolean tree_hash_id (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + YelpInfoPager *pager); + static YelpPagerClass *parent_class; GType @@ -110,6 +116,10 @@ info_pager_init (YelpInfoPager *pager) YelpInfoPagerPriv *priv; priv = g_new0 (YelpInfoPagerPriv, 1); + + /* In this hash, key == value */ + priv->frags_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + pager->priv = priv; } @@ -118,6 +128,9 @@ info_pager_dispose (GObject *object) { YelpInfoPager *pager = YELP_INFO_PAGER (object); + g_object_unref (pager->priv->tree); + g_hash_table_destroy (pager->priv->frags_hash); + g_free (pager->priv); G_OBJECT_CLASS (parent_class)->dispose (object); @@ -163,6 +176,10 @@ info_pager_parse (YelpPager *pager) /* create the XML file */ doc = yelp_info_parser_parse_tree (priv->tree); + + gtk_tree_model_foreach (GTK_TREE_MODEL (priv->tree), + (GtkTreeModelForeachFunc) tree_hash_id, + pager); g_object_unref (pager); @@ -189,8 +206,12 @@ info_pager_params (YelpPager *pager) static const gchar * info_pager_resolve_frag (YelpPager *pager, const gchar *frag_id) { - /* MUST DO THIS RIGHTLY */ - return "Top"; + g_return_val_if_fail (YELP_IS_INFO_PAGER (pager), NULL); + + if (frag_id) + return g_hash_table_lookup (YELP_INFO_PAGER (pager)->priv->frags_hash, frag_id); + else + return g_hash_table_lookup (YELP_INFO_PAGER (pager)->priv->frags_hash, "Top"); } static GtkTreeModel * @@ -200,3 +221,23 @@ info_pager_get_sections (YelpPager *pager) return YELP_INFO_PAGER (pager)->priv->tree; } + +static gboolean +tree_hash_id (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + YelpInfoPager *pager) +{ + YelpInfoPagerPriv *priv; + gchar *id; + + priv = pager->priv; + + gtk_tree_model_get (model, iter, + YELP_PAGER_COLUMN_ID, &id, + -1); + if (id) + g_hash_table_replace (priv->frags_hash, id, id); + + return FALSE; +} |