more verbose debug output for slave debugging
[ardour.git] / gtk2_ardour / editor.h
index 0321f45e4c8a5bf7695bfcc25b5c3f5a03a46f07..68ba1101234b985522252bf44a7b63ce0affc96c 100644 (file)
 #include <gtkmm/layout.h>
 
 #include "gtkmm2ext/bindings.h"
-#include "gtkmm2ext/click_box.h"
 #include "gtkmm2ext/dndtreeview.h"
-#include "gtkmm2ext/pane.h"
-#include "gtkmm2ext/selector.h"
-#include "gtkmm2ext/stateful_button.h"
 
 #include "pbd/stateful.h"
 #include "pbd/signals.h"
 #include "canvas/fwd.h"
 #include "canvas/ruler.h"
 
-#include "ardour_button.h"
+#include "widgets/ardour_button.h"
+#include "widgets/ardour_dropdown.h"
+#include "widgets/pane.h"
+
 #include "ardour_dialog.h"
-#include "ardour_dropdown.h"
 #include "public_editor.h"
 #include "editing.h"
 #include "enums.h"
@@ -102,7 +100,6 @@ class AutomationLine;
 class AutomationSelection;
 class AutomationTimeAxisView;
 class BundleManager;
-class ButtonJoiner;
 class ControlPoint;
 class CursorContext;
 class DragManager;
@@ -115,7 +112,6 @@ class EditorRoutes;
 class EditorRouteGroups;
 class EditorSnapshots;
 class EditorSummary;
-class GroupedButtons;
 class GUIObjectState;
 class ArdourMarker;
 class MidiRegionView;
@@ -140,14 +136,13 @@ class TimeSelection;
 class RegionLayeringOrderEditor;
 class VerboseCursor;
 
-class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
+class Editor : public PublicEditor, public PBD::ScopedConnectionList
 {
- public:
+public:
        Editor ();
        ~Editor ();
 
        void             set_session (ARDOUR::Session *);
-       ARDOUR::Session* session() const { return _session; }
 
        Gtk::Window* use_own_window (bool and_fill_it);
 
@@ -197,7 +192,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void foreach_time_axis_view (sigc::slot<void,TimeAxisView&>);
        void add_to_idle_resize (TimeAxisView*, int32_t);
 
-       RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const;
+       StripableTimeAxisView* get_stripable_time_axis_by_id (const PBD::ID& id) const;
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -243,8 +238,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
                return pixel * samples_per_pixel;
        }
 
