cropper

view callbacks.c @ 16:88b8856fccf5

merged callbacks.h in main.h
author meillo@marmaro.de
date Thu, 04 Mar 2010 19:20:41 +0100
parents 7dbf3879939a
children
line source
1 #include <gtk/gtk.h>
2 #include <gdk-pixbuf/gdk-pixbuf.h>
3 #include <gdk/gdkkeysyms.h>
4 #include "main.h"
6 int image_width;
7 int image_height;
8 float inc = 0.3;
9 float zoom = 1.0;
12 /*
13 void
14 update_spin_button_ratio(GtkWidget* spinbutton)
15 {
16 g_print("ratio change: %f\n", ratio);
17 on_ratio_w_spinbutton_value_changed(spinbutton, NULL);
18 }
21 void
22 on_ratio_none_activate(GtkMenuItem* menuitem, gpointer user_data)
23 {
24 ratio = 1;
25 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
26 }
29 void
30 on_ratio_square_activate(GtkMenuItem* menuitem, gpointer user_data)
31 {
32 ratio = 1;
33 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
34 }
37 void
38 on_ratio_4x3_activate(GtkMenuItem* menuitem, gpointer user_data)
39 {
40 ratio = 4.0/3.0;
41 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
42 }
45 void
46 on_ratio_3x2_activate(GtkMenuItem* menuitem, gpointer user_data)
47 {
48 ratio = 1.5;
49 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
50 }
53 void
54 on_ratio_custom_activate(GtkMenuItem* menuitem, gpointer user_data)
55 {
56 ratio = gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_w_spinbutton"))
57 / gtk_spin_button_get_value(lookup_widget(cropper_window, "ratio_h_spinbutton"));
58 update_spin_button_ratio(lookup_widget(cropper_window, "ratio_w_spinbutton"));
59 }
60 */
70 /*
71 static void
72 ratio_optionmenu_changed_cb(GtkOptionMenu* optionmenu, gpointer unser_data)
73 {
74 int idx = gtk_option_menu_get_history(optionmenu);
75 int w = 1, h = 1;
76 gboolean use_ratio = TRUE;
78 switch (idx) {
79 case GTH_CROP_RATIO_NONE:
80 use_ratio = FALSE;
81 break;
82 case GTH_CROP_RATIO_SQUARE:
83 w = h = 1;
84 break;
85 case GTH_CROP_RATIO_IMAGE:
86 w = lookup_widget(cropper_window, "image_width");
87 h = lookup_widget(cropper_window, "image_height");
88 break;
89 case GTH_CROP_RATIO_DISPLAY:
90 w = lookup_widget(cropper_window, "display_width");
91 h = lookup_widget(cropper_window, "display_height");
92 break;
93 case GTH_CROP_RATIO_4_3:
94 w = 4;
95 h = 3;
96 break;
97 case GTH_CROP_RATIO_4_6:
98 w = 4;
99 h = 6;
100 break;
101 case GTH_CROP_RATIO_CUSTOM:
102 default:
103 w = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
104 lookup_widget(cropper_window, "ratio_w_spinbutton")));
105 h = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
106 lookup_widget(cropper_window, "ratio_h_spinbutton")));
107 break;
108 }
110 gtk_widget_set_sensitive(lookup_widget(cropper_window, "custom_ratio_box"),
111 idx == GTH_CROP_RATIO_CUSTOM);
112 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), w);
113 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), h);
115 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window, "crop_image")),
116 use_ratio, (double) w / h);
117 }
120 static void
121 ratio_value_changed_cb(GtkSpinButton* spin, gpointer unser_data)
122 {
123 int w, h;
125 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
126 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
128 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(
129 lookup_widget(cropper_window, "crop_image")), TRUE, (double) w / h);
130 }
133 static void
134 ratio_swap_button_cb(GtkButton* button, gpointer unser_data)
135 {
136 int w, h;
138 w = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_w_spinbutton"));
139 h = gtk_spin_button_get_value_as_int(lookup_widget(cropper_window, "ratio_h_spinbutton"));
141 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_w_spinbutton"), h);
142 set_spin_value(cropper_window, lookup_widget(cropper_window, "ratio_h_spinbutton"), w);
144 gth_image_selector_set_ratio(GTH_IMAGE_SELECTOR(lookup_widget(cropper_window,
145 "crop_image")), TRUE, (double) h / w);
146 }
155 void
156 on_ratio_w_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
157 {
158 g_print("spinbutton W - ratio: %f\n", ratio);
159 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_h_spinbutton"),
160 gtk_spin_button_get_value(spinbutton) / ratio);
161 }
164 void
165 on_ratio_w_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
166 {
167 }
170 void
171 on_ratio_h_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
172 {
173 }
176 void
177 on_ratio_h_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
178 {
179 g_print("spinbutton H - ratio: %f\n", ratio);
180 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
181 gtk_spin_button_get_value(spinbutton) * ratio);
183 }
186 void
187 on_ratio_swap_button_clicked(GtkButton* button, gpointer user_data)
188 {
190 ratio = 1.0 / ratio;
191 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
192 gtk_spin_button_get_value(lookup_widget(cropper_window,
193 "ratio_h_spinbutton")));
194 gtk_spin_button_update(lookup_widget(cropper_window, "ratio_w_spinbutton"));
196 }
197 */
200 void
201 update_title(char* zoom)
202 {
203 char title[128];
204 snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y);
205 gtk_window_set_title(GTK_WINDOW(cropper_window), title);
206 }
209 /* zoom */
210 void
211 set_zoom()
212 {
213 static GdkPixbuf* pixbuf_new;
214 g_object_unref(pixbuf_new);
216 pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom,
217 GDK_INTERP_BILINEAR);
218 gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new);
219 }
221 void
222 on_zoom_in_button_clicked(GtkObject* object, gpointer user_data)
223 {
224 zoom *= 1 + inc;
225 set_zoom();
226 }
228 void
229 on_zoom_out_button_clicked(GtkObject* object, gpointer user_data)
230 {
231 zoom *= 1 - inc;
232 set_zoom();
233 }
235 void
236 on_zoom_100_button_clicked(GtkObject* object, gpointer user_data)
237 {
238 zoom = 1.0;
239 set_zoom();
240 }
242 void
243 on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data)
244 {
245 int w, h;
246 float zw, zh;
247 GtkWidget* image_a;
249 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
250 gdk_drawable_get_size(image_a->window, &w, &h);
252 zw = w*1.0 / image_width;
253 zh = h*1.0 / image_height;
255 zoom = (zw < zh) ? zw : zh;
256 set_zoom();
257 }
265 void
266 crop(void)
267 {
268 char crop_call[256];
270 sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"",
271 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
272 "crop_width_spinbutton")),
273 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
274 "crop_height_spinbutton")),
275 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
276 "crop_x_spinbutton")),
277 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
278 "crop_y_spinbutton")),
279 image_filename,
280 image_filename
281 );
282 system(crop_call);
283 gtk_main_quit();
284 }
287 void
288 on_cropper_window_create(GtkObject* object, gpointer user_data)
289 {
290 image_width = gdk_pixbuf_get_width(image_buffer);
291 image_height = gdk_pixbuf_get_height(image_buffer);
293 /*
294 image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
295 image_area = gtk_image_new_from_pixbuf(image_buffer);
297 int w, h;
298 GtkWidget* image_a;
300 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
301 gdk_drawable_get_size(image_a->window, &w, &h);
303 image_width = w - 200;
304 image_height = h - 150;
305 set_zoom();
306 */
307 }
309 void
310 on_cropper_window_destroy(GtkObject* object, gpointer user_data)
311 {
312 gtk_main_quit();
313 }
318 gboolean
319 on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata)
320 {
321 if (pKey->type != GDK_KEY_PRESS) {
322 return FALSE;
323 }
324 switch (pKey->keyval) {
325 case GDK_q:
326 gtk_main_quit();
327 break;
328 case GDK_Return:
329 crop();
330 break;
331 case GDK_plus:
332 on_zoom_in_button_clicked(NULL, userdata);
333 break;
334 case GDK_minus:
335 on_zoom_out_button_clicked(NULL, userdata);
336 break;
337 case GDK_0:
338 on_zoom_100_button_clicked(NULL, userdata);
339 break;
340 case GDK_f:
341 on_zoom_fit_button_clicked(NULL, userdata);
342 break;
343 }
344 return TRUE;
345 }