X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.h;h=167ad65b1f0ebd7647d2b0f29b48e6e14268053e;hb=c892bc35c8048514a07499871a23eb94cbd101c0;hp=dd433c77a2e53c68f07e876d62e02893f0619e67;hpb=52a8242a1158426caeed4757bbc3f7f71091e351;p=ardour.git diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index dd433c77a2..167ad65b1f 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -25,10 +25,16 @@ #include #include #include +#include + +#include + +#include #include #include #include +#include #include @@ -39,11 +45,14 @@ #include #include -#include -#include -#include -#include -#include +#include "pbd/stateful.h" +#include "ardour/session.h" +#include "ardour/tempo.h" +#include "ardour/stretch.h" +#include "ardour/location.h" +#include "ardour/audioregion.h" +#include "ardour/track.h" +#include "ardour/types.h" #include "audio_clock.h" #include "gtk-custom-ruler.h" @@ -70,7 +79,7 @@ namespace ARDOUR { class TempoSection; class NamedSelection; class Session; - class AudioFilter; + class Filter; class Crossfade; class ChanCount; } @@ -79,29 +88,31 @@ namespace LADSPA { class Plugin; } -class TimeAxisView; +class AnalysisWindow; +class AudioRegionView; +class AudioStreamView; class AudioTimeAxisView; +class AutomationLine; +class AutomationSelection; class AutomationTimeAxisView; -class AudioRegionView; +class BundleManager; +class ControlPoint; class CrossfadeView; -class PluginSelector; -class PlaylistSelector; -class Marker; +class GlobalPortMatrixWindow; class GroupedButtons; -class AutomationLine; -class UIExportSpecification; -class ExportDialog; +class Marker; +class MixerStrip; +class PlaylistSelector; +class PluginSelector; +class RhythmFerret; class Selection; +class SoundFileOmega; +class StreamView; +class TempoLines; +class TimeAxisView; +class TimeFXDialog; class TimeSelection; class TrackSelection; -class AutomationSelection; -class MixerStrip; -class StreamView; -class AudioStreamView; -class ControlPoint; -#ifdef FFT_ANALYSIS -class AnalysisWindow; -#endif /* */ class ImageFrameView; @@ -119,15 +130,19 @@ class Editor : public PublicEditor public: Editor (); ~Editor (); - + void connect_to_session (ARDOUR::Session *); ARDOUR::Session* current_session() const { return session; } + void first_idle (); + virtual bool have_idled () const { return _have_idled; } - nframes_t leftmost_position() const { return leftmost_frame; } - nframes_t current_page_frames() const { - return (nframes_t) floor (canvas_width * frames_per_unit); + nframes64_t leftmost_position() const { return leftmost_frame; } + nframes64_t current_page_frames() const { + return (nframes64_t) floor (canvas_width * frames_per_unit); } + void cycle_snap_mode (); + void cycle_snap_choice (); void set_snap_to (Editing::SnapType); void set_snap_mode (Editing::SnapMode); void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;} @@ -141,46 +156,64 @@ 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 + TimeAxisView* get_named_time_axis(const std::string & name) ; + void foreach_time_axis_view (sigc::slot); + void add_to_idle_resize (TimeAxisView*, uint32_t); + + RouteTimeAxisView* get_route_view_by_id (PBD::ID& id); + void consider_auditioning (boost::shared_ptr); void hide_a_region (boost::shared_ptr); void remove_a_region (boost::shared_ptr); +#ifdef USE_RUBBERBAND + std::vector rb_opt_strings; +#endif + /* option editor-access */ void set_show_waveforms (bool yn); bool show_waveforms() const { return _show_waveforms; } + void set_waveform_scale (Editing::WaveformScale); + void set_show_waveforms_recording (bool yn); bool show_waveforms_recording() const { return _show_waveforms_recording; } /* things that need to be public to be used in the main menubar */ void new_region_from_selection (); + void separate_regions_between (const TimeSelection&); void separate_region_from_selection (); + 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 */ - nframes_t unit_to_frame (double unit) { - return (nframes_t) rint (unit * frames_per_unit); + nframes64_t unit_to_frame (double unit) const { + return (nframes64_t) rint (unit * frames_per_unit); } - double frame_to_unit (nframes_t frame) { + double frame_to_unit (nframes64_t frame) const { return rint ((double) frame / (double) frames_per_unit); } - double frame_to_unit (double frame) { + double frame_to_unit (double frame) const { return rint (frame / frames_per_unit); } @@ -191,7 +224,7 @@ class Editor : public PublicEditor xscroll_adjustment. */ - nframes_t pixel_to_frame (double pixel) { + nframes64_t pixel_to_frame (double pixel) const { /* pixel can be less than zero when motion events are processed. since we've already run the world->canvas @@ -200,16 +233,18 @@ class Editor : public PublicEditor */ if (pixel >= 0) { - return (nframes_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas.gobj())->pixels_per_unit); + return (nframes64_t) rint (pixel * frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit); } else { return 0; } } - gulong frame_to_pixel (nframes_t frame) { - return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas.gobj())->pixels_per_unit))); + gulong frame_to_pixel (nframes64_t frame) const { + return (gulong) rint ((frame / (frames_per_unit * GNOME_CANVAS(track_canvas->gobj())->pixels_per_unit))); } + void flush_canvas (); + /* selection */ Selection& get_selection() const { return *selection; } @@ -218,36 +253,35 @@ class Editor : public PublicEditor bool extend_selection_to_track (TimeAxisView&); void play_selection (); - void select_all_in_selected_tracks (Selection::Operation op); + void select_all_in_track (Selection::Operation op); void select_all (Selection::Operation op); - void invert_selection_in_selected_tracks (); + void invert_selection_in_track (); void invert_selection (); + void deselect_all (); /* tempo */ void set_show_measures (bool yn); bool show_measures () const { return _show_measures; } - bool initial_ruler_update_required; -#ifdef FFT_ANALYSIS /* analysis window */ + void analyze_region_selection(); void analyze_range_selection(); -#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; } - void set_zoom_focus (Editing::ZoomFocus); + void set_zoom_focus (Editing::ZoomFocus); Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; } - gdouble get_current_zoom () { return frames_per_unit; } + double get_current_zoom () const { return frames_per_unit; } void temporal_zoom_step (bool coarser); @@ -255,27 +289,28 @@ class Editor : public PublicEditor PlaylistSelector& playlist_selector() const; void route_name_changed (TimeAxisView *); - gdouble frames_per_unit; - nframes_t leftmost_frame; void clear_playlist (boost::shared_ptr); - 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); + void get_onscreen_tracks (TrackViewList&); Width editor_mixer_strip_width; void maybe_add_mixer_strip_width (XMLNode&); void show_editor_mixer (bool yn); + void create_editor_mixer (); + void show_editor_list (bool yn); void set_selected_mixer_strip (TimeAxisView&); - void hide_track_in_display (TimeAxisView& tv); + void hide_track_in_display (TimeAxisView& tv, bool temporary = false); void show_track_in_display (TimeAxisView& tv); /* nudge is initiated by transport controls owned by ARDOUR_UI */ - void nudge_forward (bool next); - void nudge_backward (bool next); + void nudge_forward (bool next, bool force_playhead); + void nudge_backward (bool next, bool force_playhead); /* nudge initiated from context menu */ @@ -290,8 +325,14 @@ class Editor : public PublicEditor bool dragging_playhead () const { return _dragging_playhead; } void toggle_waveform_visibility (); + void toggle_zero_line_visibility (); void toggle_waveforms_while_recording (); void toggle_measure_visibility (); + void toggle_logo_visibility (); + + double get_physical_screen_width () const { return physical_screen_width; }; + double physical_screen_width; + double physical_screen_height; /* SMPTE timecode & video sync */ @@ -299,11 +340,16 @@ class Editor : public PublicEditor void video_pullup_chosen (ARDOUR::Session::PullupFormat pullup); void subframes_per_frame_chosen (uint32_t); - void update_smpte_mode(); - void update_video_pullup(); + void update_smpte_mode (); + void update_video_pullup (); void update_subframes_per_frame (); - /* xfades */ + /* fades/xfades */ + + void toggle_region_fades (); + void toggle_region_fades_visible (); + void toggle_selected_region_fades (int dir); + void update_region_fade_visibility (); void toggle_auto_xfade (); void toggle_xfades_active (); void toggle_xfade_visibility (); @@ -315,6 +361,9 @@ class Editor : public PublicEditor /* layers */ void set_layer_model (ARDOUR::LayerModel); void update_layering_model (); + + void toggle_link_region_and_track_selection (); + void toggle_automation_follows_regions (); /* redirect shared ops menu. caller must free returned menu */ @@ -329,35 +378,91 @@ class Editor : public PublicEditor void scroll_tracks_down_line (); void scroll_tracks_up_line (); + void move_selected_tracks (bool up); + bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; } void prepare_for_cleanup (); + void finish_cleanup (); void maximise_editing_space(); void restore_editing_space(); - void reset_x_origin (nframes_t); + void reset_x_origin (nframes64_t); void reset_zoom (double); - void reposition_and_zoom (nframes_t, double); + void reposition_and_zoom (nframes64_t, double); + + nframes64_t get_preferred_edit_position (bool ignore_playhead = false); + + bool update_mouse_speed (); + bool decelerate_mouse_speed (); + + void toggle_meter_updating(); - nframes_t edit_cursor_position(bool); + void show_rhythm_ferret(); + void show_bundle_manager (); + void show_global_port_matrix (ARDOUR::DataType); + + void goto_visual_state (uint32_t); + void save_visual_state (uint32_t); + + void queue_draw_resize_line (int at); + void start_resize_line_ops (); + void end_resize_line_ops (); protected: void map_transport_state (); - void map_position_change (nframes_t); + void map_position_change (nframes64_t); void on_realize(); + bool on_expose_event (GdkEventExpose*); 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 _control_scroll_target; + PlaylistSelector* _playlist_selector; - void set_frames_per_unit (double); + typedef std::pair TAVState; + + struct VisualState { + double y_position; + double frames_per_unit; + nframes64_t leftmost_frame; + Editing::ZoomFocus zoom_focus; + bool zoomed_to_region; + std::list track_states; + }; + + std::list undo_visual_stack; + std::list redo_visual_stack; + VisualState* current_visual_state (bool with_tracks = true); + void undo_visual_state (); + void redo_visual_state (); + void use_visual_state (VisualState&); + bool no_save_visual; + void swap_visual_state (); + + std::vector visual_states; + sigc::connection visual_state_op_connection; + void start_visual_state_op (uint32_t n); + void cancel_visual_state_op (uint32_t n); + bool end_visual_state_op (uint32_t n); + + nframes64_t leftmost_frame; + double frames_per_unit; + Editing::ZoomFocus zoom_focus; + + void set_frames_per_unit (double); + void post_zoom (); Editing::MouseMode mouse_mode; + Editing::MidiEditMode midi_edit_mode; int post_maximal_editor_width; int post_maximal_pane_position; @@ -383,6 +488,7 @@ class Editor : public PublicEditor void location_gone (ARDOUR::Location *); void remove_marker (ArdourCanvas::Item&, GdkEvent*); gint really_remove_marker (ARDOUR::Location* loc); + void goto_nth_marker (int nth); uint32_t location_marker_color; uint32_t location_range_color; @@ -393,50 +499,56 @@ class Editor : public PublicEditor struct LocationMarkers { Marker* start; Marker* end; + bool valid; + LocationMarkers () : start(0), end(0), valid (true) {} + ~LocationMarkers (); void hide(); void show (); void set_name (const string&); - void set_position (nframes_t start, nframes_t end = 0); + void set_position (nframes64_t start, nframes64_t end = 0); void set_color_rgba (uint32_t); }; - LocationMarkers *find_location_markers (ARDOUR::Location *); - ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start); + LocationMarkers *find_location_markers (ARDOUR::Location *) const; + ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const; + Marker* entered_marker; typedef std::map LocationMarkerMap; LocationMarkerMap location_markers; void hide_marker (ArdourCanvas::Item*, GdkEvent*); void clear_marker_display (); - void mouse_add_new_marker (nframes_t where); + void mouse_add_new_marker (nframes64_t where, bool is_cd=false, bool is_xrun=false); + bool choose_new_marker_name(string &name); + void update_cd_marker_display (); + void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location); TimeAxisView* clicked_axisview; RouteTimeAxisView* clicked_routeview; - /** The last RegionView that was clicked on, or 0 if the last click was not - * on a RegionView. This is set up by the canvas event handlers in - * editor_canvas_events.cc - */ + /** The last RegionView that was clicked on, or 0 if the last click was not + * on a RegionView. This is set up by the canvas event handlers in + * editor_canvas_events.cc + */ RegionView* clicked_regionview; - - RegionView* latest_regionview; + RegionSelection latest_regionviews; uint32_t clicked_selection; CrossfadeView* clicked_crossfadeview; ControlPoint* clicked_control_point; - void sort_track_selection (); + void sort_track_selection (TrackSelection* sel = 0); void get_relevant_tracks (std::set& relevant_tracks); - void get_equivalent_regions (RegionView* rv, std::vector&); - void mapover_tracks (sigc::slot sl); + void get_equivalent_regions (RegionView* rv, std::vector&) const; + void mapover_tracks (sigc::slot 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*); - void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t); - void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t); + void mapped_get_equivalent_regions (RouteTimeAxisView&, uint32_t, RegionView*, vector*) const; + void mapped_use_new_playlist (RouteTimeAxisView&, uint32_t, vector > const &); + void mapped_use_copy_playlist (RouteTimeAxisView&, uint32_t, vector > const &); void mapped_clear_playlist (RouteTimeAxisView&, uint32_t); /* end */ @@ -446,26 +558,47 @@ class Editor : public PublicEditor void catch_vanishing_regionview (RegionView *); - bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false); + 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 region); + 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); + 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); bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false); void set_selected_regionview_from_region_list (boost::shared_ptr region, Selection::Operation op = Selection::Set); + bool set_selected_regionview_from_map_event (GdkEventAny*, StreamView*, boost::weak_ptr); void collect_new_region_view (RegionView *); - - 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&); - void add_region_context_items (Gtk::Menu_Helpers::MenuList&); + void collect_and_select_new_region_view (RegionView *); + + Gtk::Menu track_context_menu; + Gtk::Menu track_region_context_menu; + Gtk::Menu track_selection_context_menu; + Gtk::Menu track_crossfade_context_menu; + + Gtk::MenuItem* region_edit_menu_split_item; + Gtk::MenuItem* region_edit_menu_split_multichannel_item; + Gtk::Menu * track_region_edit_playlist_menu; + Gtk::Menu * track_edit_playlist_submenu; + Gtk::Menu * track_selection_edit_playlist_submenu; + + void popup_track_context_menu (int, int, ItemType, bool, nframes64_t); + Gtk::Menu* build_track_context_menu (nframes64_t); + Gtk::Menu* build_track_bus_context_menu (nframes64_t); + Gtk::Menu* build_track_region_context_menu (nframes64_t frame); + Gtk::Menu* build_track_crossfade_context_menu (nframes64_t); + Gtk::Menu* build_track_selection_context_menu (nframes64_t); + void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&); + void add_bus_context_items (Gtk::Menu_Helpers::MenuList&); + void add_region_context_items (StreamView*, boost::shared_ptr, Gtk::Menu_Helpers::MenuList&); void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr, Gtk::Menu_Helpers::MenuList&, bool many); void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList&, Gtk::Menu_Helpers::MenuElem, bool) const; - void handle_new_route (ARDOUR::Session::RouteList&); + void handle_new_route (ARDOUR::RouteList&); void remove_route (TimeAxisView *); bool route_removal; @@ -473,10 +606,15 @@ class Editor : public PublicEditor Gtk::VBox global_vpacker; Gtk::VBox vpacker; + bool need_resize_line; + int resize_line_y; + int old_resize_line_y; + Gdk::Cursor* current_canvas_cursor; + void set_canvas_cursor (); + Gdk::Cursor* which_grabber_cursor (); - ArdourCanvas::CanvasAA track_canvas; - ArdourCanvas::CanvasAA time_canvas; + ArdourCanvas::Canvas* track_canvas; ArdourCanvas::Text* first_action_message; ArdourCanvas::Text* verbose_canvas_cursor; @@ -493,12 +631,13 @@ class Editor : public PublicEditor bool verbose_cursor_on; // so far unused - 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 time_canvas_event_box; + Gtk::EventBox track_canvas_event_box; + Gtk::EventBox time_button_event_box; + Gtk::EventBox ruler_label_event_box; ArdourCanvas::Group *minsec_group; + ArdourCanvas::Pixbuf *logo_item; ArdourCanvas::Group *bbt_group; ArdourCanvas::Group *smpte_group; ArdourCanvas::Group *frame_group; @@ -507,8 +646,35 @@ class Editor : public PublicEditor ArdourCanvas::Group *marker_group; 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* _background_group; + /* + The _master_group is the group containing all items + that require horizontal scrolling.. + It is primarily used to separate canvas items + that require horizontal scrolling from those that do not. + */ + 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 { + enum RulerType { ruler_metric_smpte = 0, ruler_metric_bbt = 1, ruler_metric_frames = 2, @@ -519,25 +685,39 @@ class Editor : public PublicEditor ruler_time_marker = 6, ruler_time_range_marker = 7, ruler_time_transport_marker = 8, + ruler_time_cd_marker = 9, }; static GtkCustomMetric ruler_metrics[4]; - bool ruler_shown[9]; - bool no_ruler_shown_update; + Glib::RefPtr ruler_timecode_action; + Glib::RefPtr ruler_bbt_action; + Glib::RefPtr ruler_samples_action; + Glib::RefPtr ruler_minsec_action; + Glib::RefPtr ruler_tempo_action; + Glib::RefPtr ruler_meter_action; + Glib::RefPtr ruler_marker_action; + Glib::RefPtr ruler_range_action; + Glib::RefPtr ruler_loop_punch_action; + Glib::RefPtr ruler_cd_marker_action; + bool no_ruler_shown_update; gint ruler_button_press (GdkEventButton*); gint ruler_button_release (GdkEventButton*); gint ruler_mouse_motion (GdkEventMotion*); + bool ruler_scroll (GdkEventScroll* event); - gint ruler_pressed_button; + gint ruler_pressed_button; Gtk::Widget * ruler_grabbed_widget; void initialize_rulers (); void update_just_smpte (); + void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers void update_fixed_rulers (); void update_tempo_based_rulers (); - void popup_ruler_menu (nframes_t where = 0, ItemType type = RegionItem); + void popup_ruler_menu (nframes64_t where = 0, ItemType type = RegionItem); void update_ruler_visibility (); + void set_ruler_visible (RulerType, bool); + void toggle_ruler_visibility (RulerType rt); void ruler_toggled (int); gint ruler_label_button_release (GdkEventButton*); void store_ruler_visibility (); @@ -548,6 +728,55 @@ class Editor : public PublicEditor static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint); static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint); + enum MinsecRulerScale { + minsec_show_seconds, + minsec_show_minutes, + minsec_show_hours, + minsec_show_frames + }; + + MinsecRulerScale minsec_ruler_scale; + + nframes_t minsec_mark_interval; + gint minsec_mark_modulo; + 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 + }; + + SMPTERulerScale smpte_ruler_scale; + + nframes_t smpte_mark_interval; + gint smpte_mark_modulo; + gint smpte_nmarks; + void set_smpte_ruler_scale (gdouble lower, gdouble upper); + + enum BBTRulerScale { + bbt_over, + bbt_show_64, + bbt_show_16, + bbt_show_4, + bbt_show_1, + bbt_show_beats, + bbt_show_ticks, + bbt_show_ticks_detail, + bbt_show_ticks_super_detail + }; + + BBTRulerScale bbt_ruler_scale; + + uint32_t bbt_bars; + gint bbt_nmarks; + uint32_t bbt_bar_helper_on; + 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_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); gint metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint); @@ -566,6 +795,8 @@ class Editor : public PublicEditor static const double timebar_height; guint32 visible_timebars; + gdouble canvas_timebars_vsize; + gdouble get_canvas_timebars_vsize () const { return canvas_timebars_vsize; } Gtk::Menu *editor_ruler_menu; ArdourCanvas::SimpleRect* tempo_bar; @@ -573,14 +804,8 @@ class Editor : public PublicEditor ArdourCanvas::SimpleRect* marker_bar; ArdourCanvas::SimpleRect* range_marker_bar; ArdourCanvas::SimpleRect* transport_marker_bar; - + ArdourCanvas::SimpleRect* cd_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; @@ -590,7 +815,7 @@ class Editor : public PublicEditor Gtk::Label mark_label; Gtk::Label range_mark_label; Gtk::Label transport_mark_label; - + Gtk::Label cd_mark_label; Gtk::VBox time_button_vbox; Gtk::HBox time_button_hbox; @@ -599,40 +824,51 @@ class Editor : public PublicEditor Editor& editor; ArdourCanvas::Points points; ArdourCanvas::Line canvas_item; - nframes_t current_frame; + nframes64_t current_frame; double length; Cursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*)); ~Cursor (); - void set_position (nframes_t); + void set_position (nframes64_t); void set_length (double units); void set_y_axis (double position); }; - friend struct Cursor; /* it needs access to several private - fields. XXX fix me. - */ - - Cursor* playhead_cursor; - Cursor* edit_cursor; + Cursor* playhead_cursor; ArdourCanvas::Group* cursor_group; + nframes64_t get_region_boundary (nframes64_t pos, int32_t dir, bool with_selection, bool only_onscreen); + + void cursor_to_region_boundary (bool with_selection, int32_t dir); + void cursor_to_next_region_boundary (bool with_selection); + void cursor_to_previous_region_boundary (bool with_selection); void cursor_to_next_region_point (Cursor*, ARDOUR::RegionPoint); void cursor_to_previous_region_point (Cursor*, ARDOUR::RegionPoint); void cursor_to_region_point (Cursor*, ARDOUR::RegionPoint, int32_t dir); void cursor_to_selection_start (Cursor *); void cursor_to_selection_end (Cursor *); + + void selected_marker_to_region_boundary (bool with_selection, int32_t dir); + void selected_marker_to_next_region_boundary (bool with_selection); + void selected_marker_to_previous_region_boundary (bool with_selection); + void selected_marker_to_next_region_point (ARDOUR::RegionPoint); + void selected_marker_to_previous_region_point (ARDOUR::RegionPoint); + void selected_marker_to_region_point (ARDOUR::RegionPoint, int32_t dir); + void selected_marker_to_selection_start (); + void selected_marker_to_selection_end (); + void select_all_selectables_using_cursor (Cursor *, bool); - void select_all_selectables_between_cursors (Cursor *, Cursor *); + void select_all_selectables_using_edit (bool); + void select_all_selectables_between (bool within); + void select_range_between (); - boost::shared_ptr find_next_region (nframes_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0); + boost::shared_ptr find_next_region (nframes64_t, ARDOUR::RegionPoint, int32_t dir, TrackViewList&, TimeAxisView ** = 0); + nframes64_t find_next_region_boundary (nframes64_t, int32_t dir, const TrackViewList&); - vector region_boundary_cache; + vector region_boundary_cache; void build_region_boundary_cache (); - Gtk::VBox trackview_vpacker; - Gtk::HBox top_hbox; Gtk::HBox bottom_hbox; @@ -645,6 +881,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; @@ -658,26 +895,34 @@ class Editor : public PublicEditor double canvas_width; double canvas_height; double full_canvas_height; - nframes_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; Gtk::HBox edit_controls_hbox; void control_scroll (float); - bool deferred_control_scroll (nframes_t); + void access_action (std::string,std::string); + 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_background_group () const { return _background_group; } + 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); struct VisualChange { enum Type { @@ -686,7 +931,7 @@ class Editor : public PublicEditor }; Type pending; - nframes_t time_origin; + nframes64_t time_origin; double frames_per_unit; int idle_handler_id; @@ -700,31 +945,61 @@ class Editor : public PublicEditor static int _idle_visual_changer (void *arg); int idle_visual_changer (); - void queue_visual_change (nframes_t); + void queue_visual_change (nframes64_t); void queue_visual_change (double); void end_location_changed (ARDOUR::Location*); 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 name; Gtk::TreeModelColumn > region; Gtk::TreeModelColumn color_; + Gtk::TreeModelColumn start; + Gtk::TreeModelColumn end; + Gtk::TreeModelColumn length; + Gtk::TreeModelColumn sync; + Gtk::TreeModelColumn fadein; + Gtk::TreeModelColumn fadeout; + Gtk::TreeModelColumn locked; + Gtk::TreeModelColumn glued; + Gtk::TreeModelColumn muted; + Gtk::TreeModelColumn opaque; + Gtk::TreeModelColumn used; + Gtk::TreeModelColumn path; }; RegionListDisplayModelColumns region_list_columns; Gtkmm2ext::DnDTreeView > region_list_display; - + Glib::RefPtr region_list_model; Glib::RefPtr toggle_full_region_list_action; Glib::RefPtr toggle_show_auto_regions_action; + void region_list_region_changed (ARDOUR::Change, boost::weak_ptr); void region_list_selection_changed (); + sigc::connection region_list_change_connection; + void set_selected_in_region_list(RegionSelection&); + bool set_selected_in_region_list_subrow(boost::shared_ptr, Gtk::TreeModel::Row const &, int); bool region_list_selection_filter (const Glib::RefPtr& model, const Gtk::TreeModel::Path& path, bool yn); + void region_name_edit (const Glib::ustring&, const Glib::ustring&); + void get_regions_corresponding_to (boost::shared_ptr region, std::vector& regions); Gtk::Menu *region_list_menu; Gtk::ScrolledWindow region_list_scroller; @@ -752,7 +1027,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); @@ -805,32 +1080,38 @@ class Editor : public PublicEditor /* track views */ TrackViewList track_views; - TimeAxisView *trackview_by_y_position (double ypos); + std::pair trackview_by_y_position (double); static Gdk::Cursor* cross_hair_cursor; static Gdk::Cursor* trimmer_cursor; static Gdk::Cursor* selector_cursor; static Gdk::Cursor* grabber_cursor; + static Gdk::Cursor* grabber_edit_point_cursor; static Gdk::Cursor* zoom_cursor; 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_resize_cursor; + static Gdk::Cursor* midi_erase_cursor; static Gdk::Cursor* wait_cursor; static Gdk::Cursor* timebar_cursor; + static Gdk::Cursor* transparent_cursor; static void build_cursors (); sigc::connection scroll_connection; - nframes_t last_update_frame; - void center_screen (nframes_t); - void center_screen_internal (nframes_t, float); + nframes64_t last_update_frame; + void center_screen (nframes64_t); + void center_screen_internal (nframes64_t, float); void update_current_screen (); void session_going_away (); - nframes_t cut_buffer_start; - nframes_t cut_buffer_length; + nframes64_t cut_buffer_start; + nframes64_t cut_buffer_length; bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType); bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType); @@ -843,13 +1124,21 @@ class Editor : public PublicEditor void register_actions (); - int ensure_cursor (nframes_t* pos); + int ensure_cursor (nframes64_t* pos); void handle_new_region (boost::weak_ptr); + void handle_new_regions (vector >& ); void handle_region_removed (boost::weak_ptr); void add_region_to_region_display (boost::shared_ptr); + void add_regions_to_region_display (std::vector > & ); void region_hidden (boost::shared_ptr); void redisplay_regions (); + void populate_row (boost::shared_ptr, Gtk::TreeModel::Row const &); + void update_region_row (boost::shared_ptr); + bool update_region_subrows (boost::shared_ptr, 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); list > tmp_region_list; @@ -857,35 +1146,42 @@ class Editor : public PublicEditor void cut_copy (Editing::CutCopyOp); bool can_cut_copy () const; void cut_copy_points (Editing::CutCopyOp); - void cut_copy_regions (Editing::CutCopyOp); + void cut_copy_regions (Editing::CutCopyOp, RegionSelection&); void cut_copy_ranges (Editing::CutCopyOp); void mouse_paste (); - void paste_internal (nframes_t position, float times); + void paste_internal (nframes64_t position, float times); /* EDITING OPERATIONS */ void reset_point_selection (); - void set_region_mute (bool); - void set_region_lock (bool); - void set_region_position_lock (bool); - void set_region_opaque (bool); + void toggle_region_mute (); + void toggle_region_lock (); + void toggle_region_opaque (); + void toggle_record_enable (); + void set_region_lock_style (ARDOUR::Region::PositionLockStyle); + void raise_region (); void raise_region_to_top (); + void lower_region (); void lower_region_to_bottom (); void split_region (); - void split_region_at (nframes_t); - void split_regions_at (nframes_t, RegionSelection&); + void split_region_at (nframes64_t); + void split_regions_at (nframes64_t, RegionSelection&); + void split_region_at_transients (); + void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret); void crop_region_to_selection (); - void set_a_regions_sync_position (boost::shared_ptr, nframes_t); - void set_region_sync_from_edit_cursor (); + void crop_region_to (nframes64_t start, nframes64_t end); + void set_sync_point (nframes64_t, const RegionSelection&); + void set_region_sync_from_edit_point (); void remove_region_sync(); - void align_selection (ARDOUR::RegionPoint, nframes_t position); - void align_selection_relative (ARDOUR::RegionPoint point, nframes_t position); - void align_region (boost::shared_ptr, ARDOUR::RegionPoint point, nframes_t position); - void align_region_internal (boost::shared_ptr, ARDOUR::RegionPoint point, nframes_t position); + void align_selection (ARDOUR::RegionPoint, nframes64_t position, const RegionSelection&); + void align_selection_relative (ARDOUR::RegionPoint point, nframes64_t position, const RegionSelection&); + void align_region (boost::shared_ptr, ARDOUR::RegionPoint point, nframes64_t position); + void align_region_internal (boost::shared_ptr, ARDOUR::RegionPoint point, nframes64_t position); void remove_selected_regions (); void remove_clicked_region (); void edit_region (); + void rename_region (); void duplicate_some_regions (RegionSelection&, float times); void duplicate_selection (float times); void region_fill_selection (); @@ -894,9 +1190,22 @@ class Editor : public PublicEditor void audition_playlist_region_standalone (boost::shared_ptr); void audition_playlist_region_via_route (boost::shared_ptr, ARDOUR::Route&); void split_multichannel_region(); - void reverse_regions (); - void normalize_regions (); - void denormalize_regions (); + void reverse_region (); + void strip_region_silence (); + void normalize_region (); + void denormalize_region (); + void adjust_region_scale_amplitude (bool up); + void quantize_region (); + + void do_insert_time (); + void insert_time (nframes64_t pos, nframes64_t distance, Editing::InsertTimeOption opt, bool ignore_music_glue, bool markers_too); + + void tab_to_transient (bool forward); + + void use_region_as_bar (); + void use_range_as_bar (); + + void define_one_bar (nframes64_t start, nframes64_t end); void audition_region_from_region_list (); void hide_region_from_region_list (); @@ -908,6 +1217,8 @@ class Editor : public PublicEditor void reset_focus (); + void split (); + void cut (); void copy (); void paste (float times); @@ -915,32 +1226,28 @@ class Editor : public PublicEditor int get_prefix (float&, bool&); void keyboard_paste (); - void keyboard_duplicate_region (); - void keyboard_duplicate_selection (); void keyboard_insert_region_list_selection (); void region_from_selection (); - void create_region_from_selection (std::vector >&); - - bool region_renamed; - void rename_region (); - void rename_region_finished (bool); + void create_region_from_selection (std::vector >&); void play_from_start (); - void play_from_edit_cursor (); + void play_from_edit_point (); + void play_from_edit_point_and_return (); void play_selected_region (); - void audition_selected_region (); + void play_edit_range (); void loop_selected_region (); void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); - Editing::ZoomFocus zoom_focus; - void temporal_zoom_selection (); + void temporal_zoom_region (bool both_axes); + void toggle_zoom_region (bool both_axes); + bool zoomed_to_region; void temporal_zoom_session (); void temporal_zoom (gdouble scale); - void temporal_zoom_by_frame (nframes_t start, nframes_t end, const string & op); - void temporal_zoom_to_frame (bool coarser, nframes_t frame); + void temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op); + void temporal_zoom_to_frame (bool coarser, nframes64_t frame); void amplitude_zoom (gdouble scale); void amplitude_zoom_step (bool in); @@ -948,15 +1255,39 @@ class Editor : public PublicEditor void insert_region_list_drag (boost::shared_ptr, int x, int y); void insert_region_list_selection (float times); + void insert_route_list_drag (boost::shared_ptr, int x, int y); + + /* import & embed */ + void add_external_audio_action (Editing::ImportMode); + void external_audio_dialog (); + void session_import_dialog (); - void bring_in_external_audio (Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t& pos, bool prompt); - void do_import (vector paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool); - void do_embed (vector paths, bool split, Editing::ImportMode mode, ARDOUR::AudioTrack*, nframes_t&, bool); - int import_sndfile (vector paths, Editing::ImportMode mode, ARDOUR::AudioTrack* track, nframes_t& pos); - int embed_sndfile (vector 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 region, uint32_t, uint32_t, ARDOUR::AudioTrack* track, nframes_t& pos, Editing::ImportMode mode); + int check_whether_and_how_to_import(string, bool all_or_nothing = true); + bool check_multichannel_status (const std::vector& paths); + + SoundFileOmega* sfbrowser; + + void bring_in_external_audio (Editing::ImportMode mode, nframes64_t& pos); + + bool idle_drop_paths (std::vector paths, nframes64_t frame, double ypos); + void drop_paths_part_two (const std::vector& paths, nframes64_t frame, double ypos); + + void do_import (vector paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t&); + void do_embed (vector paths, Editing::ImportDisposition, Editing::ImportMode mode, nframes64_t&); + + int import_sndfiles (vector paths, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t& pos, + int target_regions, int target_tracks, boost::shared_ptr, bool, uint32_t total); + int embed_sndfiles (vector paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, + nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr&); + + int add_sources (vector paths, ARDOUR::SourceList& sources, nframes64_t& pos, Editing::ImportMode, + int target_regions, int target_tracks, boost::shared_ptr&, bool add_channel_suffix); + int finish_bringing_in_material (boost::shared_ptr region, uint32_t, uint32_t, nframes64_t& pos, Editing::ImportMode mode, + boost::shared_ptr& existing_track); + + boost::shared_ptr get_nth_selected_audio_track (int nth) const; + boost::shared_ptr get_nth_selected_midi_track (int nth) const; /* generic interthread progress window */ @@ -971,16 +1302,24 @@ class Editor : public PublicEditor void build_interthread_progress_window (); ARDOUR::InterThreadInfo* current_interthread_info; -#ifdef FFT_ANALYSIS AnalysisWindow* analysis_window; -#endif /* import specific info */ - ARDOUR::Session::import_status import_status; + struct EditorImportStatus : public ARDOUR::Session::ImportStatus { + Editing::ImportMode mode; + nframes64_t pos; + int target_tracks; + int target_regions; + boost::shared_ptr track; + bool replace; + }; + + EditorImportStatus import_status; gint import_progress_timeout (void *); static void *_import_thread (void *); void* import_thread (); + void finish_import (); /* to support this ... */ @@ -991,9 +1330,11 @@ class Editor : public PublicEditor void move_to_end (); void goto_frame (); void center_playhead (); - void center_edit_cursor (); + void center_edit_point (); void edit_cursor_backward (); void edit_cursor_forward (); + void playhead_forward_to_grid (); + void playhead_backward_to_grid (); void playhead_backward (); void playhead_forward (); void scroll_playhead (bool forward); @@ -1023,13 +1364,25 @@ class Editor : public PublicEditor void set_selection_from_range (ARDOUR::Location&); void set_selection_from_punch (); void set_selection_from_loop (); - void set_selection_from_audio_region (); + void set_selection_from_region (); + void add_location_mark (nframes64_t where); void add_location_from_audio_region (); + void add_locations_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_punch_from_region (); + + void set_loop_from_edit_range (bool play); + void set_loop_from_region (bool play); + void set_punch_from_edit_range (); + + void set_loop_range (nframes64_t start, nframes64_t end, std::string cmd); + void set_punch_range (nframes64_t start, nframes64_t end, std::string cmd); void add_location_from_playhead_cursor (); + bool select_new_marker; void reverse_selection (); void edit_envelope (); @@ -1037,10 +1390,17 @@ class Editor : public PublicEditor void start_scrolling (); void stop_scrolling (); + bool _scrubbing; + double last_scrub_x; + int scrubbing_direction; + int scrub_reversals; + int scrub_reverse_distance; + void scrub (); + void keyboard_selection_begin (); void keyboard_selection_finish (bool add); bool have_pending_keyboard_selection; - nframes_t pending_keyboard_selection_start; + nframes64_t pending_keyboard_selection_start; boost::shared_ptr select_region_for_operation (int dir, TimeAxisView **tv); void extend_selection_to_end_of_region (bool next); @@ -1053,6 +1413,7 @@ class Editor : public PublicEditor double snap_threshold; void handle_gui_changes (const string &, void *); + bool ignore_gui_changes; void hide_all_tracks (bool with_select); @@ -1062,10 +1423,14 @@ class Editor : public PublicEditor void start_grab (GdkEvent*, Gdk::Cursor* cursor = 0); bool end_grab (ArdourCanvas::Item*, GdkEvent*); void swap_grab (ArdourCanvas::Item*, Gdk::Cursor* cursor, uint32_t time); + void break_drag (); + void finalize_drag (); Gtk::Menu fade_context_menu; void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType); + void region_gain_motion_callback (ArdourCanvas::Item*, GdkEvent*); + void start_fade_in_grab (ArdourCanvas::Item*, GdkEvent*); void start_fade_out_grab (ArdourCanvas::Item*, GdkEvent*); void fade_in_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); @@ -1075,18 +1440,29 @@ class Editor : public PublicEditor void set_fade_in_shape (ARDOUR::AudioRegion::FadeShape); void set_fade_out_shape (ARDOUR::AudioRegion::FadeShape); - + + void set_fade_length (bool in); + void toggle_fade_active (bool in); void set_fade_in_active (bool); void set_fade_out_active (bool); std::set > motion_frozen_playlists; + RegionSelection pre_drag_region_selection; 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 check_region_drag_possible (RouteTimeAxisView**, ARDOUR::layer_t*); + void possibly_copy_regions_during_grab (GdkEvent*); + void region_drag_splice_motion_callback (ArdourCanvas::Item*, GdkEvent*); + void region_drag_splice_finished_callback (ArdourCanvas::Item*, GdkEvent*); bool _dragging_playhead; + bool _dragging_edit_point; void cursor_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); void cursor_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*); + void cursor_drag_finished_ensure_locate_callback (ArdourCanvas::Item*, GdkEvent*); void marker_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); void marker_drag_finished_callback (ArdourCanvas::Item*, GdkEvent*); void control_point_drag_motion_callback (ArdourCanvas::Item*, GdkEvent*); @@ -1102,10 +1478,12 @@ 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*); void start_cursor_grab (ArdourCanvas::Item*, GdkEvent*); + void start_cursor_grab_no_stop (ArdourCanvas::Item*, GdkEvent*); void start_marker_grab (ArdourCanvas::Item*, GdkEvent*); void start_control_point_grab (ArdourCanvas::Item*, GdkEvent*); void start_line_grab_from_regionview (ArdourCanvas::Item*, GdkEvent*); @@ -1121,11 +1499,13 @@ class Editor : public PublicEditor void remove_gain_control_point (ArdourCanvas::Item*, GdkEvent*); void remove_control_point (ArdourCanvas::Item*, GdkEvent*); - void mouse_brush_insert_region (RegionView*, nframes_t pos); - void brush (nframes_t); + void mouse_brush_insert_region (RegionView*, nframes64_t pos); + void brush (nframes64_t); - void show_verbose_time_cursor (nframes_t frame, double offset = 0, double xpos=-1, double ypos=-1); - void show_verbose_duration_cursor (nframes_t start, nframes_t end, double offset = 0, double xpos=-1, double ypos=-1); + void show_verbose_time_cursor (nframes64_t frame, double offset = 0, double xpos=-1, double ypos=-1); + void show_verbose_duration_cursor (nframes64_t start, nframes64_t end, double offset = 0, double xpos=-1, double ypos=-1); + double clamp_verbose_cursor_x (double); + double clamp_verbose_cursor_y (double); /* Canvas event handlers */ @@ -1139,6 +1519,14 @@ class Editor : public PublicEditor bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); + + + // These variables are used to detect a feedback loop and break it to avoid a gui hang +private: + ArdourCanvas::Item *last_item_entered; + int last_item_entered_n; +public: + bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); @@ -1154,6 +1542,7 @@ class Editor : public PublicEditor bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_range_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_transport_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); + bool canvas_cd_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_imageframe_item_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameView*); bool canvas_imageframe_view_event(GdkEvent* event, ArdourCanvas::Item*,ImageFrameTimeAxis*); @@ -1167,7 +1556,6 @@ class Editor : public PublicEditor /* non-public event handlers */ bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*); - bool canvas_edit_cursor_event (GdkEvent* event, ArdourCanvas::Item*); bool track_canvas_scroll (GdkEventScroll* event); bool track_canvas_scroll_event (GdkEventScroll* event); @@ -1176,34 +1564,20 @@ class Editor : public PublicEditor 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_size_allocated (); - void set_edit_cursor (GdkEvent* event); - void set_playhead_cursor (GdkEvent* event); + void set_playhead_cursor (); void kbd_driver (sigc::slot, bool use_track_canvas = true, bool use_time_canvas = true, bool can_select = true); - void kbd_set_playhead_cursor (); - void kbd_set_edit_cursor (); void kbd_mute_unmute_region (); - void kbd_split (); - void kbd_set_sync_position (); - void kbd_align (ARDOUR::RegionPoint); - void kbd_align_relative (ARDOUR::RegionPoint); void kbd_brush (); - void kbd_audition (); - void kbd_do_split (GdkEvent*); - void kbd_do_set_sync_position (GdkEvent* ev); - void kbd_do_align (GdkEvent*, ARDOUR::RegionPoint); - void kbd_do_align_relative (GdkEvent*, ARDOUR::RegionPoint); void kbd_do_brush (GdkEvent*); void kbd_do_audition (GdkEvent*); void handle_new_duration (); void initialize_canvas (); - void reset_scrolling_region (Gtk::Allocation* alloc = 0); /* display control */ @@ -1217,20 +1591,18 @@ class Editor : public PublicEditor ARDOUR::TempoMap::BBTPointList *current_bbt_points; - typedef vector TimeLineList; - TimeLineList free_measure_lines; - TimeLineList used_measure_lines; + TempoLines* tempo_lines; ArdourCanvas::Group* time_line_group; - ArdourCanvas::SimpleLine* get_time_line (); + void hide_measures (); void draw_measures (); - bool lazy_hide_and_draw_measures (); + bool redraw_measures (); void new_tempo_section (); - void mouse_add_new_tempo_event (nframes_t where); - void mouse_add_new_meter_event (nframes_t where); + void mouse_add_new_tempo_event (nframes64_t where); + void mouse_add_new_meter_event (nframes64_t where); void remove_tempo_marker (ArdourCanvas::Item*); void remove_meter_marker (ArdourCanvas::Item*); @@ -1241,10 +1613,12 @@ class Editor : public PublicEditor void edit_meter_section (ARDOUR::MeterSection*); void edit_tempo_marker (ArdourCanvas::Item*); void edit_meter_marker (ArdourCanvas::Item*); + void edit_control_point (ArdourCanvas::Item*); void marker_menu_edit (); void marker_menu_remove (); void marker_menu_rename (); + void marker_menu_lock (bool yn); void marker_menu_hide (); void marker_menu_loop_range (); void marker_menu_select_all_selectables_using_range (); @@ -1255,11 +1629,12 @@ class Editor : public PublicEditor void marker_menu_set_playhead (); void marker_menu_set_from_playhead (); void marker_menu_set_from_selection (); + void marker_menu_range_to_next (); void new_transport_marker_menu_set_loop (); void new_transport_marker_menu_set_punch (); void update_loop_range_view (bool visibility=false); void update_punch_range_view (bool visibility=false); - gint new_transport_marker_menu_popdown (GdkEventAny*); + void new_transport_marker_menu_popdown (); void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); @@ -1275,6 +1650,7 @@ class Editor : public PublicEditor Gtk::Menu* range_marker_menu; Gtk::Menu* transport_marker_menu; Gtk::Menu* new_transport_marker_menu; + Gtk::Menu* cd_marker_menu; ArdourCanvas::Item* marker_menu_item; typedef list Marks; @@ -1283,26 +1659,24 @@ class Editor : public PublicEditor void remove_metric_marks (); void draw_metric_marks (const ARDOUR::Metrics& metrics); + void compute_current_bbt_points (nframes_t left, nframes_t right); void tempo_map_changed (ARDOUR::Change); void redisplay_tempo (bool immediate_redraw); 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 (nframes64_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 edit_point_clock; AudioClock zoom_range_clock; Gtk::Button zoom_in_button; Gtk::Button zoom_out_button; @@ -1322,6 +1696,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; @@ -1335,6 +1710,8 @@ class Editor : public PublicEditor Gtk::ComboBoxText edit_mode_selector; Gtk::VBox edit_mode_box; + void set_edit_mode (ARDOUR::EditMode); + void cycle_edit_mode (); void edit_mode_selection_done (); Gtk::ComboBoxText snap_type_selector; @@ -1366,15 +1743,38 @@ class Editor : public PublicEditor void zoom_adjustment_changed(); - void edit_cursor_clock_changed(); + void edit_point_clock_changed(); 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; + Gtk::ToggleButton midi_tool_pencil_button; + Gtk::ToggleButton midi_tool_select_button; + Gtk::ToggleButton midi_tool_resize_button; + Gtk::ToggleButton midi_tool_erase_button; + Gtk::Button midi_panic_button; + Gtk::ToggleButton midi_sound_notes; + GroupedButtons *midi_tool_button_set; + void midi_edit_mode_toggled (Editing::MidiEditMode m); + void midi_panic_button_pressed (); + bool sound_notes () const { return midi_sound_notes.get_active(); } + + 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; @@ -1383,7 +1783,10 @@ class Editor : public PublicEditor void time_selection_changed (); void track_selection_changed (); void region_selection_changed (); + sigc::connection editor_regions_selection_changed_connection; + void sensitize_the_right_region_actions (bool have_selected_regions); void point_selection_changed (); + void marker_selection_changed (); enum SelectionOp { CreateSelection, @@ -1401,18 +1804,20 @@ class Editor : public PublicEditor void region_selection_op (void (ARDOUR::Region::*pmf)(void*), void*); void region_selection_op (void (ARDOUR::Region::*pmf)(bool), bool); - bool audio_region_selection_covers (nframes_t where); + bool audio_region_selection_covers (nframes64_t where); /* transport range select process */ enum RangeMarkerOp { CreateRangeMarker, - CreateTransportMarker + CreateTransportMarker, + CreateCDMarker } range_marker_op; void start_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event, RangeMarkerOp); void drag_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event); void end_range_markerbar_op (ArdourCanvas::Item* item, GdkEvent* event); + ArdourCanvas::SimpleRect* cd_marker_bar_drag_rect; ArdourCanvas::SimpleRect* range_bar_drag_rect; ArdourCanvas::SimpleRect* transport_bar_drag_rect; ArdourCanvas::Line* marker_drag_line; @@ -1420,7 +1825,9 @@ class Editor : public PublicEditor ArdourCanvas::SimpleRect* range_marker_drag_rect; void update_marker_drag_item (ARDOUR::Location *); - +#ifdef GTKOSX + ArdourCanvas::SimpleRect *bogus_background_rect; +#endif ArdourCanvas::SimpleRect *transport_bar_range_rect; ArdourCanvas::SimpleRect *transport_bar_preroll_rect; ArdourCanvas::SimpleRect *transport_bar_postroll_rect; @@ -1442,7 +1849,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, const TrackViewList&, Selection::Operation op); + bool select_all_within (nframes64_t start, nframes64_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op); ArdourCanvas::SimpleRect *rubberband_rect; @@ -1453,7 +1860,7 @@ class Editor : public PublicEditor void end_mouse_zoom (ArdourCanvas::Item* item, GdkEvent* event); ArdourCanvas::SimpleRect *zoom_rect; - void reposition_zoom_rect (nframes_t start, nframes_t end); + void reposition_zoom_rect (nframes64_t start, nframes64_t end); /* diskstream/route display management */ @@ -1461,11 +1868,15 @@ class Editor : public PublicEditor RouteDisplayModelColumns() { add (text); add (visible); + add (temporary_visible); add (tv); + add (route); } Gtk::TreeModelColumn text; Gtk::TreeModelColumn visible; + Gtk::TreeModelColumn temporary_visible; Gtk::TreeModelColumn tv; + Gtk::TreeModelColumn > route; }; RouteDisplayModelColumns route_display_columns; @@ -1476,16 +1887,32 @@ class Editor : public PublicEditor Gtk::ScrolledWindow route_list_scroller; Gtk::Menu* route_list_menu; + void update_route_visibility (); + + void sync_order_keys (const char*); + bool route_redisplay_does_not_sync_order_keys; + bool route_redisplay_does_not_reset_order_keys; + bool route_list_display_button_press (GdkEventButton*); + void route_list_display_drag_data_received (const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + bool route_list_selection_filter (const Glib::RefPtr& 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); bool ignore_route_list_reorder; bool no_route_list_redisplay; + bool sync_track_view_list_and_route_list (); void build_route_list_menu (); void show_route_list_menu (); @@ -1544,15 +1971,21 @@ class Editor : public PublicEditor bool autoscroll_active; int autoscroll_timeout_tag; - int autoscroll_direction; + int autoscroll_x; + int autoscroll_y; + int last_autoscroll_x; + int last_autoscroll_y; uint32_t autoscroll_cnt; - nframes_t autoscroll_distance; - + nframes64_t autoscroll_x_distance; + double autoscroll_y_distance; + static gint _autoscroll_canvas (void *); bool autoscroll_canvas (); - void start_canvas_autoscroll (int direction); + void start_canvas_autoscroll (int x, int y); void stop_canvas_autoscroll (); - void maybe_autoscroll (GdkEvent*); + void maybe_autoscroll (GdkEventMotion*); + void maybe_autoscroll_horizontally (GdkEventMotion*); + bool allow_vertical_scroll; /* trimming */ enum TrimOp { @@ -1564,70 +1997,86 @@ class Editor : public PublicEditor void start_trim (ArdourCanvas::Item*, GdkEvent*); void point_trim (GdkEvent*); void trim_motion_callback (ArdourCanvas::Item*, GdkEvent*); - void single_contents_trim (RegionView&, nframes_t, bool, bool, bool); - void single_start_trim (RegionView&, nframes_t, bool, bool); - void single_end_trim (RegionView&, nframes_t, bool, bool); + void single_contents_trim (RegionView&, nframes64_t, bool, bool, bool); + void single_start_trim (RegionView&, nframes64_t, bool, bool, bool); + void single_end_trim (RegionView&, nframes64_t, bool, bool, bool); void trim_finished_callback (ArdourCanvas::Item*, GdkEvent*); void thaw_region_after_trim (RegionView& rv); - - void trim_region_to_edit_cursor (); - void trim_region_from_edit_cursor (); + + void trim_region_front(); + void trim_region_back(); + void trim_region (bool front); + + void trim_region_to_edit_point (); + void trim_region_from_edit_point (); + void trim_region_to_loop (); + void trim_region_to_punch (); + void trim_region_to_location (const ARDOUR::Location&, const char* cmd); + + void trim_to_region(bool forward); + void trim_region_to_previous_region_end(); + void trim_region_to_next_region_start(); bool show_gain_after_trim; /* Drag-n-Drop */ - int convert_drop_to_paths (std::vector& paths, - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void track_canvas_drag_data_received (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + int convert_drop_to_paths ( + std::vector& paths, + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void track_canvas_drag_data_received ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); - void region_list_display_drag_data_received (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - - void drop_paths (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); - - void drop_regions (const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + void region_list_display_drag_data_received ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_paths ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_regions ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); + + void drop_routes ( + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); /* audio export */ - ExportDialog *export_dialog; - ExportDialog *export_range_markers_dialog; - - void export_range (nframes_t start, nframes_t end); - void export_range_markers (); - int write_region_selection(RegionSelection&); bool write_region (string path, boost::shared_ptr); - void export_region (); void bounce_region_selection (); - void bounce_range_selection (); + void bounce_range_selection (bool replace, bool enable_processing); void external_edit_region (); int write_audio_selection (TimeSelection&); @@ -1635,30 +2084,20 @@ class Editor : public PublicEditor void write_selection (); - /* history */ - - UndoAction get_memento() const; - XMLNode *before; /* used in *_reversible_command */ void begin_reversible_command (string cmd_name); void commit_reversible_command (); - /* visual history */ - - UndoHistory visual_history; - UndoTransaction current_visual_command; - - void update_title (); void update_title_s (const string & snapshot_name); struct State { Selection* selection; - double frames_per_unit; + double frames_per_unit; - State(); - ~State(); + State (PublicEditor const * e); + ~State (); }; void store_state (State&) const; @@ -1675,8 +2114,8 @@ class Editor : public PublicEditor static void* _freeze_thread (void*); void* freeze_thread (); - void freeze_routes (); - void unfreeze_routes (); + void freeze_route (); + void unfreeze_route (); /* edit-group solo + mute */ @@ -1685,61 +2124,48 @@ class Editor : public PublicEditor /* duplication */ - void duplicate_dialog (bool for_region); + void duplicate_dialog (bool with_dialog); - nframes_t event_frame (GdkEvent*, double* px = 0, double* py = 0); + nframes64_t event_frame (GdkEvent*, double* px = 0, double* py = 0) const; + + /* returns false if mouse pointer is not in track or marker canvas + */ + bool mouse_frame (nframes64_t&, bool& in_track_canvas) const; void time_fx_motion (ArdourCanvas::Item*, GdkEvent*); void start_time_fx (ArdourCanvas::Item*, GdkEvent*); void end_time_fx (ArdourCanvas::Item*, GdkEvent*); - struct TimeStretchDialog : public ArdourDialog { - ARDOUR::Session::TimeStretchRequest request; - Editor& editor; - RegionSelection regions; - Gtk::ProgressBar progress_bar; - Gtk::ToggleButton quick_button; - Gtk::ToggleButton antialias_button; - Gtk::Button* cancel_button; - Gtk::Button* action_button; - Gtk::HBox upper_button_box; - Gtk::VBox packer; - int status; - - TimeStretchDialog (Editor& e); - - gint update_progress (); - sigc::connection first_cancel; - sigc::connection first_delete; - void cancel_timestretch_in_progress (); - gint delete_timestretch_in_progress (GdkEventAny*); - }; - /* "whats mine is yours" */ - friend class TimeStretchDialog; + TimeFXDialog* current_timefx; - TimeStretchDialog* current_timestretch; + static void* timefx_thread (void *arg); + void do_timefx (TimeFXDialog&); - static void* timestretch_thread (void *arg); - int run_timestretch (RegionSelection&, float fraction); - void do_timestretch (TimeStretchDialog&); + int time_stretch (RegionSelection&, float fraction); + int pitch_shift (RegionSelection&, float cents); + void pitch_shift_regions (); + int time_fx (RegionSelection&, float val, bool pitching); /* editor-mixer strip */ MixerStrip *current_mixer_strip; bool show_editor_mixer_when_tracks_arrive; Gtk::VBox current_mixer_strip_vbox; + void cms_new (boost::shared_ptr); 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); - +#ifdef GTKOSX + void ensure_all_elements_drawn (); +#endif /* nudging tracks */ - void nudge_selected_tracks (bool use_edit_cursor, bool forwards); + void nudge_track (bool use_edit_point, bool forwards); /* xfades */ @@ -1803,11 +2229,14 @@ class Editor : public PublicEditor Gtk::VBox nudge_vbox; AudioClock nudge_clock; - nframes_t get_nudge_distance (nframes_t pos, nframes_t& next); + nframes64_t get_nudge_distance (nframes64_t pos, nframes64_t& next); + + bool nudge_forward_release (GdkEventButton*); + bool nudge_backward_release (GdkEventButton*); /* audio filters */ - void apply_filter (ARDOUR::AudioFilter&, string cmd); + void apply_filter (ARDOUR::Filter&, string cmd); /* handling cleanup */ @@ -1818,31 +2247,32 @@ class Editor : public PublicEditor /* tracking step changes of track height */ TimeAxisView* current_stepping_trackview; - struct timeval last_track_height_step_timestamp; + ARDOUR::microseconds_t last_track_height_step_timestamp; gint track_height_step_timeout(); sigc::connection step_timeout; TimeAxisView* entered_track; RegionView* entered_regionview; + + + void ensure_entered_track_selected (bool op_acts_on_objects = false); bool clear_entered_track; - gint left_track_canvas (GdkEventCrossing*); + bool left_track_canvas (GdkEventCrossing*); + bool entered_track_canvas (GdkEventCrossing*); void set_entered_track (TimeAxisView*); void set_entered_regionview (RegionView*); + void ensure_track_visible (TimeAxisView*); gint left_automation_track (); bool _new_regionviews_show_envelope; - void set_gain_envelope_visibility (bool); - void set_gain_envelope_active (bool); + void reset_canvas_action_sensitivity (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_opaque_item; - bool on_key_press_event (GdkEventKey*); + bool on_key_release_event (GdkEventKey*); void session_state_saved (string); @@ -1850,6 +2280,66 @@ class Editor : public PublicEditor Glib::RefPtr redo_action; void history_changed (); + + Gtk::HBox status_bar_hpacker; + + Editing::EditPoint _edit_point; + + Gtk::ComboBoxText edit_point_selector; + + void set_edit_point_preference (Editing::EditPoint ep, bool force = false); + void cycle_edit_point (bool with_marker); + void set_edit_point (); + void edit_point_selection_done (); + void edit_point_chosen (Editing::EditPoint); + Glib::RefPtr edit_point_action (Editing::EditPoint); + std::vector 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_for_action (RegionSelection&, bool allowed_entered_regionview = false); + + sigc::connection fast_screen_update_connection; + gint start_updating (); + gint stop_updating (); + void fast_update_strips (); + bool meters_running; + + void select_next_route (); + void select_prev_route (); + + void 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 (); + void set_track_height (uint32_t h); + + void remove_tracks (); + void toggle_tracks_active (); + void waveform_scale_chosen (Editing::WaveformScale); + + bool _have_idled; + int resize_idle_id; + int32_t resize_idle_target; + bool idle_resize(); + friend gboolean _idle_resize (gpointer); + std::vector pending_resizes; + + void visible_order_range (int*, int*) const; + bool y_movement_disallowed (int, int, int, int, int, std::bitset<512> const &, std::vector const &) const; + + void located (); + bool _pending_locate_request; }; #endif /* __ardour_editor_h__ */