-        double sample_to_pixel (framepos_t sample) const {
-               return round (sample / (double) samples_per_pixel);
+       double sample_to_pixel (framepos_t sample) const {
+               return round (sample / (double) samples_per_pixel);
        }
 
        double sample_to_pixel_unrounded (framepos_t sample) const {
@@ -256,14 +251,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Selection& get_selection() const { return *selection; }
        bool get_selection_extents (framepos_t &start, framepos_t &end) const;  // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes
        Selection& get_cut_buffer() const { return *cut_buffer; }
-       void track_mixer_selection ();
+
+       void set_selection (std::list<Selectable*>, Selection::Operation);
 
        bool extend_selection_to_track (TimeAxisView&);
 
        void play_selection ();
-       framepos_t get_preroll ();
        void maybe_locate_with_edit_preroll (framepos_t);
        void play_with_preroll ();
+       void rec_with_preroll ();
+       void rec_with_count_in ();
        void select_all_in_track (Selection::Operation op);
        void select_all_objects (Selection::Operation op);
        void invert_selection_in_track ();
@@ -329,6 +326,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void set_selected_mixer_strip (TimeAxisView&);
        void mixer_strip_width_changed ();
        void hide_track_in_display (TimeAxisView* tv, bool apply_to_selection = false);
+       void show_track_in_display (TimeAxisView* tv, bool move_into_view = false);
+       void tempo_curve_selected (ARDOUR::TempoSection* ts, bool yn);
 
        /* nudge is initiated by transport controls owned by ARDOUR_UI */
 
@@ -365,10 +364,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void set_group_tabs ();
        void toggle_measure_visibility ();
 
+       /* returns the left-most and right-most time that the gui should allow the user to scroll to */
+       std::pair <framepos_t,framepos_t> session_gui_extents( bool use_extra = true ) const; 
+
        /* fades */
 
-       void toggle_region_fades (int dir);
-       void update_region_fade_visibility ();
+       void toggle_region_fades (int dir);
+       void update_region_fade_visibility ();
 
        /* redirect shared ops menu. caller must free returned menu */
 
@@ -390,6 +392,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void scroll_left_half_page ();
        void scroll_right_half_page ();
 
+       void select_topmost_track ();
+
        void prepare_for_cleanup ();
        void finish_cleanup ();
 
@@ -421,7 +425,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void start_resize_line_ops ();
        void end_resize_line_ops ();
 
-       TrackViewList const & get_track_views () {
+       TrackViewList const & get_track_views () const {
                return track_views;
        }
 
@@ -453,20 +457,20 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
 
-       void snap_to (framepos_t&       first,
-                     ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
-                     bool              for_mark  = false,
-                     bool              ensure_snap = false);
+       void snap_to (ARDOUR::MusicFrame& first,
+                     ARDOUR::RoundMode   direction = ARDOUR::RoundNearest,
+                     bool                for_mark  = false,
+                     bool                ensure_snap = false);
 
-       void snap_to_with_modifier (framepos_t&       first,
-                                   GdkEvent const *  ev,
-                                   ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
-                                   bool              for_mark  = false);
+       void snap_to_with_modifier (ARDOUR::MusicFrame& first,
+                                   GdkEvent const *    ev,
+                                   ARDOUR::RoundMode   direction = ARDOUR::RoundNearest,
+                                   bool                for_mark  = false);
 
-       void snap_to (framepos_t&       first,
-                     framepos_t&       last,
-                     ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
-                     bool              for_mark  = false);
+       void snap_to (ARDOUR::MusicFrame& first,
+                     ARDOUR::MusicFrame& last,
+                     ARDOUR::RoundMode   direction = ARDOUR::RoundNearest,
+                     bool                for_mark  = false);
 
        void begin_selection_op_history ();
        void begin_reversible_selection_op (std::string cmd_name);
@@ -543,7 +547,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* editing operations that need to be public */
        void mouse_add_new_marker (framepos_t where, bool is_cd=false);
-       void split_regions_at (framepos_t, RegionSelection&, const int32_t sub_num, bool snap = true);
+       void split_regions_at (ARDOUR::MusicFrame, RegionSelection&, bool snap = true);
        void split_region_at_points (boost::shared_ptr<ARDOUR::Region>, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false);
        RegionSelection get_regions_from_selection_and_mouse (framepos_t);
 
@@ -552,16 +556,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void edit_tempo_section (ARDOUR::TempoSection*);
        void edit_meter_section (ARDOUR::MeterSection*);
 
-  protected:
+protected:
        void map_transport_state ();
        void map_position_change (framepos_t);
+       void transport_looped ();
 
        void on_realize();
 
        void suspend_route_redisplay ();
        void resume_route_redisplay ();
 
-  private:
+private:
 
        void color_handler ();
 
@@ -577,13 +582,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        typedef std::pair<TimeAxisView*,XMLNode*> TAVState;
 
        struct VisualState {
-           VisualState (bool with_tracks);
-           ~VisualState ();
-           double              y_position;
-           framecnt_t          samples_per_pixel;
-           framepos_t          leftmost_frame;
-           Editing::ZoomFocus  zoom_focus;
-           GUIObjectState*     gui_state;
+               VisualState (bool with_tracks);
+               ~VisualState ();
+               double              y_position;
+               framecnt_t          samples_per_pixel;
+               framepos_t          leftmost_frame;
+               Editing::ZoomFocus  zoom_focus;
+               GUIObjectState*     gui_state;
        };
 
        std::list<VisualState*> undo_visual_stack;
@@ -604,6 +609,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Editing::ZoomFocus zoom_focus;
 
        void set_samples_per_pixel (framecnt_t);
+       void on_samples_per_pixel_changed ();
 
        Editing::MouseMode mouse_mode;
        Editing::SnapType  pre_internal_snap_type;
@@ -626,13 +632,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        boost::optional<float>  pre_notebook_shrink_pane_width;
 
+       Gtk::VBox _editor_list_vbox;
        Gtk::Notebook _the_notebook;
        bool _notebook_shrunk;
        void add_notebook_page (std::string const &, Gtk::Widget &);
        bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
 
-       Gtkmm2ext::HPane   edit_pane;
-       Gtkmm2ext::VPane   editor_summary_pane;
+       ArdourWidgets::HPane edit_pane;
+       ArdourWidgets::VPane editor_summary_pane;
 
        Gtk::EventBox meter_base;
        Gtk::HBox     meter_box;
@@ -654,6 +661,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void toggle_marker_lines ();
        void set_marker_line_visibility (bool);
 
+       void jump_forward_to_mark ();
+       void jump_backward_to_mark ();
+
        uint32_t location_marker_color;
        uint32_t location_range_color;
        uint32_t location_loop_color;
@@ -728,6 +738,9 @@ 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;
+       RegionView* regionview_from_region (boost::shared_ptr<ARDOUR::Region>) const;
+       RouteTimeAxisView* rtav_from_route (boost::shared_ptr<ARDOUR::Route>) 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;
 
@@ -1054,7 +1067,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        Gtk::HBox           toplevel_hpacker;
 
-       Gtk::HBox           top_hbox;
        Gtk::HBox           bottom_hbox;
 
        Gtk::Table          edit_packer;
@@ -1105,7 +1117,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void control_scroll (float);
        void control_select (boost::shared_ptr<ARDOUR::Stripable>, Selection::Operation);
        void control_unselect ();
-       void access_action (std::string,std::string);
+       void access_action (const std::string&, const std::string&);
+       void set_toggleaction (const std::string&, const std::string&, bool);
        bool deferred_control_scroll (framepos_t);
        sigc::connection control_scroll_connection;
 
@@ -1117,7 +1130,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
                enum Type {
                        TimeOrigin = 0x1,
                        ZoomLevel = 0x2,
-                       YOrigin = 0x4
+                       YOrigin = 0x4,
+                       VideoTimeline = 0x8
                };
 
                Type       pending;
@@ -1136,6 +1150,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        };
 
        VisualChange pending_visual_change;
+       bool visual_change_queued;
+
+       void pre_render ();
 
        static int _idle_visual_changer (void *arg);
        int idle_visual_changer ();
@@ -1145,16 +1162,24 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        /* track views */
        TrackViewList track_views;
        std::pair<TimeAxisView*, double> trackview_by_y_position (double, bool trackview_relative_offset = true) const;
-       TimeAxisView* axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
+
+       AxisView* axis_view_by_stripable (boost::shared_ptr<ARDOUR::Stripable>) const;
+       AxisView* axis_view_by_control (boost::shared_ptr<ARDOUR::AutomationControl>) const;
+
+       TimeAxisView* time_axis_view_from_stripable (boost::shared_ptr<ARDOUR::Stripable> s) const {
+               return dynamic_cast<TimeAxisView*> (axis_view_by_stripable (s));
+       }
 
        TrackViewList get_tracks_for_range_action () const;
 
        sigc::connection super_rapid_screen_update_connection;
-       framepos_t last_update_frame;
        void center_screen_internal (framepos_t, float);
 
        void super_rapid_screen_update ();
 
+       int64_t _last_update_time;
+       double _err_screen_engine;
+
        void session_going_away ();
 
        framepos_t cut_buffer_start;
@@ -1257,6 +1282,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void normalize_region ();
        void reset_region_scale_amplitude ();
        void adjust_region_gain (bool up);
+       void reset_region_gain ();
        void quantize_region ();
        void quantize_regions (const RegionSelection& rs);
        void legatize_region (bool shrink_only);
@@ -1316,6 +1342,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void calc_extra_zoom_edges(framepos_t &start, framepos_t &end);
        void temporal_zoom_selection (Editing::ZoomAxis);
        void temporal_zoom_session ();
+       void temporal_zoom_extents ();
        void temporal_zoom (framecnt_t samples_per_pixel);
        void temporal_zoom_by_frame (framepos_t start, framepos_t end);
        void temporal_zoom_to_frame (bool coarser, framepos_t frame);
@@ -1337,8 +1364,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        /* import & embed */
 
        void add_external_audio_action (Editing::ImportMode);
-       void external_audio_dialog ();
-       void session_import_dialog ();
 
        int  check_whether_and_how_to_import(std::string, bool all_or_nothing = true);
        bool check_multichannel_status (const std::vector<std::string>& paths);
@@ -1401,6 +1426,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        AnalysisWindow* analysis_window;
 
+       /* import & embed */
+       void external_audio_dialog ();
+       void session_import_dialog ();
+
        /* import specific info */
 
        struct EditorImportStatus : public ARDOUR::ImportStatus {
@@ -1421,7 +1450,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void import_audio (bool as_tracks);
        void do_import (std::vector<std::string> paths, bool split, bool as_tracks);
-       void import_smf_tempo_map (Evoral::SMF const &);
+       void import_smf_tempo_map (Evoral::SMF const &, framepos_t pos);
        void move_to_start ();
        void move_to_end ();
        void center_playhead ();
@@ -1439,8 +1468,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void clear_locations ();
        void unhide_markers ();
        void unhide_ranges ();
-       void jump_forward_to_mark ();
-       void jump_backward_to_mark ();
        void cursor_align (bool playhead_to_edit);
        void toggle_skip_playback ();
 
@@ -1603,10 +1630,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void queue_visual_videotimeline_update ();
        void embed_audio_from_video (std::string, framepos_t n = 0, bool lock_position_to_video = true);
 
+       bool track_selection_change_without_scroll () const {
+               return _track_selection_change_without_scroll;
+       }
+
        PBD::Signal0<void> EditorFreeze;
        PBD::Signal0<void> EditorThaw;
 
-  private:
+private:
        friend class DragManager;
        friend class EditorRouteGroups;
        friend class EditorRegions;
@@ -1633,8 +1664,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void initialize_canvas ();
 
-       void set_script_action_name (int i, const std::string&);
-
        /* display control */
 
        bool _show_measures;
@@ -1675,7 +1704,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void marker_menu_rename ();
        void rename_marker (ArdourMarker *marker);
        void toggle_marker_lock_style ();
+       void toggle_tempo_clamped ();
        void toggle_tempo_type ();
+       void ramp_to_next_tempo ();
        void toggle_marker_menu_lock ();
        void toggle_marker_menu_glue ();
        void marker_menu_hide ();
@@ -1698,7 +1729,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
        void tempo_or_meter_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
        void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*);
-       void build_range_marker_menu (bool, bool);
+       void build_range_marker_menu (ARDOUR::Location *, bool, bool);
        void build_marker_menu (ARDOUR::Location *);
        void build_tempo_marker_menu (TempoMarker *, bool);
        void build_meter_marker_menu (MeterMarker *, bool);
@@ -1726,7 +1757,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void compute_current_bbt_points (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t left, framepos_t right);
 
        void tempo_map_changed (const PBD::PropertyChange&);
-       void marker_position_changed ();
+       void tempometric_position_changed (const PBD::PropertyChange&);
        void redisplay_tempo (bool immediate_redraw);
 
        uint32_t bbt_beat_subdivision;
@@ -1738,14 +1769,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void editor_mixer_button_toggled ();
        void editor_list_button_toggled ();
 
-       ArdourButton              zoom_in_button;
-       ArdourButton              zoom_out_button;
-       ArdourButton              zoom_out_full_button;
+       ArdourWidgets::ArdourButton   zoom_in_button;
+       ArdourWidgets::ArdourButton   zoom_out_button;
+       ArdourWidgets::ArdourButton   zoom_out_full_button;
 
-       ArdourButton              tav_expand_button;
-       ArdourButton              tav_shrink_button;
-       ArdourDropdown            visible_tracks_selector;
-       ArdourDropdown            zoom_preset_selector;
+       ArdourWidgets::ArdourButton   tav_expand_button;
+       ArdourWidgets::ArdourButton   tav_shrink_button;
+       ArdourWidgets::ArdourDropdown visible_tracks_selector;
+       ArdourWidgets::ArdourDropdown zoom_preset_selector;
 
        int32_t                   _visible_track_count;
        void build_track_count_menu ();
@@ -1758,15 +1789,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::Table               toolbar_selection_clock_table;
        Gtk::Label               toolbar_selection_cursor_label;
 
-       ArdourButton mouse_select_button;
-       ArdourButton mouse_draw_button;
-       ArdourButton mouse_move_button;
-       ArdourButton mouse_timefx_button;
-       ArdourButton mouse_content_button;
-       ArdourButton mouse_audition_button;
-       ArdourButton mouse_cut_button;
+       ArdourWidgets::ArdourButton mouse_select_button;
+       ArdourWidgets::ArdourButton mouse_draw_button;
+       ArdourWidgets::ArdourButton mouse_move_button;
+       ArdourWidgets::ArdourButton mouse_timefx_button;
+       ArdourWidgets::ArdourButton mouse_content_button;
+       ArdourWidgets::ArdourButton mouse_audition_button;
+       ArdourWidgets::ArdourButton mouse_cut_button;
 
-       ArdourButton smart_mode_button;
+       ArdourWidgets::ArdourButton smart_mode_button;
        Glib::RefPtr<Gtk::ToggleAction> smart_mode_action;
 
        void                     mouse_mode_toggled (Editing::MouseMode m);
@@ -1779,20 +1810,20 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::Button              automation_mode_button;
 
        //edit mode menu stuff
-       ArdourDropdown  edit_mode_selector;
-       void edit_mode_selection_done ( ARDOUR::EditMode m );
+       ArdourWidgets::ArdourDropdown   edit_mode_selector;
+       void edit_mode_selection_done (ARDOUR::EditMode);
        void build_edit_mode_menu ();
-       Gtk::VBox         edit_mode_box;
+       Gtk::VBox edit_mode_box;
 
        void set_edit_mode (ARDOUR::EditMode);
        void cycle_edit_mode ();
 
-       ArdourDropdown snap_type_selector;
+       ArdourWidgets::ArdourDropdown snap_type_selector;
        void build_snap_type_menu ();
 
-       ArdourDropdown snap_mode_selector;
+       ArdourWidgets::ArdourDropdown snap_mode_selector;
        void build_snap_mode_menu ();
-       Gtk::HBox         snap_box;
+       Gtk::HBox snap_box;
 
        std::vector<std::string> snap_type_strings;
        std::vector<std::string> snap_mode_strings;
@@ -1806,8 +1837,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Glib::RefPtr<Gtk::RadioAction> snap_mode_action (Editing::SnapMode);
 
        //zoom focus meu stuff
-       ArdourDropdown  zoom_focus_selector;
-       void zoom_focus_selection_done ( Editing::ZoomFocus f );
+       ArdourWidgets::ArdourDropdown   zoom_focus_selector;
+       void zoom_focus_selection_done (Editing::ZoomFocus);
        void build_zoom_focus_menu ();
        std::vector<std::string> zoom_focus_strings;
 
@@ -1815,17 +1846,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        Glib::RefPtr<Gtk::RadioAction> zoom_focus_action (Editing::ZoomFocus);
 
-       Gtk::HBox           _zoom_box;
-       void                zoom_adjustment_changed();
+       Gtk::HBox _track_box;
+
+       Gtk::HBox _zoom_box;
+       void zoom_adjustment_changed();
 
        void setup_toolbar ();
 
        void setup_tooltips ();
 
-       Gtk::HBox                toolbar_hbox;
-       Gtk::EventBox            toolbar_base;
-       Gtk::Frame               toolbar_frame;
-       Gtk::Viewport           _toolbar_viewport;
+       Gtk::HBox toolbar_hbox;
 
        void setup_midi_toolbar ();
 
@@ -1837,11 +1867,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void time_selection_changed ();
        void update_time_selection_display ();
-       void track_selection_changed ();
+       void presentation_info_changed (PBD::PropertyChange const &);
        void region_selection_changed ();
        sigc::connection editor_regions_selection_changed_connection;
        void sensitize_all_region_actions (bool);
-       void sensitize_the_right_region_actions ();
+       void sensitize_the_right_region_actions (bool because_canvas_crossing);
        bool _all_region_actions_sensitized;
        /** Flag to block region action handlers from doing what they normally do;
         *  I tried Gtk::Action::block_activate() but this doesn't work (ie it doesn't
@@ -1852,7 +1882,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void point_selection_changed ();
        void marker_selection_changed ();
 
-       bool _ignore_follow_edits;
+       bool _track_selection_change_without_scroll;
 
        void cancel_selection ();
        void cancel_time_selection ();
@@ -1863,35 +1893,35 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* transport range select process */
 
-       ArdourCanvas::Rectangle*  cd_marker_bar_drag_rect;
-       ArdourCanvas::Rectangle*  range_bar_drag_rect;
-       ArdourCanvas::Rectangle*  transport_bar_drag_rect;
-       ArdourCanvas::Rectangle     *transport_bar_range_rect;
-       ArdourCanvas::Rectangle     *transport_bar_preroll_rect;
-       ArdourCanvas::Rectangle     *transport_bar_postroll_rect;
-       ArdourCanvas::Rectangle     *transport_loop_range_rect;
-       ArdourCanvas::Rectangle     *transport_punch_range_rect;
-       ArdourCanvas::Line     *transport_punchin_line;
-       ArdourCanvas::Line     *transport_punchout_line;
-       ArdourCanvas::Rectangle     *transport_preroll_rect;
-       ArdourCanvas::Rectangle     *transport_postroll_rect;
+       ArdourCanvas::Rectangle* cd_marker_bar_drag_rect;
+       ArdourCanvas::Rectangle* range_bar_drag_rect;
+       ArdourCanvas::Rectangle* transport_bar_drag_rect;
+       ArdourCanvas::Rectangletransport_bar_range_rect;
+       ArdourCanvas::Rectangletransport_bar_preroll_rect;
+       ArdourCanvas::Rectangletransport_bar_postroll_rect;
+       ArdourCanvas::Rectangletransport_loop_range_rect;
+       ArdourCanvas::Rectangletransport_punch_range_rect;
+       ArdourCanvas::Line*      transport_punchin_line;
+       ArdourCanvas::Line*      transport_punchout_line;
+       ArdourCanvas::Rectangletransport_preroll_rect;
+       ArdourCanvas::Rectangletransport_postroll_rect;
 
-       ARDOUR::Location*  transport_loop_location();
-       ARDOUR::Location*  transport_punch_location();
+       ARDOUR::Location* transport_loop_location();
+       ARDOUR::Location* transport_punch_location();
 
-       ARDOUR::Location   *temp_location;
+       ARDOUR::Locationtemp_location;
 
        /* object rubberband select process */
 
        void select_all_within (framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool);
 
-       ArdourCanvas::Rectangle   *rubberband_rect;
+       ArdourCanvas::Rectanglerubberband_rect;
 
        EditorRouteGroups* _route_groups;
-       EditorRoutes* _routes;
-       EditorRegions* _regions;
-       EditorSnapshots* _snapshots;
-       EditorLocations* _locations;
+       EditorRoutes*      _routes;
+       EditorRegions*     _regions;
+       EditorSnapshots*   _snapshots;
+       EditorLocations*   _locations;
 
        /* diskstream/route display management */
        Glib::RefPtr<Gdk::Pixbuf> rec_enabled_icon;
@@ -1901,7 +1931,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        bool sync_track_view_list_and_routes ();
 
-       Gtk::VBox           list_vpacker;
+       Gtk::VBox list_vpacker;
 
        /* autoscrolling */
 
@@ -2059,8 +2089,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        /* nudge */
 
-       ArdourButton      nudge_forward_button;
-       ArdourButton      nudge_backward_button;
+       ArdourWidgets::ArdourButton      nudge_forward_button;
+       ArdourWidgets::ArdourButton      nudge_backward_button;
        Gtk::HBox        nudge_hbox;
        Gtk::VBox        nudge_vbox;
        AudioClock*       nudge_clock;
@@ -2122,7 +2152,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        Editing::EditPoint _edit_point;
 
-       ArdourDropdown edit_point_selector;
+       ArdourWidgets::ArdourDropdown edit_point_selector;
        void build_edit_point_menu();
 
        void set_edit_point_preference (Editing::EditPoint ep, bool force = false);
@@ -2141,24 +2171,26 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        void get_regions_at (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
        void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const;
 
-       RegionSelection get_regions_from_selection_and_edit_point ();
+       RegionSelection get_regions_from_selection_and_edit_point (Editing::EditIgnoreOption = Editing::EDIT_IGNORE_NONE,
+                                                                  bool use_context_click = false,
+                                                                  bool from_outside_canvas = false);
        RegionSelection get_regions_from_selection_and_entered () const;
 
        void start_updating_meters ();
        void stop_updating_meters ();
        bool meters_running;
 
-       void select_next_route ();
-       void select_prev_route ();
+       void select_next_stripable (bool routes_only = true);
+       void select_prev_stripable (bool routes_only = true);
 
-       void snap_to_internal (framepos_t&       first,
-                              ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
-                              bool              for_mark  = false,
-                              bool              ensure_snap = false);
+       void snap_to_internal (ARDOUR::MusicFrame& first,
+                              ARDOUR::RoundMode   direction = ARDOUR::RoundNearest,
+                              bool                for_mark  = false,
+                              bool                ensure_snap = false);
 
-       void timecode_snap_to_internal (framepos_t&       first,
-                                       ARDOUR::RoundMode direction = ARDOUR::RoundNearest,
-                                       bool              for_mark  = false);
+       void timecode_snap_to_internal (ARDOUR::MusicFrame& first,
+                                       ARDOUR::RoundMode   direction = ARDOUR::RoundNearest,
+                                       bool                for_mark  = false);
 
        RhythmFerret* rhythm_ferret;
 
@@ -2221,8 +2253,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        bool _region_selection_change_updates_region_list;
 
        void setup_fade_images ();
-       std::map<ARDOUR::FadeShape, Gtk::Image*> _fade_in_images;
-       std::map<ARDOUR::FadeShape, Gtk::Image*> _fade_out_images;
        std::map<ARDOUR::FadeShape, Gtk::Image*> _xfade_in_images;
        std::map<ARDOUR::FadeShape, Gtk::Image*> _xfade_out_images;
 
@@ -2260,7 +2290,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        QuantizeDialog* quantize_dialog;
        MainMenuDisabler* _main_menu_disabler;
 
-       /* private helper functions to help with registering axis */
+       /* private helper functions to help with registering region actions */
+
+       Glib::RefPtr<Gtk::Action> register_region_action (Glib::RefPtr<Gtk::ActionGroup> group, Editing::RegionActionTarget, char const * name, char const * label, sigc::slot<void> slot);
+       void register_toggle_region_action (Glib::RefPtr<Gtk::ActionGroup> group, Editing::RegionActionTarget, char const * name, char const * label, sigc::slot<void> slot);
 
        Glib::RefPtr<Gtk::Action> reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
        void toggle_reg_sens (Glib::RefPtr<Gtk::ActionGroup> group, char const * name, char const * label, sigc::slot<void> slot);
@@ -2286,7 +2319,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        friend class ControlPointDrag;
        friend class LineDrag;
        friend class RubberbandSelectDrag;
-       friend class RulerZoomDrag;
        friend class EditorRubberbandSelectDrag;
        friend class TimeFXDrag;
        friend class ScrubDrag;