# HG changeset patch
# User nadvornik
# Date 1237584511 0
# Node ID 607c60506863c6986ebf0414f6e1afa1318ac02b
# Parent e9f9d3da3f43719e3e4b90d431e6bff421ec03c3
added a possibility to update existing bars from config
diff -r e9f9d3da3f43 -r 607c60506863 src/bar.c
--- a/src/bar.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar.c Fri Mar 20 21:28:31 2009 +0000
@@ -151,6 +151,57 @@
return ret;
}
+GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id)
+{
+ BarData *bd;
+ GList *list, *work;
+ GtkWidget *ret = NULL;
+
+ if (!id || !id[0]) return NULL;
+
+ bd = g_object_get_data(G_OBJECT(bar), "bar_data");
+ if (!bd) return NULL;
+
+ list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
+
+ work = list;
+ while (work)
+ {
+ GtkWidget *widget = gtk_bin_get_child(GTK_BIN(work->data));
+ PaneData *pd = g_object_get_data(G_OBJECT(widget), "pane_data");
+ if (!pd) continue;
+
+ if (type == pd->type && strcmp(id, pd->id) == 0)
+ {
+ ret = widget;
+ break;
+ }
+ work = work->next;
+ }
+ g_list_free(list);
+ return ret;
+}
+
+void bar_clear(GtkWidget *bar)
+{
+ BarData *bd;
+ GList *list, *work;
+
+ bd = g_object_get_data(G_OBJECT(bar), "bar_data");
+ if (!bd) return;
+
+ list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
+
+ work = list;
+ while (work)
+ {
+ GtkWidget *widget = work->data;
+ gtk_widget_destroy(widget);
+ work = work->next;
+ }
+ g_list_free(list);
+}
+
void bar_write_config(GtkWidget *bar, GString *outstr, gint indent)
{
BarData *bd;
@@ -165,6 +216,9 @@
write_bool_option(outstr, indent, "enabled", GTK_WIDGET_VISIBLE(bar));
write_uint_option(outstr, indent, "width", bd->width);
WRITE_STRING(">");
+
+ indent++;
+ WRITE_NL(); WRITE_STRING("");
list = gtk_container_get_children(GTK_CONTAINER(bd->vbox));
work = list;
@@ -178,15 +232,26 @@
pd->expanded = gtk_expander_get_expanded(GTK_EXPANDER(expander));
if (pd->pane_write_config)
- pd->pane_write_config(widget, outstr, indent + 1);
+ pd->pane_write_config(widget, outstr, indent);
work = work->next;
}
g_list_free(list);
-
+ indent--;
WRITE_NL(); WRITE_STRING("");
}
+void bar_update_expander(GtkWidget *pane)
+{
+ PaneData *pd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ GtkWidget *expander;
+
+ if (!pd) return;
+
+ expander = pane->parent;
+
+ gtk_expander_set_expanded(GTK_EXPANDER(expander), pd->expanded);
+}
void bar_add(GtkWidget *bar, GtkWidget *pane)
{
@@ -224,19 +289,19 @@
{
GtkWidget *widget;
- widget = bar_pane_histogram_new(_("Histogram"), 80, TRUE, HCHAN_RGB, 0);
+ widget = bar_pane_histogram_new("histogram", _("Histogram"), 80, TRUE, HCHAN_RGB, 0);
bar_add(bar, widget);
- widget = bar_pane_comment_new(_("Title"), "Xmp.dc.title", TRUE, 40);
+ widget = bar_pane_comment_new("title", _("Title"), "Xmp.dc.title", TRUE, 40);
bar_add(bar, widget);
- widget = bar_pane_keywords_new(_("Keywords"), KEYWORD_KEY, TRUE);
+ widget = bar_pane_keywords_new("keywords", _("Keywords"), KEYWORD_KEY, TRUE);
bar_add(bar, widget);
- widget = bar_pane_comment_new(_("Comment"), "Xmp.dc.description", TRUE, 150);
+ widget = bar_pane_comment_new("comment", _("Comment"), "Xmp.dc.description", TRUE, 150);
bar_add(bar, widget);
- widget = bar_pane_exif_new(_("Exif"), TRUE, TRUE);
+ widget = bar_pane_exif_new("exif", _("Exif"), TRUE, TRUE);
bar_add(bar, widget);
}
@@ -335,10 +400,8 @@
return bar;
}
-GtkWidget *bar_new_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values)
+GtkWidget *bar_update_from_config(GtkWidget *bar, const gchar **attribute_names, const gchar **attribute_values)
{
- GtkWidget *bar = bar_new(lw);
-
gboolean enabled = TRUE;
gint width = SIDEBAR_DEFAULT_WIDTH;
@@ -355,10 +418,23 @@
}
gtk_widget_set_size_request(bar, width, -1);
- if (enabled) gtk_widget_show(bar);
+ if (enabled)
+ {
+ gtk_widget_show(bar);
+ }
+ else
+ {
+ gtk_widget_hide(bar);
+ }
return bar;
}
+GtkWidget *bar_new_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values)
+{
+ GtkWidget *bar = bar_new(lw);
+ return bar_update_from_config(bar, attribute_names, attribute_values);
+}
+
GtkWidget *bar_pane_expander_title(const gchar *title)
{
GtkWidget *widget = gtk_label_new(title);
diff -r e9f9d3da3f43 -r 607c60506863 src/bar.h
--- a/src/bar.h Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar.h Fri Mar 20 21:28:31 2009 +0000
@@ -14,6 +14,13 @@
#ifndef BAR_H
#define BAR_H
+typedef enum {
+ PANE_COMMENT,
+ PANE_EXIF,
+ PANE_HISTOGRAM,
+ PANE_KEYWORDS
+} PaneType;
+
typedef struct _PaneData PaneData;
struct _PaneData {
@@ -23,6 +30,8 @@
void (*pane_write_config)(GtkWidget *pane, GString *outstr, gint indent);
GtkWidget *title;
gboolean expanded;
+ gchar *id;
+ PaneType type;
/* filled in by bar */
GtkWidget *bar;
@@ -31,16 +40,20 @@
+
GtkWidget *bar_new(LayoutWindow *lw);
GtkWidget *bar_new_default(LayoutWindow *lw);
GtkWidget *bar_new_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values);
+GtkWidget *bar_update_from_config(GtkWidget *bar, const gchar **attribute_names, const gchar **attribute_values);
void bar_close(GtkWidget *bar);
void bar_write_config(GtkWidget *bar, GString *outstr, gint indent);
void bar_add(GtkWidget *bar, GtkWidget *pane);
+GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id);
+void bar_clear(GtkWidget *bar);
void bar_set_fd(GtkWidget *bar, FileData *fd);
gboolean bar_event(GtkWidget *bar, GdkEvent *event);
@@ -48,6 +61,6 @@
gint bar_get_width(GtkWidget *bar);
GtkWidget *bar_pane_expander_title(const gchar *title);
-
+void bar_update_expander(GtkWidget *pane);
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_comment.c
--- a/src/bar_comment.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_comment.c Fri Mar 20 21:28:31 2009 +0000
@@ -151,8 +151,9 @@
if (!pcd) return;
WRITE_NL(); WRITE_STRING("pane.title)));
- WRITE_BOOL(*pcd, pane.expanded);
+ write_char_option(outstr, indent, "id", pcd->pane.id);
+ write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(pcd->pane.title)));
+ WRITE_BOOL(pcd->pane, expanded);
WRITE_CHAR(*pcd, key);
WRITE_INT(*pcd, height);
WRITE_STRING("/>");
@@ -202,13 +203,14 @@
file_data_unref(pcd->fd);
g_free(pcd->key);
-
+
+ g_free(pcd->pane.id);
g_free(pcd);
}
-GtkWidget *bar_pane_comment_new(const gchar *title, const gchar *key, gboolean expanded, gint height)
+GtkWidget *bar_pane_comment_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded, gint height)
{
PaneCommentData *pcd;
GtkWidget *scrolled;
@@ -220,6 +222,8 @@
pcd->pane.pane_event = bar_pane_comment_event;
pcd->pane.pane_write_config = bar_pane_comment_write_config;
pcd->pane.title = bar_pane_expander_title(title);
+ pcd->pane.id = g_strdup(id);
+ pcd->pane.type = PANE_COMMENT;
pcd->pane.expanded = expanded;
@@ -237,7 +241,7 @@
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(scrolled, -1, height);
+ gtk_widget_set_size_request(pcd->widget, -1, height);
gtk_widget_show(scrolled);
pcd->comment_view = gtk_text_view_new();
@@ -259,26 +263,67 @@
GtkWidget *bar_pane_comment_new_from_config(const gchar **attribute_names, const gchar **attribute_values)
{
- gchar *title = g_strdup(_("NoName"));
+ gchar *title = g_strdup(_("Comment"));
gchar *key = g_strdup(COMMENT_KEY);
gboolean expanded = TRUE;
gint height = 50;
+ gchar *id = g_strdup("comment");
+ GtkWidget *ret;
while (*attribute_names)
{
const gchar *option = *attribute_names++;
const gchar *value = *attribute_values++;
- if (READ_CHAR_FULL("pane.title", title)) continue;
+ if (READ_CHAR_FULL("title", title)) continue;
if (READ_CHAR_FULL("key", key)) continue;
- if (READ_BOOL_FULL("pane.expanded", expanded)) continue;
+ if (READ_BOOL_FULL("expanded", expanded)) continue;
if (READ_INT_FULL("height", height)) continue;
+ if (READ_CHAR_FULL("id", id)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
- return bar_pane_comment_new(title, key, expanded, height);
+ ret = bar_pane_comment_new(id, title, key, expanded, height);
+ g_free(title);
+ g_free(key);
+ g_free(id);
+ return ret;
+}
+
+void bar_pane_comment_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
+{
+ PaneCommentData *pcd;
+
+ pcd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!pcd) return;
+
+ gchar *title = NULL;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+
+ if (READ_CHAR_FULL("title", title)) continue;
+ if (READ_CHAR_FULL("key", pcd->key)) continue;
+ if (READ_BOOL_FULL("expanded", pcd->pane.expanded)) continue;
+ if (READ_INT_FULL("height", pcd->height)) continue;
+ if (READ_CHAR_FULL("id", pcd->pane.id)) continue;
+
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+
+ if (title)
+ {
+ gtk_label_set_text(GTK_LABEL(pcd->pane.title), title);
+ g_free(title);
+ }
+ gtk_widget_set_size_request(pcd->widget, -1, pcd->height);
+ bar_update_expander(pane);
+ bar_pane_comment_update(pcd);
}
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_comment.h
--- a/src/bar_comment.h Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_comment.h Fri Mar 20 21:28:31 2009 +0000
@@ -14,8 +14,9 @@
#ifndef BAR_COMMENT_H
#define BAR_COMMENT_H
-GtkWidget *bar_pane_comment_new(const gchar *title, const gchar *key, gboolean expanded, gint height);
+GtkWidget *bar_pane_comment_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded, gint height);
GtkWidget *bar_pane_comment_new_from_config(const gchar **attribute_names, const gchar **attribute_values);
+void bar_pane_comment_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_exif.c
--- a/src/bar_exif.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_exif.c Fri Mar 20 21:28:31 2009 +0000
@@ -653,8 +653,9 @@
if (!ped) return;
WRITE_NL(); WRITE_STRING("pane.title)));
- WRITE_BOOL(*ped, pane.expanded);
+ write_char_option(outstr, indent, "id", ped->pane.id);
+ write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(ped->pane.title)));
+ WRITE_BOOL(ped->pane, expanded);
WRITE_STRING(">");
indent++;
@@ -690,6 +691,7 @@
file_data_unregister_notify_func(bar_pane_exif_notify_cb, ped);
g_object_unref(ped->size_group);
file_data_unref(ped->fd);
+ g_free(ped->pane.id);
g_free(ped);
}
@@ -708,7 +710,7 @@
ped->min_height = alloc->height;
}
-GtkWidget *bar_pane_exif_new(const gchar *title, gboolean expanded, gboolean populate)
+GtkWidget *bar_pane_exif_new(const gchar *id, const gchar *title, gboolean expanded, gboolean populate)
{
PaneExifData *ped;
@@ -718,7 +720,9 @@
ped->pane.pane_write_config = bar_pane_exif_write_config;
ped->pane.pane_event = bar_pane_exif_event;
ped->pane.title = bar_pane_expander_title(title);
+ ped->pane.id = g_strdup(id);
ped->pane.expanded = expanded;
+ ped->pane.type = PANE_EXIF;
ped->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
ped->widget = gtk_event_box_new();
@@ -771,23 +775,62 @@
GtkWidget *bar_pane_exif_new_from_config(const gchar **attribute_names, const gchar **attribute_values)
{
- gchar *title = g_strdup(_("NoName"));
+ gchar *title = g_strdup(_("Exif"));
+ gchar *id = g_strdup("exif");
gboolean expanded = TRUE;
+ GtkWidget *ret;
while (*attribute_names)
{
const gchar *option = *attribute_names++;
const gchar *value = *attribute_values++;
- if (READ_CHAR_FULL("pane.title", title)) continue;
- if (READ_BOOL_FULL("pane.expanded", expanded)) continue;
+ if (READ_CHAR_FULL("id", id)) continue;
+ if (READ_CHAR_FULL("title", title)) continue;
+ if (READ_BOOL_FULL("expanded", expanded)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
- return bar_pane_exif_new(title, expanded, FALSE);
+ ret = bar_pane_exif_new(id, title, expanded, FALSE);
+ g_free(title);
+ g_free(id);
+ return ret;
}
+void bar_pane_exif_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
+{
+ PaneExifData *ped;
+
+ ped = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!ped) return;
+
+ gchar *title = NULL;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+
+ if (READ_CHAR_FULL("title", title)) continue;
+ if (READ_BOOL_FULL("expanded", ped->pane.expanded)) continue;
+ if (READ_CHAR_FULL("id", ped->pane.id)) continue;
+
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+
+ if (title)
+ {
+ gtk_label_set_text(GTK_LABEL(ped->pane.title), title);
+ g_free(title);
+ }
+
+ bar_update_expander(pane);
+ bar_pane_exif_update(ped);
+}
+
+
void bar_pane_exif_entry_add_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
{
PaneExifData *ped;
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_exif.h
--- a/src/bar_exif.h Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_exif.h Fri Mar 20 21:28:31 2009 +0000
@@ -14,8 +14,10 @@
#ifndef BAR_EXIF_H
#define BAR_EXIF_H
-GtkWidget *bar_pane_exif_new(const gchar *title, gboolean expanded, gboolean populate);
+GtkWidget *bar_pane_exif_new(const gchar *id, const gchar *title, gboolean expanded, gboolean populate);
GtkWidget *bar_pane_exif_new_from_config(const gchar **attribute_names, const gchar **attribute_values);
+void bar_pane_exif_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
+
void bar_pane_exif_entry_add_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
/* these are exposed for when duplication of the exif bar's text is needed */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_histogram.c
--- a/src/bar_histogram.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_histogram.c Fri Mar 20 21:28:31 2009 +0000
@@ -118,8 +118,9 @@
if (!phd) return;
WRITE_NL(); WRITE_STRING("pane.title)));
- WRITE_BOOL(*phd, pane.expanded);
+ write_char_option(outstr, indent, "id", phd->pane.id);
+ write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(phd->pane.title)));
+ WRITE_BOOL(phd->pane, expanded);
WRITE_INT(*phd->histogram, histogram_channel);
WRITE_INT(*phd->histogram, histogram_mode);
WRITE_STRING("/>");
@@ -182,6 +183,7 @@
file_data_unref(phd->fd);
histogram_free(phd->histogram);
if (phd->pixbuf) g_object_unref(phd->pixbuf);
+ g_free(phd->pane.id);
g_free(phd);
}
@@ -326,7 +328,7 @@
}
-GtkWidget *bar_pane_histogram_new(const gchar *title, gint height, gboolean expanded, gint histogram_channel, gint histogram_mode)
+GtkWidget *bar_pane_histogram_new(const gchar *id, const gchar *title, gint height, gboolean expanded, gint histogram_channel, gint histogram_mode)
{
PaneHistogramData *phd;
@@ -335,6 +337,8 @@
phd->pane.pane_set_fd = bar_pane_histogram_set_fd;
phd->pane.pane_write_config = bar_pane_histogram_write_config;
phd->pane.title = bar_pane_expander_title(title);
+ phd->pane.id = g_strdup(id);
+ phd->pane.type = PANE_HISTOGRAM;
phd->pane.expanded = expanded;
phd->idle_id = -1;
@@ -376,25 +380,64 @@
GtkWidget *bar_pane_histogram_new_from_config(const gchar **attribute_names, const gchar **attribute_values)
{
gchar *title = g_strdup(_("NoName"));
+ gchar *id = g_strdup("histogram");
gboolean expanded = TRUE;
gint height = 80;
gint histogram_channel = HCHAN_RGB;
gint histogram_mode = 0;
+ GtkWidget *ret;
while (*attribute_names)
{
const gchar *option = *attribute_names++;
const gchar *value = *attribute_values++;
- if (READ_CHAR_FULL("pane.title", title)) continue;
- if (READ_BOOL_FULL("pane.expanded", expanded)) continue;
+ if (READ_CHAR_FULL("id", id)) continue;
+ if (READ_CHAR_FULL("title", title)) continue;
+ if (READ_BOOL_FULL("expanded", expanded)) continue;
if (READ_INT_FULL("histogram_channel", histogram_channel)) continue;
if (READ_INT_FULL("histogram_mode", histogram_mode)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
- return bar_pane_histogram_new(title, height, expanded, histogram_channel, histogram_mode);
+ ret = bar_pane_histogram_new(id, title, height, expanded, histogram_channel, histogram_mode);
+ g_free(title);
+ g_free(id);
+ return ret;
}
+void bar_pane_histogram_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
+{
+ PaneHistogramData *phd;
+
+ phd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!phd) return;
+
+ gint histogram_channel = phd->histogram->histogram_channel;
+ gint histogram_mode = phd->histogram->histogram_mode;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+
+ if (READ_CHAR_FULL("id", phd->pane.id)) continue;
+// if (READ_CHAR_FULL("pane.title", title)) continue;
+ if (READ_BOOL_FULL("expanded", phd->pane.expanded)) continue;
+ if (READ_INT_FULL("histogram_channel", histogram_channel)) continue;
+ if (READ_INT_FULL("histogram_mode", histogram_mode)) continue;
+
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+
+ histogram_set_channel(phd->histogram, histogram_channel);
+ histogram_set_mode(phd->histogram, histogram_mode);
+
+ bar_update_expander(pane);
+ bar_pane_histogram_update(phd);
+}
+
+
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_histogram.h
--- a/src/bar_histogram.h Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_histogram.h Fri Mar 20 21:28:31 2009 +0000
@@ -14,8 +14,9 @@
#ifndef BAR_HISTOGRAM_H
#define BAR_HISTOGRAM_H
-GtkWidget *bar_pane_histogram_new(const gchar *title, gint height, gboolean expanded, gint histogram_channel, gint histogram_mode);
+GtkWidget *bar_pane_histogram_new(const gchar *id, const gchar *title, gint height, gboolean expanded, gint histogram_channel, gint histogram_mode);
GtkWidget *bar_pane_histogram_new_from_config(const gchar **attribute_names, const gchar **attribute_values);
+void bar_pane_histogram_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_keywords.c
--- a/src/bar_keywords.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_keywords.c Fri Mar 20 21:28:31 2009 +0000
@@ -248,8 +248,9 @@
if (!pkd) return;
WRITE_NL(); WRITE_STRING("pane.title)));
- WRITE_BOOL(*pkd, pane.expanded);
+ write_char_option(outstr, indent, "id", pkd->pane.id);
+ write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(pkd->pane.title)));
+ WRITE_BOOL(pkd->pane, expanded);
WRITE_CHAR(*pkd, key);
WRITE_STRING("/>");
}
@@ -1181,7 +1182,8 @@
pkd = g_object_get_data(G_OBJECT(bar), "pane_data");
if (!pkd) return;
-
+
+ g_free(pkd->pane.id);
gtk_widget_destroy(pkd->widget);
}
@@ -1200,7 +1202,7 @@
}
-GtkWidget *bar_pane_keywords_new(const gchar *title, const gchar *key, gboolean expanded)
+GtkWidget *bar_pane_keywords_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded)
{
PaneKeywordsData *pkd;
GtkWidget *hbox;
@@ -1216,6 +1218,8 @@
pkd->pane.pane_event = bar_pane_keywords_event;
pkd->pane.pane_write_config = bar_pane_keywords_write_config;
pkd->pane.title = bar_pane_expander_title(title);
+ pkd->pane.id = g_strdup(id);
+ pkd->pane.type = PANE_KEYWORDS;
pkd->pane.expanded = expanded;
@@ -1345,24 +1349,65 @@
GtkWidget *bar_pane_keywords_new_from_config(const gchar **attribute_names, const gchar **attribute_values)
{
- gchar *title = g_strdup(_("NoName"));
+ gchar *id = g_strdup("keywords");
+ gchar *title = g_strdup(_("Keywords"));
gchar *key = g_strdup(COMMENT_KEY);
gboolean expanded = TRUE;
+ GtkWidget *ret;
while (*attribute_names)
{
const gchar *option = *attribute_names++;
const gchar *value = *attribute_values++;
- if (READ_CHAR_FULL("pane.title", title)) continue;
+ if (READ_CHAR_FULL("id", id)) continue;
+ if (READ_CHAR_FULL("title", title)) continue;
if (READ_CHAR_FULL("key", key)) continue;
- if (READ_BOOL_FULL("pane.expanded", expanded)) continue;
+ if (READ_BOOL_FULL("expanded", expanded)) continue;
log_printf("unknown attribute %s = %s\n", option, value);
}
- return bar_pane_keywords_new(title, key, expanded);
+ ret = bar_pane_keywords_new(id, title, key, expanded);
+ g_free(id);
+ g_free(title);
+ g_free(key);
+ return ret;
}
+void bar_pane_keywords_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values)
+{
+ PaneKeywordsData *pkd;
+
+ pkd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!pkd) return;
+
+ gchar *title = NULL;
+
+ while (*attribute_names)
+ {
+ const gchar *option = *attribute_names++;
+ const gchar *value = *attribute_values++;
+
+ if (READ_CHAR_FULL("title", title)) continue;
+ if (READ_CHAR_FULL("key", pkd->key)) continue;
+ if (READ_BOOL_FULL("expanded", pkd->pane.expanded)) continue;
+ if (READ_CHAR_FULL("id", pkd->pane.id)) continue;
+
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+
+ if (title)
+ {
+ gtk_label_set_text(GTK_LABEL(pkd->pane.title), title);
+ g_free(title);
+ }
+
+ bar_update_expander(pane);
+ bar_pane_keywords_update(pkd);
+}
+
+
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff -r e9f9d3da3f43 -r 607c60506863 src/bar_keywords.h
--- a/src/bar_keywords.h Fri Mar 20 17:02:00 2009 +0000
+++ b/src/bar_keywords.h Fri Mar 20 21:28:31 2009 +0000
@@ -14,8 +14,9 @@
#ifndef BAR_KEYWORDS_H
#define BAR_KEYWORDS_H
-GtkWidget *bar_pane_keywords_new(const gchar *title, const gchar *key, gboolean expanded);
+GtkWidget *bar_pane_keywords_new(const gchar *id, const gchar *title, const gchar *key, gboolean expanded);
GtkWidget *bar_pane_keywords_new_from_config(const gchar **attribute_names, const gchar **attribute_values);
+void bar_pane_keywords_update_from_config(GtkWidget *pane, const gchar **attribute_names, const gchar **attribute_values);
/* used in search.c */
GList *keyword_list_pull(GtkWidget *text_widget);
diff -r e9f9d3da3f43 -r 607c60506863 src/layout_util.c
--- a/src/layout_util.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/layout_util.c Fri Mar 20 21:28:31 2009 +0000
@@ -1828,6 +1828,9 @@
void layout_toolbar_add(LayoutWindow *lw, const gchar *action)
{
if (!action || !lw->ui_manager) return;
+
+ if (g_list_find_custom(lw->toolbar_actions, action, (GCompareFunc)strcmp)) return;
+
gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id, "/ToolBar", action, action, GTK_UI_MANAGER_TOOLITEM, FALSE);
lw->toolbar_actions = g_list_append(lw->toolbar_actions, g_strdup(action));
}
@@ -1852,6 +1855,7 @@
GList *work = lw->toolbar_actions;
WRITE_NL(); WRITE_STRING("");
indent++;
+ WRITE_NL(); WRITE_STRING("");
while (work)
{
gchar *action = work->data;
diff -r e9f9d3da3f43 -r 607c60506863 src/rcfile.c
--- a/src/rcfile.c Fri Mar 20 17:02:00 2009 +0000
+++ b/src/rcfile.c Fri Mar 20 21:28:31 2009 +0000
@@ -919,26 +919,63 @@
GtkWidget *bar = data;
if (g_ascii_strcasecmp(element_name, "pane_comment") == 0)
{
- GtkWidget *pane = bar_pane_comment_new_from_config(attribute_names, attribute_values);
- bar_add(bar, pane);
+ GtkWidget *pane = bar_find_pane_by_id(bar, PANE_COMMENT, options_get_id(attribute_names, attribute_values));
+ if (pane)
+ {
+ bar_pane_comment_update_from_config(pane, attribute_names, attribute_values);
+ }
+ else
+ {
+ pane = bar_pane_comment_new_from_config(attribute_names, attribute_values);
+ bar_add(bar, pane);
+ }
options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
}
else if (g_ascii_strcasecmp(element_name, "pane_exif") == 0)
{
- GtkWidget *pane = bar_pane_exif_new_from_config(attribute_names, attribute_values);
- bar_add(bar, pane);
+ GtkWidget *pane = bar_find_pane_by_id(bar, PANE_EXIF, options_get_id(attribute_names, attribute_values));
+ if (pane)
+ {
+ bar_pane_exif_update_from_config(pane, attribute_names, attribute_values);
+ }
+ else
+ {
+ pane = bar_pane_exif_new_from_config(attribute_names, attribute_values);
+ bar_add(bar, pane);
+ }
options_parse_func_push(parser_data, options_parse_pane_exif, NULL, pane);
}
else if (g_ascii_strcasecmp(element_name, "pane_histogram") == 0)
{
- GtkWidget *pane = bar_pane_histogram_new_from_config(attribute_names, attribute_values);
- bar_add(bar, pane);
+ GtkWidget *pane = bar_find_pane_by_id(bar, PANE_HISTOGRAM, options_get_id(attribute_names, attribute_values));
+ if (pane)
+ {
+ bar_pane_histogram_update_from_config(pane, attribute_names, attribute_values);
+ }
+ else
+ {
+ pane = bar_pane_histogram_new_from_config(attribute_names, attribute_values);
+ bar_add(bar, pane);
+ }
options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
}
else if (g_ascii_strcasecmp(element_name, "pane_keywords") == 0)
{
- GtkWidget *pane = bar_pane_keywords_new_from_config(attribute_names, attribute_values);
- bar_add(bar, pane);
+ GtkWidget *pane = bar_find_pane_by_id(bar, PANE_KEYWORDS, options_get_id(attribute_names, attribute_values));
+ if (pane)
+ {
+ bar_pane_keywords_update_from_config(pane, attribute_names, attribute_values);
+ }
+ else
+ {
+ pane = bar_pane_keywords_new_from_config(attribute_names, attribute_values);
+ bar_add(bar, pane);
+ }
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
+ else if (g_ascii_strcasecmp(element_name, "clear") == 0)
+ {
+ bar_clear(bar);
options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
}
else
@@ -956,6 +993,11 @@
layout_toolbar_add_from_config(lw, attribute_names, attribute_values);
options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
}
+ else if (g_ascii_strcasecmp(element_name, "clear") == 0)
+ {
+ layout_toolbar_clear(lw);
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
else
{
log_printf("unexpected in : <%s>\n", element_name);
@@ -968,8 +1010,16 @@
LayoutWindow *lw = data;
if (g_ascii_strcasecmp(element_name, "bar") == 0)
{
- GtkWidget *bar = bar_new_from_config(lw, attribute_names, attribute_values);
- layout_bar_set(lw, bar);
+ if (!lw->bar)
+ {
+ GtkWidget *bar = bar_new_from_config(lw, attribute_names, attribute_values);
+ layout_bar_set(lw, bar);
+ }
+ else
+ {
+ bar_update_from_config(lw->bar, attribute_names, attribute_values);
+ }
+
options_parse_func_push(parser_data, options_parse_bar, NULL, lw->bar);
}
else if (g_ascii_strcasecmp(element_name, "bar_sort") == 0)
@@ -980,7 +1030,6 @@
}
else if (g_ascii_strcasecmp(element_name, "toolbar") == 0)
{
- layout_toolbar_clear(lw);
options_parse_func_push(parser_data, options_parse_toolbar, NULL, lw);
}
else