push2: splash screen
[ardour.git] / libs / surfaces / push2 / push2.h
index c50452fc6545fcda5c08c212dea2be8904533082..2d130b9d66eed6b034cff83276830e8e3ef2c3d7 100644 (file)
@@ -86,6 +86,14 @@ class Push2 : public ARDOUR::ControlProtocol
        sigc::connection vblank_connection;
        sigc::connection periodic_connection;
 
+       enum ModifierState {
+               None = 0,
+               ModShift = 0x1,
+               ModSelect = 0x2,
+       };
+
+       ModifierState modifier_state;
+
        static const int cols;
        static const int rows;
        static const int pixels_per_row;
@@ -95,7 +103,7 @@ class Push2 : public ARDOUR::ControlProtocol
        int open ();
        int close ();
        bool redraw ();
-       int bitblt_to_device_frame_buffer ();
+       int blit_to_device_frame_buffer ();
        bool vblank ();
 
        enum ButtonID {
@@ -155,7 +163,7 @@ class Push2 : public ARDOUR::ControlProtocol
        struct LED
        {
                enum State {
-                       Off,
+                       NoTransition,
                        OneShot24th,
                        OneShot16th,
                        OneShot8th,
@@ -174,6 +182,7 @@ class Push2 : public ARDOUR::ControlProtocol
                };
 
                enum Colors {
+                       Black = 0,
                        Red = 127,
                        Green = 126,
                        Blue = 125,
@@ -182,7 +191,7 @@ class Push2 : public ARDOUR::ControlProtocol
                        White = 122
                };
 
-               LED (uint8_t e) : _extra (e), _color_index (0), _state (Off) {}
+               LED (uint8_t e) : _extra (e), _color_index (0), _state (NoTransition) {}
                virtual ~LED() {}
 
                uint8_t extra () const { return _extra; }
@@ -206,7 +215,7 @@ class Push2 : public ARDOUR::ControlProtocol
                        , x (xx)
                        , y (yy) {}
 
-               MidiByteArray state_msg () const { return MidiByteArray (3, 0x90|_state, _extra, (_state == Off) ? 0 : _color_index); }
+               MidiByteArray state_msg () const { return MidiByteArray (3, 0x90|_state, _extra, _color_index); }
 
                int coord () const { return (y * 8) + x; }
                int note_number() const { return extra(); }
@@ -221,6 +230,7 @@ class Push2 : public ARDOUR::ControlProtocol
                        , id (bb)
                        , press_method (&Push2::relax)
                        , release_method (&Push2::relax)
+                       , long_press_method (&Push2::relax)
                {}
 
                Button (ButtonID bb, uint8_t ex, void (Push2::*press)())
@@ -228,6 +238,7 @@ class Push2 : public ARDOUR::ControlProtocol
                        , id (bb)
                        , press_method (press)
                        , release_method (&Push2::relax)
+                       , long_press_method (&Push2::relax)
                {}
 
                Button (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
@@ -235,14 +246,25 @@ class Push2 : public ARDOUR::ControlProtocol
                        , id (bb)
                        , press_method (press)
                        , release_method (release)
+                       , long_press_method (&Push2::relax)
+               {}
+
+               Button (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+                       : LED (ex)
+                       , id (bb)
+                       , press_method (press)
+                       , release_method (release)
+                       , long_press_method (long_press)
                {}
 
-               MidiByteArray state_msg () const { return MidiByteArray (3, 0xb0|_state, _extra, (_state == Off) ? 0 : _color_index); }
+               MidiByteArray state_msg () const { return MidiByteArray (3, 0xb0|_state, _extra, _color_index); }
                int controller_number() const { return extra(); }
 
                ButtonID id;
                void (Push2::*press_method)();
                void (Push2::*release_method)();
+               void (Push2::*long_press_method)();
+               sigc::connection timeout_connection;
        };
 
        struct ColorButton : public Button {
@@ -255,6 +277,9 @@ class Push2 : public ARDOUR::ControlProtocol
 
                ColorButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
                        : Button (bb, ex, press, release) {}
+
+               ColorButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+                       : Button (bb, ex, press, release, long_press) {}
        };
 
        struct WhiteButton : public Button {
@@ -266,6 +291,9 @@ class Push2 : public ARDOUR::ControlProtocol
 
                WhiteButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)())
                        : Button (bb, ex, press, release) {}
+
+               WhiteButton (ButtonID bb, uint8_t ex, void (Push2::*press)(), void (Push2::*release)(), void (Push2::*long_press)())
+                       : Button (bb, ex, press, release, long_press) {}
        };
 
        void relax () {}
@@ -276,6 +304,14 @@ class Push2 : public ARDOUR::ControlProtocol
        /* map of Buttons by ButtonID */
        typedef std::map<ButtonID,Button*> IDButtonMap;
        IDButtonMap id_button_map;
+       std::set<ButtonID> buttons_down;
+       std::set<ButtonID> consumed;
+
+       bool button_long_press_timeout (ButtonID id);
+       void start_press_timeout (Button&, ButtonID);
+
+       void init_buttons (bool startup);
+       void init_touch_strip ();
 
        /* map of Pads by note number */
        typedef std::map<int,Pad*> NNPadMap;
@@ -332,6 +368,59 @@ class Push2 : public ARDOUR::ControlProtocol
        void button_metronome ();
        void button_repeat ();
        void button_solo ();
+       void button_fixed_length ();
+       void button_new ();
+       void button_browse ();
+       void button_clip ();
+       void button_upper (uint32_t n);
+       void button_lower (uint32_t n);
+       void button_upper_1 () { button_upper (0); }
+       void button_upper_2 () { button_upper (1); }
+       void button_upper_3 () { button_upper (2); }
+       void button_upper_4 () { button_upper (3); }
+       void button_upper_5 () { button_upper (4); }
+       void button_upper_6 () { button_upper (5); }
+       void button_upper_7 () { button_upper (6); }
+       void button_upper_8 () { button_upper (7); }
+       void button_lower_1 () { button_lower (0); }
+       void button_lower_2 () { button_lower (1); }
+       void button_lower_3 () { button_lower (2); }
+       void button_lower_4 () { button_lower (3); }
+       void button_lower_5 () { button_lower (4); }
+       void button_lower_6 () { button_lower (5); }
+       void button_lower_7 () { button_lower (6); }
+       void button_lower_8 () { button_lower (7); }
+       void button_undo ();
+       void button_fwd32t ();
+       void button_fwd32 ();
+       void button_fwd16t ();
+       void button_fwd16 ();
+       void button_fwd8t ();
+       void button_fwd8 ();
+       void button_fwd4t ();
+       void button_fwd4 ();
+       void button_add_track ();
+       void button_stop ();
+       void button_shift_press ();
+       void button_shift_release ();
+       void button_shift_long_press ();
+       void button_select_press ();
+       void button_select_release ();
+       void button_select_long_press ();
+       void button_page_left ();
+       void button_page_right ();
+
+       void start_shift ();
+       void end_shift ();
+       void start_select ();
+       void end_select ();
+
+       /* encoders */
+
+       void strip_vpot (int, int);
+       void other_vpot (int, int);
+       void strip_vpot_touch (int, bool);
+       void other_vpot_touch (int, bool);
 
        /* widgets */
 
@@ -341,6 +430,23 @@ class Push2 : public ARDOUR::ControlProtocol
        Glib::RefPtr<Pango::Layout> upper_layout[8];
        Glib::RefPtr<Pango::Layout> mid_layout[8];
        Glib::RefPtr<Pango::Layout> lower_layout[8];
+
+       void splash ();
+       ARDOUR::microseconds_t splash_start;
+
+       /* stripables */
+
+       int32_t bank_start;
+       PBD::ScopedConnectionList stripable_connections;
+       boost::shared_ptr<ARDOUR::Stripable> stripable[8];
+       boost::shared_ptr<ARDOUR::Stripable> master;
+       boost::shared_ptr<ARDOUR::Stripable> monitor;
+
+       void solo_change (int);
+       void mute_change (int);
+       void stripable_property_change (PBD::PropertyChange const& what_changed, int which);
+
+       void switch_bank (uint32_t base);
 };