first part of MIDI cut/copy/paste ; fix for input/output_streams of an IOProcessor...
[ardour.git] / gtk2_ardour / editor.h
index b4731e8c647d8b3c5e632141fea1cd788c1f217f..758772598c2b2b2463e432c143cecadb0e028ad6 100644 (file)
@@ -38,8 +38,8 @@
 
 #include <cmath>
 
-#include <gtkmm/layout.h>
 #include <gtkmm/comboboxtext.h>
+#include <gtkmm/layout.h>
 
 #include <gtkmm2ext/selector.h>
 #include <gtkmm2ext/click_box.h>
@@ -48,7 +48,6 @@
 #include "pbd/stateful.h"
 #include "ardour/session.h"
 #include "ardour/tempo.h"
-#include "ardour/stretch.h"
 #include "ardour/location.h"
 #include "ardour/audioregion.h"
 #include "ardour/track.h"
@@ -184,23 +183,23 @@ class Editor : public PublicEditor
        void set_mouse_mode (Editing::MouseMode, bool force=true);
        void step_mouse_mode (bool next);
        Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
-       
-       void set_midi_edit_cursor (Editing::MidiEditMode);
-       void set_midi_edit_mode (Editing::MidiEditMode, bool force=true);
-       Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; }
+       Editing::MidiEditMode current_midi_edit_mode () const;
+
+       bool internal_editing() const { return _internal_editing ; }
+       void set_internal_edit (bool yn);
 
 #ifdef WITH_CMT
        void add_imageframe_time_axis(const std::string & track_name, void*) ;
-       void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisViewPtr marked_track, void*) ;
+       void add_imageframe_marker_time_axis(const std::string & track_name, TimeAxisView* marked_track, void*) ;
        void connect_to_image_compositor() ;
        void scroll_timeaxis_to_imageframe_item(const TimeAxisViewItem* item) ;
 #endif
 
-       TimeAxisViewPtr get_named_time_axis(const std::string & name) ;
-       void foreach_time_axis_view (sigc::slot<void,TimeAxisViewPtr>);
-       void add_to_idle_resize (TimeAxisViewPtr, int32_t);
+       TimeAxisView* get_named_time_axis(const std::string & name) ;
+       void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
+       void add_to_idle_resize (TimeAxisView*, int32_t);
 
-       RouteTimeAxisViewPtr get_route_view_by_id (PBD::ID& id);
+       RouteTimeAxisView* get_route_view_by_id (PBD::ID& id);
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -273,7 +272,7 @@ class Editor : public PublicEditor
        Selection& get_selection() const { return *selection; }
        Selection& get_cut_buffer() const { return *cut_buffer; }
 
-       bool extend_selection_to_track (TimeAxisViewPtr);
+       bool extend_selection_to_track (TimeAxisView&);
 
        void play_selection ();
        void select_all_in_track (Selection::Operation op);
@@ -315,11 +314,11 @@ class Editor : public PublicEditor
        PlaylistSelector& playlist_selector() const;
        void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
 
-       void new_playlists (boost::weak_ptr<TimeAxisView>);
-       void copy_playlists (boost::weak_ptr<TimeAxisView>);
-       void clear_playlists (boost::weak_ptr<TimeAxisView>);
+       void new_playlists (TimeAxisView* v);
+       void copy_playlists (TimeAxisView* v);
+       void clear_playlists (TimeAxisView* v);
 
-       TrackViewList* get_valid_views (TimeAxisViewPtr, ARDOUR::RouteGroup* grp = 0);
+       TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
        void get_onscreen_tracks (TrackViewList&);
 
        Width editor_mixer_strip_width;
@@ -327,8 +326,8 @@ class Editor : public PublicEditor
        void show_editor_mixer (bool yn);
        void create_editor_mixer ();
        void show_editor_list (bool yn);
