Initial revision
[geeqie.git] / src / img-view.c
1 /*
2  * GQview image viewer
3  * (C)1999 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 gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
131 {
132         gtk_widget_destroy(w);
133         return TRUE;
134 }
135
136 static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
137 {
138         ImageWindow *imd = data;
139         image_area_free(imd);
140         return FALSE;
141 }
142
143 void view_window_new(gchar *path)
144 {
145         GtkWidget *window;
146         ImageWindow *imd;
147         GtkAllocation req_size;
148         gint w, h;
149         if (!path) return;
150
151         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
152         gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
153         gtk_window_set_title (GTK_WINDOW (window), "GQview");
154         gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview");
155         gtk_container_border_width (GTK_CONTAINER (window), 0);
156
157         imd = image_area_new(NULL);
158         image_area_set_topwindow(imd, window, NULL, TRUE);
159         gtk_container_add(GTK_CONTAINER(window), imd->eventbox);
160         gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE);
161         gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0);
162         gtk_widget_show_all(imd->eventbox);
163
164         image_dnd_init(imd);
165
166         image_area_set_button(imd, 3, button3_cb, NULL);
167
168         gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL);
169         gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd);
170         gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd);
171
172         image_area_set_image(imd, path, get_default_zoom(NULL));
173
174         w = imd->width;
175         h = imd->height;
176         if (limit_window_size)
177                 {
178                 gint mw = gdk_screen_width() * max_window_size / 100;
179                 gint mh = gdk_screen_height() * max_window_size / 100;
180
181                 if (w > mw) w = mw;
182                 if (h > mh) h = mh;
183                 }
184
185         gtk_window_set_default_size (GTK_WINDOW(window), w, h);
186         req_size.x = req_size.y = 0;
187         req_size.width = w;
188         req_size.height = h;
189         gtk_widget_size_allocate(GTK_WIDGET(window), &req_size);
190
191         gtk_widget_set_usize(imd->eventbox, w, h);
192
193         gtk_widget_show(window);
194 }
195
196 /*
197  *-----------------------------------------------------------------------------
198  * view window menu routines and callbacks
199  *-----------------------------------------------------------------------------
200  */ 
201
202 static ImageWindow *view_window_get_active()
203 {
204         return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active");
205 }
206
207 void view_window_active_edit(gint n)
208 {
209         ImageWindow *imd = view_window_get_active();
210         if (!imd) return;
211         start_editor_from_file(n, image_area_get_path(imd));
212 }
213
214 static void view_zoom_in_cb(GtkWidget *widget, gpointer data)
215 {
216         ImageWindow *imd = view_window_get_active();
217         if (!imd) return;
218         image_area_adjust_zoom(imd, 1);
219 }
220
221 static void view_zoom_out_cb(GtkWidget *widget, gpointer data)
222 {
223         ImageWindow *imd = view_window_get_active();
224         if (!imd) return;
225         image_area_adjust_zoom(imd, -1);
226 }
227
228 static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data)
229 {
230         ImageWindow *imd = view_window_get_active();
231         if (!imd) return;
232         image_area_set_zoom(imd, 1);
233 }
234
235 static void view_zoom_fit_cb(GtkWidget *widget, gpointer data)
236 {
237         ImageWindow *imd = view_window_get_active();
238         if (!imd) return;
239         image_area_set_zoom(imd, 0);
240 }
241
242 static void view_copy_cb(GtkWidget *widget, gpointer data)
243 {
244         ImageWindow *imd = view_window_get_active();
245         if (!imd) return;
246         file_util_copy(image_area_get_path(imd), NULL, current_path);
247 }
248
249 static void view_move_cb(GtkWidget *widget, gpointer data)
250 {
251         ImageWindow *imd = view_window_get_active();
252         if (!imd) return;
253         file_util_move(image_area_get_path(imd), NULL, current_path);
254 }
255
256 static void view_rename_cb(GtkWidget *widget, gpointer data)
257 {
258         ImageWindow *imd = view_window_get_active();
259         if (!imd) return;
260         file_util_rename(image_area_get_path(imd), NULL);
261 }
262
263 static void view_delete_cb(GtkWidget *widget, gpointer data)
264 {
265         ImageWindow *imd = view_window_get_active();
266         if (!imd) return;
267         file_util_delete(image_area_get_path(imd), NULL);
268 }
269
270 static void view_close_cb(GtkWidget *widget, gpointer data)
271 {
272         ImageWindow *imd = view_window_get_active();
273         if (!imd) return;
274         gtk_widget_destroy(imd->top_window);
275 }
276
277 void create_menu_view_popup()
278 {
279         menu_window_view = gtk_menu_new();
280         add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL);
281         add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL);
282         add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL);
283         add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL);
284         add_menu_divider(menu_window_view);
285
286         menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit"));
287         gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit);
288         gtk_widget_show(menu_window_view_edit);
289
290         add_menu_divider(menu_window_view);
291         add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL);
292         add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL);
293         add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL);
294         add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL);
295
296         add_menu_divider(menu_window_view);
297         add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL);
298 }
299
300