Bug fix #934: Request to add image bookmarking/tagging within a folder
[geeqie.git] / src / img-view.c
index 4e90ee6..b5f3bd5 100644 (file)
@@ -80,6 +80,66 @@ static void view_window_dnd_init(ViewWindow *vw);
 
 static void view_window_notify_cb(FileData *fd, NotifyType type, gpointer data);
 
+
+/**
+ * This array must be kept in sync with the contents of:\n
+ *  @link view_popup_menu() @endlink \n
+ *  @link view_window_key_press_cb() @endlink
+ * 
+ * See also @link hard_coded_window_keys @endlink
+ **/
+hard_coded_window_keys image_window_keys[] = {
+       {GDK_CONTROL_MASK, 'C', N_("Copy")},
+       {GDK_CONTROL_MASK, 'M', N_("Move")},
+       {GDK_CONTROL_MASK, 'R', N_("Rename")},
+       {GDK_CONTROL_MASK, 'D', N_("Move to Trash")},
+       {0, GDK_KEY_Delete, N_("Move to Trash")},
+       {GDK_SHIFT_MASK, GDK_KEY_Delete, N_("Delete")},
+       {GDK_CONTROL_MASK, 'W', N_("Close window")},
+       {GDK_SHIFT_MASK, 'R', N_("Rotate 180°")},
+       {GDK_SHIFT_MASK, 'M', N_("Rotate mirror")},
+       {GDK_SHIFT_MASK, 'F', N_("Rotate flip")},
+       {0, ']', N_(" Rotate counterclockwise 90°")},
+       {0, '[', N_(" Rotate clockwise 90°")},
+       {0, GDK_KEY_Page_Up, N_("Previous")},
+       {0, GDK_KEY_KP_Page_Up, N_("Previous")},
+       {0, GDK_KEY_BackSpace, N_("Previous")},
+       {0, 'B', N_("Previous")},
+       {0, GDK_KEY_Page_Down, N_("Next")},
+       {0, GDK_KEY_KP_Page_Down, N_("Next")},
+       {0, GDK_KEY_space, N_("Next")},
+       {0, 'N', N_("Next")},
+       {0, GDK_KEY_equal, N_("Zoom in")},
+       {0, GDK_KEY_plus, N_("Zoom in")},
+       {0, GDK_KEY_minus, N_("Zoom out")},
+       {0, 'X', N_("Zoom to fit")},
+       {0, GDK_KEY_KP_Multiply, N_("Zoom to fit")},
+       {0, 'Z', N_("Zoom 1:1")},
+       {0, GDK_KEY_KP_Divide, N_("Zoom 1:1")},
+       {0, GDK_KEY_1, N_("Zoom 1:1")},
+       {0, '2', N_("Zoom 2:1")},
+       {0, '3', N_("Zoom 3:1")},
+       {0, '4', N_("Zoom 4:1")},
+       {0, '7', N_("Zoom 1:4")},
+       {0, '8', N_("Zoom 1:3")},
+       {0, '9', N_("Zoom 1:2")},
+       {0, 'W', N_("Zoom fit window width")},
+       {0, 'H', N_("Zoom fit window height")},
+       {0, 'S', N_("Toggle slideshow")},
+       {0, 'P', N_("Pause slideshow")},
+       {0, 'R', N_("Reload image")},
+       {0, 'F', N_("Full screen")},
+       {0, 'V', N_("Fullscreen")},
+       {0, GDK_KEY_F11, N_("Fullscreen")},
+       {0, 'I', N_("Image overlay")},
+       {0, GDK_KEY_Escape, N_("Exit fullscreen")},
+       {0, GDK_KEY_Escape, N_("Close window")},
+       {GDK_SHIFT_MASK, 'G', N_("Desaturate")},
+       {GDK_SHIFT_MASK, 'P', N_("Print")},
+       {0, 0, NULL}
+};
+
+
 /*
  *-----------------------------------------------------------------------------
  * misc
@@ -592,11 +652,27 @@ static void button_cb(ImageWindow *imd, GdkEventButton *event, gpointer data)
 {
        ViewWindow *vw = data;
        GtkWidget *menu;
+       gchar *dest_dir;
+       LayoutWindow *lw_new;
 
        switch (event->button)
                {
                case MOUSE_BUTTON_LEFT:
-                       if (options->image_l_click_video && options->image_l_click_video_editor && imd->image_fd->format_class == FORMAT_CLASS_VIDEO)
+                       if (options->image_l_click_archive && imd->image_fd->format_class == FORMAT_CLASS_ARCHIVE)
+                               {
+                               dest_dir = open_archive(imd->image_fd);
+                               if (dest_dir)
+                                       {
+                                       lw_new = layout_new_from_default();
+                                       layout_set_path(lw_new, dest_dir);
+                                       g_free(dest_dir);
+                                       }
+                               else
+                                       {
+                                       warning_dialog(_("Cannot open archive file"), _("See the Log Window"), GTK_STOCK_DIALOG_WARNING, NULL);
+                                       }
+                               }
+                       else if (options->image_l_click_video && options->image_l_click_video_editor && imd->image_fd->format_class == FORMAT_CLASS_VIDEO)
                                {
                                start_editor_from_file(options->image_l_click_video_editor, imd->image_fd);
                                }
@@ -930,6 +1006,14 @@ static ViewWindow *real_view_window_new(FileData *fd, GList *list, CollectionDat
 
        file_data_register_notify_func(view_window_notify_cb, vw, NOTIFY_PRIORITY_LOW);
 
+       /** @FIXME This is a hack to fix #965 View in new window - blank image
+        * The problem occurs when zoom is set to Original Size and Preload
+        * Next Image is set.
+        * An extra reload is required to force the image to be displayed.
+        * This is probably not the correct solution.
+        **/
+       image_reload(vw->imd);
+
        return vw;
 }
 
