From d5b911cd3eca6de811ef53f8cac6a3f84ced1062 Mon Sep 17 00:00:00 2001 From: Vladimir Nadvornik Date: Sat, 28 Feb 2009 12:50:39 +0000 Subject: [PATCH] save and restore toolbar configuration --- src/layout.c | 5 ++- src/layout_util.c | 89 ++++++++++++++++++++++++++++++++++++++++------- src/layout_util.h | 8 ++++- src/rcfile.c | 20 +++++++++++ src/typedefs.h | 2 ++ 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/src/layout.c b/src/layout.c index 46ac6c10..95229208 100644 --- a/src/layout.c +++ b/src/layout.c @@ -218,7 +218,7 @@ static GtkWidget *layout_tool_setup(LayoutWindow *lw) gtk_box_pack_start(GTK_BOX(box), menu_bar, FALSE, FALSE, 0); gtk_widget_show(menu_bar); - lw->toolbar = layout_button_bar(lw); + lw->toolbar = layout_actions_toolbar(lw); gtk_box_pack_start(GTK_BOX(box), lw->toolbar, FALSE, FALSE, 0); if (!lw->options.toolbar_hidden) gtk_widget_show(lw->toolbar); @@ -1971,6 +1971,7 @@ void layout_free(LayoutWindow *lw) file_data_unref(lw->dir_fd); } + string_list_free(lw->toolbar_actions); free_layout_options_content(&lw->options); g_free(lw); } @@ -2177,6 +2178,8 @@ void layout_write_config(LayoutWindow *lw, GString *outstr, gint indent) bar_sort_write_config(lw->bar_sort, outstr, indent + 1); bar_write_config(lw->bar, outstr, indent + 1); + layout_toolbar_write_config(lw, outstr, indent + 1); + WRITE_STRING("\n"); } diff --git a/src/layout_util.c b/src/layout_util.c index c207542b..0d3af6ee 100644 --- a/src/layout_util.c +++ b/src/layout_util.c @@ -43,6 +43,7 @@ #include "view_dir.h" #include "window.h" #include "metadata.h" +#include "rcfile.h" #include /* for keyboard values */ @@ -1444,17 +1445,6 @@ static const gchar *menu_ui_description = " " " " " " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " -" " " " "" "" @@ -1478,7 +1468,6 @@ static const gchar *menu_ui_description = "" ""; - static gchar *menu_translate(const gchar *path, gpointer data) { return (gchar *)(_(path)); @@ -1727,6 +1716,9 @@ void layout_actions_setup(LayoutWindow *lw) exit(EXIT_FAILURE); } + layout_toolbar_clear(lw); + layout_toolbar_add_default(lw); + layout_actions_setup_marks(lw); layout_actions_setup_editors(lw); layout_copy_path_update(lw); @@ -1747,7 +1739,7 @@ GtkWidget *layout_actions_menu_bar(LayoutWindow *lw) return gtk_ui_manager_get_widget(lw->ui_manager, "/MainMenu"); } -GtkWidget *layout_button_bar(LayoutWindow *lw) +GtkWidget *layout_actions_toolbar(LayoutWindow *lw) { GtkWidget *bar = gtk_ui_manager_get_widget(lw->ui_manager, "/ToolBar"); gtk_toolbar_set_icon_size(GTK_TOOLBAR(bar), GTK_ICON_SIZE_SMALL_TOOLBAR); @@ -1755,6 +1747,77 @@ GtkWidget *layout_button_bar(LayoutWindow *lw) return bar; } +void layout_toolbar_clear(LayoutWindow *lw) +{ + if (lw->toolbar_merge_id) + { + gtk_ui_manager_remove_ui(lw->ui_manager, lw->toolbar_merge_id); + gtk_ui_manager_ensure_update(lw->ui_manager); + } + string_list_free(lw->toolbar_actions); + lw->toolbar_actions = NULL; + + lw->toolbar_merge_id = gtk_ui_manager_new_merge_id(lw->ui_manager); +} + + +void layout_toolbar_add(LayoutWindow *lw, const gchar *action) +{ + if (!action || !lw->ui_manager) 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)); +} + + +void layout_toolbar_add_default(LayoutWindow *lw) +{ + layout_toolbar_add(lw, "Thumbnails"); + layout_toolbar_add(lw, "Back"); + layout_toolbar_add(lw, "Home"); + layout_toolbar_add(lw, "Refresh"); + layout_toolbar_add(lw, "ZoomIn"); + layout_toolbar_add(lw, "ZoomOut"); + layout_toolbar_add(lw, "ZoomFit"); + layout_toolbar_add(lw, "Zoom100"); + layout_toolbar_add(lw, "Preferences"); + layout_toolbar_add(lw, "FloatTools"); +} + +void layout_toolbar_write_config(LayoutWindow *lw, GString *outstr, gint indent) +{ + GList *work = lw->toolbar_actions; + WRITE_STRING("\n"); + indent++; + while (work) + { + gchar *action = work->data; + work = work->next; + WRITE_STRING("\n"); + } + indent--; + WRITE_STRING("\n"); +} + +void layout_toolbar_add_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values) +{ + gchar *action = NULL; + + while (*attribute_names) + { + const gchar *option = *attribute_names++; + const gchar *value = *attribute_values++; + + if (READ_CHAR_FULL("action", action)) continue; + + DEBUG_1("unknown attribute %s = %s", option, value); + } + + layout_toolbar_add(lw, action); + g_free(action); +} + /* *----------------------------------------------------------------------------- * misc diff --git a/src/layout_util.h b/src/layout_util.h index 7fa37980..3b0dbebe 100644 --- a/src/layout_util.h +++ b/src/layout_util.h @@ -33,9 +33,15 @@ void layout_copy_path_update_all(void); void layout_actions_setup(LayoutWindow *lw); void layout_actions_add_window(LayoutWindow *lw, GtkWidget *window); GtkWidget *layout_actions_menu_bar(LayoutWindow *lw); +void layout_toolbar_add_from_config(LayoutWindow *lw, const gchar **attribute_names, const gchar **attribute_values); +GtkWidget *layout_actions_toolbar(LayoutWindow *lw); + +void layout_toolbar_clear(LayoutWindow *lw); +void layout_toolbar_add(LayoutWindow *lw, const gchar *action); +void layout_toolbar_add_default(LayoutWindow *lw); +void layout_toolbar_write_config(LayoutWindow *lw, GString *outstr, gint indent); -GtkWidget *layout_button_bar(LayoutWindow *lw); void layout_keyboard_init(LayoutWindow *lw, GtkWidget *window); diff --git a/src/rcfile.c b/src/rcfile.c index a8d368ab..c79c066b 100644 --- a/src/rcfile.c +++ b/src/rcfile.c @@ -887,6 +887,21 @@ static void options_parse_bar(GQParserData *parser_data, GMarkupParseContext *co } } +static void options_parse_toolbar(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) +{ + LayoutWindow *lw = data; + if (g_ascii_strcasecmp(element_name, "toolitem") == 0) + { + layout_toolbar_add_from_config(lw, attribute_names, attribute_values); + options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL); + } + else + { + DEBUG_1("unexpected in : <%s>", element_name); + options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL); + } +} + static void options_parse_layout(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) { LayoutWindow *lw = data; @@ -902,6 +917,11 @@ static void options_parse_layout(GQParserData *parser_data, GMarkupParseContext layout_bar_sort_set(lw, bar); options_parse_func_push(parser_data, options_parse_leaf, NULL, NULL); } + 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 { DEBUG_1("unexpected in : <%s>", element_name); diff --git a/src/typedefs.h b/src/typedefs.h index db39f9f7..4fde26cb 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -551,6 +551,8 @@ struct _LayoutWindow GtkActionGroup *action_group; GtkActionGroup *action_group_external; GtkUIManager *ui_manager; + guint toolbar_merge_id; + GList *toolbar_actions; GtkWidget *path_entry; -- 2.20.1