remove commented debug output
[ardour.git] / libs / gtkmm2ext / pixfader.cc
index fe464d0fac62e00ee7d4ffa76a089fabac74952b..a77750b243dfb890e9fac08660e8323e184dc6d1 100644 (file)
 
 
 #include <iostream>
-#include <gtkmm2ext/pixfader.h>
+#include "gtkmm2ext/pixfader.h"
+#include "gtkmm2ext/keyboard.h"
 
 using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace Gdk;
 using namespace std;
 
-#ifdef GTKOSX
-int PixFader::fine_scale_modifier = GDK_META_MASK;
-#else
-int PixFader::fine_scale_modifier = GDK_CONTROL_MASK;
-#endif
 
-int PixFader::extra_fine_scale_modifier = GDK_MOD1_MASK;
+int PixFader::fine_scale_modifier = Keyboard::PrimaryModifier;
+int PixFader::extra_fine_scale_modifier = Keyboard::SecondaryModifier;
 
-PixFader::PixFader (Glib::RefPtr<Pixbuf> belt, Gtk::Adjustment& adj, int orientation)
+PixFader::PixFader (Glib::RefPtr<Pixbuf> belt, Gtk::Adjustment& adj, int orientation, int fader_length)
 
        : adjustment (adj),
          pixbuf (belt),
@@ -50,15 +47,13 @@ PixFader::PixFader (Glib::RefPtr<Pixbuf> belt, Gtk::Adjustment& adj, int orienta
 
        if (orientation == VERT) {
                view.width = girth = pixbuf->get_width();
-               view.height = span = pixbuf->get_height() / 2;
-               unity_loc = (int) rint (view.height - (default_value * view.height)) - 1;
        } else {
-               view.width = span = pixbuf->get_width () / 2;
                view.height = girth = pixbuf->get_height();
-               unity_loc = (int) rint (default_value * view.width) - 1;
-       }       
+       }
 
-       add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
+       set_fader_length (fader_length);
+
+       add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
 
        adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
        adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
@@ -72,8 +67,19 @@ bool
 PixFader::on_expose_event (GdkEventExpose* ev)
 {
        GdkRectangle intersection;
-       int srcx, srcy, ds = display_span ();
+       int srcx, srcy;
+
+       int const ds = display_span ();
+
        int offset_into_pixbuf = (int) floor (span / ((float) span / ds));
+
+       /* account for fader lengths that are shorter than the fader pixbuf */
+       if (_orien == VERT) {
+               offset_into_pixbuf += pixbuf->get_height() / 2 - view.height;
+       } else {
+               offset_into_pixbuf += pixbuf->get_width() / 2 - view.width;
+       }
+       
        Glib::RefPtr<Gdk::GC> fg_gc (get_style()->get_fg_gc(get_state()));
 
        if (gdk_rectangle_intersect (&view, &ev->area, &intersection)) {
@@ -138,7 +144,7 @@ PixFader::on_button_release_event (GdkEventButton* ev)
 {
        double fract, ev_pos;
 
-       ev_pos = (_orien == VERT) ? ev->y : 0; // Don't step if we are horizontal
+       ev_pos = (_orien == VERT) ? ev->y : ev->x;
        
        switch (ev->button) {
        case 1:
@@ -150,11 +156,11 @@ PixFader::on_button_release_event (GdkEventButton* ev)
 
                                /* no motion - just a click */
 
-                               if (ev->state & Gdk::SHIFT_MASK) {
+                               if (ev->state & Keyboard::TertiaryModifier) {
                                        adjustment.set_value (default_value);
                                } else if (ev->state & fine_scale_modifier) {
                                        adjustment.set_value (adjustment.get_lower());
-                               } else if (ev_pos < span - display_span()) {
+                               } else if ((_orien == VERT && ev_pos < span - display_span()) || (_orien == HORIZ && ev_pos > span - display_span())) {
                                        /* above the current display height, remember X Window coords */
                                        adjustment.set_value (adjustment.get_value() + adjustment.get_step_increment());
                                } else {
@@ -190,6 +196,7 @@ bool
 PixFader::on_scroll_event (GdkEventScroll* ev)
 {
        double scale;
+       bool ret = false;
 
        if (ev->state & fine_scale_modifier) {
                if (ev->state & extra_fine_scale_modifier) {
@@ -202,35 +209,45 @@ PixFader::on_scroll_event (GdkEventScroll* ev)
        }
 
        if (_orien == VERT) {
+
+               /* should left/right scroll affect vertical faders ? */
+
                switch (ev->direction) {
 
                case GDK_SCROLL_UP:
-                       /* wheel up */
                        adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale));
+                       ret = true;
                        break;
                case GDK_SCROLL_DOWN:
-                       /* wheel down */
                        adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale));
+                       ret = true;
                        break;
                default:
                        break;
                }
        } else {
+
+               /* up/down scrolls should definitely affect horizontal faders
+                  because they are so much easier to use
+               */
+
                switch (ev->direction) {
 
                case GDK_SCROLL_RIGHT:
-                       /* wheel right */
+               case GDK_SCROLL_UP:
                        adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale));
+                       ret = true;
                        break;
                case GDK_SCROLL_LEFT:
-                       /* wheel left */
+               case GDK_SCROLL_DOWN:
                        adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale));
+                       ret = true;
                        break;
                default:
                        break;
                }
        }
-       return false;
+       return ret;
 }
 
 bool
@@ -285,6 +302,7 @@ PixFader::adjustment_changed ()
        }
 }
 
+/** @return pixel offset of the current value from the right or bottom of the fader */
 int
 PixFader::display_span ()
 {
@@ -292,3 +310,30 @@ PixFader::display_span ()
        return (_orien == VERT) ? (int)floor (span * (1.0 - fract)) : (int)floor (span * fract);
 }
 
+void
+PixFader::set_fader_length (int l)
+{
+       if (_orien == VERT) {
+               view.height = span = l;
+               unity_loc = (int) rint (view.height - (default_value * view.height)) - 1;
+       } else {
+               view.width = span = l;
+               unity_loc = (int) rint (default_value * view.width) - 1;
+       }
+
+       queue_draw ();
+}
+
+bool
+PixFader::on_enter_notify_event (GdkEventCrossing*)
+{
+       Keyboard::magic_widget_grab_focus ();
+       return false;
+}
+
+bool
+PixFader::on_leave_notify_event (GdkEventCrossing*)
+{
+       Keyboard::magic_widget_drop_focus();
+       return false;
+}