Fix displaying of notes in auto-created MIDI region when it's the first region in...
[ardour.git] / gtk2_ardour / editor.h
index cb78ccc344ff3aaed8c21f36a7b2005a0a1c18c9..7e96f9c9c551823545750994e93b30451fdce588 100644 (file)
 #include <string>
 #include <sys/time.h>
 
+#include <glibmm/ustring.h>
+
+#include <boost/optional.hpp>
+
 #include <libgnomecanvasmm/canvas.h>
 #include <libgnomecanvasmm/group.h>
 #include <libgnomecanvasmm/line.h>
+#include <libgnomecanvasmm/pixbuf.h>
 
 #include <cmath>
 
@@ -55,6 +60,7 @@
 #include "region_selection.h"
 #include "canvas.h"
 #include "draginfo.h"
+#include "tempo_lines.h"
 
 namespace Gtkmm2ext {
        class TearOff;
@@ -70,7 +76,7 @@ namespace ARDOUR {
        class TempoSection;
        class NamedSelection;
        class Session;
-       class AudioFilter;
+       class Filter;
        class Crossfade;
        class ChanCount;
 }
@@ -99,6 +105,7 @@ class MixerStrip;
 class StreamView;
 class AudioStreamView;
 class ControlPoint;
+class SoundFileOmega;
 #ifdef FFT_ANALYSIS
 class AnalysisWindow;
 #endif
@@ -141,12 +148,18 @@ class Editor : public PublicEditor
        void set_mouse_mode (Editing::MouseMode, bool force=true);
        void step_mouse_mode (bool next);
        Editing::MouseMode current_mouse_mode () const { return mouse_mode; }
+       
+       void set_midi_edit_cursor (Editing::MidiEditMode);
+       void set_midi_edit_mode (Editing::MidiEditMode, bool force=true);
+       Editing::MidiEditMode current_midi_edit_mode () const { return midi_edit_mode; }
 
+#ifdef WITH_CMT
        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 std::string & name) ;
+#endif
 
        void consider_auditioning (boost::shared_ptr<ARDOUR::Region>);
        void hide_a_region (boost::shared_ptr<ARDOUR::Region>);
@@ -242,6 +255,7 @@ class Editor : public PublicEditor
 
 
        void add_toplevel_controls (Gtk::Container&);
+       Gtk::HBox& get_status_bar_packer()  { return status_bar_hpacker; }
 
        void      set_zoom_focus (Editing::ZoomFocus);
        Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; }
@@ -257,15 +271,16 @@ class Editor : public PublicEditor
        nframes_t leftmost_frame;
        void clear_playlist (boost::shared_ptr<ARDOUR::Playlist>);
 
-       void new_playlists ();
-       void copy_playlists ();
-       void clear_playlists ();
+       void new_playlists (TimeAxisView* v);
+       void copy_playlists (TimeAxisView* v);
+       void clear_playlists (TimeAxisView* v);
 
        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 show_editor_list (bool yn);
        void set_selected_mixer_strip (TimeAxisView&);
        void hide_track_in_display (TimeAxisView& tv);
        void show_track_in_display (TimeAxisView& tv);
@@ -290,6 +305,7 @@ class Editor : public PublicEditor
        void toggle_waveform_visibility ();
        void toggle_waveforms_while_recording ();
        void toggle_measure_visibility ();
+       void toggle_logo_visibility ();
 
        /* SMPTE timecode & video sync */
 
@@ -338,6 +354,8 @@ class Editor : public PublicEditor
        void reposition_and_zoom (nframes_t, double);
 
        nframes_t edit_cursor_position(bool);
+       bool update_mouse_speed ();
+       bool decelerate_mouse_speed ();
 
   protected:
        void map_transport_state ();
@@ -346,15 +364,21 @@ class Editor : public PublicEditor
        void on_realize();
 
   private:
-       
+
+       /// The session that we are editing, or 0
+       void color_handler ();
        ARDOUR::Session     *session;
        bool                 constructed;
 
+       // to keep track of the playhead position for control_scroll
+       boost::optional<nframes_t> _control_scroll_target;
        PlaylistSelector* _playlist_selector;
 
        void          set_frames_per_unit (double);
 
-       Editing::MouseMode mouse_mode;
+       Editing::MouseMode    mouse_mode;
+       Editing::MidiEditMode midi_edit_mode;
 
        int  post_maximal_editor_width;
        int  post_maximal_pane_position;
