rationalize destruction pathway (some more); tidy-ify some ImageFrame code
[ardour.git] / gtk2_ardour / editor.h
index f2779d353c7522d974aa553057d174385b86a2fc..ca1082af787791e2ed601ff051c2c58500cb59fd 100644 (file)
@@ -46,7 +46,9 @@
 #include <gtkmm2ext/dndtreeview.h>
 
 #include "pbd/stateful.h"
-#include "ardour/session.h"
+#include "pbd/signals.h"
+
+#include "ardour/import_status.h"
 #include "ardour/tempo.h"
 #include "ardour/location.h"
 #include "ardour/audioregion.h"
 #include "canvas.h"
 #include "editor_summary.h"
 
+namespace Gnome { namespace Canvas {
+       class NoEventText;
+} }
+
 namespace Gtkmm2ext {
        class TearOff;
 }
@@ -83,6 +89,8 @@ namespace ARDOUR {
        class Crossfade;
        class ChanCount;
        class MidiOperator;
+       class MidiTrack;
+       class AudioTrack;
 }
 
 namespace LADSPA {
@@ -115,11 +123,11 @@ class TempoLines;
 class TimeAxisView;
 class TimeFXDialog;
 class TimeSelection;
-class TrackSelection;
 class EditorGroupTabs;
 class EditorRoutes;
 class EditorRouteGroups;
 class EditorRegions;
+class EditorLocations;
 class EditorSnapshots;
 
 /* <CMT Additions> */
@@ -146,17 +154,18 @@ struct EditorCursor {
        void set_length (double units);
        void set_y_axis (double position);
 
-       sigc::signal<void, nframes64_t> PositionChanged;
+        PBD::Signal1<void, nframes64_t> PositionChanged;
 };
 
-class Editor : public PublicEditor
+class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr
 {
   public:
        Editor ();
        ~Editor ();
 
-       void             connect_to_session (ARDOUR::Session *);
-       ARDOUR::Session* current_session() const { return session; }
+       void             set_session (ARDOUR::Session *);
+       ARDOUR::Session* session() const { return _session; }
+
        void             first_idle ();
        virtual bool     have_idled () const { return _have_idled; }
 
@@ -176,11 +185,14 @@ class Editor : public PublicEditor
        void set_snap_mode (Editing::SnapMode);
        void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;}
 
+       Editing::SnapMode  snap_mode () const;
+       Editing::SnapType  snap_type () const;
+
        void undo (uint32_t n = 1);
        void redo (uint32_t n = 1);
 
        XMLNode& get_state ();
-       int set_state (const XMLNode&, int version = 3000);
+       int set_state (const XMLNode&, int version);
 
        void set_mouse_mode (Editing::MouseMode, bool force=true);
        void step_mouse_mode (bool next);
@@ -224,7 +236,6 @@ class Editor : public PublicEditor
        void separate_region_from_punch ();
        void separate_region_from_loop ();
        void separate_regions_using_location (ARDOUR::Location&);
-       void toggle_playback (bool with_abort);
        void transition_to_rolling (bool forward);
 
        /* undo related */
@@ -321,7 +332,6 @@ class Editor : public PublicEditor
        void copy_playlists (TimeAxisView* v);
        void clear_playlists (TimeAxisView* v);
 
-       TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
        void get_onscreen_tracks (TrackViewList&);
 
        Width editor_mixer_strip_width;
@@ -403,7 +413,6 @@ class Editor : public PublicEditor
        void toggle_meter_updating();
 
        void show_rhythm_ferret();
-       void show_bundle_manager ();
        void show_global_port_matrix (ARDOUR::DataType);
 
        void goto_visual_state (uint32_t);
@@ -423,6 +432,10 @@ class Editor : public PublicEditor
        void show_verbose_canvas_cursor_with (const std::string& txt);
        void hide_verbose_canvas_cursor();
 
+       void center_screen (nframes64_t);
+
+       TrackViewList axis_views_from_routes (boost::shared_ptr<ARDOUR::RouteList>) const;
+
   protected:
        void map_transport_state ();
        void map_position_change (nframes64_t);
@@ -433,7 +446,6 @@ class Editor : public PublicEditor
 
        void color_handler ();
 
-       ARDOUR::Session     *session; ///< The session that we are editing, or 0
        bool                 constructed;
 
        // to keep track of the playhead position for control_scroll
@@ -448,7 +460,6 @@ class Editor : public PublicEditor
            double              frames_per_unit;
            nframes64_t         leftmost_frame;
            Editing::ZoomFocus  zoom_focus;
-           bool                zoomed_to_region;
            std::list<TAVState> track_states;
        };
 
