cropper

view callbacks.c @ 13:13bc21684b8a

added zooming with buttons
author meillo@marmaro.de
date Thu, 04 Mar 2010 17:05:38 +0100
parents c18ba4ea1514
children da18f2d4f92f
line source
1 #include <gtk/gtk.h>
2 #include <gdk-pixbuf/gdk-pixbuf.h>
3 #include <gdk/gdkkeysyms.h>
4 #include "main.h"
5 #include "callbacks.h"
6 #include "support.h"
8 int image_width;
9 int image_height;
10 float inc = 0.3;
11 float zoom = 1.0;
14 /*
15 void
16 update_spin_button_ratio(GtkWidget* spinbutton)
17 {
18 g_print("ratio change: %f\n", ratio);
19 on_ratio_w_spinbutton_value_changed(spinbutton, NULL);
20 }
23 void
24 on_ratio_none_activate(GtkMenuItem* menuitem, gpointer user_data)
25 {
26 ratio = 1;
27 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
28 }
31 void
32 on_ratio_square_activate(GtkMenuItem* menuitem, gpointer user_data)
33 {
34 ratio = 1;
35 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
36 }
39 void
40 on_ratio_4x3_activate(GtkMenuItem* menuitem, gpointer user_data)
41 {
42 ratio = 4.0/3.0;
43 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
44 }
47 void
48 on_ratio_3x2_activate(GtkMenuItem* menuitem, gpointer user_data)
49 {
50 ratio = 1.5;
51 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
52 }
55 void
56 on_ratio_custom_activate(GtkMenuItem* menuitem, gpointer user_data)
57 {
58 ratio = gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_w_spinbutton"))
59 / gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_h_spinbutton"));
60 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
61 }
62 */
72 /*
73 static void
74 ratio_optionmenu_changed_cb(GtkOptionMenu* optionmenu, gpointer unser_data)
75 {
76 int idx = gtk_option_menu_get_history(optionmenu);
77 int w = 1, h = 1;
78 gboolean use_ratio = TRUE;
80 switch (idx) {
81 case GTH_CROP_RATIO_NONE:
82 use_ratio = FALSE;
83 break;
84 case GTH_CROP_RATIO_SQUARE:
85 w = h = 1;
86 break;
87 case GTH_CROP_RATIO_IMAGE:
88 w = lookup_widget(cropper_window, "image_width");
89 h = lookup_widget(cropper_window, "image_height");
90 break;
91 case GTH_CROP_RATIO_DISPLAY:
92 w = lookup_widget(cropper_window, "display_width");
93 h = lookup_widget(cropper_window, "display_height");
94 break;
95 case GTH_CROP_RATIO_4_3:
96 w = 4;
97 h = 3;
98 break;
99 case GTH_CROP_RATIO_4_6:
100 w = 4;
101 h = 6;
102 break;
103 case GTH_CROP_RATIO_CUSTOM:
104 default:
105 w = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
106 lookup_widget(cropper_window, "ratio_w_spinbutton")));
107 h = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
108 lookup_widget(cropper_window, "ratio_h_spinbutton")));
109 break;
110 }
112 gtk_widget_set_sensitive(lookup_widget(cropper_window, "custom_ratio_box"),
113 idx == GTH_CROP_RATIO_CUSTOM);
114 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), w);
115 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), h);
117 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window, "crop_image")),
118 use_ratio, (double) w / h);
119 }
122 static void
123 ratio_value_changed_cb(GtkSpinButton* spin, gpointer unser_data)
124 {
125 int w, h;
127 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
128 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
130 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(
131 lookup_widget(cropper_window, "crop_image")), TRUE, (double) w / h);
132 }
135 static void
136 ratio_swap_button_cb(GtkButton* button, gpointer unser_data)
137 {
138 int w, h;
140 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
141 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
143 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), h);
144 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), w);
146 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window,
147 "crop_image")), TRUE, (double) h / w);
148 }
150 */
159 /*
160 void
161 on_ratio_w_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
162 {
163 g_print("spinbutton W - ratio: %f\n", ratio);
164 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_h_spinbutton"),
165 gtk_spin_button_get_value(spinbutton) / ratio);
166 }
169 void
170 on_ratio_w_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
171 {
172 }
175 void
176 on_ratio_h_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
177 {
178 }
181 void
182 on_ratio_h_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
183 {
184 g_print("spinbutton H - ratio: %f\n", ratio);
185 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
186 gtk_spin_button_get_value(spinbutton) * ratio);
188 }
191 void
192 on_ratio_swap_button_clicked(GtkButton* button, gpointer user_data)
193 {
195 ratio = 1.0 / ratio;
196 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
197 gtk_spin_button_get_value(lookup_widget(cropper_window,
198 "ratio_h_spinbutton")));
199 gtk_spin_button_update(lookup_widget(cropper_window, "ratio_w_spinbutton"));
201 }
202 */
205 void
206 update_title(char* zoom)
207 {
208 char title[128];
209 snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y);
210 gtk_window_set_title(GTK_WINDOW(cropper_window), title);
211 }
214 /* zoom */
215 void
216 set_zoom()
217 {
218 static GdkPixbuf* pixbuf_new;
219 g_object_unref(pixbuf_new);
221 pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom,
222 GDK_INTERP_BILINEAR);
223 gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new);
224 }
226 void
227 on_zoom_in_button_clicked(GtkObject* object, gpointer user_data)
228 {
229 zoom *= 1 + inc;
230 set_zoom();
231 }
233 void
234 on_zoom_out_button_clicked(GtkObject* object, gpointer user_data)
235 {
236 zoom *= 1 - inc;
237 set_zoom();
238 }
240 void
241 on_zoom_100_button_clicked(GtkObject* object, gpointer user_data)
242 {
243 zoom = 1.0;
244 set_zoom();
245 }
247 void
248 on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data)
249 {
250 int w, h;
251 float zw, zh;
252 GtkWidget* image_a;
254 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
255 gdk_drawable_get_size(image_a->window, &w, &h);
257 zw = w*1.0 / image_width;
258 zh = h*1.0 / image_height;
260 zoom = (zw < zh) ? zw : zh;
261 set_zoom();
262 }
270 void
271 on_crop_clicked(GtkButton* button, gpointer user_data)
272 {
273 char crop_call[256];
275 sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"",
276 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
277 "crop_width_spinbutton")),
278 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
279 "crop_height_spinbutton")),
280 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
281 "crop_x_spinbutton")),
282 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
283 "crop_y_spinbutton")),
284 image_filename,
285 image_filename
286 );
287 system(crop_call);
288 gtk_main_quit();
289 }
292 void
293 on_cropper_window_create(GtkObject* object, gpointer user_data)
294 {
295 image_width = gdk_pixbuf_get_width(image_buffer);
296 image_height = gdk_pixbuf_get_height(image_buffer);
298 /*
299 image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
300 image_area = gtk_image_new_from_pixbuf(image_buffer);
302 int w, h;
303 GtkWidget* image_a;
305 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
306 gdk_drawable_get_size(image_a->window, &w, &h);
308 image_width = w - 200;
309 image_height = h - 150;
310 set_zoom();
311 */
312 }
314 void
315 on_cropper_window_destroy(GtkObject* object, gpointer user_data)
316 {
317 gtk_main_quit();
318 }
323 gboolean
324 on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata)
325 {
326 if (pKey->type != GDK_KEY_PRESS) {
327 return FALSE;
328 }
329 switch (pKey->keyval) {
330 case GDK_plus:
331 on_zoom_in_button_clicked(NULL, userdata);
332 break;
333 case GDK_minus:
334 on_zoom_out_button_clicked(NULL, userdata);
335 break;
336 case GDK_0:
337 on_zoom_100_button_clicked(NULL, userdata);
338 break;
339 case GDK_f:
340 on_zoom_fit_button_clicked(NULL, userdata);
341 break;
342 }
343 return TRUE;
344 }