-       void set_selected_mixer_strip (TimeAxisViewPtr);
-       void hide_track_in_display (TimeAxisViewPtr tv, bool temporary = false);
+       void set_selected_mixer_strip (TimeAxisView&);
+       void hide_track_in_display (TimeAxisView& tv, bool temporary = false);
 
        /* nudge is initiated by transport controls owned by ARDOUR_UI */
 
@@ -433,7 +432,7 @@ class Editor : public PublicEditor
  
        PlaylistSelector* _playlist_selector;
 
-       typedef std::pair<TimeAxisViewPtr,XMLNode*> TAVState;
+       typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
 
        struct VisualState {
            double              y_position;
@@ -467,8 +466,8 @@ class Editor : public PublicEditor
        void post_zoom ();
 
        Editing::MouseMode mouse_mode;
-       Editing::MidiEditMode midi_edit_mode;
-
+       bool _internal_editing;
+       
        int  post_maximal_editor_width;
        int  post_maximal_pane_position;
        int  pre_maximal_pane_position;
@@ -531,8 +530,8 @@ class Editor : public PublicEditor
        void update_cd_marker_display ();
        void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location);
 
-       TimeAxisViewPtr      clicked_axisview;
-       RouteTimeAxisViewPtr clicked_routeview;
+       TimeAxisView*      clicked_axisview;
+       RouteTimeAxisView* clicked_routeview;
        /** The last RegionView that was clicked on, or 0 if the last click was not
         * on a RegionView.  This is set up by the canvas event handlers in
         * editor_canvas_events.cc
@@ -545,18 +544,18 @@ class Editor : public PublicEditor
 
        void sort_track_selection (TrackSelection* sel = 0);
 
-       void get_relevant_tracks (std::set<RouteTimeAxisViewPtr>& relevant_tracks) const;
-       void get_equivalent_tracks (RouteTimeAxisViewPtr, std::set<RouteTimeAxisViewPtr> &, ARDOUR::RouteGroup::Property) const;
+       void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks) const;
+       void get_equivalent_tracks (RouteTimeAxisView*, std::set<RouteTimeAxisView*> &, ARDOUR::RouteGroup::Property) const;
        void get_equivalent_regions (RegionView* rv, std::vector<RegionView*> &, ARDOUR::RouteGroup::Property) const;
        RegionSelection get_equivalent_regions (RegionSelection &, ARDOUR::RouteGroup::Property) const;
-       void mapover_tracks (sigc::slot<void,RouteTimeAxisViewPtr,uint32_t> sl, TimeAxisViewPtr, ARDOUR::RouteGroup::Property) const;
+       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, ARDOUR::RouteGroup::Property) const;
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_get_equivalent_regions (RouteTimeAxisViewPtr, uint32_t, RegionView *, std::vector<RegionView*>*) const;
-       void mapped_use_new_playlist (RouteTimeAxisViewPtr, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
-       void mapped_use_copy_playlist (RouteTimeAxisViewPtr, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
-       void mapped_clear_playlist (RouteTimeAxisViewPtr, uint32_t);
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView *, std::vector<RegionView*>*) const;
+       void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
+       void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, std::vector<boost::shared_ptr<ARDOUR::Playlist> > const &);
+       void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
 
        /* end */
 
@@ -565,7 +564,7 @@ class Editor : public PublicEditor
 
        void catch_vanishing_regionview (RegionView *);
 
-       void set_selected_track (TimeAxisViewPtr, Selection::Operation op = Selection::Set, bool no_remove=false);
+       void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
        void select_all_tracks ();
        
        bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
@@ -601,7 +600,7 @@ class Editor : public PublicEditor
        void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
 
        void handle_new_route (ARDOUR::RouteList&);
-       void remove_route (TimeAxisViewPtr);
+       void remove_route (TimeAxisView *);
        bool route_removal;
 
        Gtk::HBox           global_hpacker;
@@ -846,7 +845,7 @@ class Editor : public PublicEditor
        void    select_all_selectables_between (bool within);
        void    select_range_between ();
 
