X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fzoom-context.cpp;h=64b468e36fe69ece40905909f910834dec02e1b9;hb=522aa9b8f493ba0c8e8b0bb536a563c96f5430a8;hp=f7bae09e925b8541147fd64100763049018d4fc1;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/zoom-context.cpp b/src/zoom-context.cpp index f7bae09e9..64b468e36 100644 --- a/src/zoom-context.cpp +++ b/src/zoom-context.cpp @@ -43,7 +43,7 @@ static bool escaped; GType sp_zoom_context_get_type(void) { static GType type = 0; - + if (!type) { GTypeInfo info = { sizeof(SPZoomContextClass), @@ -57,16 +57,16 @@ GType sp_zoom_context_get_type(void) }; type = g_type_register_static(SP_TYPE_EVENT_CONTEXT, "SPZoomContext", &info, (GTypeFlags) 0); } - + return type; } static void sp_zoom_context_class_init(SPZoomContextClass *klass) { SPEventContextClass *event_context_class = (SPEventContextClass *) klass; - + parent_class = (SPEventContextClass*) g_type_class_peek_parent(klass); - + event_context_class->setup = sp_zoom_context_setup; event_context_class->finish = sp_zoom_context_finish; @@ -77,7 +77,7 @@ static void sp_zoom_context_class_init(SPZoomContextClass *klass) static void sp_zoom_context_init (SPZoomContext *zoom_context) { SPEventContext *event_context = SP_EVENT_CONTEXT(zoom_context); - + event_context->cursor_shape = cursor_zoom_xpm; event_context->hot_x = 6; event_context->hot_y = 6; @@ -110,7 +110,7 @@ static gint sp_zoom_context_item_handler(SPEventContext *event_context, SPItem * if (((SPEventContextClass *) parent_class)->item_handler) { ret = ((SPEventContextClass *) parent_class)->item_handler (event_context, item, event); } - + return ret; } @@ -119,79 +119,88 @@ static gint sp_zoom_context_root_handler(SPEventContext *event_context, GdkEvent SPDesktop *desktop = event_context->desktop; tolerance = prefs_get_int_attribute_limited ("options.dragtolerance", "value", 0, 0, 100); double const zoom_inc = prefs_get_double_attribute_limited("options.zoomincrement", "value", M_SQRT2, 1.01, 10); - + gint ret = FALSE; - + switch (event->type) { case GDK_BUTTON_PRESS: - if (event->button.button == 1) { + { + NR::Point const button_w(event->button.x, event->button.y); + NR::Point const button_dt(desktop->w2d(button_w)); + if (event->button.button == 1 && !event_context->space_panning) { // save drag origin - xp = (gint) event->button.x; + xp = (gint) event->button.x; yp = (gint) event->button.y; within_tolerance = true; - - NR::Point const button_w(event->button.x, event->button.y); - NR::Point const button_dt(desktop->w2d(button_w)); + Inkscape::Rubberband::get()->start(desktop, button_dt); escaped = false; + ret = TRUE; + } else if (event->button.button == 3) { + double const zoom_rel( (event->button.state & GDK_SHIFT_MASK) + ? zoom_inc + : 1 / zoom_inc ); + desktop->zoom_relative_keep_point(button_dt, zoom_rel); ret = TRUE; } break; - + } + case GDK_MOTION_NOTIFY: - if (event->motion.state & GDK_BUTTON1_MASK) { + if (event->motion.state & GDK_BUTTON1_MASK && !event_context->space_panning) { ret = TRUE; - + if ( within_tolerance && ( abs( (gint) event->motion.x - xp ) < tolerance ) && ( abs( (gint) event->motion.y - yp ) < tolerance ) ) { break; // do not drag if we're within tolerance from origin } - // Once the user has moved farther than tolerance from the original location - // (indicating they intend to move the object, not click), then always process the + // Once the user has moved farther than tolerance from the original location + // (indicating they intend to move the object, not click), then always process the // motion notify coordinates as given (no snapping back to origin) - within_tolerance = false; - + within_tolerance = false; + NR::Point const motion_w(event->motion.x, event->motion.y); NR::Point const motion_dt(desktop->w2d(motion_w)); Inkscape::Rubberband::get()->move(motion_dt); } break; - - case GDK_BUTTON_RELEASE: - if ( event->button.button == 1 ) { + + case GDK_BUTTON_RELEASE: + { + NR::Point const button_w(event->button.x, event->button.y); + NR::Point const button_dt(desktop->w2d(button_w)); + if ( event->button.button == 1 && !event_context->space_panning) { NR::Maybe const b = Inkscape::Rubberband::get()->getRectangle(); - if (b != NR::Nothing() && !within_tolerance) { - desktop->set_display_area(b.assume(), 10); + if (b && !within_tolerance) { + desktop->set_display_area(*b, 10); } else if (!escaped) { - NR::Point const button_w(event->button.x, event->button.y); - NR::Point const button_dt(desktop->w2d(button_w)); double const zoom_rel( (event->button.state & GDK_SHIFT_MASK) ? 1 / zoom_inc : zoom_inc ); desktop->zoom_relative_keep_point(button_dt, zoom_rel); } ret = TRUE; - } + } Inkscape::Rubberband::get()->stop(); - xp = yp = 0; + xp = yp = 0; escaped = false; break; - + } case GDK_KEY_PRESS: switch (get_group0_keyval (&event->key)) { case GDK_Escape: Inkscape::Rubberband::get()->stop(); - xp = yp = 0; + xp = yp = 0; escaped = true; ret = TRUE; break; - case GDK_Up: - case GDK_Down: - case GDK_KP_Up: - case GDK_KP_Down: + case GDK_Up: + case GDK_Down: + case GDK_KP_Up: + case GDK_KP_Down: // prevent the zoom field from activation if (!MOD__CTRL_ONLY) ret = TRUE;