Remove use of invalidated iterator (#4826).
[ardour.git] / gtk2_ardour / editor.h
index d9f3669730c70f1c7b8eec2c4afd98a3e59c4dc0..d5b2cb9172454483479fa48683378e72d2c35235 100644 (file)
@@ -104,6 +104,7 @@ class AutomationLine;
 class AutomationSelection;
 class AutomationTimeAxisView;
 class BundleManager;
+class ButtonJoiner;
 class ControlPoint;
 class CrossfadeView;
 class DragManager;
@@ -168,7 +169,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        }
 
        void cycle_snap_mode ();
-       void cycle_snap_choice ();
+       void next_snap_choice ();
+       void next_snap_choice_music_only ();
+       void next_snap_choice_music_and_time ();
+       void prev_snap_choice ();
+       void prev_snap_choice_music_only ();
+       void prev_snap_choice_music_and_time ();
        void set_snap_to (Editing::SnapType);
        void set_snap_mode (Editing::SnapMode);
        void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
@@ -281,6 +287,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void invert_selection_in_track ();
        void invert_selection ();
        void deselect_all ();
+       long select_range (framepos_t, framepos_t);
 
        void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
 
@@ -477,7 +484,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
 
        struct VisualState {
-           VisualState();
+           VisualState (bool with_tracks);
            ~VisualState ();
            double              y_position;
            double              frames_per_unit;
@@ -496,10 +503,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void swap_visual_state ();
 
        std::vector<VisualState*> visual_states;
-       sigc::connection visual_state_op_connection;
        void start_visual_state_op (uint32_t n);
        void cancel_visual_state_op (uint32_t n);
-       bool end_visual_state_op (uint32_t n);
 
        framepos_t leftmost_frame;
        double      frames_per_unit;
@@ -510,6 +515,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        Editing::MouseMode mouse_mode;
        Editing::MouseMode pre_internal_mouse_mode;
+       Editing::SnapType  pre_internal_snap_type;
+       Editing::SnapMode  pre_internal_snap_mode;
+       Editing::SnapType  internal_snap_type;
+       Editing::SnapMode  internal_snap_mode;
        bool _internal_editing;
        Editing::MouseMode effective_mouse_mode () const;
 
@@ -629,18 +638,21 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void get_equivalent_regions (RegionView* rv, std::vector<RegionView*> &, PBD::PropertyID) const;
        RegionSelection get_equivalent_regions (RegionSelection &, PBD::PropertyID) const;
+       std::vector<boost::shared_ptr<ARDOUR::Crossfade> > get_equivalent_crossfades (
+               RouteTimeAxisView&, boost::shared_ptr<ARDOUR::Crossfade>, PBD::PropertyID
+               ) const;
        void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, PBD::PropertyID) const;
        void mapover_tracks_with_unique_playlists (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, PBD::PropertyID) const;
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
-
        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 */
-
+       void mapped_get_equivalent_crossfades (
+               RouteTimeAxisView&, uint32_t, boost::shared_ptr<ARDOUR::Crossfade>, std::vector<boost::shared_ptr<ARDOUR::Crossfade> >*
+               ) const;
+       
        void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type);
        bool button_release_can_deselect;
 
@@ -652,15 +664,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false);
        void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
-       void set_selected_track_as_side_effect (Selection::Operation op, bool force = false);
-       bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false);
+       void set_selected_track_as_side_effect (Selection::Operation op);
+       bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set);
 
        bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr<ARDOUR::Region>);
        void collect_new_region_view (RegionView *);
        void collect_and_select_new_region_view (RegionView *);
 
-       long select_range_around_region (RegionView *);
-
        Gtk::Menu track_context_menu;
        Gtk::Menu track_region_context_menu;
        Gtk::Menu track_selection_context_menu;
@@ -702,6 +712,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void set_canvas_cursor ();
 
        ArdourCanvas::Canvas* track_canvas;
+       bool within_track_canvas;
 
        friend class VerboseCursor;
        VerboseCursor* _verbose_cursor;
@@ -1190,7 +1201,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void zoom_to_region (bool both_axes);
        void temporal_zoom_session ();
        void temporal_zoom (gdouble scale);
-       void temporal_zoom_by_frame (framepos_t start, framepos_t end, const std::string & op);
+       void temporal_zoom_by_frame (framepos_t start, framepos_t end);
        void temporal_zoom_to_frame (bool coarser, framepos_t frame);
 
        void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
@@ -1490,6 +1501,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void marker_menu_set_from_playhead ();
        void marker_menu_set_from_selection ();
        void marker_menu_range_to_next ();
+       void marker_menu_zoom_to_range ();
        void new_transport_marker_menu_set_loop ();
        void new_transport_marker_menu_set_punch ();
        void update_loop_range_view (bool visibility=false);
@@ -1552,7 +1564,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        ArdourButton mouse_zoom_button;
        ArdourButton mouse_timefx_button;
        ArdourButton mouse_audition_button;
-       ArdourButton join_object_range_button;
+
+       ButtonJoiner* smart_mode_joiner;
+       Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
 
        void                     mouse_mode_toggled (Editing::MouseMode m);
        void                     mouse_mode_object_range_toggled () {}
@@ -1793,14 +1807,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void update_title ();
        void update_title_s (const std::string & snapshot_name);
 
-       struct State {
-           Selection* selection;
-           double frames_per_unit;
-
-           State (PublicEditor const * e);
-           ~State ();
-       };
-
        void instant_save ();
 
        boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
@@ -1824,12 +1830,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
         */
        bool mouse_frame (framepos_t&, bool& in_track_canvas) const;
 
-       /* "whats mine is yours" */
-
        TimeFXDialog* current_timefx;
-
        static void* timefx_thread (void *arg);
-       void do_timefx (TimeFXDialog&);
+       void do_timefx ();
 
        int time_stretch (RegionSelection&, float fraction);
        int pitch_shift (RegionSelection&, float cents);
@@ -1899,8 +1902,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        ImageFrameSocketHandler* image_socket_listener ;
 #endif
 
-       void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
-       void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
+       void toggle_xfade_active (RouteTimeAxisView *, boost::weak_ptr<ARDOUR::Crossfade>);
+       void toggle_xfade_length (RouteTimeAxisView *, boost::weak_ptr<ARDOUR::Crossfade>);
        void edit_xfade (boost::weak_ptr<ARDOUR::Crossfade>);
        void xfade_edit_left_region ();
        void xfade_edit_right_region ();
@@ -1956,7 +1959,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        gint left_automation_track ();
 
        void reset_canvas_action_sensitivity (bool);
-       void toggle_gain_envelope_visibility ();
+       void set_gain_envelope_visibility (bool);
+       void set_region_gain_visibility (RegionView*, bool);
        void toggle_gain_envelope_active ();
        void reset_region_gain_envelopes ();
 
@@ -2082,6 +2086,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        int time_fx (ARDOUR::RegionList&, float val, bool pitching);
 
+       bool doing_range_stuff() const {
+               return (mouse_mode == Editing::MouseRange && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
+                       _join_object_range_state == JOIN_OBJECT_RANGE_RANGE;
+       }
+       
+       bool doing_object_stuff() const {
+               return (mouse_mode == Editing::MouseObject && (_join_object_range_state == JOIN_OBJECT_RANGE_NONE)) ||
+                       _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT;
+       }
+
+       void toggle_sound_midi_notes ();
+
        friend class Drag;
        friend class RegionDrag;
        friend class RegionMoveDrag;