-       boost::shared_ptr<ARDOUR::Region> find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisViewPtr * = 0);
+       boost::shared_ptr<ARDOUR::Region> find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0);
        nframes64_t find_next_region_boundary (nframes64_t, int32_t dir, const TrackViewList&);
 
        std::vector<nframes64_t> region_boundary_cache;
@@ -969,9 +968,12 @@ class Editor : public PublicEditor
 
        /* track views */
        TrackViewList track_views;
-       std::pair<TimeAxisViewPtr, ARDOUR::layer_t> trackview_by_y_position (double);
+       std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
+       TimeAxisView* axis_view_from_route (ARDOUR::Route *) const;
        TrackSelection axis_views_from_routes (std::list<ARDOUR::Route *>) const;
 
+       TrackSelection get_tracks_for_range_action () const;
+
        static Gdk::Cursor* cross_hair_cursor;
        static Gdk::Cursor* trimmer_cursor;
        static Gdk::Cursor* selector_cursor;
@@ -1005,6 +1007,8 @@ class Editor : public PublicEditor
 
        bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType);
        bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
+       bool button_press_handler_1 (ArdourCanvas::Item *, GdkEvent *, ItemType);
+       bool button_press_handler_2 (ArdourCanvas::Item *, GdkEvent *, ItemType);
        bool button_release_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
        bool motion_handler (ArdourCanvas::Item*, GdkEvent*, bool from_autoscroll = false);
        bool enter_handler (ArdourCanvas::Item*, GdkEvent*, ItemType);
@@ -1021,6 +1025,7 @@ class Editor : public PublicEditor
        void cut_copy_points (Editing::CutCopyOp);
        void cut_copy_regions (Editing::CutCopyOp, RegionSelection&);
        void cut_copy_ranges (Editing::CutCopyOp);
+       void cut_copy_midi (Editing::CutCopyOp);
 
        void mouse_paste ();
        void paste_internal (nframes64_t position, float times);
@@ -1270,7 +1275,7 @@ class Editor : public PublicEditor
        bool have_pending_keyboard_selection;
        nframes64_t pending_keyboard_selection_start;
 
-       boost::shared_ptr<ARDOUR::Region> select_region_for_operation (int dir, TimeAxisViewPtr *tv);
+       boost::shared_ptr<ARDOUR::Region> select_region_for_operation (int dir, TimeAxisView **tv);
        void extend_selection_to_end_of_region (bool next);
        void extend_selection_to_start_of_region (bool previous);
 
@@ -1350,12 +1355,12 @@ public:
        bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
        bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
        bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*);
-       bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, boost::weak_ptr<TimeAxisView>);
+       bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*);
        bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*);
        bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*);
        bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*);
        bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*);
-       bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, boost::weak_ptr<AutomationTimeAxisView>);
+       bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*) ;
 
        bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*);
@@ -1510,17 +1515,19 @@ public:
        
        Gtk::HBox                mouse_mode_button_box;
        Gtkmm2ext::TearOff*      mouse_mode_tearoff;
-       Gtk::ToggleButton        mouse_select_button;
-       Gtk::ToggleButton        mouse_move_button;
-       Gtk::ToggleButton        mouse_gain_button;
-       Gtk::ToggleButton        mouse_zoom_button;
-       Gtk::ToggleButton        mouse_timefx_button;
-       Gtk::ToggleButton        mouse_audition_button;
-       Gtk::ToggleButton        mouse_note_button;
-       GroupedButtons          *mouse_mode_button_set;
+       Gtk::ToggleButton         mouse_select_button;
+       Gtk::ToggleButton         mouse_move_button;
+       Gtk::ToggleButton         mouse_gain_button;
+       Gtk::ToggleButton         mouse_zoom_button;
+       Gtk::ToggleButton         mouse_timefx_button;
+       Gtk::ToggleButton         mouse_audition_button;
+
        void                     mouse_mode_toggled (Editing::MouseMode m);
        bool                     ignore_mouse_mode_toggle;
 
