Remove un-read variable.
[ardour.git] / gtk2_ardour / midi_region_view.h
index f8928045a540179ae4770e95a9fdd41ffb7ecf8f..c3084aee384a24e1f2d3700ee52dbce91ce8686f 100644 (file)
@@ -28,7 +28,6 @@
 #include "pbd/signals.h"
 
 #include "ardour/midi_track.h"
-#include "ardour/midi_region.h"
 #include "ardour/midi_model.h"
 #include "ardour/diskstream.h"
 #include "ardour/types.h"
@@ -85,8 +84,7 @@ public:
 
        virtual void init (Gdk::Color const & basic_color, bool wfd);
 
-       inline const boost::shared_ptr<ARDOUR::MidiRegion> midi_region() const
-       { return boost::dynamic_pointer_cast<ARDOUR::MidiRegion>(_region); }
+       const boost::shared_ptr<ARDOUR::MidiRegion> midi_region() const;
 
        inline MidiTimeAxisView* midi_view() const
        { return dynamic_cast<MidiTimeAxisView*>(&trackview); }
@@ -104,7 +102,7 @@ public:
 
        void set_frame_color();
        void color_handler ();
-        
+
        void show_step_edit_cursor (Evoral::MusicalTime pos);
        void move_step_edit_cursor (Evoral::MusicalTime pos);
        void hide_step_edit_cursor ();
@@ -154,6 +152,9 @@ public:
         */
        void next_patch (ArdourCanvas::CanvasPatchChange &);
 
+       void previous_bank (ArdourCanvas::CanvasPatchChange &);
+       void next_bank (ArdourCanvas::CanvasPatchChange &);
+
        /** Displays all patch change events in the region as flags on the canvas.
         */
        void display_patch_changes();
@@ -166,8 +167,6 @@ public:
        void end_write();
        void extend_active_notes();
 
-       void create_note_at(double x, double y, double length, bool);
-
        void display_model(boost::shared_ptr<ARDOUR::MidiModel> model);
 
        void start_note_diff_command (std::string name = "midi edit");
@@ -191,6 +190,8 @@ public:
        void   delete_note (boost::shared_ptr<NoteType>);
        size_t selection_size() { return _selection.size(); }
        void   select_all_notes ();
+       void   select_range(framepos_t start, framepos_t end);
+       void   invert_selection ();
 
        void move_selection(double dx, double dy, double cumulative_dy);
        void note_dropped (ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::frameoffset_t, int8_t d_note);
@@ -217,6 +218,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
@@ -228,6 +230,7 @@ public:
                Pressed,
                SelectTouchDragging,
                SelectRectDragging,
+               SelectVerticalDragging,
                AddDragging
        };
 
@@ -250,33 +253,46 @@ public:
         */
        framepos_t snap_pixel_to_frame(double x);
 
-       ARDOUR::frameoffset_t snap_frame_to_frame (ARDOUR::frameoffset_t);
-
-       /** Convert a timestamp in beats to frames (both relative to region start) */
-       framepos_t beats_to_frames(double beats) const;
-
-       /** Convert a timestamp in frames to beats (both relative to region start) */
-       double frames_to_beats(framepos_t) const;
-
-       void goto_previous_note ();
-       void goto_next_note ();
+       /** 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 position) */
+       double region_frames_to_region_beats(framepos_t) const;
+
+       /** Convert a timestamp in beats measured from source start into absolute frames */
+       framepos_t source_beats_to_absolute_frames(double beats) const;
+       /** Convert a timestamp in beats measured from source start into region-relative frames */
+       framepos_t source_beats_to_region_frames(double beats) const {
+               return source_beats_to_absolute_frames (beats) - _region->position();
+       }
+       /** Convert a timestamp in absolute frames to beats measured from source start*/
+       double absolute_frames_to_source_beats(framepos_t) const;
+
+       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 transpose (bool up, bool fine, bool allow_smush);
        void nudge_notes (bool forward);
+       void channel_edit ();
 
        void show_list_editor ();
 
        void selection_as_notelist (Notes& selected, bool allow_all_if_none_selected = false);
 
        void enable_display (bool);
-       
+
        void set_channel_selector_scoped_note(ArdourCanvas::CanvasNoteEvent* note){ _channel_selection_scoped_note = note; }
        ArdourCanvas::CanvasNoteEvent* channel_selector_scoped_note(){  return _channel_selection_scoped_note; }
 
        void trim_front_starting ();
        void trim_front_ending ();
-        
+
+       void create_note_at (framepos_t, double, double, bool);
+       
 protected:
        /** Allows derived types to specify their visibility requirements
         * to the TimeAxisViewItem parent class.
@@ -295,8 +311,18 @@ protected:
 
        void reset_width_dependent_items (double pixel_width);
 
+       void parameter_changed (std::string const & p);
+
 private:
 
+       friend class MidiRubberbandSelectDrag;
+       friend class MidiVerticalSelectDrag;
+
+       /** Emitted when the selection has been cleared in one MidiRegionView */
+       static PBD::Signal1<void, MidiRegionView*> SelectionCleared;
+       PBD::ScopedConnection _selection_cleared_connection;
+       void selection_cleared (MidiRegionView *);
+
        friend class EditNoteDialog;
 
        /** Play the NoteOn event of the given note immediately
@@ -318,7 +344,7 @@ private:
        void midi_channel_mode_changed(ARDOUR::ChannelMode mode, uint16_t mask);
        void midi_patch_settings_changed(std::string model, std::string custom_device_mode);
 
-       void change_note_channel (ArdourCanvas::CanvasNoteEvent *, int8_t);
+       void change_note_channel (ArdourCanvas::CanvasNoteEvent *, int8_t, bool relative=false);
        void change_note_velocity(ArdourCanvas::CanvasNoteEvent* ev, int8_t vel, bool relative=false);
        void change_note_note(ArdourCanvas::CanvasNoteEvent* ev, int8_t note, bool relative=false);
        void change_note_time(ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::TimeType, bool relative=false);
@@ -326,19 +352,17 @@ private:
        void trim_note(ArdourCanvas::CanvasNoteEvent* ev, ARDOUR::MidiModel::TimeType start_delta,
                       ARDOUR::MidiModel::TimeType end_delta);
 
-       void clear_selection_except(ArdourCanvas::CanvasNoteEvent* ev);
-       void clear_selection() { clear_selection_except(NULL); }
-       void update_drag_selection(double last_x, double x, double last_y, double y);
+       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*);
 
-       uint8_t get_channel_for_add () const;
-
        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;
@@ -363,16 +387,11 @@ 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;
        ArdourCanvas::CanvasNoteEvent*       _channel_selection_scoped_note;
-       
+
 
        /** A group used to temporarily reparent _note_group to during start trims, so
         *  that the notes don't move with the parent region view.
@@ -437,16 +456,19 @@ private:
        void display_patch_changes_on_channel (uint8_t);
 
        void connect_to_diskstream ();
-       void data_recorded (boost::shared_ptr<ARDOUR::MidiBuffer>, boost::weak_ptr<ARDOUR::MidiSource>);
+       void data_recorded (boost::weak_ptr<ARDOUR::MidiSource>);
 
        void remove_ghost_note ();
        void mouse_mode_changed ();
        double _last_event_x;
        double _last_event_y;
 
+       framepos_t snap_frame_to_grid_underneath (framepos_t p, framecnt_t &) const;
+       
        PBD::ScopedConnection _mouse_mode_connection;
 
-       Gdk::Cursor* _pre_enter_cursor;
+       Gdk::Cursor* pre_enter_cursor;
+       Gdk::Cursor* pre_press_cursor;
 };