From 0ceba72258134a7379e5d42ceda33967bad55b08 Mon Sep 17 00:00:00 2001 From: Vladimir Nadvornik Date: Sun, 29 Mar 2009 14:20:44 +0000 Subject: [PATCH] improved sidebar configuration --- src/bar.c | 278 ++++++++++++++++++++++++++++++++++++++-------- src/bar.h | 5 +- src/layout_util.c | 4 +- src/options.c | 6 +- src/rcfile.c | 27 +++-- src/rcfile.h | 6 +- src/remote.c | 2 +- 7 files changed, 265 insertions(+), 63 deletions(-) diff --git a/src/bar.c b/src/bar.c index 4c3a01e5..130e3866 100644 --- a/src/bar.c +++ b/src/bar.c @@ -36,17 +36,127 @@ struct _KnownPanes PaneType type; gchar *id; gchar *title; + const gchar *config; }; +static const gchar default_config_histogram[] = +"" +" " +" " +" " +" " +" " +""; + +static const gchar default_config_title[] = +"" +" " +" " +" " +" " +" " +""; + +static const gchar default_config_keywords[] = +"" +" " +" " +" " +" " +" " +""; + +static const gchar default_config_comment[] = +"" +" " +" " +" " +" " +" " +""; + +static const gchar default_config_exif[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + +static const gchar default_config_file_info[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + +static const gchar default_config_location[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + +static const gchar default_config_copyright[] = +"" +" " +" " +" " +" " +" " +" " +" " +" " +" " +""; + static const KnownPanes known_panes[] = { /* default sidebar */ - {PANE_HISTOGRAM, "histogram", N_("Histogram")}, - {PANE_COMMENT, "title", N_("Title")}, - {PANE_KEYWORDS, "keywords", N_("Keywords")}, - {PANE_COMMENT, "comment", N_("Comment")}, - {PANE_EXIF, "exif", N_("Exif")}, - - {PANE_UNDEF, NULL, NULL} + {PANE_HISTOGRAM, "histogram", N_("Histogram"), default_config_histogram}, + {PANE_COMMENT, "title", N_("Title"), default_config_title}, + {PANE_KEYWORDS, "keywords", N_("Keywords"), default_config_keywords}, + {PANE_COMMENT, "comment", N_("Comment"), default_config_comment}, + {PANE_EXIF, "exif", N_("Exif"), default_config_exif}, +/* other pre-configured panes */ + {PANE_EXIF, "file_info", N_("File info"), default_config_file_info}, + {PANE_EXIF, "location", N_("Location"), default_config_location}, + {PANE_EXIF, "copyright", N_("Copyright"), default_config_copyright}, + + {PANE_UNDEF, NULL, NULL, NULL} }; typedef struct _BarData BarData; @@ -61,7 +171,7 @@ struct _BarData gint width; }; -static void bar_expander_move(GtkWidget *widget, gpointer data, gboolean up) +static void bar_expander_move(GtkWidget *widget, gpointer data, gboolean up, gboolean single_step) { GtkWidget *expander = data; GtkWidget *box; @@ -73,8 +183,15 @@ static void bar_expander_move(GtkWidget *widget, gpointer data, gboolean up) gtk_container_child_get(GTK_CONTAINER(box), expander, "position", &pos, NULL); - pos = up ? (pos - 1) : (pos + 1); - if (pos < 0) pos = 0; + if (single_step) + { + pos = up ? (pos - 1) : (pos + 1); + if (pos < 0) pos = 0; + } + else + { + pos = up ? 0 : -1; + } gtk_box_reorder_child(GTK_BOX(box), expander, pos); } @@ -82,32 +199,105 @@ static void bar_expander_move(GtkWidget *widget, gpointer data, gboolean up) static void bar_expander_move_up_cb(GtkWidget *widget, gpointer data) { - bar_expander_move(widget, data, TRUE); + bar_expander_move(widget, data, TRUE, TRUE); } static void bar_expander_move_down_cb(GtkWidget *widget, gpointer data) { - bar_expander_move(widget, data, FALSE); + bar_expander_move(widget, data, FALSE, TRUE); +} + +static void bar_expander_move_top_cb(GtkWidget *widget, gpointer data) +{ + bar_expander_move(widget, data, TRUE, FALSE); } +static void bar_expander_move_bottom_cb(GtkWidget *widget, gpointer data) +{ + bar_expander_move(widget, data, FALSE, FALSE); +} -static void bar_expander_menu_popup(GtkWidget *data) +static void bar_expander_delete_cb(GtkWidget *widget, gpointer data) +{ + GtkWidget *expander = data; + gtk_widget_destroy(expander); +} + +static void bar_expander_add_cb(GtkWidget *widget, gpointer data) +{ + //GtkWidget *bar = data; + const KnownPanes *pane = known_panes; + const gchar *id = g_object_get_data(G_OBJECT(widget), "pane_add_id"); + const gchar *config; + + if (!id) return; + + while (pane->id) + { + if (strcmp(pane->id, id) == 0) break; + pane++; + } + if (!pane->id) return; + + config = bar_pane_get_default_config(id); + if (config) load_config_from_buf(config, strlen(config), FALSE); + +} + + +static void bar_menu_popup(GtkWidget *widget) { GtkWidget *menu; + GtkWidget *bar; + GtkWidget *expander; + const KnownPanes *pane = known_panes; + BarData *bd; + bd = g_object_get_data(G_OBJECT(widget), "bar_data"); + if (bd) + { + expander = NULL; + bar = widget; + } + else + { + expander = widget; + bar = widget->parent; + while (bar && !g_object_get_data(G_OBJECT(bar), "bar_data")) + bar = bar->parent; + if (!bar) return; + } + menu = popup_menu_short_lived(); - menu_item_add_stock(menu, _("Move _up"), GTK_STOCK_GO_UP, G_CALLBACK(bar_expander_move_up_cb), data); - menu_item_add_stock(menu, _("Move _down"), GTK_STOCK_GO_DOWN, G_CALLBACK(bar_expander_move_down_cb), data); - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, data, 0, GDK_CURRENT_TIME); + if (expander) + { + menu_item_add_stock(menu, _("Move to _top"), GTK_STOCK_GOTO_TOP, G_CALLBACK(bar_expander_move_top_cb), expander); + menu_item_add_stock(menu, _("Move _up"), GTK_STOCK_GO_UP, G_CALLBACK(bar_expander_move_up_cb), expander); + menu_item_add_stock(menu, _("Move _down"), GTK_STOCK_GO_DOWN, G_CALLBACK(bar_expander_move_down_cb), expander); + menu_item_add_stock(menu, _("Move to _bottom"), GTK_STOCK_GOTO_BOTTOM, G_CALLBACK(bar_expander_move_bottom_cb), expander); + menu_item_add_divider(menu); + menu_item_add_stock(menu, _("Delete"), GTK_STOCK_DELETE, G_CALLBACK(bar_expander_delete_cb), expander); + menu_item_add_divider(menu); + } + + while (pane->id) + { + GtkWidget *item; + item = menu_item_add_stock(menu, _(pane->title), GTK_STOCK_ADD, G_CALLBACK(bar_expander_add_cb), bar); + g_object_set_data(G_OBJECT(item), "pane_add_id", pane->id); + pane++; + } + + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, bar, 0, GDK_CURRENT_TIME); } -static gboolean bar_expander_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +static gboolean bar_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) { if (bevent->button == MOUSE_BUTTON_RIGHT) { - bar_expander_menu_popup(widget); + bar_menu_popup(widget); return TRUE; } return FALSE; @@ -288,7 +478,7 @@ void bar_add(GtkWidget *bar, GtkWidget *pane) gtk_box_pack_start(GTK_BOX(bd->vbox), expander, FALSE, TRUE, 0); - g_signal_connect(expander, "button_press_event", G_CALLBACK(bar_expander_menu_cb), bd); + g_signal_connect(expander, "button_press_event", G_CALLBACK(bar_menu_cb), bd); gtk_container_add(GTK_CONTAINER(expander), pane); @@ -300,24 +490,17 @@ void bar_add(GtkWidget *bar, GtkWidget *pane) } -static void bar_populate_default(GtkWidget *bar) +void bar_populate_default(GtkWidget *bar) { - GtkWidget *widget; + const gchar *populate_id[] = {"histogram", "title", "keywords", "comment", "exif", NULL}; + const gchar **id = populate_id; - widget = bar_pane_histogram_new("histogram", _("Histogram"), 80, TRUE, HCHAN_RGB, 0); - bar_add(bar, widget); - - widget = bar_pane_comment_new("title", _("Title"), "Xmp.dc.title", TRUE, 40); - bar_add(bar, widget); - - widget = bar_pane_keywords_new("keywords", _("Keywords"), KEYWORD_KEY, TRUE); - bar_add(bar, widget); - - widget = bar_pane_comment_new("comment", _("Comment"), "Xmp.dc.description", TRUE, 150); - bar_add(bar, widget); - - widget = bar_pane_exif_new("exif", _("Exif"), TRUE, TRUE); - bar_add(bar, widget); + while (*id) + { + const gchar *config = bar_pane_get_default_config(*id); + if (config) load_config_from_buf(config, strlen(config), FALSE); + id++; + } } static void bar_size_allocate(GtkWidget *widget, GtkAllocation *allocation, gpointer data) @@ -373,6 +556,8 @@ GtkWidget *bar_new(LayoutWindow *lw) g_signal_connect(G_OBJECT(bd->widget), "size-allocate", G_CALLBACK(bar_size_allocate), bd); + g_signal_connect(G_OBJECT(bd->widget), "button_press_event", G_CALLBACK(bar_menu_cb), bd); + bd->width = SIDEBAR_DEFAULT_WIDTH; gtk_widget_set_size_request(bd->widget, bd->width, -1); @@ -404,16 +589,6 @@ GtkWidget *bar_new(LayoutWindow *lw) return bd->widget; } -GtkWidget *bar_new_default(LayoutWindow *lw) -{ - GtkWidget *bar = bar_new(lw); - - bar_populate_default(bar); - - gtk_widget_show(bar); - - return bar; -} GtkWidget *bar_update_from_config(GtkWidget *bar, const gchar **attribute_names, const gchar **attribute_values) { @@ -478,5 +653,18 @@ gboolean bar_pane_translate_title(PaneType type, const gchar *id, gchar **title) *title = g_strdup(_(pane->title)); return TRUE; } + +const gchar *bar_pane_get_default_config(const gchar *id) +{ + const KnownPanes *pane = known_panes; + + while (pane->id) + { + if (strcmp(pane->id, id) == 0) break; + pane++; + } + if (!pane->id) return NULL; + return pane->config; +} /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff --git a/src/bar.h b/src/bar.h index 6f8436b9..2ef1ad06 100644 --- a/src/bar.h +++ b/src/bar.h @@ -43,7 +43,6 @@ struct _PaneData { 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); @@ -51,6 +50,8 @@ void bar_close(GtkWidget *bar); void bar_write_config(GtkWidget *bar, GString *outstr, gint indent); +void bar_populate_default(GtkWidget *bar); + void bar_add(GtkWidget *bar, GtkWidget *pane); GtkWidget *bar_find_pane_by_id(GtkWidget *bar, PaneType type, const gchar *id); @@ -64,5 +65,7 @@ gint bar_get_width(GtkWidget *bar); GtkWidget *bar_pane_expander_title(const gchar *title); void bar_update_expander(GtkWidget *pane); gboolean bar_pane_translate_title(PaneType type, const gchar *id, gchar **title); +const gchar *bar_pane_get_default_config(const gchar *id); + #endif /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff --git a/src/layout_util.c b/src/layout_util.c index 399fc03f..fb295911 100644 --- a/src/layout_util.c +++ b/src/layout_util.c @@ -2030,9 +2030,11 @@ static void layout_bar_set_default(LayoutWindow *lw) if (!lw->utility_box) return; - bar = bar_new_default(lw); + bar = bar_new(lw); layout_bar_set(lw, bar); + + bar_populate_default(bar); } static void layout_bar_close(LayoutWindow *lw) diff --git a/src/options.c b/src/options.c index 33030f36..38fe508b 100644 --- a/src/options.c +++ b/src/options.c @@ -247,7 +247,7 @@ void save_options(ConfOptions *options) sync_options_with_current_state(options); rc_path = g_build_filename(get_rc_dir(), RC_FILE_NAME, NULL); - save_options_to(rc_path, options); + save_config_to_file(rc_path, options); g_free(rc_path); } @@ -259,13 +259,13 @@ gboolean load_options(ConfOptions *options) if (isdir(GQ_SYSTEM_WIDE_DIR)) { rc_path = g_build_filename(GQ_SYSTEM_WIDE_DIR, RC_FILE_NAME, NULL); - success = load_options_from(rc_path, options, TRUE); + success = load_config_from_file(rc_path, TRUE); DEBUG_1("Loading options from %s ... %s", rc_path, success ? "done" : "failed"); g_free(rc_path); } rc_path = g_build_filename(get_rc_dir(), RC_FILE_NAME, NULL); - success = load_options_from(rc_path, options, TRUE); + success = load_config_from_file(rc_path, TRUE); DEBUG_1("Loading options from %s ... %s", rc_path, success ? "done" : "failed"); g_free(rc_path); return(success); diff --git a/src/rcfile.c b/src/rcfile.c index 8b71a84b..32c55e0c 100644 --- a/src/rcfile.c +++ b/src/rcfile.c @@ -486,7 +486,7 @@ static void write_color_profile(GString *outstr, gint indent) *----------------------------------------------------------------------------- */ -gboolean save_options_to(const gchar *utf8_path, ConfOptions *options) +gboolean save_config_to_file(const gchar *utf8_path, ConfOptions *options) { SecureSaveInfo *ssi; gchar *rc_pathl; @@ -1167,19 +1167,12 @@ static GMarkupParser parser = { *----------------------------------------------------------------------------- */ -gboolean load_options_from(const gchar *utf8_path, ConfOptions *options, gboolean startup) +gboolean load_config_from_buf(const gchar *buf, gsize size, gboolean startup) { - gsize size; - gchar *buf; GMarkupParseContext *context; gboolean ret = TRUE; GQParserData *parser_data; - if (g_file_get_contents(utf8_path, &buf, &size, NULL) == FALSE) - { - return FALSE; - } - parser_data = g_new0(GQParserData, 1); parser_data->startup = startup; @@ -1195,10 +1188,24 @@ gboolean load_options_from(const gchar *utf8_path, ConfOptions *options, gboolea g_free(parser_data); - g_free(buf); g_markup_parse_context_free(context); return ret; } + +gboolean load_config_from_file(const gchar *utf8_path, gboolean startup) +{ + gsize size; + gchar *buf; + gboolean ret = TRUE; + + if (g_file_get_contents(utf8_path, &buf, &size, NULL) == FALSE) + { + return FALSE; + } + ret = load_config_from_buf(buf, size, startup); + g_free(buf); + return ret; +} diff --git a/src/rcfile.h b/src/rcfile.h index 5397e63b..44bd3ca7 100644 --- a/src/rcfile.h +++ b/src/rcfile.h @@ -73,8 +73,10 @@ void options_parse_func_pop(GQParserData *parser_data); void options_parse_func_set_data(GQParserData *parser_data, gpointer data); -gboolean save_options_to(const gchar *utf8_path, ConfOptions *options); -gboolean load_options_from(const gchar *utf8_path, ConfOptions *options, gboolean startup); +gboolean save_config_to_file(const gchar *utf8_path, ConfOptions *options); + +gboolean load_config_from_buf(const gchar *buf, gsize size, gboolean startup); +gboolean load_config_from_file(const gchar *utf8_path, gboolean startup); #endif diff --git a/src/remote.c b/src/remote.c index 5ef99e28..359a7152 100644 --- a/src/remote.c +++ b/src/remote.c @@ -506,7 +506,7 @@ static void gr_config_load(const gchar *text, gpointer data) if (isfile(filename)) { - load_options_from(filename, options, FALSE); + load_config_from_file(filename, FALSE); } else { -- 2.20.1