Merged with trunk R1612.
[ardour.git] / libs / gtkmm2ext / barcontroller.cc
index c8a211a48fb721c394550272262c5fee5be22c2d..c3c15b4281bf47ff229da0b90f3b6f3be3a054cb 100644 (file)
 #include <cmath>
 #include <algorithm>
 
-#include <midi++/controllable.h>
+#include <pbd/controllable.h>
 
 #include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/barcontroller.h>
 
 #include "i18n.h"
@@ -35,16 +36,13 @@ using namespace Gtk;
 using namespace Gtkmm2ext;
 
 BarController::BarController (Gtk::Adjustment& adj,
-                             MIDI::Controllable *mc,
+                             PBD::Controllable& mc,
                              sigc::slot<void,char*,unsigned int> lc) 
 
        : adjustment (adj),
-         prompter (Gtk::WIN_POS_MOUSE, 30000, false),
-         midi_control (mc),
+         binding_proxy (mc),
          label_callback (lc),
-         spinner (adjustment),
-         bind_button (2),
-         bind_statemask (Gdk::CONTROL_MASK)
+         spinner (adjustment)
 
 {                        
        _style = LeftToRight;
@@ -67,22 +65,14 @@ BarController::BarController (Gtk::Adjustment& adj,
                          Gdk::BUTTON_PRESS_MASK|
                          Gdk::POINTER_MOTION_MASK|
                          Gdk::ENTER_NOTIFY_MASK|
-                         Gdk::LEAVE_NOTIFY_MASK);
+                         Gdk::LEAVE_NOTIFY_MASK|
+                         Gdk::SCROLL_MASK);
 
        darea.signal_expose_event().connect (mem_fun (*this, &BarController::expose));
        darea.signal_motion_notify_event().connect (mem_fun (*this, &BarController::motion));
-       darea.signal_button_press_event().connect (mem_fun (*this, &BarController::button_press));
-       darea.signal_button_release_event().connect (mem_fun (*this, &BarController::button_release));
-
-       prompter.signal_unmap_event().connect (mem_fun (*this, &BarController::prompter_hiding));
-       
-       prompting = false;
-       unprompting = false;
-       
-       if (mc) {
-               mc->learning_started.connect (mem_fun (*this, &BarController::midicontrol_prompt));
-               mc->learning_stopped.connect (mem_fun (*this, &BarController::midicontrol_unprompt));
-       }
+       darea.signal_button_press_event().connect (mem_fun (*this, &BarController::button_press), false);
+       darea.signal_button_release_event().connect (mem_fun (*this, &BarController::button_release), false);
+       darea.signal_scroll_event().connect (mem_fun (*this, &BarController::scroll));
 
        spinner.signal_activate().connect (mem_fun (*this, &BarController::entry_activated));
        spinner.signal_focus_out_event().connect (mem_fun (*this, &BarController::entry_focus_out));
@@ -93,27 +83,29 @@ BarController::BarController (Gtk::Adjustment& adj,
 }
 
 void
-BarController::set_bind_button_state (guint button, guint statemask)
+BarController::drop_grab ()
 {
-       bind_button = button;
-       bind_statemask = statemask;
+       if (grabbed) {
+               grabbed = false;
+               darea.remove_modal_grab();
+               StopGesture ();
+       }
 }
 
-void
-BarController::get_bind_button_state (guint &button, guint &statemask)
+bool
+BarController::button_press (GdkEventButton* ev)
 {
-       button = bind_button;
-       statemask = bind_statemask;
-}
+       double fract;
 
+       if (binding_proxy.button_press_handler (ev)) {
+               return true;
+       }
 
-gint
-BarController::button_press (GdkEventButton* ev)
-{
        switch (ev->button) {
        case 1:
                if (ev->type == GDK_2BUTTON_PRESS) {
                        switch_on_release = true;
+                       drop_grab ();
                } else {
                        switch_on_release = false;
                        darea.add_modal_grab();
@@ -122,10 +114,13 @@ BarController::button_press (GdkEventButton* ev)
                        grab_window = ev->window;
                        StartGesture ();
                }
-               return TRUE;
+               return true;
                break;
 
        case 2:
+               fract = ev->x / (darea.get_width() - 2.0);
+               adjustment.set_value (adjustment.get_lower() + fract * (adjustment.get_upper() - adjustment.get_lower()));
+
        case 3:
                break;
 
@@ -134,17 +129,19 @@ BarController::button_press (GdkEventButton* ev)
                break;
        }
 
-       return FALSE;
+       return false;
 }
 