@@ -551,10 +562,8 @@ class Editor : public PublicEditor
        CrossfadeView*     clicked_crossfadeview;
        ControlPoint*      clicked_control_point;
 
-       void sort_track_selection (TrackSelection* sel = 0);
+       void sort_track_selection (TrackViewList* sel = 0);
 
-       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,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*, ARDOUR::RouteGroup::Property) const;
@@ -609,8 +618,7 @@ class Editor : public PublicEditor
        void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
 
        void handle_new_route (ARDOUR::RouteList&);
-       void remove_route (TimeAxisView *);
-       bool route_removal;
+       void timeaxisview_deleted (TimeAxisView *);
 
        Gtk::HBox           global_hpacker;
        Gtk::VBox           global_vpacker;
@@ -622,7 +630,7 @@ class Editor : public PublicEditor
 
        ArdourCanvas::Canvas* track_canvas;
 
-       ArdourCanvas::Text* verbose_canvas_cursor;
+       ArdourCanvas::NoEventText* verbose_canvas_cursor;
        bool                 verbose_cursor_visible;
 
        void parameter_changed (std::string);
@@ -643,7 +651,7 @@ class Editor : public PublicEditor
        ArdourCanvas::Group      *minsec_group;
        ArdourCanvas::Pixbuf     *logo_item;
        ArdourCanvas::Group      *bbt_group;
-       ArdourCanvas::Group      *smpte_group;
+       ArdourCanvas::Group      *timecode_group;
        ArdourCanvas::Group      *frame_group;
        ArdourCanvas::Group      *tempo_group;
        ArdourCanvas::Group      *meter_group;
