use new FPU singleton pattern in libs/ardour
[ardour.git] / libs / gtkmm2ext / pixfader.cc
index bfdec04fcde68cb4b1351df5322c10ad53f83908..1e814fd147517b6aa6b0b2ae77f7a06e28cc0004 100644 (file)
@@ -53,7 +53,6 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
        , _orien (orientation)
        , _pattern (0)
        , _hovering (false)
-       , _last_drawn (-1)
        , _dragging (false)
        , _centered_text (true)
        , _current_parent (0)
@@ -72,7 +71,7 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
 
        _adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
        _adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
-
+       signal_grab_broken_event ().connect (mem_fun (*this, &PixFader::on_grab_broken_event));
        if (_orien == VERT) {
                CairoWidget::set_size_request(_girth, _span);
        } else {
@@ -326,13 +325,11 @@ PixFader::render (cairo_t *cr, cairo_rectangle_t* area)
                Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
                cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
                cairo_fill (cr);
-       } else if (_hovering) {
+       } else if (_hovering && CairoWidget::widget_prelight()) {
                Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
                cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
                cairo_fill (cr);
        }
-
-       _last_drawn = ds;
 }
 
 void
@@ -368,6 +365,18 @@ PixFader::on_size_allocate (Gtk::Allocation& alloc)
        update_unity_position ();
 }
 
+bool
+PixFader::on_grab_broken_event (GdkEventGrabBroken* ev)
+{
+       if (_dragging) {
+               remove_modal_grab();
+               _dragging = false;
+               gdk_pointer_ungrab (GDK_CURRENT_TIME);
+               StopGesture ();
+       }
+       return (_tweaks & NoButtonForward) ? true : false;
+}
+
 bool
 PixFader::on_button_press_event (GdkEventButton* ev)
 {
@@ -424,7 +433,6 @@ PixFader::on_button_release_event (GdkEventButton* ev)
 
                        if (ev_pos == _grab_start) {
                                /* no motion - just a click */
-                               const double slider_pos =  display_span();
                                ev_pos = rint(ev_pos);
 
                                if (ev->state & Keyboard::TertiaryModifier) {
@@ -531,7 +539,7 @@ PixFader::on_motion_notify_event (GdkEventMotion* ev)
 
                if (ev->state & Keyboard::GainFineScaleModifier) {
                        if (ev->state & Keyboard::GainExtraFineScaleModifier) {
-                               scale = 0.05;
+                               scale = 0.005;
                        } else {
                                scale = 0.1;
                        }
@@ -540,7 +548,9 @@ PixFader::on_motion_notify_event (GdkEventMotion* ev)
                double const delta = ev_pos - _grab_loc;
                _grab_loc = ev_pos;
 
-               double fract = (delta / _span);
+               const double off  = FADER_RESERVE + ((_orien == VERT) ? CORNER_OFFSET : 0);
+               const double span = _span - off;
+               double fract = (delta / span);
 
                fract = min (1.0, fract);
                fract = max (-1.0, fract);
@@ -560,9 +570,7 @@ PixFader::on_motion_notify_event (GdkEventMotion* ev)
 void
 PixFader::adjustment_changed ()
 {
-       if (display_span() != _last_drawn) {
-               queue_draw ();
-       }
+       queue_draw ();
 }
 
 /** @return pixel offset of the current value from the right or bottom of the fader */
@@ -572,9 +580,13 @@ PixFader::display_span ()
        float fract = (_adjustment.get_value () - _adjustment.get_lower()) / ((_adjustment.get_upper() - _adjustment.get_lower()));
        int ds;
        if (_orien == VERT) {
-               ds = (int)rint (_span * (1.0 - fract));
+               const double off  = FADER_RESERVE + CORNER_OFFSET;
+               const double span = _span - off;
+               ds = (int)rint (span * (1.0 - fract));
        } else {
-               ds = (int)rint (_span * fract);
+               const double off  = FADER_RESERVE;
+               const double span = _span - off;
+               ds = (int)rint (span * fract + off);
        }
 
        return ds;
@@ -584,9 +596,11 @@ void
 PixFader::update_unity_position ()
 {
        if (_orien == VERT) {
-               _unity_loc = (int) rint (_span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1;
+               const double span = _span - FADER_RESERVE - CORNER_OFFSET;
+               _unity_loc = (int) rint (span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1;
        } else {
-               _unity_loc = (int) rint ((_default_value - _adjustment.get_lower()) * _span / (_adjustment.get_upper() - _adjustment.get_lower()));
+               const double span = _span - FADER_RESERVE;
+               _unity_loc = (int) rint (FADER_RESERVE + (_default_value - _adjustment.get_lower()) * span / (_adjustment.get_upper() - _adjustment.get_lower()));
        }
 
        queue_draw ();
@@ -619,7 +633,9 @@ PixFader::on_leave_notify_event (GdkEventCrossing*)
 void
 PixFader::set_adjustment_from_event (GdkEventButton* ev)
 {
-       double fract = (_orien == VERT) ? (1.0 - (ev->y / _span)) : (ev->x / _span);
+       const double off  = FADER_RESERVE + ((_orien == VERT) ? CORNER_OFFSET : 0);
+       const double span = _span - off;
+       double fract = (_orien == VERT) ? (1.0 - ((ev->y - off) / span)) : ((ev->x - off) / span);
 
        fract = min (1.0, fract);
        fract = max (0.0, fract);