Implementation of Zoom with mouse wheel and CTRL key.
authorAndreas Eversberg <jolly@eversberg.eu>
Thu, 28 May 2015 07:12:42 +0000 (09:12 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Sat, 20 Jun 2015 04:42:19 +0000 (06:42 +0200)
gui/main.c

index 0c664db..1602d24 100644 (file)
@@ -33,7 +33,8 @@ GtkToggleButton *show_marked_button, *show_highlighted_button, *show_preview_but
 #ifdef WITH_OPENCV
 GtkToggleButton *show_flow_button;
 #endif
-int button_down = 0, button_down_x = -1000, button_down_y = -1000, shift_pressed = 0, button_num = 1;
+int button_down = 0, button_down_x = -1000, button_down_y = -1000, shift_pressed = 0, ctrl_pressed = 0, button_num = 1;
+int last_x = 0, last_y = 0; /* where mouse is over scrolled view */
 int brush_size;
 int mark = 1, highlight = 0, preview = 0, rendered = 0, draw_mode = 1, move_mode = 0, fill_mode = 0, pick_mode = 0, flowview = 0;
 int mouse_over_palette_area = 0, mouse_over_drawing_area = 0, mouse_over_timeline_area = 0;
@@ -161,6 +162,10 @@ static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer use
        case GDK_Shift_R:
                shift_pressed = 1;
                break;
+       case GDK_Control_L:
+       case GDK_Control_R:
+               ctrl_pressed = 1;
+               break;
 //     default:
 //             printf("press %x\n", event->keyval);
        }
@@ -176,6 +181,10 @@ static gboolean on_key_release(GtkWidget *widget, GdkEventKey *event, gpointer u
        case GDK_Shift_R:
                shift_pressed = 0;
                break;
+       case GDK_Control_L:
+       case GDK_Control_R:
+               ctrl_pressed = 0;
+               break;
 //     default:
 //             printf("release %x\n", event->keyval);
        }
@@ -281,6 +290,8 @@ static gint motion_notify_event( GtkWidget *widget,
                y = event->y;
                state = event->state;
        }
+       last_x = x;
+       last_y = y;
 
        if ((state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))) {
                if (mark || highlight) {
@@ -348,6 +359,58 @@ static gint button_press_event (GtkWidget *widget, GdkEventButton *event)
        return TRUE;
 }
 
+static gint scroll_event (GtkWidget *widget, GdkEventScroll *event)
+{
+       if (!ctrl_pressed)
+               return FALSE;
+
+#if 0
+int x,y;
+GtkAdjustment *hadjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(img_scroll));
+GtkAdjustment *vadjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(img_scroll));
+
+x = last_x;
+y = last_y;
+printf("mouse over pixmap: %d, %d\n", x, y);
+x -= (int)gtk_adjustment_get_value(hadjustment);
+y -= (int)gtk_adjustment_get_value(vadjustment);
+printf("mouse over widget: %d, %d\n", x, y);
+
+
+
+
+GdkDrawable *draw = gtk_widget_get_window(img_drawing_area);
+int window_width, window_height;
+gdk_drawable_get_size (draw, &window_width, &window_height);
+
+/* we need to calculate an offset, since the drawing area is now larger */
+x -= (window_width - img_width*img_scale_x/16) / 2;
+y -= (window_height - img_height*img_scale_y/16) / 2;
+
+x = x*16/img_scale_x;
+y = y*16/img_scale_y;
+
+printf("real coordinates: %d, %d\n", x, y);
+
+if (x < 0 || x >= img_width || y < 0 || y >= img_height)
+       return FALSE;
+
+#endif
+
+
+
+       switch (event->direction) {
+       case GDK_SCROLL_UP:
+               zoom_in_event(NULL);
+               return TRUE;
+       case GDK_SCROLL_DOWN:
+               zoom_out_event(NULL);
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
+
 /* redraw event of image area */
 static gint img_expose_event (GtkWidget *widget, GdkEventExpose *event)
 {
@@ -592,6 +655,7 @@ int main(int argc, char *argv[])
        img_drawing_area = gtk_drawing_area_new ();
        gtk_signal_connect(GTK_OBJECT(img_drawing_area), "motion_notify_event", (GtkSignalFunc)motion_notify_event, NULL);
        gtk_signal_connect(GTK_OBJECT (img_drawing_area), "button_press_event", (GtkSignalFunc)button_press_event, NULL);
+       gtk_signal_connect(GTK_OBJECT (img_drawing_area), "scroll_event", (GtkSignalFunc)scroll_event, NULL);
        gtk_signal_connect(GTK_OBJECT (img_drawing_area), "expose_event", (GtkSignalFunc)img_expose_event, NULL); 
        g_signal_connect(img_drawing_area, "enter_notify_event", G_CALLBACK(enter_drawing_area), NULL);
        g_signal_connect(img_drawing_area, "leave_notify_event", G_CALLBACK(leave_drawing_area), NULL);
@@ -599,6 +663,7 @@ int main(int argc, char *argv[])
                | GDK_ENTER_NOTIFY_MASK
                | GDK_LEAVE_NOTIFY_MASK
                | GDK_BUTTON_PRESS_MASK
+               | GDK_SCROLL_MASK
                | GDK_POINTER_MOTION_MASK
                | GDK_POINTER_MOTION_HINT_MASK);
        gtk_widget_show(img_drawing_area);