-gint
+bool
 BarController::button_release (GdkEventButton* ev)
 {
+       drop_grab ();
+       
        switch (ev->button) {
        case 1:
                if (switch_on_release) {
                        Glib::signal_idle().connect (mem_fun (*this, &BarController::switch_to_spinner));
-                       return TRUE;
+                       return true;
                }
 
                if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) {
@@ -162,49 +159,56 @@ BarController::button_release (GdkEventButton* ev)
 
                        mouse_control (ev->x, ev->window, scale);
                }
-               grabbed = false;
-               darea.remove_modal_grab();
-               StopGesture ();
                break;
 
        case 2:
-               if ((ev->state & bind_statemask) && bind_button == 2) {
-                       midi_learn ();
-               } else {
-                       double fract;
-                       fract = ev->x / (darea.get_width() - 2.0);
-                       adjustment.set_value (adjustment.get_lower() + 
-                                             fract * (adjustment.get_upper() - adjustment.get_lower()));
-               }
-               return TRUE;
-
+               break;
+               
        case 3:
-               if ((ev->state & bind_statemask) && bind_button == 3) {
-                       midi_learn ();
-                       return TRUE;
-               }
-               return FALSE;
+               return false;
                
-       case 4:
-               adjustment.set_value (adjustment.get_value() +
-                                     adjustment.get_step_increment());
+       default:
                break;
-       case 5:
-               adjustment.set_value (adjustment.get_value() -
-                                     adjustment.get_step_increment());
+       }
+
+       return true;
+}
+
+bool
+BarController::scroll (GdkEventScroll* ev)
+{
+       double scale;
+
+       if (ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+               scale = 0.01;
+       } else if (ev->state & GDK_CONTROL_MASK) {
+               scale = 0.1;
+       } else {
+               scale = 1.0;
+       }
+
+       switch (ev->direction) {
+       case GDK_SCROLL_UP:
+       case GDK_SCROLL_RIGHT:
+               adjustment.set_value (adjustment.get_value() + (scale * adjustment.get_step_increment()));
+               break;
+
+       case GDK_SCROLL_DOWN:
+       case GDK_SCROLL_LEFT:
+               adjustment.set_value (adjustment.get_value() - (scale * adjustment.get_step_increment()));
                break;
        }
 
-       return TRUE;
+       return true;
 }
 
