attempt to be compliant with gcc 4.6 (assuming that its more compliant with standards...
[ardour.git] / libs / gtkmm2ext / scroomer.cc
index 0f252070064e0999632a665f1e76f36a69037ac3..85092379f495b79f728bffb22c98a65f6135fd70 100644 (file)
@@ -18,7 +18,9 @@
 */
 
 #include <iostream>
-#include <gtkmm2ext/scroomer.h>
+
+#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";
-       }
-}