+       Gtk::ToggleButton        internal_edit_button;
+       void                     toggle_internal_editing ();
+
        gint                     mouse_select_button_release (GdkEventButton*);
 
        Gtk::VBox                automation_box;
@@ -1575,25 +1582,12 @@ public:
 
        /* midi toolbar */
 
-       Gtk::HBox                midi_tool_button_box;
-       Gtk::ToggleButton        midi_tool_pencil_button;
-       Gtk::ToggleButton        midi_tool_select_button;
-       Gtk::ToggleButton        midi_tool_resize_button;
-       Gtk::ToggleButton        midi_tool_erase_button;
+       Gtk::HBox                panic_box;
        Gtk::Button              midi_panic_button;
        Gtk::ToggleButton        midi_sound_notes;
-       GroupedButtons          *midi_tool_button_set;
-       void                     midi_edit_mode_toggled (Editing::MidiEditMode m);
        void                     midi_panic_button_pressed ();
        bool                     sound_notes () const { return midi_sound_notes.get_active(); }
        
-       bool                     ignore_midi_edit_mode_toggle;
-
-       Gtkmm2ext::TearOff* midi_tools_tearoff;
-       Gtk::HBox           midi_toolbar_hbox;
-       Gtk::EventBox       midi_toolbar_base;
-       Gtk::Frame          midi_toolbar_frame;
-       
        void setup_midi_toolbar ();
 
        /* selection process */
@@ -1851,7 +1845,7 @@ public:
        
 #ifdef WITH_CMT
        void handle_new_imageframe_time_axis_view(const std::string & track_name, void* src) ;
-       void handle_new_imageframe_marker_time_axis_view(const std::string & track_name, TimeAxisViewPtr marked_track) ;
+       void handle_new_imageframe_marker_time_axis_view(const std::string & track_name, TimeAxisView* marked_track) ;
 
        void start_imageframe_grab(ArdourCanvas::Item*, GdkEvent*) ;
        void start_markerview_grab(ArdourCanvas::Item*, GdkEvent*) ;
@@ -1924,12 +1918,12 @@ public:
 
        /* tracking step changes of track height */
 
-       TimeAxisViewPtr current_stepping_trackview;
+       TimeAxisView* current_stepping_trackview;
        ARDOUR::microseconds_t last_track_height_step_timestamp;
        gint track_height_step_timeout();
        sigc::connection step_timeout;
 
-       TimeAxisViewPtr entered_track;
+       TimeAxisView* entered_track;
        RegionView*   entered_regionview;
 
 
@@ -1937,9 +1931,9 @@ public:
        bool clear_entered_track;
        bool left_track_canvas (GdkEventCrossing*);
        bool entered_track_canvas (GdkEventCrossing*);
-       void set_entered_track (TimeAxisViewPtr);
+       void set_entered_track (TimeAxisView*);
        void set_entered_regionview (RegionView*);
-       void ensure_track_visible (TimeAxisViewPtr);
+       void ensure_track_visible (TimeAxisView*);
        gint left_automation_track ();
 
        bool _new_regionviews_show_envelope;
@@ -2011,7 +2005,7 @@ public:
        bool idle_resize();
        friend gboolean _idle_resize (gpointer);
        int32_t _pending_resize_amount;
-       TimeAxisViewPtr _pending_resize_view;
+       TimeAxisView* _pending_resize_view;
 
        void visible_order_range (int*, int*) const;
 
@@ -2027,8 +2021,6 @@ public:
        EditorGroupTabs* _group_tabs;
        void fit_route_group (ARDOUR::RouteGroup *);
 
-       TimeAxisViewPtr find_time_axis (TimeAxisView *);
-
        friend class Drag;
        friend class RegionDrag;
        friend class RegionMoveDrag;