X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fscroomer.cc;h=85092379f495b79f728bffb22c98a65f6135fd70;hb=df46ab2c02d39d9c09cb95d0d2d4268c47168eee;hp=0f252070064e0999632a665f1e76f36a69037ac3;hpb=3a97c19e1e3d5dcbe71067cde4652efc9f255c18;p=ardour.git diff --git a/libs/gtkmm2ext/scroomer.cc b/libs/gtkmm2ext/scroomer.cc index 0f25207006..85092379f4 100644 --- a/libs/gtkmm2ext/scroomer.cc +++ b/libs/gtkmm2ext/scroomer.cc @@ -18,7 +18,9 @@ */ #include -#include + +#include "gtkmm2ext/scroomer.h" +#include "gtkmm2ext/keyboard.h" using namespace Gtkmm2ext; using namespace Gtk; @@ -28,8 +30,8 @@ using namespace std; Scroomer::Scroomer(Gtk::Adjustment& adjustment) : adj(adjustment) , handle_size(0) - , grab_comp(None) { - + , grab_comp(None) +{ position[TopBase] = 0; position[Handle1] = 0; position[Slider] = 0; @@ -74,8 +76,8 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) grab_y = ev->y; - if (ev->state & GDK_CONTROL_MASK) { - if (ev->state & GDK_MOD1_MASK) { + if (ev->state & Keyboard::PrimaryModifier) { + if (ev->state & Keyboard::SecondaryModifier) { scale = 0.05; } else { scale = 0.1; @@ -88,7 +90,7 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) fract = max (-1.0, fract); fract = -fract; - switch(grab_comp) { + switch (grab_comp) { case TopBase: case BottomBase: unzoomed_val += scale * fract * range; @@ -101,25 +103,40 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) unzoomed_val = max(unzoomed_val, adj.get_lower()); break; case Handle1: + 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 = max(unzoomed_page, min_page_size); break; default: break; } - /* - * Then we handle zoom, which is dragging horizontally. We zoom around the area that is + /* 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 */ @@ -177,19 +194,26 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) val = unzoomed_val; page = unzoomed_page; } - + adj.set_page_size(page); + adj.set_value(val); + adj.value_changed(); - if (val == adj.get_value()) { - adj.value_changed(); - } + return true; +} - if (val < adj.get_lower()) { - adj.value_changed(); - } else if (val > adj.get_upper()) { - adj.value_changed(); - } else { - adj.set_value(val); +bool +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); + break; + case GDK_SCROLL_DOWN: + adj.set_value (adj.get_value() - adj.get_page_size() / 10.0); + break; + default: + return false; } return true; @@ -198,7 +222,7 @@ Scroomer::on_motion_notify_event (GdkEventMotion* ev) bool Scroomer::on_button_press_event (GdkEventButton* ev) { - if (ev->button == 1) { + if (ev->button == 1 || ev->button == 3) { Component comp = point_in(ev->y); if (comp == Total || comp == None) { @@ -211,7 +235,16 @@ 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 { + pinch = false; + } + + DragStarting (); /* EMIT SIGNAL */ } + return false; } @@ -228,11 +261,11 @@ Scroomer::on_button_release_event (GdkEventButton* ev) return true; } - if (ev->button != 1) { + if (ev->button != 1 && ev->button != 3) { return true; } - switch(grab_comp) { + switch (grab_comp) { case TopBase: break; case Handle1: @@ -250,12 +283,7 @@ Scroomer::on_button_release_event (GdkEventButton* ev) grab_comp = None; remove_modal_grab(); - return true; -} - -bool -Scroomer::on_scroll_event (GdkEventScroll*) -{ + DragFinishing (); /* EMIT SIGNAL */ return true; } @@ -269,15 +297,14 @@ Scroomer::on_size_allocate (Allocation& a) update(); } -/* - * assumes that x and width are correct, and they will not be altered +/** Assumes that x and width are correct, and they will not be altered. */ void Scroomer::set_comp_rect(GdkRectangle& r, Component c) const { int index = (int) c; - switch(c) { + switch (c) { case None: return; case Total: @@ -367,29 +394,5 @@ Scroomer::adjustment_changed() rect.set_height(position[BottomBase] - old_pos[Handle2]); win->invalidate_rect(rect, false); } - - win->process_updates(false); } -std::string -Scroomer::get_comp_name(Component c) -{ - switch(c) { - case TopBase: - return "TopBase"; - case Handle1: - return "Handle1"; - case Slider: - return "Slider"; - case Handle2: - return "Handle2"; - case BottomBase: - return "BottomBase"; - case Total: - return "Total"; - case None: - return "None"; - default: - return "ERROR"; - } -}