cropper

annotate callbacks.c @ 14:da18f2d4f92f

removed all buttons and stuff from the window; cleaned up
author meillo@marmaro.de
date Thu, 04 Mar 2010 18:31:28 +0100
parents 13bc21684b8a
children 7dbf3879939a
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@11 157 void
meillo@11 158 on_ratio_w_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
meillo@11 159 {
meillo@3 160 g_print("spinbutton W - ratio: %f\n", ratio);
meillo@11 161 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_h_spinbutton"),
meillo@11 162 gtk_spin_button_get_value(spinbutton) / ratio);
meillo@3 163 }
meillo@3 164
meillo@3 165
meillo@11 166 void
meillo@11 167 on_ratio_w_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
meillo@11 168 {
meillo@3 169 }
meillo@3 170
meillo@3 171
meillo@11 172 void
meillo@11 173 on_ratio_h_spinbutton_change_value(GtkSpinButton* spinbutton, GtkScrollType scroll, gpointer user_data)
meillo@11 174 {
meillo@3 175 }
meillo@3 176
meillo@3 177
meillo@11 178 void
meillo@11 179 on_ratio_h_spinbutton_value_changed(GtkSpinButton* spinbutton, gpointer user_data)
meillo@11 180 {
meillo@3 181 g_print("spinbutton H - ratio: %f\n", ratio);
meillo@11 182 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
meillo@11 183 gtk_spin_button_get_value(spinbutton) * ratio);
meillo@0 184
meillo@0 185 }
meillo@0 186
meillo@0 187
meillo@11 188 void
meillo@11 189 on_ratio_swap_button_clicked(GtkButton* button, gpointer user_data)
meillo@11 190 {
meillo@3 191
meillo@3 192 ratio = 1.0 / ratio;
meillo@11 193 gtk_spin_button_set_value(lookup_widget(cropper_window, "ratio_w_spinbutton"),
meillo@11 194 gtk_spin_button_get_value(lookup_widget(cropper_window,
meillo@11 195 "ratio_h_spinbutton")));
meillo@3 196 gtk_spin_button_update(lookup_widget(cropper_window, "ratio_w_spinbutton"));
meillo@0 197
meillo@2 198 }
meillo@4 199 */
meillo@2 200
meillo@2 201
meillo@13 202 void
meillo@13 203 update_title(char* zoom)
meillo@13 204 {
meillo@13 205 char title[128];
meillo@13 206 snprintf(title, 128, "cropper (%s) %dx%d+%d+%d", zoom, w, h, x, y);
meillo@13 207 gtk_window_set_title(GTK_WINDOW(cropper_window), title);
meillo@13 208 }
meillo@13 209
meillo@2 210
meillo@7 211 /* zoom */
meillo@11 212 void
meillo@11 213 set_zoom()
meillo@11 214 {
meillo@8 215 static GdkPixbuf* pixbuf_new;
meillo@8 216 g_object_unref(pixbuf_new);
meillo@8 217
meillo@13 218 pixbuf_new = gdk_pixbuf_scale_simple(image_buffer, image_width*zoom, image_height*zoom,
meillo@13 219 GDK_INTERP_BILINEAR);
meillo@8 220 gtk_image_set_from_pixbuf((GtkImage*) lookup_widget(cropper_window, "image_area"), pixbuf_new);
meillo@8 221 }
meillo@8 222
meillo@11 223 void
meillo@11 224 on_zoom_in_button_clicked(GtkObject* object, gpointer user_data)
meillo@11 225 {
meillo@13 226 zoom *= 1 + inc;
meillo@8 227 set_zoom();
meillo@7 228 }
meillo@7 229
meillo@11 230 void
meillo@11 231 on_zoom_out_button_clicked(GtkObject* object, gpointer user_data)
meillo@11 232 {
meillo@13 233 zoom *= 1 - inc;
meillo@8 234 set_zoom();
meillo@7 235 }
meillo@7 236
meillo@11 237 void
meillo@11 238 on_zoom_100_button_clicked(GtkObject* object, gpointer user_data)
meillo@11 239 {
meillo@13 240 zoom = 1.0;
meillo@8 241 set_zoom();
meillo@7 242 }
meillo@7 243
meillo@11 244 void
meillo@11 245 on_zoom_fit_button_clicked(GtkObject* object, gpointer user_data)
meillo@11 246 {
meillo@8 247 int w, h;
meillo@13 248 float zw, zh;
meillo@8 249 GtkWidget* image_a;
meillo@8 250
meillo@8 251 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
meillo@11 252 gdk_drawable_get_size(image_a->window, &w, &h);
meillo@8 253
meillo@13 254 zw = w*1.0 / image_width;
meillo@13 255 zh = h*1.0 / image_height;
meillo@13 256
meillo@13 257 zoom = (zw < zh) ? zw : zh;
meillo@8 258 set_zoom();
meillo@7 259 }
meillo@7 260
meillo@7 261
meillo@7 262
meillo@7 263
meillo@7 264
meillo@7 265
meillo@7 266
meillo@11 267 void
meillo@14 268 crop(void)
meillo@11 269 {
meillo@4 270 char crop_call[256];
meillo@2 271
meillo@4 272 sprintf(crop_call, "echo \"convert -crop %ix%i+%i+%i %s cropped_%s\"",
meillo@11 273 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
meillo@11 274 "crop_width_spinbutton")),
meillo@11 275 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
meillo@11 276 "crop_height_spinbutton")),
meillo@11 277 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
meillo@11 278 "crop_x_spinbutton")),
meillo@11 279 gtk_spin_button_get_value_as_int((GtkSpinButton*) lookup_widget(cropper_window,
meillo@11 280 "crop_y_spinbutton")),
meillo@4 281 image_filename,
meillo@4 282 image_filename
meillo@4 283 );
meillo@4 284 system(crop_call);
meillo@4 285 gtk_main_quit();
meillo@4 286 }
meillo@2 287
meillo@11 288
meillo@11 289 void
meillo@11 290 on_cropper_window_create(GtkObject* object, gpointer user_data)
meillo@11 291 {
meillo@7 292 image_width = gdk_pixbuf_get_width(image_buffer);
meillo@7 293 image_height = gdk_pixbuf_get_height(image_buffer);
meillo@10 294
meillo@10 295 /*
meillo@11 296 image_buffer = gdk_pixbuf_new_from_file(image_filename, NULL);
meillo@11 297 image_area = gtk_image_new_from_pixbuf(image_buffer);
meillo@10 298
meillo@10 299 int w, h;
meillo@10 300 GtkWidget* image_a;
meillo@10 301
meillo@10 302 image_a = (GtkWidget*) lookup_widget(cropper_window, "image_area");
meillo@11 303 gdk_drawable_get_size(image_a->window, &w, &h);
meillo@10 304
meillo@10 305 image_width = w - 200;
meillo@10 306 image_height = h - 150;
meillo@10 307 set_zoom();
meillo@10 308 */
meillo@7 309 }
meillo@0 310
meillo@11 311 void
meillo@11 312 on_cropper_window_destroy(GtkObject* object, gpointer user_data)
meillo@11 313 {
meillo@0 314 gtk_main_quit();
meillo@0 315 }
meillo@0 316
meillo@13 317
meillo@13 318
meillo@13 319
meillo@13 320 gboolean
meillo@13 321 on_key_press(GtkWidget* window, GdkEventKey* pKey, gpointer userdata)
meillo@13 322 {
meillo@13 323 if (pKey->type != GDK_KEY_PRESS) {
meillo@13 324 return FALSE;
meillo@13 325 }
meillo@13 326 switch (pKey->keyval) {
meillo@14 327 case GDK_q:
meillo@14 328 gtk_main_quit();
meillo@14 329 break;
meillo@14 330 case GDK_Return:
meillo@14 331 crop();
meillo@14 332 break;
meillo@13 333 case GDK_plus:
meillo@13 334 on_zoom_in_button_clicked(NULL, userdata);
meillo@13 335 break;
meillo@13 336 case GDK_minus:
meillo@13 337 on_zoom_out_button_clicked(NULL, userdata);
meillo@13 338 break;
meillo@13 339 case GDK_0:
meillo@13 340 on_zoom_100_button_clicked(NULL, userdata);
meillo@13 341 break;
meillo@13 342 case GDK_f:
meillo@13 343 on_zoom_fit_button_clicked(NULL, userdata);
meillo@13 344 break;
meillo@13 345 }
meillo@13 346 return TRUE;
meillo@13 347 }
meillo@13 348
meillo@13 349