@@ -426,12 +450,12 @@ class Editor : public PublicEditor
        void sort_track_selection ();
 
        void get_relevant_tracks (std::set<RouteTimeAxisView*>& relevant_tracks);
-       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&);
-       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl);
+       void get_equivalent_regions (RegionView* rv, std::vector<RegionView*>&) const;
+       void mapover_tracks (sigc::slot<void,RouteTimeAxisView&,uint32_t> sl, TimeAxisView*) const;
 
        /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */
 
-       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*);
+       void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector<RegionView*>*) const;
        void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t);
        void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t);
        void mapped_clear_playlist (RouteTimeAxisView&, uint32_t);
@@ -453,6 +477,9 @@ class Editor : public PublicEditor
        void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set);
        void collect_new_region_view (RegionView *);
 
+       Gtk::MenuItem* region_edit_menu_split_item;
+       Gtk::MenuItem* region_edit_menu_split_multichannel_item;
+
        void popup_track_context_menu (int, int, nframes_t);
        Gtk::Menu* build_track_context_menu (nframes_t);
        void add_bus_or_audio_track_context_items (Gtk::Menu_Helpers::MenuList&);
@@ -496,6 +523,7 @@ class Editor : public PublicEditor
        Gtk::Frame         time_button_frame;
 
        ArdourCanvas::Group      *minsec_group;
+       ArdourCanvas::Pixbuf     *logo_item;
        ArdourCanvas::Group      *bbt_group;
        ArdourCanvas::Group      *smpte_group;
        ArdourCanvas::Group      *frame_group;
@@ -571,13 +599,6 @@ class Editor : public PublicEditor
        ArdourCanvas::SimpleRect* range_marker_bar;
        ArdourCanvas::SimpleRect* transport_marker_bar;
 
-       
-       ArdourCanvas::SimpleLine* tempo_line;
-       ArdourCanvas::SimpleLine* meter_line;
-       ArdourCanvas::SimpleLine* marker_line;
-       ArdourCanvas::SimpleLine* range_marker_line;
-       ArdourCanvas::SimpleLine* transport_marker_line;
-
        Gtk::Label  minsec_label;
        Gtk::Label  bbt_label;
        Gtk::Label  smpte_label;
@@ -749,7 +770,7 @@ class Editor : public PublicEditor
 
        /* snapshots */
 
-       Gtk::ScrolledWindow      snapshot_display_scroller;
+       Gtk::ScrolledWindow snapshot_display_scroller;
        struct SnapshotDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
            SnapshotDisplayModelColumns() { 
                    add (visible_name);
@@ -812,6 +833,9 @@ class Editor : public PublicEditor
        static Gdk::Cursor* time_fx_cursor;
        static Gdk::Cursor* fader_cursor;
        static Gdk::Cursor* speaker_cursor;
+       static Gdk::Cursor* midi_pencil_cursor;
+       static Gdk::Cursor* midi_select_cursor;
+       static Gdk::Cursor* midi_erase_cursor;
        static Gdk::Cursor* wait_cursor;
        static Gdk::Cursor* timebar_cursor;
 
@@ -863,12 +887,11 @@ class Editor : public PublicEditor
        /* EDITING OPERATIONS */
        
        void reset_point_selection ();
-       void set_region_mute (bool);
-       void set_region_lock (bool);
-       void set_region_opaque (bool);
-       void raise_region ();
+       void toggle_region_mute ();
+       void toggle_region_lock ();
+       void toggle_region_opaque ();
+       void toggle_region_position_lock ();
        void raise_region_to_top ();
-       void lower_region ();
        void lower_region_to_bottom ();
        void split_region ();
        void split_region_at (nframes_t);
@@ -895,6 +918,7 @@ class Editor : public PublicEditor
        void reverse_regions ();
        void normalize_regions ();
        void denormalize_regions ();
+       void quantize_regions ();
 
        void audition_region_from_region_list ();
        void hide_region_from_region_list ();
@@ -946,15 +970,32 @@ class Editor : public PublicEditor
        void insert_region_list_drag (boost::shared_ptr<ARDOUR::Region>, int x, int y);
        void insert_region_list_selection (float times);
 
+       /* import & embed */
+       
        void add_external_audio_action (Editing::ImportMode);
+       void external_audio_dialog ();
+       bool check_multichannel_status (const std::vector<Glib::ustring>& paths);
+
+       SoundFileOmega* sfbrowser;
+       
+       void bring_in_external_audio (Editing::ImportMode mode,  nframes64_t& pos);
+       void do_import (vector<Glib::ustring> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, 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);
+       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&);
+
+       int  import_sndfiles (vector<Glib::ustring> paths, Editing::ImportMode mode,  ARDOUR::SrcQuality, 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>&, bool add_channel_suffix);
+       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);
+
+       boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;
 
        /* generic interthread progress window */
        