-gint
+bool
 BarController::motion (GdkEventMotion* ev)
 {
        double scale;
        
        if (!grabbed) {
-               return TRUE;
+               return true;
        }
 
        if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) {
@@ -225,7 +229,7 @@ BarController::motion (GdkEventMotion* ev)
 gint
 BarController::mouse_control (double x, GdkWindow* window, double scaling)
 {
-       double fract;
+       double fract = 0.0;
        double delta;
 
        if (window != grab_window) {
@@ -254,23 +258,22 @@ BarController::mouse_control (double x, GdkWindow* window, double scaling)
        return TRUE;
 }
 
-gint
+bool
 BarController::expose (GdkEventExpose* event)
 {
        Glib::RefPtr<Gdk::Window> win (darea.get_window());
        Widget* parent;
-       gint x1, x2, y1, y2;
+       gint x1=0, x2=0, y1=0, y2=0;
        gint w, h;
        double fract;
 
-       w = darea.get_width() - 2;
-       h = darea.get_height() - 2;
-
        fract = ((adjustment.get_value() - adjustment.get_lower()) /
                 (adjustment.get_upper() - adjustment.get_lower()));
        
        switch (_style) {
        case Line:
+               w = darea.get_width() - 1;
+               h = darea.get_height();
                x1 = (gint) floor (w * fract);
                x2 = x1;
                y1 = 0;
@@ -281,28 +284,28 @@ BarController::expose (GdkEventExpose* event)
                        
                        if (parent) {
                                win->draw_rectangle (parent->get_style()->get_fg_gc (parent->get_state()),
-                                                   true,
-                                                   0, 0, darea.get_width(), darea.get_height());
+                                                    true,
+                                                    0, 0, darea.get_width(), darea.get_height());
                        }
-               } else {
-                       win->draw_rectangle (get_style()->get_bg_gc (get_state()),
-                                           true,
-                                           0, 0, darea.get_width(), darea.get_height());
-               }
 
-               if (fract == 0.0) {
-                       win->draw_rectangle (get_style()->get_fg_gc (get_state()),
-                                           true, x1, 1, 2, darea.get_height() - 2);
                } else {
-                       win->draw_rectangle (get_style()->get_fg_gc (get_state()),
-                                           true, x1 - 1, 1, 3, darea.get_height() - 2);
+
+                       win->draw_rectangle (get_style()->get_bg_gc (get_state()),
+                                            true,
+                                            0, 0, darea.get_width() - ((darea.get_width()+1) % 2), darea.get_height());
                }
+               
+               win->draw_line (get_style()->get_fg_gc (get_state()), x1, 0, x1, h);
                break;
 
        case CenterOut:
                break;
 
        case LeftToRight:
+
+               w = darea.get_width() - 2;
+               h = darea.get_height() - 2;
+
                x1 = 0;
                x2 = (gint) floor (w * fract);
                y1 = 0;
@@ -350,12 +353,11 @@ BarController::expose (GdkEventExpose* event)
 
                if (buf[0] != '\0') {
 
-                       int width;
-                       int height;
-                       
-                       layout->set_text (buf);
-                       layout->get_pixel_size(width, height);                  
-                       
+                       layout->set_text (buf);                 
+
+                       int width, height;
+                       layout->get_pixel_size (width, height);
+
                        int xpos;
 
                        xpos = max (3, 1 + (x2 - (width/2)));
@@ -368,7 +370,7 @@ BarController::expose (GdkEventExpose* event)
                }
        }
 
-       return TRUE;
+       return true;
 }
 
 void
@@ -380,61 +382,6 @@ BarController::set_with_text (bool yn)
        }
 }
 
-void
-BarController::midicontrol_set_tip ()
-{
-       if (midi_control) {
-               // Gtkmm2ext::UI::instance()->set_tip (&darea, midi_control->control_description());
-       }
-}
-
-void
-BarController::midi_learn()
-{
-       if (midi_control) {
-               prompting = true;
-               midi_control->learn_about_external_control ();
-       }
-}
-
-
-void
-BarController::midicontrol_prompt ()
-{
-       if (prompting) {
-               string prompt = _("operate MIDI controller now");
-               prompter.set_text (prompt);
-               Gtkmm2ext::UI::instance()->touch_display (&prompter);
-
-               unprompting = true;
-               prompting = false;
-       }
-}
-
-void
-BarController::midicontrol_unprompt ()
-{
-       if (unprompting) {
-               Gtkmm2ext::UI::instance()->touch_display (&prompter);
-               
-               unprompting = false;
-       }
-}
-
-gint
-BarController::prompter_hiding (GdkEventAny *ev)
-{
-       if (unprompting) {
-               if (midi_control) {
-                       midi_control->stop_learning();
-               }
-               unprompting = false;
-       }
-       
-       return FALSE;
-}
-
-
 void
 BarController::set_style (Style s)
 {
@@ -479,6 +426,7 @@ BarController::switch_to_spinner ()
        remove ();
        add (spinner);
        spinner.show ();
+       spinner.select_region (0, spinner.get_text_length());
        spinner.grab_focus ();
 
        switching = false;
@@ -498,11 +446,11 @@ BarController::entry_activated ()
        switch_to_bar ();
 }
 
-gint
+bool
 BarController::entry_focus_out (GdkEventFocus* ev)
 {
        entry_activated ();
-       return TRUE;
+       return true;
 }
 
 void
@@ -511,3 +459,10 @@ BarController::set_use_parent (bool yn)
        use_parent = yn;
        queue_draw ();
 }
+
+void
+BarController::set_sensitive (bool yn)
+{
+       Frame::set_sensitive (yn);
+       darea.set_sensitive (yn);
+}