X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fscroomer.cc;h=69944b4bc7ad17f4cfe4bd5ad5a405432afd6400;hb=2721f2fc249f591a3c629add5793186e75323ffe;hp=7ad99c07569cd33a9ff2bbac228a0e77dd8de7ae;hpb=cb643ab9652d08a85802ce2a94c5bd57ca31256e;p=ardour.git diff --git a/libs/gtkmm2ext/scroomer.cc b/libs/gtkmm2ext/scroomer.cc index 7ad99c0756..69944b4bc7 100644 --- a/libs/gtkmm2ext/scroomer.cc +++ b/libs/gtkmm2ext/scroomer.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2008 Paul Davis + Copyright (C) 2008 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -74,6 +74,10 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) return true; } + if (ev->y < 0 || ev->y > get_height ()) { + return true; + } + grab_y = ev->y; if (ev->state & Keyboard::PrimaryModifier) { @@ -107,29 +111,29 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) unzoomed_page += scale * fract * range; unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val); unzoomed_page = max(unzoomed_page, min_page_size); - + if (pinch){ temp = unzoomed_val + unzoomed_page; unzoomed_val -= scale * fract * range * 0.5; unzoomed_val = min(unzoomed_val, temp - min_page_size); unzoomed_val = max(unzoomed_val, adj.get_lower()); } - + break; case Handle2: temp = unzoomed_val + unzoomed_page; unzoomed_val += scale * fract * range; unzoomed_val = min(unzoomed_val, temp - min_page_size); unzoomed_val = max(unzoomed_val, adj.get_lower()); - + unzoomed_page = temp - unzoomed_val; - + if (pinch){ - + unzoomed_page -= scale * fract * range; } - - unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val); + + unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val); unzoomed_page = max(unzoomed_page, min_page_size); break; default: @@ -138,12 +142,13 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) /* Then we handle zoom, which is dragging horizontally. We zoom around the area that is * the current y pointer value, not from the area that was the start of the drag. - * the point of zoom must have the same + * We don't start doing zoom until we are at least one scroomer width outside the scroomer's + * area. */ - - if (ev->x > get_width()) { + + if (ev->x > (get_width() * 2)) { zoom = ev->x - get_width(); - + double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer; double lower = val_at_pointer - (unzoomed_val + half_min_page); @@ -165,9 +170,9 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) page = min(page, adj.get_upper() - val); } else if (ev->x < 0) { /* on zoom out increase the page size as well as moving the range towards the mouse pos*/ - zoom = abs(ev->x); + /*zoom = abs(ev->x); - /*double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer; + double higher = unzoomed_val + unzoomed_page - half_min_page - val_at_pointer; double lower = val_at_pointer - (unzoomed_val + half_min_page); higher *= zoom / 128; @@ -194,11 +199,12 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) val = unzoomed_val; page = unzoomed_page; } - - adj.set_page_size(page); - adj.set_value(val); + + /* Round these values to stop the scroomer handlers quivering about during drags */ + adj.set_page_size (rint (page)); + adj.set_value (rint (val)); adj.value_changed(); - + return true; } @@ -207,10 +213,10 @@ Scroomer::on_scroll_event (GdkEventScroll* ev) { switch (ev->direction) { case GDK_SCROLL_UP: - adj.set_value (adj.get_value() - adj.get_page_size()/10.0); + adj.set_value (min (adj.get_value() + adj.get_page_size() / 10.0, adj.get_upper() - adj.get_page_size())); break; case GDK_SCROLL_DOWN: - adj.set_value (adj.get_value() + adj.get_page_size()/10.0); + adj.set_value (adj.get_value() - adj.get_page_size() / 10.0); break; default: return false; @@ -235,7 +241,7 @@ Scroomer::on_button_press_event (GdkEventButton* ev) unzoomed_val = adj.get_value(); unzoomed_page = adj.get_page_size(); grab_window = ev->window; - + if (ev->button == 3){ pinch = true; } else { @@ -244,8 +250,12 @@ Scroomer::on_button_press_event (GdkEventButton* ev) DragStarting (); /* EMIT SIGNAL */ } - - return false; + + if (ev->type == GDK_2BUTTON_PRESS && ev->button == 1) { + DoubleClicked(); + } + + return true; } bool @@ -279,7 +289,7 @@ Scroomer::on_button_release_event (GdkEventButton* ev) default: break; } - + grab_comp = None; remove_modal_grab();