Grey-out patch changes on inactive channels rather than not
[ardour.git] / gtk2_ardour / midi_region_view.h
index 081a68e101809150cfe5a2c8ccea39f209a463c4..f47c94a1a96fbbbdd0bc6f710362cf345744e956 100644 (file)
@@ -118,11 +118,7 @@ public:
        void cut_copy_clear (Editing::CutCopyOp);
        void paste (framepos_t pos, float times, const MidiCutBuffer&);
 
-       /** Add a new patch change flag to the canvas.
-        * @param patch the patch change to add
-        * @param the text to display in the flag
-        */
-       void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext);
+       void add_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr patch, const std::string& displaytext, bool);
 
        /** Look up the given time and channel in the 'automation' and set keys accordingly.
         * @param time the time of the patch change event
@@ -218,6 +214,7 @@ public:
 
        void update_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool);
        void commit_resizing (ArdourCanvas::CanvasNoteEvent*, bool, double, bool);
+       void abort_resizing ();
 
        /** Change the channel of the selection.
         * @param channel - the channel number of the new channel, zero-based
@@ -229,6 +226,7 @@ public:
                Pressed,
                SelectTouchDragging,
                SelectRectDragging,
+               SelectVerticalDragging,
                AddDragging
        };
 
@@ -251,13 +249,13 @@ public:
         */
        framepos_t snap_pixel_to_frame(double x);
 
-       /** Convert a timestamp in beats into frames (both relative to region start) */
+       /** Convert a timestamp in beats into frames (both relative to region position) */
        framepos_t region_beats_to_region_frames(double beats) const;
        /** Convert a timestamp in beats into absolute frames */
        framepos_t region_beats_to_absolute_frames(double beats) const {
                return _region->position() + region_beats_to_region_frames (beats);
        }
-       /** Convert a timestamp in frames to beats (both relative to region start) */
+       /** Convert a timestamp in frames to beats (both relative to region position) */
        double region_frames_to_region_beats(framepos_t) const;
 
        /** Convert a timestamp in beats measured from source start into absolute frames */
@@ -272,10 +270,11 @@ public:
        void goto_previous_note (bool add_to_selection);
        void goto_next_note (bool add_to_selection);
        void change_note_lengths (bool, bool, Evoral::MusicalTime beats, bool start, bool end);
-       void change_velocities (bool up, bool fine, bool allow_smush);
+        void change_velocities (bool up, bool fine, bool allow_smush, bool all_together);
        void transpose (bool up, bool fine, bool allow_smush);
        void nudge_notes (bool forward);
        void channel_edit ();
+       void velocity_edit ();
 
        void show_list_editor ();
 
@@ -289,6 +288,18 @@ public:
        void trim_front_starting ();
        void trim_front_ending ();
 
+       void create_note_at (framepos_t, double, double, bool);
+
+       void clear_selection (bool signal = true) { clear_selection_except (0, signal); }
+
+       std::string model_name () const {
+               return _model_name;
+       }
+
+       std::string custom_device_mode () const {
+               return _custom_device_mode;
+       }
+       
 protected:
        /** Allows derived types to specify their visibility requirements
         * to the TimeAxisViewItem parent class.
@@ -312,16 +323,18 @@ protected:
 private:
 
        friend class MidiRubberbandSelectDrag;
+       friend class MidiVerticalSelectDrag;
 
-       /** Emitted when the selection has been cleared in one MidiRegionView */
+       /** Emitted when the selection has been cleared in one MidiRegionView,
+        *  with the expectation that others will clear their selections in
+        *  sympathy.
+        */
        static PBD::Signal1<void, MidiRegionView*> SelectionCleared;
        PBD::ScopedConnection _selection_cleared_connection;
        void selection_cleared (MidiRegionView *);
 
        friend class EditNoteDialog;
 
-       void create_note_at(double x, double y, double length, bool, bool);
-
        /** Play the NoteOn event of the given note immediately
         * and schedule the playback of the corresponding NoteOff event.
         */
@@ -350,8 +363,8 @@ private:
                       ARDOUR::MidiModel::TimeType end_delta);
 
        void clear_selection_except (ArdourCanvas::CanvasNoteEvent* ev, bool signal = true);
-       void clear_selection (bool signal = true) { clear_selection_except (0, signal); }
        void update_drag_selection (double last_x, double x, double last_y, double y, bool extend);
+       void update_vertical_drag_selection (double last_y, double y, bool extend);
 
        void add_to_selection (ArdourCanvas::CanvasNoteEvent*);
        void remove_from_selection (ArdourCanvas::CanvasNoteEvent*);
@@ -359,7 +372,6 @@ private:
        void show_verbose_cursor (std::string const &, double, double) const;
        void show_verbose_cursor (boost::shared_ptr<NoteType>) const;
 
-       int8_t   _force_channel;
        uint16_t _last_channel_selection;
        uint8_t  _current_range_min;
        uint8_t  _current_range_max;
@@ -384,11 +396,6 @@ private:
        ArdourCanvas::CanvasNote*            _ghost_note;
        double                               _last_ghost_x;
        double                               _last_ghost_y;
-       double                               _drag_start_x;
-       double                               _drag_start_y;
-       double                               _last_x;
-       double                               _last_y;
-       ArdourCanvas::SimpleRect*            _drag_rect;
        ArdourCanvas::SimpleRect*            _step_edit_cursor;
        Evoral::MusicalTime                  _step_edit_cursor_width;
        Evoral::MusicalTime                  _step_edit_cursor_position;
@@ -455,7 +462,7 @@ private:
        void maybe_select_by_position (GdkEventButton* ev, double x, double y);
        void get_events (Events& e, Evoral::Sequence<Evoral::MusicalTime>::NoteOperator op, uint8_t val, int chan_mask = 0);
 
-       void display_patch_changes_on_channel (uint8_t);
+       void display_patch_changes_on_channel (uint8_t, bool);
 
        void connect_to_diskstream ();
        void data_recorded (boost::weak_ptr<ARDOUR::MidiSource>);
@@ -469,7 +476,8 @@ private:
        
        PBD::ScopedConnection _mouse_mode_connection;
 
-       Gdk::Cursor* _pre_enter_cursor;
+       Gdk::Cursor* pre_enter_cursor;
+       Gdk::Cursor* pre_press_cursor;
 };