cropper

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