more improvements and fixes for the import dialog
[ardour.git] / gtk2_ardour / editor.h
index efd201ecde4faec43845fa8f40e248e865b11ffe..9f1211010286af96394072c6e62ddd91e2cda0f1 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __ardour_editor_h__
@@ -26,6 +25,9 @@
 #include <set>
 #include <string>
 #include <sys/time.h>
+#include <glibmm/ustring.h>
+
+#include <boost/optional.hpp>
 
 #include <libgnomecanvasmm/canvas.h>
 #include <libgnomecanvasmm/group.h>
@@ -61,10 +63,6 @@ namespace Gtkmm2ext {
        class TearOff;
 }
 
-namespace LinuxAudioSystems {
-       class AudioEngine;
-}
-
 namespace ARDOUR {
        class AudioDiskstream;
        class RouteGroup;
@@ -104,6 +102,7 @@ class MixerStrip;
 class StreamView;
 class AudioStreamView;
 class ControlPoint;
+class SoundFileBrowser;
 #ifdef FFT_ANALYSIS
 class AnalysisWindow;
 #endif
@@ -122,7 +121,7 @@ class TimeAxisViewItem ;
 class Editor : public PublicEditor
 {
   public:
-       Editor (ARDOUR::AudioEngine&);
+       Editor ();
        ~Editor ();
 
        void             connect_to_session (ARDOUR::Session *);
@@ -147,11 +146,11 @@ class Editor : public PublicEditor
        void step_mouse_mode (bool next);
        Editing::MouseMode current_mouse_mode () { return mouse_mode; }
 
-       void add_imageframe_time_axis(const string & track_name, void*) ;
-       void add_imageframe_marker_time_axis(const string & track_name, TimeAxisView* marked_track, void*) ;
+       void add_imageframe_time_axis(const std::string & track_name, 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) ;
-       TimeAxisView* get_named_time_axis(const string & name) ;
+       TimeAxisView* get_named_time_axis(const std::string & name) ;
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -171,6 +170,7 @@ class Editor : public PublicEditor
        void separate_region_from_selection ();
        void separate_regions_using_location (ARDOUR::Location&);
        void toggle_playback (bool with_abort);
+       void transition_to_rolling (bool forward);
 
        /* undo related */
 
@@ -268,6 +268,7 @@ class Editor : public PublicEditor
        TrackViewList* get_valid_views (TimeAxisView*, ARDOUR::RouteGroup* grp = 0);
 
        Width editor_mixer_strip_width;
+       void maybe_add_mixer_strip_width (XMLNode&);
        void show_editor_mixer (bool yn);
        void set_selected_mixer_strip (TimeAxisView&);
        void hide_track_in_display (TimeAxisView& tv);
@@ -309,6 +310,7 @@ class Editor : public PublicEditor
        void toggle_xfades_active ();
        void toggle_xfade_visibility ();
        bool xfade_visibility() const { return _xfade_visibility; }
+       void update_xfade_visibility ();
        void update_crossfade_model ();
        void set_crossfade_model (ARDOUR::CrossfadeModel);
 
@@ -339,6 +341,8 @@ class Editor : public PublicEditor
        void reset_zoom (double);
        void reposition_and_zoom (nframes_t, double);
 
+       nframes_t edit_cursor_position(bool);
+
   protected:
        void map_transport_state ();
        void map_position_change (nframes_t);
@@ -348,8 +352,10 @@ class Editor : public PublicEditor
   private:
        
        ARDOUR::Session     *session;
-       ARDOUR::AudioEngine& engine;
        bool                 constructed;
+  
+       // to keep track of the playhead position for control_scroll
+       boost::optional<nframes_t> _control_scroll_target;
 
        PlaylistSelector* _playlist_selector;
 
@@ -422,11 +428,12 @@ class Editor : public PublicEditor
        void sort_track_selection ();
 
        void get_relevant_audio_tracks (std::set<AudioTimeAxisView*>& relevant_tracks);
+       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&);
        void mapover_audio_tracks (sigc::slot<void,AudioTimeAxisView&,uint32_t> sl);
 
        /* functions to be passed to mapover_audio_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_set_selected_regionview_from_click (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
        void mapped_use_new_playlist (AudioTimeAxisView&, uint32_t);
        void mapped_use_copy_playlist (AudioTimeAxisView&, uint32_t);
        void mapped_clear_playlist (AudioTimeAxisView&, uint32_t);
@@ -439,6 +446,7 @@ class Editor : public PublicEditor
        void catch_vanishing_regionview (RegionView *);
 
        bool 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);
        bool set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false);
@@ -502,6 +510,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;
 
        ArdourCanvas::Group      *minsec_group;
        ArdourCanvas::Group      *bbt_group;
@@ -558,6 +567,7 @@ class Editor : public PublicEditor
        gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint);
        gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint);
 
+       Gtk::Widget        *_ruler_separator;
        GtkWidget          *_smpte_ruler;
        GtkWidget          *_bbt_ruler;
        GtkWidget          *_frames_ruler;
@@ -606,7 +616,7 @@ class Editor : public PublicEditor
            nframes_t        current_frame;
            double                length;
 
-           Cursor (Editor&, const string& color, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
+           Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*));
            ~Cursor ();
 
            void set_position (nframes_t);
@@ -651,6 +661,7 @@ class Editor : public PublicEditor
        void controls_layout_size_request (Gtk::Requisition*);
 
        Gtk::HScrollbar     edit_hscrollbar;
+       bool                _dragging_hscrollbar;
 
        void reset_hscrollbar_stepping ();
        
@@ -768,10 +779,12 @@ class Editor : public PublicEditor
        SnapshotDisplayModelColumns snapshot_display_columns;
        Glib::RefPtr<Gtk::ListStore> snapshot_display_model;
        Gtk::TreeView snapshot_display;
+       Gtk::Menu snapshot_context_menu;
 
        bool snapshot_display_button_press (GdkEventButton*);
        void snapshot_display_selection_changed ();
        void redisplay_snapshots();
+       void popup_snapshot_context_menu (int, int32_t, Glib::ustring);
 
        /* named selections */
 
@@ -793,6 +806,8 @@ class Editor : public PublicEditor
        void create_named_selection ();
        void paste_named_selection (float times);
        void remove_selected_named_selections ();
+       void remove_snapshot (Glib::ustring);
+       void rename_snapshot (Glib::ustring);
 
        void handle_new_named_selection ();
        void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
@@ -803,7 +818,6 @@ class Editor : public PublicEditor
        void named_selection_display_selection_changed ();
 
        /* track views */
-       int track_spacing;
        TrackViewList  track_views;
        TimeAxisView     *trackview_by_y_position (double ypos);
 
@@ -949,14 +963,27 @@ class Editor : public PublicEditor
        void insert_region_list_selection (float times);
 
        void add_external_audio_action (Editing::ImportMode);
+       void external_audio_dialog ();
+       bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
+
+       SoundFileBrowser* sfbrowser;
+
+       void bring_in_external_audio (Editing::ImportMode mode,  nframes64_t& pos);
+       void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
+
+       void _do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
+       void do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
+       bool idle_do_embed (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode,  nframes64_t&);
 
-       void bring_in_external_audio (Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t& pos, bool prompt);
-       void do_import (vector<Glib::ustring> paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool);
-       void do_embed (vector<Glib::ustring> paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool);
-       int  import_sndfile (vector<Glib::ustring> paths, Editing::ImportMode mode, ARDOUR::AudioTrack* track, nframes_t& pos);
-       int  embed_sndfile (vector<Glib::ustring> paths, bool split, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, 
-                           ARDOUR::AudioTrack* track, nframes_t& pos, bool prompt);
-       int finish_bringing_in_audio (boost::shared_ptr<ARDOUR::AudioRegion> region, uint32_t, uint32_t, ARDOUR::AudioTrack* track, nframes_t& pos, Editing::ImportMode mode);
+       int  import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode,  nframes64_t& pos,
+                             int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
+       int  embed_sndfiles (vector<Glib::ustring> paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, 
+                            nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
+
+       int add_sources (vector<Glib::ustring> paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode,
+                        int target_regions, int target_tracks, boost::shared_ptr<ARDOUR::AudioTrack>&);
+       int finish_bringing_in_audio (boost::shared_ptr<ARDOUR::AudioRegion> region, uint32_t, uint32_t,  nframes64_t& pos, Editing::ImportMode mode,
+                                     boost::shared_ptr<ARDOUR::AudioTrack>& existing_track, int nth);
 
        /* generic interthread progress window */
        
@@ -1027,7 +1054,11 @@ class Editor : public PublicEditor
 
        void add_location_from_audio_region ();
        void add_location_from_selection ();
-       void set_route_loop_selection ();
+       void set_loop_from_selection (bool play);
+       void set_punch_from_selection ();
+
+       void set_loop_range (nframes_t start, nframes_t end, std::string cmd);
+       void set_punch_range (nframes_t start, nframes_t end, std::string cmd);
 
        void add_location_from_playhead_cursor ();
 
@@ -1037,6 +1068,10 @@ class Editor : public PublicEditor
        void start_scrolling ();
        void stop_scrolling ();
 
+       bool _scrubbing;
+       nframes64_t last_scrub_frame;
+       uint32_t last_scrub_time;
+
        void keyboard_selection_begin ();
        void keyboard_selection_finish (bool add);
        bool have_pending_keyboard_selection;
@@ -1166,13 +1201,17 @@ class Editor : public PublicEditor
 
        bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
        bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*);
-       bool track_canvas_event (GdkEvent* event, ArdourCanvas::Item*);
        bool track_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);