@@ -1025,7 +1066,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 ();
 
@@ -1035,6 +1080,18 @@ class Editor : public PublicEditor
        void start_scrolling ();
        void stop_scrolling ();
 
+       bool _scrubbing;
+       bool have_full_mouse_speed;
+       nframes64_t last_scrub_frame;
+       double last_scrub_time;
+       int mouse_speed_update;
+       double mouse_direction;
+       double compute_mouse_speed ();
+       void add_mouse_speed (double, double);
+       double* mouse_speed;
+       size_t mouse_speed_entries;
+       size_t mouse_speed_size;
+
        void keyboard_selection_begin ();
        void keyboard_selection_finish (bool add);
        bool have_pending_keyboard_selection;
@@ -1046,6 +1103,8 @@ class Editor : public PublicEditor
 
        Editing::SnapType snap_type;
        Editing::SnapMode snap_mode;
+
+       /// Snap threshold in pixels
        double snap_threshold;
 
        void handle_gui_changes (const string &, void *);
@@ -1078,6 +1137,8 @@ class Editor : public PublicEditor
        std::set<boost::shared_ptr<ARDOUR::Playlist> > motion_frozen_playlists;
        void region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
        void region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
+       void create_region_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*);
+       void create_region_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*);
 
        bool _dragging_playhead;
 
@@ -1098,6 +1159,7 @@ class Editor : public PublicEditor
        gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*);
 
        void start_region_grab (ArdourCanvas::Item*, GdkEvent*);
+       void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*);
        void start_selection_grab (ArdourCanvas::Item*, GdkEvent*);
@@ -1204,21 +1266,24 @@ class Editor : public PublicEditor
        /* display control */
        
        bool _show_measures;
+       /// true to show waveforms, otherwise false
        bool _show_waveforms;
+       /// true if the editor should follow the playhead, otherwise false
        bool _follow_playhead;
+       /// true if waveforms should be shown while recording audio tracks, otherwise false
        bool _show_waveforms_recording;
        
        ARDOUR::TempoMap::BBTPointList *current_bbt_points;
        
-       typedef vector<ArdourCanvas::SimpleLine*> TimeLineList;
-       TimeLineList free_measure_lines;
-       TimeLineList used_measure_lines;
-
        ArdourCanvas::Group* time_line_group;
-       ArdourCanvas::SimpleLine* get_time_line ();
+       ArdourCanvas::Group* marker_time_line_group;
+       
+       TempoLines* tempo_lines;
+       TempoLines* marker_tempo_lines;
+
        void hide_measures ();
        void draw_measures ();
-       bool lazy_hide_and_draw_measures ();
+       bool redraw_measures ();
 
        void new_tempo_section ();
 
@@ -1279,14 +1344,25 @@ class Editor : public PublicEditor
        void tempo_map_changed (ARDOUR::Change);
        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;
+       }
+       
+       double snap_length_beats (nframes_t start);
+
        uint32_t bbt_beat_subdivision;
 
        /* toolbar */
        
-       Gtk::ToggleButton        editor_mixer_button;
+       Gtk::ToggleButton editor_mixer_button;
+       Gtk::ToggleButton editor_list_button;
 
        void editor_mixer_button_toggled ();
+       void editor_list_button_toggled ();
 
        AudioClock               edit_cursor_clock;
        AudioClock               zoom_range_clock;
@@ -1308,6 +1384,7 @@ class Editor : public PublicEditor
        Gtk::ToggleButton        mouse_zoom_button;
        Gtk::ToggleButton        mouse_timefx_button;
        Gtk::ToggleButton        mouse_audition_button;
+       Gtk::ToggleButton        mouse_note_button;
        GroupedButtons          *mouse_mode_button_set;
        void                     mouse_mode_toggled (Editing::MouseMode m);
        bool                     ignore_mouse_mode_toggle;
@@ -1356,11 +1433,29 @@ class Editor : public PublicEditor
        
        void setup_toolbar ();
 
-       Gtkmm2ext::TearOff*       tools_tearoff;
+       Gtkmm2ext::TearOff*      tools_tearoff;
        Gtk::HBox                toolbar_hbox;
        Gtk::EventBox            toolbar_base;
        Gtk::Frame               toolbar_frame;
 
