X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=blobdiff_plain;f=src%2Flayout_util.c;h=fc431c899a42335a60afbe03c442fa0a672ceead;hp=8c30ff5dec69cb8544a48320eeb1b6472c43cad4;hb=f6a87c016ecead37f8232bea58de4f0b0d3e3680;hpb=08e352717c3bbe9c39f8aec4428878256f995d0b diff --git a/src/layout_util.c b/src/layout_util.c index 8c30ff5d..fc431c89 100644 --- a/src/layout_util.c +++ b/src/layout_util.c @@ -1,16 +1,24 @@ /* - * Geeqie - * (C) 2004 John Ellis - * Copyright (C) 2008 - 2012 The Geeqie Team + * Copyright (C) 2004 John Ellis + * Copyright (C) 2008 - 2016 The Geeqie Team * * Author: John Ellis * - * 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! + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - #include "main.h" #include "layout_util.h" @@ -43,18 +51,20 @@ #include "ui_tabcomp.h" #include "utilops.h" #include "view_dir.h" +#include "view_file.h" #include "window.h" #include "metadata.h" -#include "rcfile.h" #include "desktop_file.h" #include /* for keyboard values */ - +#include "keymap_template.c" #define MENU_EDIT_ACTION_OFFSET 16 +#define FILE_COLUMN_POINTER 0 static gboolean layout_bar_enabled(LayoutWindow *lw); static gboolean layout_bar_sort_enabled(LayoutWindow *lw); +static void layout_bars_hide_toggle(LayoutWindow *lw); static void layout_util_sync_views(LayoutWindow *lw); /* @@ -196,7 +206,9 @@ static void layout_menu_new_window_cb(GtkAction *action, gpointer data) LayoutWindow *nw; LayoutOptions lop; gboolean tmp = options->save_window_positions; - options->save_window_positions = FALSE; /* let the windowmanager decide for the first time */ + + if (!options->use_saved_window_positions_for_new_windows) + options->save_window_positions = FALSE; /* let the windowmanager decide for the first time */ layout_exit_fullscreen(lw); @@ -239,7 +251,7 @@ static void layout_menu_dupes_cb(GtkAction *action, gpointer data) LayoutWindow *lw = data; layout_exit_fullscreen(lw); - dupe_window_new(DUPE_MATCH_NAME); + dupe_window_new(); } static void layout_menu_pan_cb(GtkAction *action, gpointer data) @@ -299,6 +311,16 @@ static void layout_menu_delete_cb(GtkAction *action, gpointer data) file_util_delete(NULL, layout_selection_list(lw), layout_window(lw)); } +static void layout_menu_delete_key_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + if (options->file_ops.enable_delete_key) + { + file_util_delete(NULL, layout_selection_list(lw), layout_window(lw)); + } +} + static void layout_menu_disable_grouping_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -333,6 +355,55 @@ static void layout_menu_alter_90_cb(GtkAction *action, gpointer data) layout_image_alter_orientation(lw, ALTER_ROTATE_90); } +static void layout_menu_rating_0_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "0"); +} + +static void layout_menu_rating_1_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "1"); +} + +static void layout_menu_rating_2_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "2"); +} + +static void layout_menu_rating_3_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "3"); +} + +static void layout_menu_rating_4_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "4"); +} + +static void layout_menu_rating_5_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "5"); +} + +static void layout_menu_rating_m1_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_image_rating(lw, "-1"); +} + static void layout_menu_alter_90cc_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -375,6 +446,109 @@ static void layout_menu_alter_none_cb(GtkAction *action, gpointer data) layout_image_alter_orientation(lw, ALTER_NONE); } +static void layout_menu_exif_rotate_cb(GtkToggleAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + options->image.exif_rotate_enable = gtk_toggle_action_get_active(action); + layout_image_reset_orientation(lw); +} + +static void layout_menu_write_rotate(GtkToggleAction *action, gpointer data, gboolean keep_date) +{ + LayoutWindow *lw = data; + GtkTreeModel *store; + GList *work; + GtkTreeSelection *selection; + GtkTreePath *tpath; + FileData *fd_n; + GtkTreeIter iter; + IconData *id; + gchar *rotation; + gchar *command; + gint run_result; + GenericDialog *gd; + GString *message; + + if (!layout_valid(&lw)) return; + + if (!lw || !lw->vf) return; + + if (lw->vf->type == FILEVIEW_ICON) + { + if (!VFICON(lw->vf)->selection) return; + work = VFICON(lw->vf)->selection; + } + else + { + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(lw->vf->listview)); + work = gtk_tree_selection_get_selected_rows(selection, &store); + } + + while (work) + { + if (lw->vf->type == FILEVIEW_ICON) + { + id = work->data; + fd_n = id->fd; + work = work->next; + } + else + { + tpath = work->data; + gtk_tree_model_get_iter(store, &iter, tpath); + gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1); + work = work->next; + } + + rotation = g_strdup_printf("%d", fd_n->user_orientation); + command = g_strconcat(GQ_BIN_DIR, "/geeqie-rotate -r ", rotation, + keep_date ? " -t " : " ", fd_n->path, NULL); + + run_result = WEXITSTATUS(runcmd(command)); + if (!run_result) + { + fd_n->user_orientation = 0; + } + else + { + message = g_string_new(""); + message = g_string_append(message, _("Operation failed:\n")); + + if (run_result == 3) + message = g_string_append(message, _("Cannot create tmp file")); + else + { + message = g_string_append(message, _("File: ")); + message = g_string_append(message, fd_n->name); + } + + gd = generic_dialog_new(_("Image orientation"), + "Image orientation", NULL, TRUE, NULL, NULL); + generic_dialog_add_message(gd, GTK_STOCK_DIALOG_ERROR, + "Image orientation", message->str); + generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, NULL, TRUE); + + gtk_widget_show(gd->dialog); + + g_string_free(message, TRUE); + } + + g_free(rotation); + g_free(command); + } +} + +static void layout_menu_write_rotate_keep_date_cb(GtkToggleAction *action, gpointer data) +{ + layout_menu_write_rotate(action, data, TRUE); +} + +static void layout_menu_write_rotate_cb(GtkToggleAction *action, gpointer data) +{ + layout_menu_write_rotate(action, data, FALSE); +} + static void layout_menu_config_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -610,12 +784,20 @@ static void layout_menu_list_cb(GtkRadioAction *action, GtkRadioAction *current, layout_views_set(lw, lw->options.dir_view_type, (FileViewType) gtk_radio_action_get_current_value(action)); } -static void layout_menu_view_dir_as_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data) +static void layout_menu_view_dir_as_cb(GtkToggleAction *action, gpointer data) { LayoutWindow *lw = data; layout_exit_fullscreen(lw); - layout_views_set(lw, (DirViewType) gtk_radio_action_get_current_value(action), lw->options.file_view_type); + + if (gtk_toggle_action_get_active(action)) + { + layout_views_set(lw, DIRVIEW_TREE, lw->options.file_view_type); + } + else + { + layout_views_set(lw, DIRVIEW_LIST, lw->options.file_view_type); + } } static void layout_menu_view_in_new_window_cb(GtkAction *action, gpointer data) @@ -686,6 +868,21 @@ static void layout_menu_histogram_cb(GtkToggleAction *action, gpointer data) } } +static void layout_menu_animate_cb(GtkToggleAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + if (lw->options.animate == gtk_toggle_action_get_active(action)) return; + layout_image_animate_toggle(lw); +} + +static void layout_menu_rectangular_selection_cb(GtkToggleAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + options->collections.rectangular_selection = gtk_toggle_action_get_active(action); +} + static void layout_menu_histogram_toggle_channel_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -800,6 +997,13 @@ static void layout_menu_bar_sort_cb(GtkToggleAction *action, gpointer data) layout_bar_sort_toggle(lw); } +static void layout_menu_hide_bars_cb(GtkToggleAction *action, gpointer data) +{ + LayoutWindow *lw = data; + + layout_bars_hide_toggle(lw); +} + static void layout_menu_slideshow_cb(GtkToggleAction *action, gpointer data) { LayoutWindow *lw = data; @@ -846,7 +1050,7 @@ static void layout_menu_help_cb(GtkAction *action, gpointer data) LayoutWindow *lw = data; layout_exit_fullscreen(lw); - help_window_show("html_contents"); + help_window_show("index.html"); } static void layout_menu_help_keys_cb(GtkAction *action, gpointer data) @@ -854,7 +1058,7 @@ static void layout_menu_help_keys_cb(GtkAction *action, gpointer data) LayoutWindow *lw = data; layout_exit_fullscreen(lw); - help_window_show("documentation"); + help_window_show("GuideReferenceKeyboardShortcuts.html"); } static void layout_menu_notes_cb(GtkAction *action, gpointer data) @@ -865,6 +1069,168 @@ static void layout_menu_notes_cb(GtkAction *action, gpointer data) help_window_show("release_notes"); } +static char *keyboard_map_hardcoded[][2] = { + {"Scroll","Left"}, + {"FastScroll", "<Shift>Left"}, + {"Left Border", "<Primary>Left"}, + {"Left Border", "<Primary><Shift>Left"}, + {"Scroll", "Right"}, + {"FastScroll", "<Shift>Right"}, + {"Right Border", "<Primary>Right"}, + {"Right Border", "<Primary><Shift>Right"}, + {"Scroll", "Up"}, + {"FastScroll", "<Shift>Up"}, + {"Uper Border", "<Primary>Up"}, + {"Uper Border", "<Primary><Shift>Up"}, + {"Scroll", "Down"}, + {"FastScroll", "<Shift>Down"}, + {"Lower Border", "<Primary>Down"}, + {"Lower Border", "<Primary><Shift>Down"}, + {"Next/Drag", "M1"}, + {"FastDrag", "<Shift>M1"}, + {"DnD Start", "M2"}, + {"Menu", "M3"}, + {"PrevImage", "MW4"}, + {"NextImage", "MW5"}, + {"ScrollUp", "<Shift>MW4"}, + {"ScrollDown", "<Shift>MW5"}, + {"ZoomIn", "<Primary>MW4"}, + {"ZoomOut", "<Primary>MW5"}, + {NULL, NULL} +}; + +static void layout_menu_foreach_func( + gpointer data, + const gchar *accel_path, + guint accel_key, + GdkModifierType accel_mods, + gboolean changed) +{ + gchar *path, *name; + gchar *key_name, *menu_name; + gchar **subset_lt_arr, **subset_gt_arr; + gchar *subset_lt, *converted_name; + GPtrArray *array = data; + + path = g_strescape(accel_path, NULL); + name = gtk_accelerator_name(accel_key, accel_mods); + + menu_name = g_strdup(g_strrstr(path, "/")+1); + + if (g_strrstr(name, ">")) + { + subset_lt_arr = g_strsplit_set(name,"<", 4); + subset_lt = g_strjoinv("<", subset_lt_arr); + subset_gt_arr = g_strsplit_set(subset_lt,">", 4); + converted_name = g_strjoinv(">", subset_gt_arr); + key_name = g_strdup(converted_name); + + g_free(converted_name); + g_free(subset_lt); + g_strfreev(subset_lt_arr); + g_strfreev(subset_gt_arr); + } + else + key_name = g_strdup(name); + + g_ptr_array_add(array, (gpointer)menu_name); + g_ptr_array_add(array, (gpointer)key_name); + + g_free(name); + g_free(path); +} + +static void layout_menu_kbd_map_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + gint fd = -1; + GPtrArray *array; + char * tmp_file; + GError *error = NULL; + GIOChannel *channel; + char **pre_key, **post_key; + char *key_name, *converted_line; + int keymap_index, index; + + fd = g_file_open_tmp("geeqie_keymap_XXXXXX.svg", &tmp_file, &error); + if (error) + { + DEBUG_0("Keyboard Map - cannot create file:%s\n",error->message); + g_error_free(error); + } + else + { + array = g_ptr_array_new(); + + gtk_accel_map_foreach(array, layout_menu_foreach_func); + + channel = g_io_channel_unix_new(fd); + + keymap_index = 0; + while (keymap_template[keymap_index]) + { + if (g_strrstr(keymap_template[keymap_index], ">key:")) + { + pre_key = g_strsplit(keymap_template[keymap_index],">key:",2); + post_key = g_strsplit(pre_key[1],"<",2); + + index=0; + key_name = " "; + for (index=0; index < array->len-2; index=index+2) + { + if (!(g_ascii_strcasecmp(g_ptr_array_index(array,index+1), post_key[0]))) + { + key_name = g_ptr_array_index(array,index+0); + break; + } + } + + index=0; + while (keyboard_map_hardcoded[index][0]) + { + if (!(g_strcmp0(keyboard_map_hardcoded[index][1], post_key[0]))) + { + key_name = keyboard_map_hardcoded[index][0]; + break; + } + index++; + } + + converted_line = g_strconcat(pre_key[0], ">", key_name, "<", post_key[1], "\n", NULL); + g_io_channel_write_chars(channel, converted_line, -1, NULL, &error); + if (error) {DEBUG_0("Keyboard Map:%s\n",error->message); g_error_free(error);} + + g_free(converted_line); + g_strfreev(pre_key); + g_strfreev(post_key); + } + else + { + g_io_channel_write_chars(channel, keymap_template[keymap_index], -1, NULL, &error); + if (error) {DEBUG_0("Keyboard Map:%s\n",error->message); g_error_free(error);} + g_io_channel_write_chars(channel, "\n", -1, NULL, &error); + if (error) {DEBUG_0("Keyboard Map:%s\n",error->message); g_error_free(error);} + } + keymap_index++; + } + + g_io_channel_flush(channel, &error); + if (error) {DEBUG_0("Keyboard Map:%s\n",error->message); g_error_free(error);} + g_io_channel_unref(channel); + + index=0; + for (index=0; index < array->len-2; index=index+2) + { + g_free(g_ptr_array_index(array,index)); + g_free(g_ptr_array_index(array,index+1)); + } + g_ptr_array_unref(array); + + view_window_new(file_data_new_simple(tmp_file)); + g_free(tmp_file); + } +} + static void layout_menu_about_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -878,7 +1244,7 @@ static void layout_menu_log_window_cb(GtkAction *action, gpointer data) LayoutWindow *lw = data; layout_exit_fullscreen(lw); - log_window_new(); + log_window_new(lw); } @@ -1015,6 +1381,64 @@ static void layout_menu_image_next_cb(GtkAction *action, gpointer data) layout_image_next(lw); } +static void layout_menu_split_pane_next_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + gint active_frame; + + active_frame = lw->active_split_image; + + if (active_frame < MAX_SPLIT_IMAGES-1 && lw->split_images[active_frame+1] ) + { + active_frame++; + } + else + { + active_frame = 0; + } + layout_image_activate(lw, active_frame, FALSE); +} + +static void layout_menu_split_pane_prev_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + gint active_frame; + + active_frame = lw->active_split_image; + + if (active_frame >=1 && lw->split_images[active_frame-1] ) + { + active_frame--; + } + else + { + active_frame = MAX_SPLIT_IMAGES-1; + while (!lw->split_images[active_frame]) + { + active_frame--; + } + } + layout_image_activate(lw, active_frame, FALSE); +} + +static void layout_menu_split_pane_updown_cb(GtkAction *action, gpointer data) +{ + LayoutWindow *lw = data; + gint active_frame; + + active_frame = lw->active_split_image; + + if (lw->split_images[MAX_SPLIT_IMAGES-1] ) + { + active_frame = active_frame ^ 2; + } + else + { + active_frame = active_frame ^ 1; + } + layout_image_activate(lw, active_frame, FALSE); +} + static void layout_menu_image_last_cb(GtkAction *action, gpointer data) { LayoutWindow *lw = data; @@ -1272,6 +1696,7 @@ 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 }, + { "RatingMenu", NULL, N_("_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 }, @@ -1309,14 +1734,21 @@ static GtkActionEntry menu_entries[] = { { "Move", NULL, N_("_Move..."), "M", N_("Move..."), CB(layout_menu_move_cb) }, { "Rename", NULL, N_("_Rename..."), "R", N_("Rename..."), CB(layout_menu_rename_cb) }, { "Delete", GTK_STOCK_DELETE, N_("_Delete..."), "D", N_("Delete..."), CB(layout_menu_delete_cb) }, - { "DeleteAlt1", GTK_STOCK_DELETE, N_("_Delete..."), "Delete", N_("Delete..."), CB(layout_menu_delete_cb) }, - { "DeleteAlt2", GTK_STOCK_DELETE, N_("_Delete..."), "KP_Delete", N_("Delete..."), CB(layout_menu_delete_cb) }, + { "DeleteAlt1", GTK_STOCK_DELETE, N_("_Delete..."), "Delete", N_("Delete..."), CB(layout_menu_delete_key_cb) }, + { "DeleteAlt2", GTK_STOCK_DELETE, N_("_Delete..."), "KP_Delete", N_("Delete..."), CB(layout_menu_delete_key_cb) }, { "EnableGrouping", NULL, N_("Enable file _grouping"), NULL, N_("Enable file grouping"), CB(layout_menu_enable_grouping_cb) }, { "DisableGrouping", NULL, N_("Disable file groupi_ng"), NULL, N_("Disable file grouping"), CB(layout_menu_disable_grouping_cb) }, { "CopyPath", NULL, N_("_Copy path to clipboard"), NULL, N_("Copy path to clipboard"), CB(layout_menu_copy_path_cb) }, { "CloseWindow", GTK_STOCK_CLOSE, N_("C_lose window"), "W", N_("Close window"), CB(layout_menu_close_cb) }, { "Quit", GTK_STOCK_QUIT, N_("_Quit"), "Q", N_("Quit"), CB(layout_menu_exit_cb) }, { "RotateCW", NULL, N_("_Rotate clockwise"), "bracketright", N_("Rotate clockwise"), CB(layout_menu_alter_90_cb) }, + { "Rating0", NULL, N_("_Rating 0"), "KP_0", N_("Rating 0"), CB(layout_menu_rating_0_cb) }, + { "Rating1", NULL, N_("_Rating 1"), "KP_1", N_("Rating 1"), CB(layout_menu_rating_1_cb) }, + { "Rating2", NULL, N_("_Rating 2"), "KP_2", N_("Rating 2"), CB(layout_menu_rating_2_cb) }, + { "Rating3", NULL, N_("_Rating 3"), "KP_3", N_("Rating 3"), CB(layout_menu_rating_3_cb) }, + { "Rating4", NULL, N_("_Rating 4"), "KP_4", N_("Rating 4"), CB(layout_menu_rating_4_cb) }, + { "Rating5", NULL, N_("_Rating 5"), "KP_5", N_("Rating 5"), CB(layout_menu_rating_5_cb) }, + { "RatingM1", NULL, N_("_Rating -1"), "KP_Subtract", N_("Rating -1"), CB(layout_menu_rating_m1_cb) }, { "RotateCCW", NULL, N_("Rotate _counterclockwise"), "bracketleft", N_("Rotate counterclockwise"), CB(layout_menu_alter_90cc_cb) }, { "Rotate180", NULL, N_("Rotate 1_80"), "R", N_("Rotate 180"), CB(layout_menu_alter_180_cb) }, { "Mirror", NULL, N_("_Mirror"), "M", N_("Mirror"), CB(layout_menu_alter_mirror_cb) }, @@ -1377,11 +1809,18 @@ static GtkActionEntry menu_entries[] = { { "Refresh", GTK_STOCK_REFRESH, N_("_Refresh"), "R", N_("Refresh"), CB(layout_menu_refresh_cb) }, { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", N_("Contents"), CB(layout_menu_help_cb) }, { "HelpShortcuts", NULL, N_("_Keyboard shortcuts"), NULL, N_("Keyboard shortcuts"), CB(layout_menu_help_keys_cb) }, + { "HelpKbd", NULL, N_("_Keyboard map"), NULL, N_("Keyboard map"), CB(layout_menu_kbd_map_cb) }, { "HelpNotes", NULL, N_("_Release notes"), NULL, N_("Release notes"), CB(layout_menu_notes_cb) }, { "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) }, { "StereoCycle", NULL, N_("_Cycle through stereo modes"), NULL, N_("Cycle through stereo modes"), CB(layout_menu_stereo_mode_next_cb) }, + { "SplitNextPane", NULL, N_("_Next Pane"), "Right", N_("Next Pane"), CB(layout_menu_split_pane_next_cb) }, + { "SplitPreviousPane", NULL, N_("_Previous Pane"), "Left", N_("Previous Pane"), CB(layout_menu_split_pane_prev_cb) }, + { "SplitUpPane", NULL, N_("_Up Pane"), "Up", N_("Up Pane"), CB(layout_menu_split_pane_updown_cb) }, + { "SplitDownPane", NULL, N_("_Down Pane"), "Down", N_("Down Pane"), CB(layout_menu_split_pane_updown_cb) }, + { "WriteRotation", NULL, N_("_Write orientation to file"), NULL, N_("Write orientation to file"), CB(layout_menu_write_rotate_cb) }, + { "WriteRotationKeepDate", NULL, N_("_Write orientation to file (preserve timestamp)"), NULL, N_("Write orientation to file (preserve timestamp)"), CB(layout_menu_write_rotate_keep_date_cb) }, }; @@ -1393,12 +1832,16 @@ static GtkToggleActionEntry menu_toggle_entries[] = { { "HideToolbar", NULL, N_("Hide tool_bar"), NULL, N_("Hide toolbar"), CB(layout_menu_toolbar_cb), FALSE }, { "SBar", NULL, N_("_Info sidebar"), "K", N_("Info sidebar"), CB(layout_menu_bar_cb), FALSE }, { "SBarSort", NULL, N_("Sort _manager"), "S", N_("Sort manager"), CB(layout_menu_bar_sort_cb), FALSE }, + { "HideBars", NULL, N_("Hide Bars"), "grave", N_("Hide Bars"), CB(layout_menu_hide_bars_cb), FALSE }, { "SlideShow", GTK_STOCK_MEDIA_PLAY, N_("Toggle _slideshow"), "S", N_("Toggle slideshow"), CB(layout_menu_slideshow_cb), FALSE }, { "UseColorProfiles", GTK_STOCK_SELECT_COLOR, N_("Use _color profiles"), NULL, N_("Use color profiles"), CB(layout_color_menu_enable_cb), FALSE}, { "UseImageProfile", NULL, N_("Use profile from _image"), NULL, N_("Use profile from image"), CB(layout_color_menu_use_image_cb), FALSE}, { "Grayscale", NULL, N_("Toggle _grayscale"), "G", N_("Toggle grayscale"), CB(layout_menu_alter_desaturate_cb), FALSE}, { "ImageOverlay", NULL, N_("Image _Overlay"), NULL, N_("Image Overlay"), CB(layout_menu_overlay_cb), FALSE }, { "ImageHistogram", NULL, N_("_Show Histogram"), NULL, N_("Show Histogram"), CB(layout_menu_histogram_cb), FALSE }, + { "RectangularSelection", NULL, N_("Rectangular Selection"), "R", N_("Rectangular Selection"), CB(layout_menu_rectangular_selection_cb), FALSE }, + { "Animate", NULL, N_("GIF _animation"), "A", N_("Toggle GIF animation"), CB(layout_menu_animate_cb), FALSE }, + { "ExifRotate", GTK_STOCK_ORIENTATION_PORTRAIT, N_("_Exif rotate"), "X", N_("Exif rotate"), CB(layout_menu_exif_rotate_cb), FALSE }, }; static GtkRadioActionEntry menu_radio_entries[] = { @@ -1406,9 +1849,8 @@ static GtkRadioActionEntry menu_radio_entries[] = { { "ViewIcons", NULL, N_("I_cons"), "I", N_("View Images as Icons"), FILEVIEW_ICON } }; -static GtkRadioActionEntry menu_view_dir_radio_entries[] = { - { "FolderList", NULL, N_("Folder Li_st"), "L", N_("View Folders as List"), DIRVIEW_LIST }, - { "FolderTree", NULL, N_("Folder T_ree"), "T", N_("View Folders as Tree"), DIRVIEW_TREE }, +static GtkToggleActionEntry menu_view_dir_toggle_entries[] = { + { "FolderTree", NULL, N_("T_oggle Folder View"), "T", N_("Toggle Folders View"), CB(layout_menu_view_dir_as_cb),FALSE }, }; static GtkRadioActionEntry menu_split_radio_entries[] = { @@ -1494,6 +1936,7 @@ static const gchar *menu_ui_description = " " " " " " +" " " " " " " " @@ -1515,6 +1958,22 @@ static const gchar *menu_ui_description = " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " " " @@ -1527,7 +1986,9 @@ static const gchar *menu_ui_description = " " " " " " +#if !GTK_CHECK_VERSION(3,0,0) " " +#endif " " " " " " @@ -1537,7 +1998,6 @@ static const gchar *menu_ui_description = " " " " " " -" " " " " " " " @@ -1585,6 +2045,11 @@ static const gchar *menu_ui_description = " " " " " " +" " +" " +" " +" " +" " " " " " " " @@ -1627,9 +2092,11 @@ static const gchar *menu_ui_description = " " " " " " +" " " " " " " " +" " " " " " " " @@ -1640,6 +2107,7 @@ static const gchar *menu_ui_description = " " " " " " +" " " " " " " " @@ -1650,8 +2118,23 @@ static const gchar *menu_ui_description = " " " " " " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " " " " " +" " +" " +" " +" " " " "" "" @@ -1946,9 +2429,9 @@ void layout_actions_setup(LayoutWindow *lw) gtk_action_group_add_radio_actions(lw->action_group, menu_split_radio_entries, G_N_ELEMENTS(menu_split_radio_entries), 0, G_CALLBACK(layout_menu_split_cb), lw); - gtk_action_group_add_radio_actions(lw->action_group, - menu_view_dir_radio_entries, VIEW_DIR_TYPES_COUNT, - 0, G_CALLBACK(layout_menu_view_dir_as_cb), lw); + gtk_action_group_add_toggle_actions(lw->action_group, + menu_view_dir_toggle_entries, G_N_ELEMENTS(menu_view_dir_toggle_entries), + lw); gtk_action_group_add_radio_actions(lw->action_group, menu_color_radio_entries, COLOR_PROFILE_FILE + COLOR_PROFILE_INPUTS, 0, G_CALLBACK(layout_color_menu_input_cb), lw); @@ -1976,14 +2459,6 @@ void layout_actions_setup(LayoutWindow *lw) exit(EXIT_FAILURE); } - DEBUG_1("%s layout_actions_setup: add toolbar", get_exec_time()); - for (i = 0; i < TOOLBAR_COUNT; i++) - { - layout_toolbar_clear(lw, i); - layout_toolbar_add_default(lw, i); - } - - DEBUG_1("%s layout_actions_setup: marks", get_exec_time()); layout_actions_setup_marks(lw); @@ -2105,144 +2580,6 @@ GtkWidget *layout_actions_toolbar(LayoutWindow *lw, ToolbarType type) return lw->toolbar[type]; } -void layout_toolbar_clear(LayoutWindow *lw, ToolbarType type) -{ - if (lw->toolbar_merge_id[type]) - { - gtk_ui_manager_remove_ui(lw->ui_manager, lw->toolbar_merge_id[type]); - gtk_ui_manager_ensure_update(lw->ui_manager); - } - string_list_free(lw->toolbar_actions[type]); - lw->toolbar_actions[type] = NULL; - - lw->toolbar_merge_id[type] = gtk_ui_manager_new_merge_id(lw->ui_manager); -} - - -void layout_toolbar_add(LayoutWindow *lw, ToolbarType type, const gchar *action) -{ - const gchar *path = NULL; - if (!action || !lw->ui_manager) return; - - if (g_list_find_custom(lw->toolbar_actions[type], action, (GCompareFunc)strcmp)) return; - - switch (type) - { - case TOOLBAR_MAIN: - path = "/ToolBar"; - break; - case TOOLBAR_STATUS: - path = "/StatusBar"; - break; - default: - break; - } - - - if (g_str_has_suffix(action, ".desktop")) - { - /* this may be called before the external editors are read - create a dummy action for now */ - - if (!lw->action_group_editors) - { - lw->action_group_editors = gtk_action_group_new("MenuActionsExternal"); - gtk_ui_manager_insert_action_group(lw->ui_manager, lw->action_group_editors, 1); - } - if (!gtk_action_group_get_action(lw->action_group_editors, action)) - { - GtkActionEntry entry = { action, - GTK_STOCK_MISSING_IMAGE, - action, - NULL, - NULL, - NULL }; - DEBUG_1("Creating temporary action %s", action); - gtk_action_group_add_actions(lw->action_group_editors, &entry, 1, lw); - } - } - gtk_ui_manager_add_ui(lw->ui_manager, lw->toolbar_merge_id[type], path, action, action, GTK_UI_MANAGER_TOOLITEM, FALSE); - lw->toolbar_actions[type] = g_list_append(lw->toolbar_actions[type], g_strdup(action)); -} - - -void layout_toolbar_add_default(LayoutWindow *lw, ToolbarType type) -{ - switch (type) - { - case TOOLBAR_MAIN: - layout_toolbar_add(lw, type, "Thumbnails"); - layout_toolbar_add(lw, type, "Back"); - layout_toolbar_add(lw, type, "Up"); - layout_toolbar_add(lw, type, "Home"); - layout_toolbar_add(lw, type, "Refresh"); - layout_toolbar_add(lw, type, "ZoomIn"); - layout_toolbar_add(lw, type, "ZoomOut"); - layout_toolbar_add(lw, type, "ZoomFit"); - layout_toolbar_add(lw, type, "Zoom100"); - layout_toolbar_add(lw, type, "Preferences"); - layout_toolbar_add(lw, type, "FloatTools"); - break; - case TOOLBAR_STATUS: - layout_toolbar_add(lw, type, "ShowInfoPixel"); - layout_toolbar_add(lw, type, "UseColorProfiles"); - layout_toolbar_add(lw, type, "SaveMetadata"); - break; - default: - break; - } -} - -void layout_toolbar_write_config(LayoutWindow *lw, ToolbarType type, GString *outstr, gint indent) -{ - const gchar *name = NULL; - GList *work = lw->toolbar_actions[type]; - - switch (type) - { - case TOOLBAR_MAIN: - name = "toolbar"; - break; - case TOOLBAR_STATUS: - name = "statusbar"; - break; - default: - break; - } - - WRITE_NL(); WRITE_STRING("<%s>", name); - indent++; - WRITE_NL(); WRITE_STRING(""); - while (work) - { - gchar *action = work->data; - work = work->next; - WRITE_NL(); WRITE_STRING(""); - } - indent--; - WRITE_NL(); WRITE_STRING("", name); -} - -void layout_toolbar_add_from_config(LayoutWindow *lw, ToolbarType type, 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; - - log_printf("unknown attribute %s = %s\n", option, value); - } - - layout_toolbar_add(lw, type, action); - g_free(action); -} - /* *----------------------------------------------------------------------------- * misc @@ -2370,11 +2707,20 @@ static void layout_util_sync_views(LayoutWindow *lw) if (!lw->action_group) return; action = gtk_action_group_get_action(lw->action_group, "FolderTree"); - gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.dir_view_type); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.dir_view_type); action = gtk_action_group_get_action(lw->action_group, "SplitSingle"); gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->split_mode); + action = gtk_action_group_get_action(lw->action_group, "SplitNextPane"); + gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE)); + action = gtk_action_group_get_action(lw->action_group, "SplitPreviousPane"); + gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE)); + action = gtk_action_group_get_action(lw->action_group, "SplitUpPane"); + gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE)); + action = gtk_action_group_get_action(lw->action_group, "SplitDownPane"); + gtk_action_set_sensitive(action, !(lw->split_mode == SPLIT_NONE)); + action = gtk_action_group_get_action(lw->action_group, "ViewIcons"); gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), lw->options.file_view_type); @@ -2399,12 +2745,21 @@ static void layout_util_sync_views(LayoutWindow *lw) action = gtk_action_group_get_action(lw->action_group, "SlideShow"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw)); + action = gtk_action_group_get_action(lw->action_group, "Animate"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->options.animate); + action = gtk_action_group_get_action(lw->action_group, "ImageOverlay"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags != OSD_SHOW_NOTHING); action = gtk_action_group_get_action(lw->action_group, "ImageHistogram"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), osd_flags & OSD_SHOW_HISTOGRAM); + action = gtk_action_group_get_action(lw->action_group, "ExifRotate"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->image.exif_rotate_enable); + + action = gtk_action_group_get_action(lw->action_group, "RectangularSelection"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), options->collections.rectangular_selection); + if (osd_flags & OSD_SHOW_HISTOGRAM) { action = gtk_action_group_get_action(lw->action_group, "HistogramChanR"); @@ -2417,6 +2772,13 @@ static void layout_util_sync_views(LayoutWindow *lw) action = gtk_action_group_get_action(lw->action_group, "ConnectZoomMenu"); gtk_action_set_sensitive(action, lw->split_mode != SPLIT_NONE); + action = gtk_action_group_get_action(lw->action_group, "WriteRotation"); + gtk_action_set_sensitive(action, !(runcmd("which exiftran >/dev/null") || + runcmd("which mogrify >/dev/null") || options->metadata.write_orientation)); + action = gtk_action_group_get_action(lw->action_group, "WriteRotationKeepDate"); + gtk_action_set_sensitive(action, !(runcmd("which exiftran >/dev/null") || + runcmd("which mogrify >/dev/null") || options->metadata.write_orientation)); + action = gtk_action_group_get_action(lw->action_group, "StereoAuto"); gtk_radio_action_set_current_value(GTK_RADIO_ACTION(action), layout_image_stereo_pixbuf_get(lw)); @@ -2614,6 +2976,39 @@ void layout_bar_sort_toggle(LayoutWindow *lw) layout_util_sync_views(lw); } +static void layout_bars_hide_toggle(LayoutWindow *lw) +{ + if (lw->options.bars_state.hidden) + { + lw->options.bars_state.hidden = FALSE; + if (lw->options.bars_state.sort) + { + gtk_widget_show(lw->bar_sort); + } + if (lw->options.bars_state.info) + { + gtk_widget_show(lw->bar); + } + layout_tools_float_set(lw, lw->options.tools_float, + lw->options.bars_state.tools_hidden); + } + else + { + lw->options.bars_state.hidden = TRUE; + lw->options.bars_state.sort = layout_bar_sort_enabled(lw); + lw->options.bars_state.info = layout_bar_enabled(lw); + lw->options.bars_state.tools_float = lw->options.tools_float; + lw->options.bars_state.tools_hidden = lw->options.tools_hidden; + + gtk_widget_hide(lw->bar); + if (lw->bar_sort) + gtk_widget_hide(lw->bar_sort); + layout_tools_float_set(lw, lw->options.tools_float, TRUE); + } + + layout_util_sync_views(lw); +} + void layout_bars_new_image(LayoutWindow *lw) { layout_bar_new_image(lw);