X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmidi_region_view.h;h=b42b7e5a364df47f9e8af9dbdd94abc16c77b264;hb=75a3964c1073832249d1d8776f46fedbd9f97035;hp=116f210ee15e9aabcdd99c0f3a45e5830523fbd8;hpb=cab3072f83bb2e959e5ece5e344c568caf474be6;p=ardour.git diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 116f210ee1..b42b7e5a36 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -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 midi_region() const - { return boost::dynamic_pointer_cast(_region); } + const boost::shared_ptr midi_region() const; inline MidiTimeAxisView* midi_view() const { return dynamic_cast(&trackview); } @@ -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 model); void start_note_diff_command (std::string name = "midi edit"); @@ -191,6 +190,8 @@ public: void delete_note (boost::shared_ptr); 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 @@ -250,16 +252,26 @@ 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 beats into frames (both relative to region start) */ + 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) */ - double frames_to_beats(framepos_t) const; - - void goto_previous_note (); - void goto_next_note (); + 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); @@ -278,6 +290,8 @@ public: void trim_front_starting (); void trim_front_ending (); + void create_note_at (framepos_t, double, double, bool, bool); + protected: /** Allows derived types to specify their visibility requirements * to the TimeAxisViewItem parent class. @@ -296,8 +310,17 @@ protected: void reset_width_dependent_items (double pixel_width); + void parameter_changed (std::string const & p); + private: + friend class MidiRubberbandSelectDrag; + + /** Emitted when the selection has been cleared in one MidiRegionView */ + static PBD::Signal1 SelectionCleared; + PBD::ScopedConnection _selection_cleared_connection; + void selection_cleared (MidiRegionView *); + friend class EditNoteDialog; /** Play the NoteOn event of the given note immediately @@ -327,9 +350,9 @@ 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 add_to_selection (ArdourCanvas::CanvasNoteEvent*); void remove_from_selection (ArdourCanvas::CanvasNoteEvent*); @@ -362,11 +385,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; @@ -436,13 +454,15 @@ private: void display_patch_changes_on_channel (uint8_t); void connect_to_diskstream (); - void data_recorded (boost::shared_ptr, boost::weak_ptr); + void data_recorded (boost::weak_ptr); 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;