+       /* midi toolbar */
+
+       Gtk::HBox                midi_tool_button_box;
+       Gtkmm2ext::TearOff*      midi_tool_tearoff;
+       Gtk::ToggleButton        midi_tool_pencil_button;
+       Gtk::ToggleButton        midi_tool_select_button;
+       Gtk::ToggleButton        midi_tool_erase_button;
+       GroupedButtons          *midi_tool_button_set;
+       void                     midi_edit_mode_toggled (Editing::MidiEditMode m);
+       bool                     ignore_midi_edit_mode_toggle;
+
+       Gtkmm2ext::TearOff* midi_tools_tearoff;
+       Gtk::HBox           midi_toolbar_hbox;
+       Gtk::EventBox       midi_toolbar_base;
+       Gtk::Frame          midi_toolbar_frame;
+       
+       void setup_midi_toolbar ();
+
        /* selection process */
 
        Selection* selection;
@@ -1448,10 +1543,12 @@ class Editor : public PublicEditor
                    add (text);
                    add (visible);
                    add (tv);
+                   add (route);
            }
            Gtk::TreeModelColumn<Glib::ustring>  text;
            Gtk::TreeModelColumn<bool>           visible;
            Gtk::TreeModelColumn<TimeAxisView*>  tv;
+           Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
        };
 
        RouteDisplayModelColumns         route_display_columns;
@@ -1462,11 +1559,16 @@ class Editor : public PublicEditor
        Gtk::ScrolledWindow                   route_list_scroller;
        Gtk::Menu*                            route_list_menu;
 
+       void sync_order_keys ();
+       bool ignore_route_order_sync;
+
        bool route_list_display_button_press (GdkEventButton*);
        bool route_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
 
        void route_list_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
        void route_list_delete (const Gtk::TreeModel::Path&);
+       void track_list_reorder (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* new_order);
+
        void initial_route_list_display ();
        void redisplay_route_list();
        void route_list_reordered (const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter, int* what);
@@ -1641,10 +1743,10 @@ class Editor : public PublicEditor
 
        struct State {
            Selection* selection;
-           double     frames_per_unit;
+           double frames_per_unit;
 
-           State();
-           ~State();
+           State (PublicEditor const * e);
+           ~State ();
        };
 
        void store_state (State&) const;
@@ -1731,7 +1833,7 @@ class Editor : public PublicEditor
 
        bool _xfade_visibility;
        
-       /* <CMT Additions> */
+#ifdef WITH_CMT
        void handle_new_imageframe_time_axis_view(const string & track_name, void* src) ;
        void handle_new_imageframe_marker_time_axis_view(const string & track_name, TimeAxisView* marked_track) ;
 
@@ -1770,7 +1872,7 @@ class Editor : public PublicEditor
        void popup_marker_time_axis_edit_menu(int button, int32_t time, ArdourCanvas::Item* ifv, bool with_frame) ;
 
        ImageFrameSocketHandler* image_socket_listener ;
-       /* </CMT Additions> */
+#endif
 
        void toggle_xfade_active (boost::weak_ptr<ARDOUR::Crossfade>);
        void toggle_xfade_length (boost::weak_ptr<ARDOUR::Crossfade>);
@@ -1793,7 +1895,7 @@ class Editor : public PublicEditor
        
        /* audio filters */
 
-       void apply_filter (ARDOUR::AudioFilter&, string cmd);
+       void apply_filter (ARDOUR::Filter&, string cmd);
 
        /* handling cleanup */
 
@@ -1818,14 +1920,15 @@ class Editor : public PublicEditor
 
        bool _new_regionviews_show_envelope;
 
-       void set_gain_envelope_visibility (bool);
-       void set_gain_envelope_active (bool);
+       void toggle_gain_envelope_visibility ();
+       void toggle_gain_envelope_active ();
        void reset_region_gain_envelopes ();
 
        Gtk::CheckMenuItem* region_envelope_visible_item;
        Gtk::CheckMenuItem* region_envelope_active_item;
        Gtk::CheckMenuItem* region_mute_item;
        Gtk::CheckMenuItem* region_lock_item;
+       Gtk::CheckMenuItem* region_lock_position_item;
        Gtk::CheckMenuItem* region_opaque_item;
        
        bool on_key_press_event (GdkEventKey*);
@@ -1836,6 +1939,8 @@ class Editor : public PublicEditor
        Glib::RefPtr<Gtk::Action>              redo_action;
 
        void history_changed ();
+
+       Gtk::HBox      status_bar_hpacker;
 };
 
 #endif /* __ardour_editor_h__ */