Improve scrolling performance for sessions containing hundreds of regions over many...
[ardour.git] / gtk2_ardour / editor.h
index e8af889ad12de63e8719a9685846baa4e21471bd..47937700710d3a9e7c553ba2ee0f447eb938bf08 100644 (file)
@@ -61,9 +61,7 @@
 #include "editor_items.h"
 #include "region_selection.h"
 #include "canvas.h"
-#include "time_axis_view.h"
 #include "draginfo.h"
-#include "tempo_lines.h"
 
 namespace Gtkmm2ext {
        class TearOff;
@@ -98,9 +96,8 @@ class PlaylistSelector;
 class Marker;
 class GroupedButtons;
 class AutomationLine;
-class UIExportSpecification;
-class ExportDialog;
 class Selection;
+class TempoLines;
 class TimeSelection;
 class TrackSelection;
 class AutomationSelection;
@@ -130,7 +127,7 @@ class Editor : public PublicEditor
   public:
        Editor ();
        ~Editor ();
-
+       
        void             connect_to_session (ARDOUR::Session *);
        ARDOUR::Session* current_session() const { return session; }
        void             first_idle ();
@@ -240,7 +237,7 @@ class Editor : public PublicEditor
        }
 
        gulong frame_to_pixel (nframes64_t frame) const {
-               return (gulong) rint ((frame / (frames_per_unit *  GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
+               return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit)));
        }
 
        void flush_canvas ();
@@ -263,7 +260,6 @@ class Editor : public PublicEditor
 
        void set_show_measures (bool yn);
        bool show_measures () const { return _show_measures; }
-       bool initial_ruler_update_required;
 
 #ifdef FFT_ANALYSIS
        /* analysis window */
@@ -272,12 +268,11 @@ class Editor : public PublicEditor
 #endif
 
        /* export */
-
-       /* these initiate export ... */
        
-       void export_session();
-       void export_selection();
-
+       void export_audio ();
+       void export_selection ();
+       void export_range ();
+       void export_region ();
 
        void add_toplevel_controls (Gtk::Container&);
        Gtk::HBox& get_status_bar_packer()  { return status_bar_hpacker; }
@@ -548,6 +543,8 @@ class Editor : public PublicEditor
        void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false);
        void select_all_tracks ();
 
+       int get_regionview_count_from_region_list (boost::shared_ptr<ARDOUR::Region> region);
+       
        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 (bool force = false);
@@ -600,7 +597,6 @@ class Editor : public PublicEditor
        Gdk::Cursor* which_grabber_cursor ();
 
        ArdourCanvas::Canvas* track_canvas;
-       ArdourCanvas::Canvas* time_canvas;
 
        ArdourCanvas::Text* first_action_message;
        ArdourCanvas::Text* verbose_canvas_cursor;
@@ -620,7 +616,7 @@ class Editor : public PublicEditor
        Gtk::EventBox      time_canvas_event_box;
        Gtk::EventBox      track_canvas_event_box;
        Gtk::EventBox      time_button_event_box;
-       Gtk::Frame         time_button_frame;
+       Gtk::EventBox      ruler_label_event_box;
 
        ArdourCanvas::Group      *minsec_group;
        ArdourCanvas::Pixbuf     *logo_item;
@@ -633,6 +629,25 @@ class Editor : public PublicEditor
        ArdourCanvas::Group      *range_marker_group;
        ArdourCanvas::Group      *transport_marker_group;
        ArdourCanvas::Group*      cd_marker_group;