@@ -1321,14 +1405,20 @@ static GtkWidget *view_popup_menu(ViewWindow *vw)
        GtkWidget *menu;
        GtkWidget *item;
        GList *editmenu_fd_list;
+       GtkAccelGroup *accel_group;
 
        menu = popup_menu_short_lived();
 
+       accel_group = gtk_accel_group_new();
+       gtk_menu_set_accel_group(GTK_MENU(menu), accel_group);
+
+       g_object_set_data(G_OBJECT(menu), "window_keys", image_window_keys);
+       g_object_set_data(G_OBJECT(menu), "accel_group", accel_group);
 
        menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);
        menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);
        menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);
-       menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
+       menu_item_add_stock(menu, _("Zoom to fit"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
        menu_item_add_divider(menu);
 
        editmenu_fd_list = view_window_get_fd_list(vw);
@@ -1370,7 +1460,7 @@ static GtkWidget *view_popup_menu(ViewWindow *vw)
 
        if (vw->ss)
                {
-               menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw);
+               menu_item_add(menu, _("Toggle _slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw);
                if (slideshow_paused(vw->ss))
                        {
                        item = menu_item_add(menu, _("Continue slides_how"),
@@ -1384,7 +1474,7 @@ static GtkWidget *view_popup_menu(ViewWindow *vw)
                }
        else
                {
-               item = menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(view_slideshow_start_cb), vw);
+               item = menu_item_add(menu, _("Toggle _slideshow"), G_CALLBACK(view_slideshow_start_cb), vw);
                gtk_widget_set_sensitive(item, (vw->list != NULL) || view_window_contains_collection(vw));
                item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw);
                gtk_widget_set_sensitive(item, FALSE);
@@ -1444,7 +1534,7 @@ static void view_dir_list_do(ViewWindow *vw, GList *list, gboolean skip, gboolea
                                        list = filelist_recursive(fd);
                                        }
                                else
-                                       { /*FIXME */
+                                       { /** @FIXME ?? */
                                        filelist_read(fd, &list, NULL);
                                        list = filelist_sort_path(list);
                                        list = filelist_filter(list, FALSE);
@@ -1454,7 +1544,7 @@ static void view_dir_list_do(ViewWindow *vw, GList *list, gboolean skip, gboolea
                        }
                else
                        {
-                       /* FIXME: no filtering here */
+                       /** @FIXME no filtering here */
                        vw->list = g_list_append(vw->list, file_data_ref(fd));
                        }
                }