@@ -679,7 +687,7 @@ class Editor : public PublicEditor
        ArdourCanvas::Group* _region_motion_group;
 
        enum RulerType {
-               ruler_metric_smpte = 0,
+               ruler_metric_timecode = 0,
                ruler_metric_bbt = 1,
                ruler_metric_frames = 2,
                ruler_metric_minsec = 3,
@@ -713,7 +721,7 @@ class Editor : public PublicEditor
        Gtk::Widget * ruler_grabbed_widget;
 
        void initialize_rulers ();
-       void update_just_smpte ();
+       void update_just_timecode ();
        void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers
        void update_fixed_rulers ();
        void update_tempo_based_rulers ();
@@ -726,7 +734,7 @@ class Editor : public PublicEditor
        void store_ruler_visibility ();
        void restore_ruler_visibility ();
 
-       static gint _metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
+       static gint _metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
        static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
        static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
        static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
@@ -745,20 +753,20 @@ class Editor : public PublicEditor
        gint minsec_nmarks;
        void set_minsec_ruler_scale (gdouble lower, gdouble upper);
 
-       enum SMPTERulerScale {
-               smpte_show_bits,
-               smpte_show_frames,
-               smpte_show_seconds,
-               smpte_show_minutes,
-               smpte_show_hours
+       enum TimecodeRulerScale {
+               timecode_show_bits,
+               timecode_show_frames,
+               timecode_show_seconds,
+               timecode_show_minutes,
+               timecode_show_hours
        };
 
-       SMPTERulerScale smpte_ruler_scale;
+       TimecodeRulerScale timecode_ruler_scale;
 
-       nframes_t smpte_mark_interval;
-       gint smpte_mark_modulo;
-       gint smpte_nmarks;
-       void set_smpte_ruler_scale (gdouble lower, gdouble upper);
+       nframes_t timecode_mark_interval;
+       gint timecode_mark_modulo;
+       gint timecode_nmarks;
+       void set_timecode_ruler_scale (gdouble lower, gdouble upper);
 
        enum BBTRulerScale {
                bbt_over,
@@ -780,17 +788,17 @@ class Editor : public PublicEditor
        uint32_t bbt_accent_modulo;
        void compute_bbt_ruler_scale (nframes64_t lower, nframes64_t upper);
 
-       gint metric_get_smpte (GtkCustomRulerMark **, gdouble, gdouble, gint);
+       gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
 
        Gtk::Widget        *_ruler_separator;
-       GtkWidget          *_smpte_ruler;
+       GtkWidget          *_timecode_ruler;
        GtkWidget          *_bbt_ruler;
        GtkWidget          *_frames_ruler;
        GtkWidget          *_minsec_ruler;
-       Gtk::Widget        *smpte_ruler;
+       Gtk::Widget        *timecode_ruler;
        Gtk::Widget        *bbt_ruler;
        Gtk::Widget        *frames_ruler;
        Gtk::Widget        *minsec_ruler;
@@ -811,7 +819,7 @@ class Editor : public PublicEditor
 
        Gtk::Label  minsec_label;
        Gtk::Label  bbt_label;
-       Gtk::Label  smpte_label;
+       Gtk::Label  timecode_label;
        Gtk::Label  frame_label;
        Gtk::Label  tempo_label;
        Gtk::Label  meter_label;
@@ -863,7 +871,6 @@ class Editor : public PublicEditor
        Gtk::HBox           bottom_hbox;
 
        Gtk::Table          edit_packer;
-       Gtk::VScrollbar     edit_vscrollbar;
 
        Gtk::Adjustment     vertical_adjustment;
        Gtk::Adjustment     horizontal_adjustment;
@@ -873,14 +880,8 @@ class Editor : public PublicEditor
        void controls_layout_size_request (Gtk::Requisition*);
        sigc::connection controls_layout_size_request_connection;
 
-       Gtk::HScrollbar     edit_hscrollbar;
-       bool                _dragging_hscrollbar;
-
-       void reset_hscrollbar_stepping ();
-
-       bool hscrollbar_button_press (GdkEventButton*);
-       bool hscrollbar_button_release (GdkEventButton*);
-       void hscrollbar_allocate (Gtk::Allocation &alloc);
+       void horizontal_scroll_left ();
+       void horizontal_scroll_right ();
 
        double _canvas_width;
        double _canvas_height;
@@ -945,42 +946,12 @@ class Editor : public PublicEditor
 
        void end_location_changed (ARDOUR::Location*);
 
-       /* named selections */
-
-       struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
-           NamedSelectionDisplayModelColumns() {
-                   add (text);
-                   add (selection);
-           }
-           Gtk::TreeModelColumn<Glib::ustring>  text;
-           Gtk::TreeModelColumn<ARDOUR::NamedSelection*>    selection;
-       };
-
-       NamedSelectionDisplayModelColumns named_selection_columns;
-       Glib::RefPtr<Gtk::TreeStore>     named_selection_model;
-
-       Gtkmm2ext::DnDTreeView<ARDOUR::NamedSelection*> named_selection_display;
-       Gtk::ScrolledWindow    named_selection_scroller;
-
-       void create_named_selection ();
-       void paste_named_selection (float times);
-       void remove_selected_named_selections ();
-
-       void handle_new_named_selection ();
-       void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
-       void redisplay_named_selections ();
-
-       bool named_selection_display_button_release (GdkEventButton *ev);
-       bool named_selection_display_key_release (GdkEventKey *ev);
-       void named_selection_display_selection_changed ();
-
        /* track views */
        TrackViewList track_views;
        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;
+       TimeAxisView* axis_view_from_route (boost::shared_ptr<ARDOUR::Route>) const;
 
-       TrackSelection get_tracks_for_range_action () const;
+       TrackViewList get_tracks_for_range_action () const;
 
        static Gdk::Cursor* cross_hair_cursor;
        static Gdk::Cursor* trimmer_cursor;
@@ -1003,7 +974,6 @@ class Editor : public PublicEditor
 
        sigc::connection scroll_connection;
        nframes64_t last_update_frame;
-       void center_screen (nframes64_t);
        void center_screen_internal (nframes64_t, float);
 
        void update_current_screen ();
@@ -1127,8 +1097,7 @@ class Editor : public PublicEditor
 
        void temporal_zoom_selection ();
        void temporal_zoom_region (bool both_axes);
-       void toggle_zoom_region (bool both_axes);
-       bool zoomed_to_region;
+       void zoom_to_region (bool both_axes);
        void temporal_zoom_session ();
        void temporal_zoom (gdouble scale);
        void temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const std::string & op);
@@ -1188,7 +1157,7 @@ class Editor : public PublicEditor
 
        /* import specific info */
 
-       struct EditorImportStatus : public ARDOUR::Session::ImportStatus {
+       struct EditorImportStatus : public ARDOUR::ImportStatus {
            Editing::ImportMode mode;
            nframes64_t pos;
            int target_tracks;
@@ -1287,8 +1256,8 @@ class Editor : public PublicEditor
        void extend_selection_to_end_of_region (bool next);
        void extend_selection_to_start_of_region (bool previous);
 
-       Editing::SnapType snap_type;
-       Editing::SnapMode snap_mode;
+       Editing::SnapType _snap_type;
+       Editing::SnapMode _snap_mode;
 
        /// Snap threshold in pixels
        double snap_threshold;
@@ -1311,7 +1280,6 @@ class Editor : public PublicEditor
        void set_fade_out_active (bool);
 
        std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
-       RegionSelection pre_drag_region_selection;
 
        bool _dragging_playhead;
        bool _dragging_edit_point;
@@ -1510,7 +1478,6 @@ public:
        void editor_mixer_button_toggled ();
        void editor_list_button_toggled ();
 
-       AudioClock               edit_point_clock;
        AudioClock               zoom_range_clock;
        Gtk::Button              zoom_in_button;
        Gtk::Button              zoom_out_button;
@@ -1584,8 +1551,6 @@ public:
 
        void                zoom_adjustment_changed();
 
-       void                edit_point_clock_changed();
-
        void setup_toolbar ();
 
        Gtkmm2ext::TearOff*      tools_tearoff;
@@ -1663,6 +1628,7 @@ public:
        EditorRoutes* _routes;
        EditorRegions* _regions;
        EditorSnapshots* _snapshots;
+       EditorLocations* _locations;
 
        /* diskstream/route display management */
        Glib::RefPtr<Gdk::Pixbuf> rec_enabled_icon;
@@ -1789,9 +1755,6 @@ public:
            ~State ();
        };
 
-       void store_state (State&) const;
-       void restore_state (State *);
-
        void instant_save ();
 
        boost::shared_ptr<ARDOUR::AudioRegion> last_audition_region;
@@ -1839,9 +1802,7 @@ public:
        bool show_editor_mixer_when_tracks_arrive;
        Gtk::VBox current_mixer_strip_vbox;
        void cms_new (boost::shared_ptr<ARDOUR::Route>);
-       void cms_deleted ();
        void current_mixer_strip_hidden ();
-       void current_mixer_strip_removed ();
 
        void detach_tearoff (Gtk::Box* b, Gtk::Window* w);
        void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n);
@@ -1928,7 +1889,7 @@ public:
 
        int playlist_deletion_dialog (boost::shared_ptr<ARDOUR::Playlist>);
 
-       std::vector<sigc::connection> session_connections;
+       PBD::ScopedConnectionList session_connections;
 
        /* tracking step changes of track height */
 
@@ -1982,13 +1943,11 @@ public:
        std::vector<std::string> edit_point_strings;
 
        void selected_marker_moved (ARDOUR::Location*);
-       sigc::connection edit_point_clock_connection_a;
-       sigc::connection edit_point_clock_connection_b;
 
        bool get_edit_op_range (nframes64_t& start, nframes64_t& end) const;
 
-       void get_regions_at (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
-       void get_regions_after (RegionSelection&, nframes64_t where, const TrackSelection& ts) const;
+       void get_regions_at (RegionSelection&, nframes64_t where, const TrackViewList& ts) const;
+       void get_regions_after (RegionSelection&, nframes64_t where, const TrackViewList& ts) const;
 
        void get_regions_for_action (RegionSelection&, bool allow_entered = false, bool allow_edit_position = true);
 
@@ -2002,12 +1961,13 @@ public:
        void select_prev_route ();
 
        void snap_to_internal (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
+       void timecode_snap_to_internal (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
 
        RhythmFerret* rhythm_ferret;
        BundleManager* _bundle_manager;
        GlobalPortMatrixWindow* _global_port_matrix[ARDOUR::DataType::num_types];
 
-       void fit_tracks (TrackSelection &);
+       void fit_tracks (TrackViewList &);
        void fit_selected_tracks ();
        void set_track_height (uint32_t h);
 
@@ -2026,6 +1986,7 @@ public:
        void located ();
        bool _pending_locate_request;
 
+       Gtk::HBox _summary_hbox;
        EditorSummary* _summary;
        void region_view_added (RegionView *);