X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fwidget%2Frotateable.cpp;h=8615df7a97064865933626a9d38b95e6f0fdbd8a;hb=fd5c8954a92eac9af9af21d2a3665e9c673203a2;hp=e434c10c568cf1cc8575b8433e5625619eeb6204;hpb=2429c5413c8d0d76b2ae660e54a0bbe7b88dee24;p=inkscape.git diff --git a/src/ui/widget/rotateable.cpp b/src/ui/widget/rotateable.cpp index e434c10c5..8615df7a9 100644 --- a/src/ui/widget/rotateable.cpp +++ b/src/ui/widget/rotateable.cpp @@ -21,10 +21,10 @@ namespace Inkscape { namespace UI { namespace Widget { - Rotateable::Rotateable(): +Rotateable::Rotateable(): axis(-M_PI/4), maxdecl(M_PI/4) - { +{ dragging = false; working = false; modifier = 0; @@ -33,91 +33,103 @@ namespace Widget { signal_button_press_event().connect(sigc::mem_fun(*this, &Rotateable::on_click)); signal_motion_notify_event().connect(sigc::mem_fun(*this, &Rotateable::on_motion)); signal_button_release_event().connect(sigc::mem_fun(*this, &Rotateable::on_release)); - } +} - bool Rotateable::on_click(GdkEventButton *event) { +bool Rotateable::on_click(GdkEventButton *event) { if (event->button == 1) { - drag_started_x = event->x; - drag_started_y = event->y; - modifier = get_single_modifier(modifier, event->state); - dragging = true; - working = false; - current_axis = axis; - return true; + drag_started_x = event->x; + drag_started_y = event->y; + modifier = get_single_modifier(modifier, event->state); + dragging = true; + working = false; + current_axis = axis; + return true; } return false; - } - - guint Rotateable::get_single_modifier(guint old, guint state) { - - if (old == 0) { - if (state & GDK_CONTROL_MASK) - return 1; // ctrl - if (state & GDK_SHIFT_MASK) - return 2; // shift - return 0; +} + +guint Rotateable::get_single_modifier(guint old, guint state) { + + if (old == 0 || old == 3) { + if (state & GDK_CONTROL_MASK) + return 1; // ctrl + if (state & GDK_SHIFT_MASK) + return 2; // shift + if (state & GDK_MOD1_MASK) + return 3; // alt + return 0; } else { - if (!(state & GDK_CONTROL_MASK) && !(state & GDK_SHIFT_MASK)) - return 0; // none - if (old == 1) - if (state & GDK_SHIFT_MASK && !(state & GDK_CONTROL_MASK)) - return 2; // shift - else - return 1; - if (old == 2) - if (state & GDK_CONTROL_MASK && !(state & GDK_SHIFT_MASK)) - return 1; // ctrl - else - return 2; - return old; + if (!(state & GDK_CONTROL_MASK) && !(state & GDK_SHIFT_MASK)) { + if (state & GDK_MOD1_MASK) + return 3; // alt + else + return 0; // none + } + if (old == 1) { + if (state & GDK_SHIFT_MASK && !(state & GDK_CONTROL_MASK)) + return 2; // shift + if (state & GDK_MOD1_MASK && !(state & GDK_CONTROL_MASK)) + return 3; // alt + return 1; + } + if (old == 2) { + if (state & GDK_CONTROL_MASK && !(state & GDK_SHIFT_MASK)) + return 1; // ctrl + if (state & GDK_MOD1_MASK && !(state & GDK_SHIFT_MASK)) + return 3; // alt + return 2; + } + return old; } - } +} - bool Rotateable::on_motion(GdkEventMotion *event) { +bool Rotateable::on_motion(GdkEventMotion *event) { if (dragging) { - double dist = NR::L2(NR::Point(event->x, event->y) - NR::Point(drag_started_x, drag_started_y)); - double angle = atan2(event->y - drag_started_y, event->x - drag_started_x); - if (dist > 20) { - working = true; - double force = CLAMP (-(angle - current_axis)/maxdecl, -1, 1); - if (fabs(force) < 0.002) - force = 0; // snap to zero - if (modifier != get_single_modifier(modifier, event->state)) { - // user has switched modifiers in mid drag, close past drag and start a new - // one, redefining axis temporarily - do_release(force, modifier); - current_axis = angle; - modifier = get_single_modifier(modifier, event->state); - } else { - do_motion(force, modifier); - } - } - gobble_motion_events(GDK_BUTTON1_MASK); - return true; + double dist = NR::L2(NR::Point(event->x, event->y) - NR::Point(drag_started_x, drag_started_y)); + double angle = atan2(event->y - drag_started_y, event->x - drag_started_x); + if (dist > 20) { + working = true; + double force = CLAMP (-(angle - current_axis)/maxdecl, -1, 1); + if (fabs(force) < 0.002) + force = 0; // snap to zero + if (modifier != get_single_modifier(modifier, event->state)) { + // user has switched modifiers in mid drag, close past drag and start a new + // one, redefining axis temporarily + do_release(force, modifier); + current_axis = angle; + modifier = get_single_modifier(modifier, event->state); + } else { + do_motion(force, modifier); + } + } + gobble_motion_events(GDK_BUTTON1_MASK); + return true; } return false; - } +} - bool Rotateable::on_release(GdkEventButton *event) { +bool Rotateable::on_release(GdkEventButton *event) { if (dragging && working) { - double angle = atan2(event->y - drag_started_y, event->x - drag_started_x); - double force = CLAMP (-(angle - current_axis)/maxdecl, -1, 1); - if (fabs(force) < 0.002) - force = 0; // snap to zero - do_release(force, modifier); - dragging = false; - working = false; - current_axis = axis; - return true; + double angle = atan2(event->y - drag_started_y, event->x - drag_started_x); + double force = CLAMP (-(angle - current_axis)/maxdecl, -1, 1); + if (fabs(force) < 0.002) + force = 0; // snap to zero + do_release(force, modifier); + current_axis = axis; + dragging = false; + working = false; + return true; } + dragging = false; + working = false; return false; - } +} - Rotateable::~Rotateable() { - } +Rotateable::~Rotateable() { +}