+
+       ArdourCanvas::Group*      timebar_group;
+
+       /* These bars never need to be scrolled */
+       ArdourCanvas::Group*      meter_bar_group;
+       ArdourCanvas::Group*      tempo_bar_group;
+       ArdourCanvas::Group*      marker_bar_group;
+       ArdourCanvas::Group*      range_marker_bar_group;
+       ArdourCanvas::Group*      transport_marker_bar_group;
+       ArdourCanvas::Group*      cd_marker_bar_group;
+
+       /** The group containing all items that require horizontal scrolling. */
+       ArdourCanvas::Group* _master_group;
+
+       /* The group containing all trackviews.  Only scrolled vertically. */
+       ArdourCanvas::Group* _trackview_group;
+       
+       /* The group used for region motion.  Sits on top of _trackview_group */
+       ArdourCanvas::Group* _region_motion_group;
        
        enum RulerType {
                ruler_metric_smpte = 0,
@@ -755,6 +770,7 @@ class Editor : public PublicEditor
 
        static const double timebar_height;
        guint32 visible_timebars;
+       gdouble canvas_timebars_vsize;
        Gtk::Menu          *editor_ruler_menu;
        
        ArdourCanvas::SimpleRect* tempo_bar;
@@ -842,6 +858,7 @@ class Editor : public PublicEditor
        Gtk::Layout         controls_layout;
        bool control_layout_scroll (GdkEventScroll* ev);
        void controls_layout_size_request (Gtk::Requisition*);
+       sigc::connection controls_layout_size_request_connection;
 
        Gtk::HScrollbar     edit_hscrollbar;
        bool                _dragging_hscrollbar;
@@ -858,12 +875,12 @@ class Editor : public PublicEditor
        nframes64_t last_canvas_frame;
 
        bool track_canvas_map_handler (GdkEventAny*);
-       bool time_canvas_map_handler (GdkEventAny*);
 
        gint edit_controls_button_release (GdkEventButton*);
        Gtk::Menu *edit_controls_left_menu;
        Gtk::Menu *edit_controls_right_menu;
 
+       Gtk::VBox           ruler_label_vbox;
        Gtk::VBox           track_canvas_vbox;
        Gtk::VBox           time_canvas_vbox;
        Gtk::VBox           edit_controls_vbox;
@@ -874,7 +891,12 @@ class Editor : public PublicEditor
        bool deferred_control_scroll (nframes64_t);
        sigc::connection control_scroll_connection;
 
+       gdouble get_trackview_group_vertical_offset () const { return vertical_adjustment.get_value () - canvas_timebars_vsize;}
+       ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; }
+       double last_trackview_group_vertical_offset;
        void tie_vertical_scrolling ();
+       void scroll_canvas_horizontally ();
+       void scroll_canvas_vertically ();
        void canvas_horizontally_scrolled ();
        void canvas_scroll_to (nframes64_t);
 
@@ -906,13 +928,37 @@ class Editor : public PublicEditor
 
        struct RegionListDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
            RegionListDisplayModelColumns() {
-                   add (name);
+                       add (name);
                    add (region);
                    add (color_);
+                   add (start);
+                   add (end);
+                   add (length);
+                       add (sync);
+                       add (fadein);
+                       add (fadeout);
+                       add (locked);
+                       add (glued);
+                       add (muted);
+                       add (opaque);
+                       add (used);
+                   add (path);
            }
            Gtk::TreeModelColumn<Glib::ustring> name;
            Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Region> > region;
            Gtk::TreeModelColumn<Gdk::Color> color_;
+           Gtk::TreeModelColumn<Glib::ustring> start;
+           Gtk::TreeModelColumn<Glib::ustring> end;
+           Gtk::TreeModelColumn<Glib::ustring> length;
+           Gtk::TreeModelColumn<Glib::ustring> sync;
+           Gtk::TreeModelColumn<Glib::ustring> fadein;
+           Gtk::TreeModelColumn<Glib::ustring> fadeout;
+           Gtk::TreeModelColumn<bool> locked;
+           Gtk::TreeModelColumn<bool> glued;
+           Gtk::TreeModelColumn<bool> muted;
+           Gtk::TreeModelColumn<bool> opaque;
+           Gtk::TreeModelColumn<Glib::ustring> used;
+           Gtk::TreeModelColumn<Glib::ustring> path;
        };
            
        RegionListDisplayModelColumns          region_list_columns;
@@ -1060,6 +1106,11 @@ class Editor : public PublicEditor
        void add_regions_to_region_display (std::vector<boost::weak_ptr<ARDOUR::Region> > & );
        void region_hidden (boost::shared_ptr<ARDOUR::Region>);
        void redisplay_regions ();
+       void populate_row (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &);
+       void update_region_row (boost::shared_ptr<ARDOUR::Region>);
+       bool update_region_subrows (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int);
+       void update_all_region_rows ();
+       void update_all_region_subrows (Gtk::TreeModel::Row const &, int);
        bool no_region_list_redisplay;
        void insert_into_tmp_regionlist(boost::shared_ptr<ARDOUR::Region>);
 
