aboutsummaryrefslogtreecommitdiffstats
path: root/lib/egg/egg-toolbars-model.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/egg/egg-toolbars-model.c')
-rwxr-xr-xlib/egg/egg-toolbars-model.c146
1 files changed, 120 insertions, 26 deletions
diff --git a/lib/egg/egg-toolbars-model.c b/lib/egg/egg-toolbars-model.c
index 682ee59b3..51ada3703 100755
--- a/lib/egg/egg-toolbars-model.c
+++ b/lib/egg/egg-toolbars-model.c
@@ -65,7 +65,7 @@ struct EggToolbarsModelPrivate
{
GNode *toolbars;
GList *types;
- GHashTable *avail;
+ GHashTable *flags;
};
GType
@@ -223,9 +223,9 @@ safe_save_xml (const char *xml_file, xmlDocPtr doc)
}
void
-egg_toolbars_model_save (EggToolbarsModel *model,
- const char *xml_file,
- const char *version)
+egg_toolbars_model_save_toolbars (EggToolbarsModel *model,
+ const char *xml_file,
+ const char *version)
{
xmlDocPtr doc;
xmlNodePtr root;
@@ -239,6 +239,32 @@ egg_toolbars_model_save (EggToolbarsModel *model,
xmlFreeDoc (doc);
}
+static gboolean
+is_unique (EggToolbarsModel *model,
+ EggToolbarsItem *idata)
+{
+ EggToolbarsItem *idata2;
+ GNode *toolbar, *item;
+
+
+ for(toolbar = g_node_first_child (model->priv->toolbars);
+ toolbar != NULL; toolbar = g_node_next_sibling (toolbar))
+ {
+ for(item = g_node_first_child (toolbar);
+ item != NULL; item = g_node_next_sibling (item))
+ {
+ idata2 = item->data;
+
+ if (idata != idata2 && strcmp (idata->name, idata2->name) == 0)
+ {
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
static GNode *
toolbar_node_new (const char *name)
{
@@ -255,18 +281,18 @@ static GNode *
item_node_new (const char *name, EggToolbarsModel *model)
{
EggToolbarsItem *item;
- int count;
+ int flags;
g_return_val_if_fail (name != NULL, NULL);
item = g_new (EggToolbarsItem, 1);
item->name = g_strdup (name);
- count = GPOINTER_TO_INT (g_hash_table_lookup (model->priv->avail, item->name));
- if (count > G_MININT && count < G_MAXINT)
- g_hash_table_insert (model->priv->avail,
+ flags = GPOINTER_TO_INT (g_hash_table_lookup (model->priv->flags, item->name));
+ if ((flags & EGG_TB_MODEL_NAME_INFINITE) == 0)
+ g_hash_table_insert (model->priv->flags,
g_strdup (item->name),
- GINT_TO_POINTER (count - 1));
+ GINT_TO_POINTER (flags | EGG_TB_MODEL_NAME_USED));
return g_node_new (item);
}
@@ -275,13 +301,13 @@ static void
item_node_free (GNode *item_node, EggToolbarsModel *model)
{
EggToolbarsItem *item = item_node->data;
- int count;
+ int flags;
- count = GPOINTER_TO_INT (g_hash_table_lookup (model->priv->avail, item->name));
- if (count < G_MAXINT - 1)
- g_hash_table_insert (model->priv->avail,
+ flags = GPOINTER_TO_INT (g_hash_table_lookup (model->priv->flags, item->name));
+ if ((flags & EGG_TB_MODEL_NAME_INFINITE) == 0 && is_unique (model, item))
+ g_hash_table_insert (model->priv->flags,
g_strdup (item->name),
- GINT_TO_POINTER (count + 1));
+ GINT_TO_POINTER (flags & ~EGG_TB_MODEL_NAME_USED));
g_free (item->name);
g_free (item);
@@ -582,8 +608,8 @@ parse_toolbars (EggToolbarsModel *model,
}
gboolean
-egg_toolbars_model_load (EggToolbarsModel *model,
- const char *xml_file)
+egg_toolbars_model_load_toolbars (EggToolbarsModel *model,
+ const char *xml_file)
{
xmlDocPtr doc;
xmlNodePtr root;
@@ -608,6 +634,70 @@ egg_toolbars_model_load (EggToolbarsModel *model,
}
static void
+parse_available_list (EggToolbarsModel *model,
+ xmlNodePtr child)
+{
+ gint flags;
+
+ while (child)
+ {
+ if (xmlStrEqual (child->name, (const xmlChar*) "toolitem"))
+ {
+ xmlChar *name;
+
+ name = xmlGetProp (child, (const xmlChar*) "name");
+ flags = egg_toolbars_model_get_name_flags
+ (model, (const char*)name);
+ egg_toolbars_model_set_name_flags
+ (model, (const char*)name, flags | EGG_TB_MODEL_NAME_KNOWN);
+ xmlFree (name);
+ }
+ child = child->next;
+ }
+}
+
+static void
+parse_names (EggToolbarsModel *model,
+ xmlNodePtr child)
+{
+ while (child)
+ {
+ if (xmlStrEqual (child->name, (const xmlChar*) "available"))
+ {
+ parse_available_list (model, child->children);
+ }
+
+ child = child->next;
+ }
+}
+
+gboolean
+egg_toolbars_model_load_names (EggToolbarsModel *model,
+ const char *xml_file)
+{
+ xmlDocPtr doc;
+ xmlNodePtr root;
+
+ g_return_val_if_fail (EGG_IS_TOOLBARS_MODEL (model), FALSE);
+
+ if (!xml_file || !g_file_test (xml_file, G_FILE_TEST_EXISTS)) return FALSE;
+
+ doc = xmlParseFile (xml_file);
+ if (doc == NULL)
+ {
+ g_warning ("Failed to load XML data from %s", xml_file);
+ return FALSE;
+ }
+ root = xmlDocGetRootElement (doc);
+
+ parse_names (model, root->children);
+
+ xmlFreeDoc (doc);
+
+ return TRUE;
+}
+
+static void
egg_toolbars_model_class_init (EggToolbarsModelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -663,8 +753,10 @@ egg_toolbars_model_init (EggToolbarsModel *model)
model->priv =EGG_TOOLBARS_MODEL_GET_PRIVATE (model);
model->priv->toolbars = g_node_new (NULL);
- model->priv->avail = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- egg_toolbars_model_set_n_avail (model, "_separator", G_MAXINT);
+ model->priv->flags = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ egg_toolbars_model_set_name_flags (model, "_separator",
+ EGG_TB_MODEL_NAME_KNOWN |
+ EGG_TB_MODEL_NAME_INFINITE);
}
static void
@@ -675,7 +767,7 @@ egg_toolbars_model_finalize (GObject *object)
g_node_children_foreach (model->priv->toolbars, G_TRAVERSE_ALL,
(GNodeForeachFunc) toolbar_node_free, model);
g_node_destroy (model->priv->toolbars);
- g_hash_table_destroy (model->priv->avail);
+ g_hash_table_destroy (model->priv->flags);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -891,25 +983,27 @@ egg_toolbars_model_set_types (EggToolbarsModel *model, GList *types)
static void
fill_avail_array (gpointer key, gpointer value, GPtrArray *array)
{
- if (GPOINTER_TO_INT (value) > 0) g_ptr_array_add (array, key);
+ int flags = GPOINTER_TO_INT (value);
+ if ((flags & EGG_TB_MODEL_NAME_KNOWN) && !(flags & EGG_TB_MODEL_NAME_USED))
+ g_ptr_array_add (array, key);
}
GPtrArray *
-egg_toolbars_model_get_avail (EggToolbarsModel *model)
+egg_toolbars_model_get_name_avail (EggToolbarsModel *model)
{
GPtrArray *array = g_ptr_array_new ();
- g_hash_table_foreach (model->priv->avail, (GHFunc) fill_avail_array, array);
+ g_hash_table_foreach (model->priv->flags, (GHFunc) fill_avail_array, array);
return array;
}
gint
-egg_toolbars_model_get_n_avail (EggToolbarsModel *model, const char *name)
+egg_toolbars_model_get_name_flags (EggToolbarsModel *model, const char *name)
{
- return GPOINTER_TO_INT (g_hash_table_lookup (model->priv->avail, name));
+ return GPOINTER_TO_INT (g_hash_table_lookup (model->priv->flags, name));
}
void
-egg_toolbars_model_set_n_avail (EggToolbarsModel *model, const char *name, gint count)
+egg_toolbars_model_set_name_flags (EggToolbarsModel *model, const char *name, gint flags)
{
- g_hash_table_insert (model->priv->avail, g_strdup (name), GINT_TO_POINTER (count));
+ g_hash_table_insert (model->priv->flags, g_strdup (name), GINT_TO_POINTER (flags));
}