+
        Gtk::Allocation canvas_allocation;
        bool canvas_idle_queued;
        void track_canvas_allocate (Gtk::Allocation alloc);
-       bool track_canvas_idle ();
+       bool track_canvas_size_allocated ();
 
        void set_edit_cursor (GdkEvent* event);
        void set_playhead_cursor (GdkEvent* event);
@@ -1239,6 +1278,7 @@ class Editor : public PublicEditor
        void marker_menu_hide ();
        void marker_menu_loop_range ();
        void marker_menu_select_all_selectables_using_range ();
+       void marker_menu_select_using_range ();
        void marker_menu_separate_regions_using_location ();
        void marker_menu_play_from ();
        void marker_menu_play_range ();
@@ -1274,9 +1314,16 @@ class Editor : public PublicEditor
        void draw_metric_marks (const ARDOUR::Metrics& metrics);
 
        void tempo_map_changed (ARDOUR::Change);
-       void redisplay_tempo ();
+       void redisplay_tempo (bool immediate_redraw);
        
-       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false);
+       void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
+       void snap_to (nframes_t& first, int32_t direction = 0, bool for_mark = false) {
+               /* XXX remove this function when everything moves to 64 bit frame counts */
+               nframes64_t first64 = first;
+               snap_to (first64, direction, for_mark);
+               first = (nframes_t) first64;
+       }
+
        uint32_t bbt_beat_subdivision;
 
        /* toolbar */
@@ -1425,7 +1472,7 @@ class Editor : public PublicEditor
        void drag_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
        void end_rubberband_select (ArdourCanvas::Item* item, GdkEvent* event);
 
-       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, Selection::Operation op);
+       bool select_all_within (nframes_t start, nframes_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op);
        
        ArdourCanvas::SimpleRect   *rubberband_rect;
        
@@ -1832,6 +1879,7 @@ class Editor : public PublicEditor
        Glib::RefPtr<Gtk::Action>              redo_action;
 
        void history_changed ();
+       void color_handler ();
 };
 
 #endif /* __ardour_editor_h__ */