@@ -1181,6 +1232,7 @@ class Editor : public PublicEditor
        
        void add_external_audio_action (Editing::ImportMode);
        void external_audio_dialog ();
+       void session_import_dialog ();
 
        int  check_whether_and_how_to_import(string, bool all_or_nothing = true);
        bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
@@ -1464,17 +1516,13 @@ public:
 
        bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
        bool track_canvas_scroll (GdkEventScroll* event);
-       bool time_canvas_scroll (GdkEventScroll* event);
 
        bool track_canvas_scroll_event (GdkEventScroll* event);
        bool track_canvas_button_press_event (GdkEventButton* event);
        bool track_canvas_button_release_event (GdkEventButton* event);
        bool track_canvas_motion_notify_event (GdkEventMotion* event);
 
-       bool time_canvas_scroll_event (GdkEventScroll* event);
-
        Gtk::Allocation canvas_allocation;
-       bool canvas_idle_queued;
        void track_canvas_allocate (Gtk::Allocation alloc);
        bool track_canvas_size_allocated ();
 
@@ -1489,9 +1537,6 @@ public:
 
        void handle_new_duration ();
        void initialize_canvas ();
-       int canvas_hroizontally_scrolled_handler_id;
-       void reset_horizontally_scrolling_region (Gtk::Allocation* alloc = 0);
-       void reset_scrolling_region (Gtk::Allocation* alloc = 0);
 
        /* display control */
        
@@ -1505,11 +1550,9 @@ public:
        
        ARDOUR::TempoMap::BBTPointList *current_bbt_points;
        
-       ArdourCanvas::Group* time_line_group;
-       ArdourCanvas::Group* marker_time_line_group;
-       
        TempoLines* tempo_lines;
-       TempoLines* marker_tempo_lines;
+
+       ArdourCanvas::Group* time_line_group;
 
        void hide_measures ();
        void draw_measures ();
@@ -1545,7 +1588,6 @@ public:
        void marker_menu_set_from_playhead ();
        void marker_menu_set_from_selection ();
        void marker_menu_range_to_next ();
-       void marker_menu_export_range ();
        void new_transport_marker_menu_set_loop ();
        void new_transport_marker_menu_set_punch ();
        void update_loop_range_view (bool visibility=false);
@@ -1576,7 +1618,6 @@ public:
        void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
        void compute_current_bbt_points (nframes_t left, nframes_t right);
-       int tempo_map_change_idle_handler_id;
        void tempo_map_changed (ARDOUR::Change);
        void redisplay_tempo (bool immediate_redraw);
        
@@ -1587,10 +1628,9 @@ public:
        uint32_t bbt_beat_subdivision;
 
        /* toolbar */
-       
+
        Gtk::ToggleButton editor_mixer_button;
        Gtk::ToggleButton editor_list_button;
-
        void editor_mixer_button_toggled ();
        void editor_list_button_toggled ();
 
@@ -1887,12 +1927,13 @@ public:
        uint32_t autoscroll_cnt;
        nframes64_t autoscroll_x_distance;
        double autoscroll_y_distance;
-     
+
        static gint _autoscroll_canvas (void *);
        bool autoscroll_canvas ();
        void start_canvas_autoscroll (int x, int y);
        void stop_canvas_autoscroll ();
        void maybe_autoscroll (GdkEventMotion*);
+       void maybe_autoscroll_horizontally (GdkEventMotion*);
        bool allow_vertical_scroll;
 
        /* trimming */
@@ -1972,15 +2013,8 @@ public:
 
        /* audio export */
 
-       ExportDialog *export_dialog;
-       ExportDialog *export_range_markers_dialog;
-       
-       void export_range (nframes64_t start, nframes64_t end);
-       void export_range_markers ();
-
        int  write_region_selection(RegionSelection&);
        bool write_region (string path, boost::shared_ptr<ARDOUR::AudioRegion>);
-       void export_region ();
        void bounce_region_selection ();
        void bounce_range_selection (bool replace);
        void external_edit_region ();