Syncing to 0.8.1
[geeqie.git] / src / img-view.c
1 /*
2  * GQview image viewer
3  * (C)2000 John Ellis
4  *
5  * Author: John Ellis
6  *
7  */
8
9 #include "gqview.h"
10 #include "image.h"
11 #include <gdk/gdkkeysyms.h> /* for keyboard values */
12
13 /*
14  *-----------------------------------------------------------------------------
15  * view window keyboard
16  *-----------------------------------------------------------------------------
17  */
18
19 static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
20 {
21         ImageWindow *imd = data;
22         gint stop_signal = FALSE;
23         gint x = 0;
24         gint y = 0;
25
26         switch (event->keyval)
27                 {
28                 case GDK_Left:
29                         x -= 1;
30                         stop_signal = TRUE;
31                         break;
32                 case GDK_Right:
33                         x += 1;
34                         stop_signal = TRUE;
35                         break;
36                 case GDK_Up:
37                         y -= 1;
38                         stop_signal = TRUE;
39                         break;
40                 case GDK_Down:
41                         y += 1;
42                         stop_signal = TRUE;
43                         break;
44                 case '+': case '=':
45                         image_area_adjust_zoom(imd, 1);
46                         break;
47                 case '-':
48                         image_area_adjust_zoom(imd, -1);
49                         break;
50                 case 'x':
51                         image_area_set_zoom(imd, 0);
52                         break;
53                 case 'z':
54                         image_area_set_zoom(imd, 1);
55                         break;
56                 case GDK_Delete:
57                         file_util_delete(image_area_get_path(imd), NULL);
58                         stop_signal = TRUE;
59                         break;
60                 case GDK_Escape:
61                         gtk_widget_destroy(imd->top_window);
62                         stop_signal = TRUE;
63                         break;
64                 }
65
66         if (event->state & GDK_CONTROL_MASK)
67                 {
68                 gint n = -1;
69                 switch (event->keyval)
70                         {
71                         case '1':
72                                 n = 0;
73                                 break;
74                         case '2':
75                                 n = 1;
76                                 break;
77                         case '3':
78                                 n = 2;
79                                 break;
80                         case '4':
81                                 n = 3;
82                                 break;
83                         case '5':
84                                 n = 4;
85                                 break;
86                         case '6':
87                                 n = 5;
88                                 break;
89                         case '7':
90                                 n = 6;
91                                 break;
92                         case '8':
93                                 n = 7;
94                                 break;
95                         }
96                 if (n != -1)
97                         {
98                         start_editor_from_file(n, image_area_get_path(imd));
99                         }
100                 }
101
102         if (event->state & GDK_SHIFT_MASK)
103                 {
104                 x *= 3;
105                 y *= 3;
106                 }
107
108         if (x != 0 || y!= 0)
109                 {
110                 keyboard_scroll_calc(&x, &y, event);
111                 image_area_scroll(imd, x, y);
112                 }
113
114         return stop_signal;
115 }
116
117 /*
118  *-----------------------------------------------------------------------------
119  * view window main routines
120  *-----------------------------------------------------------------------------
121  */ 
122
123 static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
124 {
125         gtk_object_set_data(GTK_OBJECT(menu_window_view), "view_active", imd);
126         gtk_menu_popup (GTK_MENU(menu_window_view), NULL, NULL, NULL, NULL,
127                 bevent->button, bevent->time);
128 }
129
130 static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
131 {
132         if (mousewheel_scrolls)
133                 image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
134 }
135
136 static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
137 {
138         if (mousewheel_scrolls)
139                 image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
140 }
141
142 static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
143 {
144         gtk_widget_destroy(w);
145         return TRUE;
146 }
147
148 static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
149 {
150         ImageWindow *imd = data;
151         image_area_free(imd);
152         return FALSE;
153 }
154
155 void view_window_new(gchar *path)
156 {
157         GtkWidget *window;
158         ImageWindow *imd;
159         GtkAllocation req_size;
160         gint w, h;
161         if (!path) return;
162
163         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
164         gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
165         gtk_window_set_title (GTK_WINDOW (window), "GQview");
166         gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview");
167         gtk_container_border_width (GTK_CONTAINER (window), 0);
168
169         imd = image_area_new(NULL);
170         image_area_set_topwindow(imd, window, NULL, TRUE);
171         gtk_container_add(GTK_CONTAINER(window), imd->eventbox);
172         gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE);
173         gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0);
174         gtk_widget_show_all(imd->eventbox);
175
176         image_dnd_init(imd);
177
178         image_area_set_button(imd, 3, button3_cb, NULL);
179         /* for wheel mice */
180         image_area_set_button(imd, 4, button4_cb, NULL);
181         image_area_set_button(imd, 5, button5_cb, NULL);
182
183
184         gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL);
185         gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd);
186         gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd);
187
188         image_area_set_image(imd, path, get_default_zoom(NULL));
189
190         w = imd->width;
191         h = imd->height;
192         if (limit_window_size)
193                 {
194                 gint mw = gdk_screen_width() * max_window_size / 100;
195                 gint mh = gdk_screen_height() * max_window_size / 100;
196
197                 if (w > mw) w = mw;
198                 if (h > mh) h = mh;
199                 }
200
201         gtk_window_set_default_size (GTK_WINDOW(window), w, h);
202         req_size.x = req_size.y = 0;
203         req_size.width = w;
204         req_size.height = h;
205         gtk_widget_size_allocate(GTK_WIDGET(window), &req_size);
206
207         gtk_widget_set_usize(imd->eventbox, w, h);
208
209         gtk_widget_show(window);
210 }
211
212 /*
213  *-----------------------------------------------------------------------------
214  * view window menu routines and callbacks
215  *-----------------------------------------------------------------------------
216  */ 
217
218 static ImageWindow *view_window_get_active()
219 {
220         return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active");
221 }
222
223 void view_window_active_edit(gint n)
224 {
225         ImageWindow *imd = view_window_get_active();
226         if (!imd) return;
227         start_editor_from_file(n, image_area_get_path(imd));
228 }
229
230 void view_window_active_to_root(gint n)
231 {
232         ImageWindow *imd = view_window_get_active();
233         if (!imd) return;
234         image_area_to_root(imd, (image_area_get_zoom(imd) == 0));
235 }
236
237 static void view_zoom_in_cb(GtkWidget *widget, gpointer data)
238 {
239         ImageWindow *imd = view_window_get_active();
240         if (!imd) return;
241         image_area_adjust_zoom(imd, 1);
242 }
243
244 static void view_zoom_out_cb(GtkWidget *widget, gpointer data)
245 {
246         ImageWindow *imd = view_window_get_active();
247         if (!imd) return;
248         image_area_adjust_zoom(imd, -1);
249 }
250
251 static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data)
252 {
253         ImageWindow *imd = view_window_get_active();
254         if (!imd) return;
255         image_area_set_zoom(imd, 1);
256 }
257
258 static void view_zoom_fit_cb(GtkWidget *widget, gpointer data)
259 {
260         ImageWindow *imd = view_window_get_active();
261         if (!imd) return;
262         image_area_set_zoom(imd, 0);
263 }
264
265 static void view_copy_cb(GtkWidget *widget, gpointer data)
266 {
267         ImageWindow *imd = view_window_get_active();
268         if (!imd) return;
269         file_util_copy(image_area_get_path(imd), NULL, current_path);
270 }
271
272 static void view_move_cb(GtkWidget *widget, gpointer data)
273 {
274         ImageWindow *imd = view_window_get_active();
275         if (!imd) return;
276         file_util_move(image_area_get_path(imd), NULL, current_path);
277 }
278
279 static void view_rename_cb(GtkWidget *widget, gpointer data)
280 {
281         ImageWindow *imd = view_window_get_active();
282         if (!imd) return;
283         file_util_rename(image_area_get_path(imd), NULL);
284 }
285
286 static void view_delete_cb(GtkWidget *widget, gpointer data)
287 {
288         ImageWindow *imd = view_window_get_active();
289         if (!imd) return;
290         file_util_delete(image_area_get_path(imd), NULL);
291 }
292
293 static void view_close_cb(GtkWidget *widget, gpointer data)
294 {
295         ImageWindow *imd = view_window_get_active();
296         if (!imd) return;
297         gtk_widget_destroy(imd->top_window);
298 }
299
300 void create_menu_view_popup()
301 {
302         menu_window_view = gtk_menu_new();
303         add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL);
304         add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL);
305         add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL);
306         add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL);
307         add_menu_divider(menu_window_view);
308
309         menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit"));
310         gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit);
311         gtk_widget_show(menu_window_view_edit);
312
313         add_menu_divider(menu_window_view);
314         add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL);
315         add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL);
316         add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL);
317         add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL);
318
319         add_menu_divider(menu_window_view);
320         add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL);
321 }
322
323