diff --git a/trunk/src/Makefile.am b/trunk/src/Makefile.am
index 144b090..9528d30 100644
--- a/trunk/src/Makefile.am
+++ b/trunk/src/Makefile.am
@@ -94,6 +94,8 @@ geeqie_SOURCES = \
bar_keywords.h \
bar_exif.c \
bar_exif.h \
+ bar_rating.c \
+ bar_rating.h \
bar_sort.c \
bar_sort.h \
cache.c \
diff --git a/trunk/src/bar.c b/trunk/src/bar.c
index 52d6a54..4d64b71 100644
--- a/trunk/src/bar.c
+++ b/trunk/src/bar.c
@@ -25,6 +25,7 @@
#include "ui_menu.h"
#include "bar_comment.h"
#include "bar_keywords.h"
+#include "bar_rating.h"
#include "bar_exif.h"
#include "bar_histogram.h"
#include "histogram.h"
@@ -76,6 +77,15 @@ static const gchar default_config_comment[] =
" "
"";
+static const gchar default_config_rating[] =
+""
+" "
+" "
+" "
+" "
+" "
+"";
+
static const gchar default_config_exif[] =
""
" "
@@ -178,6 +188,7 @@ static const KnownPanes known_panes[] = {
{PANE_GPS, "gps", N_("GPS Map"), default_config_gps},
#endif
#endif
+ {PANE_RATING, "rating", N_("Rating"), default_config_rating},
{PANE_UNDEF, NULL, NULL, NULL}
};
diff --git a/trunk/src/bar.h b/trunk/src/bar.h
index 61dc4be..d24acf3 100644
--- a/trunk/src/bar.h
+++ b/trunk/src/bar.h
@@ -20,7 +20,8 @@ typedef enum {
PANE_EXIF,
PANE_HISTOGRAM,
PANE_KEYWORDS,
- PANE_GPS
+ PANE_GPS,
+ PANE_RATING
} PaneType;
typedef struct _PaneData PaneData;
diff --git a/trunk/src/bar_rating.c b/trunk/src/bar_rating.c
new file mode 100644
index 0000000..80b972c
--- /dev/null
+++ b/trunk/src/bar_rating.c
@@ -0,0 +1,400 @@
+/*
+ * Geeqie
+ * (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2009 The Geeqie Team
+ *
+ * Author: Omari Stephens
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "main.h"
+#include "bar_rating.h"
+
+#include "bar.h"
+#include "metadata.h"
+#include "filedata.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "rcfile.h"
+#include "layout.h"
+#include "layout_image.h"
+
+static void bar_pane_rating_changed(GtkSpinButton *button, gpointer data);
+
+/*
+ *-------------------------------------------------------------------
+ * rating utils
+ *-------------------------------------------------------------------
+ */
+
+
+
+typedef struct _PaneRatingData PaneRatingData;
+struct _PaneRatingData
+{
+ PaneData pane;
+ GtkHBox *container;
+ GtkSpinButton *spinbutton;
+ GtkToggleButton *auto_adv; // autoadvance
+ FileData *fd;
+ gchar *key;
+ gint height;
+};
+
+
+static void bar_pane_rating_write(PaneRatingData *prd)
+{
+ guint value;
+
+ if (!prd->fd) return;
+
+ value = gtk_spin_button_get_value_as_int(prd->spinbutton);
+
+ metadata_write_int(prd->fd, prd->key, value);
+}
+
+
+static void bar_pane_rating_update(PaneRatingData *prd)
+{
+ guint64 value;
+
+ g_signal_handlers_block_by_func(prd->spinbutton, bar_pane_rating_changed, prd);
+
+ value = metadata_read_int(prd->fd, prd->key, (guint64)-1);
+
+ if(value != (guint64)-1)
+ {
+ gtk_spin_button_set_value(prd->spinbutton, value);
+ }
+ else
+ {
+ gtk_spin_button_set_value(prd->spinbutton, 0);
+ }
+
+ g_signal_handlers_unblock_by_func(prd->spinbutton, bar_pane_rating_changed, prd);
+
+ gtk_widget_set_sensitive((GtkWidget*) prd->spinbutton, (prd->fd != NULL));
+}
+
+static void bar_pane_rating_set_selection(PaneRatingData *prd, gboolean overwrite)
+{
+ GList *list = NULL;
+ GList *work;
+ gint value = -1;
+
+ value = gtk_spin_button_get_value_as_int(prd->spinbutton);
+
+ list = layout_selection_list(prd->pane.lw);
+ list = file_data_process_groups_in_selection(list, FALSE, NULL);
+
+ work = list;
+ while (work)
+ {
+ FileData *fd = work->data;
+ work = work->next;
+ if (fd == prd->fd) continue;
+
+ if (overwrite || (metadata_read_int(fd, prd->key, -1) == (guint64)-1))
+ {
+ metadata_write_int(fd, prd->key, value);
+ }
+ }
+
+ filelist_free(list);
+}
+
+/*
+static void bar_pane_comment_sel_add_cb(GtkWidget *button, gpointer data)
+{
+ PaneCommentData *pcd = data;
+
+ bar_pane_comment_set_selection(pcd, TRUE);
+}
+
+
+static void bar_pane_comment_sel_replace_cb(GtkWidget *button, gpointer data)
+{
+ PaneCommentData *pcd = data;
+
+ bar_pane_comment_set_selection(pcd, FALSE);
+}
+*/
+
+static void bar_pane_rating_set_fd(GtkWidget *bar, FileData *fd)
+{
+ PaneRatingData *prd;
+
+ prd = g_object_get_data(G_OBJECT(bar), "pane_data");
+ if (!prd) return;
+
+ file_data_unref(prd->fd);
+ prd->fd = file_data_ref(fd);
+
+ bar_pane_rating_update(prd);
+}
+
+static gint bar_pane_rating_event(GtkWidget *bar, GdkEvent *event)
+{
+ PaneRatingData *prd;
+
+ prd = g_object_get_data(G_OBJECT(bar), "pane_data");
+ if (!prd) return FALSE;
+
+ if (GTK_WIDGET_HAS_FOCUS(prd->spinbutton))
+ {
+ return gtk_widget_event((GtkWidget*) prd->spinbutton, event);
+ }
+
+ return FALSE;
+}
+
+static void bar_pane_rating_write_config(GtkWidget *pane, GString *outstr, gint indent)
+{
+ PaneRatingData *prd;
+
+ prd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!prd) return;
+
+ WRITE_NL(); WRITE_STRING("pane.id);
+ write_char_option(outstr, indent, "title", gtk_label_get_text(GTK_LABEL(prd->pane.title)));
+ WRITE_BOOL(prd->pane, expanded);
+ WRITE_CHAR(*prd, key);
+ WRITE_INT(*prd, height);
+ WRITE_STRING("/>");
+}
+
+static void bar_pane_rating_notify_cb(FileData *fd, NotifyType type, gpointer data)
+{
+ PaneRatingData *prd = data;
+ if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE | NOTIFY_METADATA)) && fd == prd->fd)
+ {
+ DEBUG_1("Notify pane_rating: %s %04x", fd->path, type);
+
+ bar_pane_rating_update(prd);
+ }
+}
+
+static void bar_pane_rating_changed(GtkSpinButton *button, gpointer data)
+{
+ PaneRatingData *prd = data;
+
+ file_data_unregister_notify_func(bar_pane_rating_notify_cb, prd);
+ bar_pane_rating_write(prd);
+ file_data_register_notify_func(bar_pane_rating_notify_cb, prd, NOTIFY_PRIORITY_LOW);
+}
+
+static void bar_pane_rating_inc_value_cb(GtkButton *button, gpointer data)
+{
+ bar_pane_rating_inc_value(data);
+}
+
+void bar_pane_rating_inc_value(gpointer data)
+{
+ PaneRatingData *prd = data;
+ gtk_spin_button_spin(prd->spinbutton, GTK_SPIN_STEP_FORWARD, 1.0);
+ if(gtk_toggle_button_get_active(prd->auto_adv)) layout_image_next(NULL);
+}
+
+static void bar_pane_rating_dec_value_cb(GtkButton *button, gpointer data)
+{
+ bar_pane_rating_dec_value(data);
+}
+
+void bar_pane_rating_dec_value(gpointer data)
+{
+ PaneRatingData *prd = data;
+ gtk_spin_button_spin(prd->spinbutton, GTK_SPIN_STEP_BACKWARD, 1.0);
+ if(gtk_toggle_button_get_active(prd->auto_adv)) layout_image_next(NULL);
+}
+
+void bar_pane_rating_set_value(gint value, gpointer data)
+{
+ PaneRatingData *prd = data;
+ gtk_spin_button_set_value(prd->spinbutton, value);
+ if(gtk_toggle_button_get_active(prd->auto_adv)) layout_image_next(NULL);
+}
+
+
+/*
+static void bar_pane_comment_populate_popup(GtkTextView *textview, GtkMenu *menu, gpointer data)
+{
+ PaneCommentData *pcd = data;
+
+ menu_item_add_divider(GTK_WIDGET(menu));
+ menu_item_add_stock(GTK_WIDGET(menu), _("Add text to selected files"), GTK_STOCK_ADD, G_CALLBACK(bar_pane_comment_sel_add_cb), pcd);
+ menu_item_add_stock(GTK_WIDGET(menu), _("Replace existing text in selected files"), GTK_STOCK_CONVERT, G_CALLBACK(bar_pane_comment_sel_replace_cb), data);
+}
+*/
+
+#if 0
+static void bar_pane_comment_close(GtkWidget *bar)
+{
+ PaneCommentData *pcd;
+
+ pcd = g_object_get_data(G_OBJECT(bar), "pane_data");
+ if (!pcd) return;
+
+ gtk_widget_destroy(pcd->comment_view);
+}
+#endif
+
+static void bar_pane_rating_destroy(GtkWidget *widget, gpointer data)
+{
+ // FIXME: make sure we free the spinbutton
+ PaneRatingData *prd = data;
+
+ file_data_unregister_notify_func(bar_pane_rating_notify_cb, prd);
+
+ file_data_unref(prd->fd);
+ g_free(prd->key);
+
+ g_free(prd->pane.id);
+
+ g_free(prd);
+}
+
+
+static GtkWidget *bar_pane_rating_new(const gchar *id, const gchar *title, const gchar *key,
+ gboolean expanded, gint height)
+{
+ PaneRatingData *prd;
+ GtkHBox *hbox;
+ GtkWidget *tmp;
+
+ prd = g_new0(PaneRatingData, 1);
+
+ prd->pane.pane_set_fd = bar_pane_rating_set_fd;
+ prd->pane.pane_event = bar_pane_rating_event;
+ prd->pane.pane_write_config = bar_pane_rating_write_config;
+ prd->pane.title = bar_pane_expander_title(title);
+ prd->pane.id = g_strdup(id);
+ prd->pane.type = PANE_RATING;
+
+ prd->pane.expanded = expanded;
+
+ prd->key = g_strdup(key);
+ prd->height = height;
+
+ // HBOX
+ hbox = (GtkHBox*)gtk_hbox_new(FALSE, 0);
+
+ prd->container = hbox;
+ g_object_set_data(G_OBJECT(prd->container), "pane_data", prd);
+ g_signal_connect(G_OBJECT(prd->container), "destroy",
+ G_CALLBACK(bar_pane_rating_destroy), prd);
+
+ gtk_widget_set_size_request((GtkWidget*) prd->container, -1, -1);
+ gtk_widget_show((GtkWidget*) hbox);
+
+ // AUTOADVANCE CHECKBOX
+ tmp = gtk_check_button_new_with_label("AA");
+ gtk_box_pack_start((GtkBox*) hbox, tmp, TRUE, TRUE, 0);
+ gtk_widget_show(tmp);
+ prd->auto_adv = (GtkToggleButton*) tmp;
+
+ // INCREMENT/DECREMENT BUTTONS
+ tmp = gtk_button_new_with_label(_("↓ Dec."));
+ gtk_box_pack_start((GtkBox*) hbox, tmp, TRUE, TRUE, 0);
+ g_signal_connect(G_OBJECT(tmp), "clicked", G_CALLBACK(bar_pane_rating_dec_value_cb), prd);
+ gtk_widget_show(tmp);
+
+ tmp = gtk_button_new_with_label(_("↑ Inc."));
+ gtk_box_pack_end((GtkBox*) hbox, tmp, TRUE, TRUE, 0);
+ g_signal_connect(G_OBJECT(tmp), "clicked", G_CALLBACK(bar_pane_rating_inc_value_cb), prd);
+ gtk_widget_show(tmp);
+
+
+ // SPIN BUTTON
+ prd->spinbutton = (GtkSpinButton*) gtk_spin_button_new_with_range(0.0, 10.0, 1.0);
+ gtk_spin_button_set_numeric(prd->spinbutton, TRUE);
+ gtk_spin_button_set_snap_to_ticks(prd->spinbutton, TRUE);
+
+ gtk_box_pack_start((GtkBox*) hbox, (GtkWidget*) prd->spinbutton, FALSE, TRUE, 0);
+// g_signal_connect(G_OBJECT(pcd->comment_view), "populate-popup",
+// G_CALLBACK(bar_pane_comment_populate_popup), pcd);
+ gtk_widget_show((GtkWidget*) prd->spinbutton);
+
+ g_signal_connect(G_OBJECT(prd->spinbutton), "value-changed",
+ G_CALLBACK(bar_pane_rating_changed), prd);
+
+
+ file_data_register_notify_func(bar_pane_rating_notify_cb, prd, NOTIFY_PRIORITY_LOW);
+
+ return (GtkWidget*) prd->container;
+}
+
+GtkWidget *bar_pane_rating_new_from_config(const gchar **attribute_names,
+ const gchar **attribute_values)
+{
+ gchar *title = NULL;
+ gchar *key = g_strdup(RATING_KEY);
+ gboolean expanded = TRUE;
+ gint height = 50;
+ gchar *id = g_strdup("rating");
+ GtkWidget *ret;
+
+ 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", key)) 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);
+ }
+
+ bar_pane_translate_title(PANE_RATING, id, &title);
+ ret = bar_pane_rating_new(id, title, key, expanded, height);
+ g_free(title);
+ g_free(key);
+ g_free(id);
+ return ret;
+}
+
+void bar_pane_rating_update_from_config(GtkWidget *pane, const gchar **attribute_names,
+ const gchar **attribute_values)
+{
+ PaneRatingData *prd;
+
+ prd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if (!prd) 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", prd->key)) continue;
+ if (READ_BOOL_FULL("expanded", prd->pane.expanded)) continue;
+ if (READ_INT_FULL("height", prd->height)) continue;
+ if (READ_CHAR_FULL("id", prd->pane.id)) continue;
+
+
+ log_printf("unknown attribute %s = %s\n", option, value);
+ }
+
+ if (title)
+ {
+ bar_pane_translate_title(PANE_RATING, prd->pane.id, &title);
+ gtk_label_set_text(GTK_LABEL(prd->pane.title), title);
+ g_free(title);
+ }
+ gtk_widget_set_size_request((GtkWidget*) prd->container, -1, -1);
+ bar_update_expander(pane);
+ bar_pane_rating_update(prd);
+}
+
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff --git a/trunk/src/bar_rating.h b/trunk/src/bar_rating.h
new file mode 100644
index 0000000..7453a4c
--- /dev/null
+++ b/trunk/src/bar_rating.h
@@ -0,0 +1,27 @@
+/*
+ * Geeqie
+ * (C) 2004 John Ellis
+ * Copyright (C) 2008 - 2009 The Geeqie Team
+ *
+ * Author: Omari Stephens
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef BAR_RATING_H
+#define BAR_RATING_H
+
+GtkWidget *bar_pane_rating_new_from_config(const gchar **attribute_names,
+ const gchar **attribute_values);
+void bar_pane_rating_update_from_config(GtkWidget *pane, const gchar **attribute_names,
+ const gchar **attribute_values);
+void bar_pane_rating_inc_value(gpointer data);
+void bar_pane_rating_dec_value(gpointer data);
+void bar_pane_rating_set_value(gint value, gpointer data);
+
+
+#endif
+/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
diff --git a/trunk/src/layout_util.c b/trunk/src/layout_util.c
index b853852..fa09e4f 100644
--- a/trunk/src/layout_util.c
+++ b/trunk/src/layout_util.c
@@ -17,6 +17,7 @@
#include "advanced_exif.h"
#include "bar_sort.h"
#include "bar.h"
+#include "bar_rating.h"
#include "cache_maint.h"
#include "collect.h"
#include "collect-dlg.h"
@@ -750,6 +751,38 @@ static void layout_menu_bar_exif_cb(GtkAction *action, gpointer data)
layout_exif_window_new(lw);
}
+static void layout_menu_bar_rating_cb(GtkAction *action, gpointer data)
+{
+ LayoutWindow *lw = data;
+ GtkWidget *pane;
+ void *prd;
+ const gchar *action_name;
+
+ if(!lw->bar) return;
+
+ pane = bar_find_pane_by_id(lw->bar, PANE_RATING, "rating");
+ if(!pane) return;
+
+ prd = g_object_get_data(G_OBJECT(pane), "pane_data");
+ if(!prd) return;
+
+ // Got a pane; now poke at it
+ action_name = gtk_action_get_name(action);
+ if(!g_strcmp0(action_name, "IncRating")) bar_pane_rating_inc_value(prd);
+ else if(!g_strcmp0(action_name, "DecRating")) bar_pane_rating_dec_value(prd);
+ else if(!g_strcmp0(action_name, "Rating0")) bar_pane_rating_set_value(0, prd);
+ else if(!g_strcmp0(action_name, "Rating1")) bar_pane_rating_set_value(1, prd);
+ else if(!g_strcmp0(action_name, "Rating2")) bar_pane_rating_set_value(2, prd);
+ else if(!g_strcmp0(action_name, "Rating3")) bar_pane_rating_set_value(3, prd);
+ else if(!g_strcmp0(action_name, "Rating4")) bar_pane_rating_set_value(4, prd);
+ else if(!g_strcmp0(action_name, "Rating5")) bar_pane_rating_set_value(5, prd);
+ else if(!g_strcmp0(action_name, "Rating6")) bar_pane_rating_set_value(6, prd);
+ else if(!g_strcmp0(action_name, "Rating7")) bar_pane_rating_set_value(7, prd);
+ else if(!g_strcmp0(action_name, "Rating8")) bar_pane_rating_set_value(8, prd);
+ else if(!g_strcmp0(action_name, "Rating9")) bar_pane_rating_set_value(9, prd);
+ else if(!g_strcmp0(action_name, "Rating10")) bar_pane_rating_set_value(10, prd);
+}
+
static void layout_menu_float_cb(GtkToggleAction *action, gpointer data)
{
LayoutWindow *lw = data;
@@ -1236,6 +1269,8 @@ static GtkActionEntry menu_entries[] = {
{ "EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL },
{ "SelectMenu", NULL, N_("_Select"), NULL, NULL, NULL },
{ "OrientationMenu", NULL, N_("_Orientation"), NULL, NULL, NULL },
+ { "MetadataMenu", NULL, N_("_Metadata"), NULL, NULL, NULL },
+ { "MetadataRateMenu", NULL, N_("_Set Rating"), NULL, NULL, NULL },
{ "ExternalMenu", NULL, N_("E_xternal Editors"), NULL, NULL, NULL },
{ "PreferencesMenu", NULL, N_("P_references"), NULL, NULL, NULL },
{ "ViewMenu", NULL, N_("_View"), NULL, NULL, NULL },
@@ -1293,6 +1328,19 @@ static GtkActionEntry menu_entries[] = {
{ "Maintenance", NULL, N_("_Thumbnail maintenance..."), NULL, N_("Thumbnail maintenance..."), CB(layout_menu_remove_thumb_cb) },
{ "Wallpaper", NULL, N_("Set as _wallpaper"), NULL, N_("Set as wallpaper"), CB(layout_menu_wallpaper_cb) },
{ "SaveMetadata", GTK_STOCK_SAVE, N_("_Save metadata"), "S", N_("Save metadata"), CB(layout_menu_metadata_write_cb) },
+ { "IncRating", NULL, N_("_Increment Rating"), "KP_Add", N_("Increment image rating"), CB(layout_menu_bar_rating_cb) },
+ { "DecRating", NULL, N_("_Decrement Rating"), "KP_Subtract", N_("Decrement image rating"), CB(layout_menu_bar_rating_cb) },
+ { "Rating0", NULL, N_("Rate _0"), "KP_0", N_("Set image rating to 0"), CB(layout_menu_bar_rating_cb) },
+ { "Rating1", NULL, N_("Rate _1"), "KP_1", N_("Set image rating to 1"), CB(layout_menu_bar_rating_cb) },
+ { "Rating2", NULL, N_("Rate _2"), "KP_2", N_("Set image rating to 2"), CB(layout_menu_bar_rating_cb) },
+ { "Rating3", NULL, N_("Rate _3"), "KP_3", N_("Set image rating to 3"), CB(layout_menu_bar_rating_cb) },
+ { "Rating4", NULL, N_("Rate _4"), "KP_4", N_("Set image rating to 4"), CB(layout_menu_bar_rating_cb) },
+ { "Rating5", NULL, N_("Rate _5"), "KP_5", N_("Set image rating to 5"), CB(layout_menu_bar_rating_cb) },
+ { "Rating6", NULL, N_("Rate _6"), "KP_6", N_("Set image rating to 6"), CB(layout_menu_bar_rating_cb) },
+ { "Rating7", NULL, N_("Rate _7"), "KP_7", N_("Set image rating to 7"), CB(layout_menu_bar_rating_cb) },
+ { "Rating8", NULL, N_("Rate _8"), "KP_8", N_("Set image rating to 8"), CB(layout_menu_bar_rating_cb) },
+ { "Rating9", NULL, N_("Rate _9"), "KP_9", N_("Set image rating to 9"), CB(layout_menu_bar_rating_cb) },
+ { "Rating10", NULL, N_("Rate _10"), "KP_Decimal", N_("Set image rating to 10"), CB(layout_menu_bar_rating_cb) },
{ "ZoomIn", GTK_STOCK_ZOOM_IN, N_("Zoom _in"), "equal", N_("Zoom in"), CB(layout_menu_zoom_in_cb) },
{ "ZoomInAlt1", GTK_STOCK_ZOOM_IN, N_("Zoom _in"), "KP_Add", N_("Zoom in"), CB(layout_menu_zoom_in_cb) },
{ "ZoomOut", GTK_STOCK_ZOOM_OUT, N_("Zoom _out"), "minus", N_("Zoom out"), CB(layout_menu_zoom_out_cb) },
@@ -1343,7 +1391,6 @@ static GtkActionEntry menu_entries[] = {
{ "About", GTK_STOCK_ABOUT, N_("_About"), NULL, N_("About"), CB(layout_menu_about_cb) },
{ "LogWindow", NULL, N_("_Log Window"), NULL, N_("Log Window"), CB(layout_menu_log_window_cb) },
{ "ExifWin", NULL, N_("_Exif window"), "E", N_("Exif window"), CB(layout_menu_bar_exif_cb) },
-
};
static GtkToggleActionEntry menu_toggle_entries[] = {
@@ -1469,7 +1516,25 @@ static const gchar *menu_ui_description =
" "
" "
" "
-" "
+" "
" "
" "
" "
diff --git a/trunk/src/metadata.h b/trunk/src/metadata.h
index 639da6d..be265cc 100644
--- a/trunk/src/metadata.h
+++ b/trunk/src/metadata.h
@@ -17,6 +17,7 @@
#define COMMENT_KEY "Xmp.dc.description"
#define KEYWORD_KEY "Xmp.dc.subject"
#define ORIENTATION_KEY "Xmp.tiff.Orientation"
+#define RATING_KEY "Xmp.xmp.Rating"
gboolean metadata_write_queue_remove(FileData *fd);
gboolean metadata_write_queue_remove_list(GList *list);
diff --git a/trunk/src/rcfile.c b/trunk/src/rcfile.c
index 4053b58..babd0a4 100644
--- a/trunk/src/rcfile.c
+++ b/trunk/src/rcfile.c
@@ -22,6 +22,7 @@
#include "bar_histogram.h"
#include "bar_keywords.h"
#include "bar_sort.h"
+#include "bar_rating.h"
#include "editors.h"
#include "filefilter.h"
#include "misc.h"
@@ -918,6 +919,22 @@ static void options_parse_bar(GQParserData *parser_data, GMarkupParseContext *co
}
options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
}
+ else if (g_ascii_strcasecmp(element_name, "pane_rating") == 0)
+ {
+ GtkWidget *pane = bar_find_pane_by_id(bar, PANE_RATING,
+ options_get_id(attribute_names, attribute_values));
+ if (pane)
+ {
+ bar_pane_rating_update_from_config(pane, attribute_names,
+ attribute_values);
+ }
+ else
+ {
+ pane = bar_pane_rating_new_from_config(attribute_names, attribute_values);
+ bar_add(bar, pane);
+ }
+ options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL);
+ }
#ifdef HAVE_LIBCHAMPLAIN
#ifdef HAVE_LIBCHAMPLAIN_GTK
else if (g_ascii_strcasecmp(element_name, "pane_gps") == 0)