# HG changeset patch
# User nadvornik
# Date 1236553767 0
# Node ID de06d83e1adcb490a781137bf6a9c2958b8e0ca8
# Parent 9274b3b4eaade21d1ae624067b4575ce6768863c
save and restore the keyword tree
diff -r 9274b3b4eaad -r de06d83e1adc src/metadata.c
--- a/src/metadata.c Sun Mar 08 21:12:45 2009 +0000
+++ b/src/metadata.c Sun Mar 08 23:09:27 2009 +0000
@@ -24,6 +24,7 @@
#include "utilops.h"
#include "filefilter.h"
#include "layout.h"
+#include "rcfile.h"
typedef enum {
MK_NONE,
@@ -982,10 +983,19 @@
}
}
+void keyword_tree_new(void)
+{
+ if (keyword_tree) return;
+
+ keyword_tree = gtk_tree_store_new(KEYWORD_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+}
+
void keyword_tree_new_default(void)
{
- keyword_tree = gtk_tree_store_new(KEYWORD_COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+ if (keyword_tree) return;
+
+ keyword_tree_new();
GtkTreeIter i1, i2, i3;
@@ -1022,4 +1032,72 @@
}
+static void keyword_tree_node_write_config(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GString *outstr, gint indent)
+{
+ GtkTreeIter iter = *iter_ptr;
+ while (TRUE)
+ {
+ GtkTreeIter children;
+ gchar *name;
+
+ WRITE_STRING("\n");
+ indent++;
+ if (gtk_tree_model_iter_children(keyword_tree, &children, &iter))
+ {
+ keyword_tree_node_write_config(keyword_tree, &children, outstr, indent);
+ }
+ indent--;
+ WRITE_STRING("\n");
+ if (!gtk_tree_model_iter_next(keyword_tree, &iter)) return;
+ }
+}
+
+void keyword_tree_write_config(GString *outstr, gint indent)
+{
+ GtkTreeIter iter;
+ WRITE_STRING("\n");
+ indent++;
+
+ if (keyword_tree && gtk_tree_model_get_iter_first(GTK_TREE_MODEL(keyword_tree), &iter))
+ {
+ keyword_tree_node_write_config(GTK_TREE_MODEL(keyword_tree), &iter, outstr, indent);
+ }
+ indent--;
+ WRITE_STRING("\n");
+}
+
+GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values)
+{
+ gchar *name = NULL;
+ gboolean is_kw = TRUE;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+
+ if (READ_CHAR_FULL("name", name)) continue;
+ if (READ_BOOL_FULL("kw", is_kw)) continue;
+
+ DEBUG_1("unknown attribute %s = %s", option, value);
+ }
+ if (name && name[0])
+ {
+ GtkTreeIter iter;
+ gtk_tree_store_append(keyword_tree, &iter, parent);
+ keyword_set(keyword_tree, &iter, name, is_kw);
+ g_free(name);
+ return gtk_tree_iter_copy(&iter);
+ }
+ g_free(name);
+ return NULL;
+}
+
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r 9274b3b4eaad -r de06d83e1adc src/metadata.h
--- a/src/metadata.h Sun Mar 08 21:12:45 2009 +0000
+++ b/src/metadata.h Sun Mar 08 23:09:27 2009 +0000
@@ -70,7 +70,10 @@
void keyword_tree_reset(GtkTreeModel *keyword_tree, GtkTreeIter *iter_ptr, GList **kw_list);
void keyword_tree_new_default(void);
+void keyword_tree_new(void);
+void keyword_tree_write_config(GString *outstr, gint indent);
+GtkTreeIter *keyword_add_from_config(GtkTreeStore *keyword_tree, GtkTreeIter *parent, const gchar **attribute_names, const gchar **attribute_values);
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r 9274b3b4eaad -r de06d83e1adc src/rcfile.c
--- a/src/rcfile.c Sun Mar 08 21:12:45 2009 +0000
+++ b/src/rcfile.c Sun Mar 08 23:09:27 2009 +0000
@@ -32,6 +32,7 @@
#include "layout.h"
#include "layout_util.h"
#include "bar.h"
+#include "metadata.h"
/*
@@ -537,7 +538,7 @@
WRITE_STRING("layout, outstr, indent + 1);
WRITE_STRING("/>\n");
-
+ keyword_tree_write_config(outstr, indent);
indent--;
WRITE_STRING("\n");
@@ -821,6 +822,45 @@
/* else this is called in init_after_global_options */
}
+static void options_parse_keyword_end(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, gpointer data, GError **error)
+{
+ GtkTreeIter *iter_ptr = data;
+ gtk_tree_iter_free(iter_ptr);
+}
+
+
+static void options_parse_keyword(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
+{
+ GtkTreeIter *iter_ptr = data;
+ if (g_ascii_strcasecmp(element_name, "keyword") == 0)
+ {
+ GtkTreeIter *child = keyword_add_from_config(keyword_tree, iter_ptr, attribute_names, attribute_values);
+ options_parse_func_push(parser_data, options_parse_keyword, options_parse_keyword_end, child);
+ }
+ else
+ {
+ DEBUG_1("unexpected in : <%s>", element_name);
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
+}
+
+
+
+static void options_parse_keyword_tree(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
+{
+ if (g_ascii_strcasecmp(element_name, "keyword") == 0)
+ {
+ GtkTreeIter *iter_ptr = keyword_add_from_config(keyword_tree, NULL, attribute_names, attribute_values);
+ options_parse_func_push(parser_data, options_parse_keyword, options_parse_keyword_end, iter_ptr);
+ }
+ else
+ {
+ DEBUG_1("unexpected in : <%s>", element_name);
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
+}
+
+
static void options_parse_global(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error)
{
if (g_ascii_strcasecmp(element_name, "color_profiles") == 0)
@@ -832,6 +872,11 @@
{
options_parse_func_push(parser_data, options_parse_filter, options_parse_filter_end, NULL);
}
+ else if (g_ascii_strcasecmp(element_name, "keyword_tree") == 0)
+ {
+ if (!keyword_tree) keyword_tree_new();
+ options_parse_func_push(parser_data, options_parse_keyword_tree, NULL, NULL);
+ }
else if (g_ascii_strcasecmp(element_name, "layout") == 0)
{
layout_load_attributes(&options->layout, attribute_names, attribute_values);