X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.h;h=2e2593dbf1c6d027b12d24b1561d21d7f0a51c28;hb=0c468dc379095430641d193fd136eec8fa48d0a9;hp=0d640c1f9d762675a1c2c41878044faf4a88ddca;hpb=ad346dc638c1b87af571cb8a920c0d7151da5a94;p=ardour.git diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 0d640c1f9d..2e2593dbf1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -20,12 +20,14 @@ #ifndef __ardour_editor_h__ #define __ardour_editor_h__ +#include + +#include #include #include #include #include -#include -#include +#include #include @@ -47,8 +49,8 @@ #include "ardour/types.h" #include "canvas/fwd.h" +#include "canvas/ruler.h" -#include "gtk-custom-ruler.h" #include "ardour_button.h" #include "ardour_dialog.h" #include "ardour_dropdown.h" @@ -57,6 +59,7 @@ #include "enums.h" #include "editor_items.h" #include "region_selection.h" +#include "selection_memento.h" namespace Gtkmm2ext { class TearOff; @@ -95,6 +98,7 @@ class AutomationTimeAxisView; class BundleManager; class ButtonJoiner; class ControlPoint; +class CursorContext; class DragManager; class EditNoteDialog; class EditorCursor; @@ -116,6 +120,7 @@ class PlaylistSelector; class PluginSelector; class ProgressReporter; class RhythmFerret; +class RulerDialog; class Selection; class SoundFileOmega; class StreamView; @@ -147,6 +152,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD double visible_canvas_height () const { return _visible_canvas_height; } + double trackviews_height () const; void cycle_snap_mode (); void next_snap_choice (); @@ -174,11 +180,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Editing::MidiEditMode current_midi_edit_mode () const; void remove_midi_note (ArdourCanvas::Item *, GdkEvent *); - bool internal_editing() const { return _internal_editing ; } - void set_internal_edit (bool yn); - bool toggle_internal_editing_from_double_click (GdkEvent*); + bool internal_editing() const; - void _ensure_time_axis_view_is_visible (const TimeAxisView& tav, bool at_top); void foreach_time_axis_view (sigc::slot); void add_to_idle_resize (TimeAxisView*, int32_t); @@ -229,7 +232,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD } double sample_to_pixel (framepos_t sample) const { - return sample / samples_per_pixel; + return round (sample / (double) samples_per_pixel); } double sample_to_pixel_unrounded (framepos_t sample) const { @@ -239,6 +242,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* selection */ Selection& get_selection() const { return *selection; } + bool get_selection_extents ( framepos_t &start, framepos_t &end ); // the time extents of the current selection, whether Range, Region(s), Control Points, or Notes Selection& get_cut_buffer() const { return *cut_buffer; } void track_mixer_selection (); @@ -249,7 +253,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void maybe_locate_with_edit_preroll (framepos_t); void play_with_preroll (); void select_all_in_track (Selection::Operation op); - void select_all (Selection::Operation op); + void select_all_objects (Selection::Operation op); void invert_selection_in_track (); void invert_selection (); void deselect_all (); @@ -275,7 +279,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void export_range (); void export_region (); - void add_toplevel_controls (Gtk::Container&); + void add_transport_frame (Gtk::Container&); + void add_toplevel_menu (Gtk::Container&); Gtk::HBox& get_status_bar_packer() { return status_bar_hpacker; } void set_zoom_focus (Editing::ZoomFocus); @@ -283,6 +288,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD framecnt_t get_current_zoom () const { return samples_per_pixel; } void cycle_zoom_focus (); void temporal_zoom_step (bool coarser); + void ensure_time_axis_view_is_visible (TimeAxisView const & tav, bool at_top); void tav_zoom_step (bool coarser); void tav_zoom_smooth (bool coarser, bool force_all); @@ -309,7 +315,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* nudge is initiated by transport controls owned by ARDOUR_UI */ framecnt_t get_nudge_distance (framepos_t pos, framecnt_t& next); - Evoral::MusicalTime get_grid_type_as_beats (bool& success, framepos_t position); + framecnt_t get_paste_offset (framepos_t pos, unsigned paste_count, framecnt_t duration); + unsigned get_grid_beat_divisions(framepos_t position); + Evoral::Beats get_grid_type_as_beats (bool& success, framepos_t position); void nudge_forward (bool next, bool force_playhead); void nudge_backward (bool next, bool force_playhead); @@ -355,8 +363,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void scroll_tracks_down_line (); void scroll_tracks_up_line (); - bool scroll_up_one_track (); - bool scroll_down_one_track (); + bool scroll_up_one_track (bool skip_child_views = false); + bool scroll_down_one_track (bool skip_child_views = false); void prepare_for_cleanup (); void finish_cleanup (); @@ -365,14 +373,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void restore_editing_space(); void update_tearoff_visibility(); + void reattach_all_tearoffs (); + double get_y_origin () const; void reset_x_origin (framepos_t); void reset_x_origin_to_follow_playhead (); void reset_y_origin (double); void reset_zoom (framecnt_t); void reposition_and_zoom (framepos_t, double); - framepos_t get_preferred_edit_position (bool ignore_playhead = false, bool use_context_click = false); + framepos_t get_preferred_edit_position (bool ignore_playhead = false, + bool use_context_click = false, + bool from_outside_canvas = false); bool update_mouse_speed (); bool decelerate_mouse_speed (); @@ -394,23 +406,53 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int get_regionview_count_from_region_list (boost::shared_ptr); - void do_import (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t&); - void do_embed (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, framepos_t&); + void do_import (std::vector paths, + Editing::ImportDisposition disposition, + Editing::ImportMode mode, + ARDOUR::SrcQuality quality, + framepos_t& pos, + boost::shared_ptr instrument = boost::shared_ptr()); + + void do_embed (std::vector paths, + Editing::ImportDisposition disposition, + Editing::ImportMode mode, + framepos_t& pos, + boost::shared_ptr instrument = boost::shared_ptr()); void get_regions_corresponding_to (boost::shared_ptr region, std::vector& regions, bool src_comparison); + void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const; + void get_per_region_note_selection (std::list > > > >&) const; + void center_screen (framepos_t); TrackViewList axis_views_from_routes (boost::shared_ptr) const; + Gtkmm2ext::TearOff* mouse_mode_tearoff () const { return _mouse_mode_tearoff; } Gtkmm2ext::TearOff* tools_tearoff () const { return _tools_tearoff; } - void snap_to (framepos_t& first, int32_t direction = 0, bool for_mark = false); - void snap_to_with_modifier (framepos_t& first, GdkEvent const *, int32_t direction = 0, bool for_mark = false); - void snap_to (framepos_t& first, framepos_t& last, int32_t direction = 0, bool for_mark = false); - + void snap_to (framepos_t& first, + ARDOUR::RoundMode direction = ARDOUR::RoundNearest, + bool for_mark = false); + + void snap_to_with_modifier (framepos_t& first, + GdkEvent const * ev, + ARDOUR::RoundMode direction = ARDOUR::RoundNearest, + bool for_mark = false); + + void snap_to (framepos_t& first, + framepos_t& last, + ARDOUR::RoundMode direction = ARDOUR::RoundNearest, + bool for_mark = false); + + void begin_selection_op_history (); + void begin_reversible_selection_op (std::string cmd_name); + void commit_reversible_selection_op (); + void undo_selection_op (); + void redo_selection_op (); void begin_reversible_command (std::string cmd_name); void begin_reversible_command (GQuark); + void abort_reversible_command (); void commit_reversible_command (); DragManager* drags () const { @@ -420,8 +462,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void maybe_autoscroll (bool, bool, bool); bool autoscroll_active() const; - Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; } - void set_canvas_cursor (Gdk::Cursor*, bool save=false); + Gdk::Cursor* get_canvas_cursor () const; + void set_current_trimmable (boost::shared_ptr); void set_current_movable (boost::shared_ptr); @@ -438,6 +480,19 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void get_pointer_position (double &, double &) const; + /** Context for mouse entry (stored in a stack). */ + struct EnterContext { + ItemType item_type; + boost::shared_ptr cursor_ctx; + }; + + /** Get the topmost enter context for the given item type. + * + * This is used to change the cursor associated with a given enter context, + * which may not be on the top of the stack. + */ + EnterContext* get_enter_context(ItemType type); + TimeAxisView* stepping_axis_view () { return _stepping_axis_view; } @@ -446,21 +501,38 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD _stepping_axis_view = v; } - ArdourCanvas::Group* get_trackview_group () const { return _trackview_group; } - ArdourCanvas::Group* get_hscroll_group () const { return h_scroll_group; } - ArdourCanvas::Group* get_vscroll_group () const { return v_scroll_group; } - ArdourCanvas::Group* get_hvscroll_group () const { return hv_scroll_group; } + ArdourCanvas::Container* get_trackview_group () const { return _trackview_group; } + ArdourCanvas::Container* get_noscroll_group () const { return no_scroll_group; } + ArdourCanvas::ScrollGroup* get_hscroll_group () const { return h_scroll_group; } + ArdourCanvas::ScrollGroup* get_hvscroll_group () const { return hv_scroll_group; } + ArdourCanvas::ScrollGroup* get_cursor_scroll_group () const { return cursor_scroll_group; } + + ArdourCanvas::GtkCanvasViewport* get_track_canvas () const; + + void override_visible_track_count (); - ArdourCanvas::GtkCanvasViewport* get_track_canvas () const; + /* Ruler metrics methods */ - void override_visible_track_count (); + void metric_get_timecode (std::vector&, gdouble, gdouble, gint); + void metric_get_bbt (std::vector&, gdouble, gdouble, gint); + void metric_get_samples (std::vector&, gdouble, gdouble, gint); + void metric_get_minsec (std::vector&, gdouble, gdouble, gint); + /* editing operations that need to be public */ + void mouse_add_new_marker (framepos_t where, bool is_cd=false, bool is_xrun=false); + void split_regions_at (framepos_t, RegionSelection&); + void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false); + RegionSelection get_regions_from_selection_and_mouse (framepos_t); + protected: void map_transport_state (); void map_position_change (framepos_t); void on_realize(); + void suspend_route_redisplay (); + void resume_route_redisplay (); + private: void color_handler (); @@ -502,15 +574,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Editing::ZoomFocus zoom_focus; void set_samples_per_pixel (framecnt_t); - bool clamp_samples_per_pixel (framecnt_t &) const; Editing::MouseMode mouse_mode; - Editing::MouseMode pre_internal_mouse_mode; Editing::SnapType pre_internal_snap_type; Editing::SnapMode pre_internal_snap_mode; Editing::SnapType internal_snap_type; Editing::SnapMode internal_snap_mode; - bool _internal_editing; Editing::MouseMode effective_mouse_mode () const; enum JoinObjectRangeState { @@ -523,7 +592,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD JoinObjectRangeState _join_object_range_state; - void update_join_object_range_location (double, double); + void update_join_object_range_location (double); boost::optional pre_notebook_shrink_pane_width; @@ -544,11 +613,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::VBox scrollers_rulers_markers_box; void location_changed (ARDOUR::Location *); - void location_flags_changed (ARDOUR::Location *, void *); + void location_flags_changed (ARDOUR::Location *); void refresh_location_display (); - void refresh_location_display_internal (ARDOUR::Locations::LocationList&); + void refresh_location_display_internal (const ARDOUR::Locations::LocationList&); void add_new_location (ARDOUR::Location *); - ArdourCanvas::Group* add_new_location_internal (ARDOUR::Location *); + ArdourCanvas::Container* add_new_location_internal (ARDOUR::Location *); void location_gone (ARDOUR::Location *); void remove_marker (ArdourCanvas::Item&, GdkEvent*); gint really_remove_marker (ARDOUR::Location* loc); @@ -594,7 +663,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD LocationMarkerMap location_markers; void update_marker_labels (); - void update_marker_labels (ArdourCanvas::Group *); + void update_marker_labels (ArdourCanvas::Container *); void check_marker_label (Marker *); /** A set of lists of Markers that are in each of the canvas groups @@ -603,13 +672,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD * a marker has moved we can decide whether we need to update the labels * for all markers or for just a few. */ - std::map > _sorted_marker_lists; + std::map > _sorted_marker_lists; void remove_sorted_marker (Marker *); void hide_marker (ArdourCanvas::Item*, GdkEvent*); void clear_marker_display (); - void mouse_add_new_marker (framepos_t where, bool is_cd=false, bool is_xrun=false); void mouse_add_new_range (framepos_t); + void mouse_add_new_loop (framepos_t); + void mouse_add_new_punch (framepos_t); bool choose_new_marker_name(std::string &name); void update_cd_marker_display (); void ensure_cd_marker_updated (LocationMarkers * lam, ARDOUR::Location * location); @@ -640,12 +710,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type); bool button_release_can_deselect; + bool _mouse_changed_selection; void catch_vanishing_regionview (RegionView *); void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false); void select_all_tracks (); - void select_all_internal_edit (Selection::Operation); + bool select_all_internal_edit (Selection::Operation); bool set_selected_control_point_from_click (bool press, Selection::Operation op = Selection::Set); void set_selected_track_from_click (bool press, Selection::Operation op = Selection::Set, bool no_remove=false); @@ -682,6 +753,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void popup_control_point_context_menu (ArdourCanvas::Item *, GdkEvent *); Gtk::Menu _control_point_context_menu; + void popup_note_context_menu (ArdourCanvas::Item *, GdkEvent *); + Gtk::Menu _note_context_menu; + void add_routes (ARDOUR::RouteList&); void timeaxisview_deleted (TimeAxisView *); @@ -689,9 +763,24 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::VBox global_vpacker; Gtk::VBox vpacker; - Gdk::Cursor* current_canvas_cursor; - Gdk::Cursor* which_grabber_cursor (); - void set_canvas_cursor (); + /* Cursor stuff. Do not use directly, use via CursorContext. */ + friend class CursorContext; + std::vector _cursor_stack; + void set_canvas_cursor (Gdk::Cursor*); + size_t push_canvas_cursor (Gdk::Cursor*); + void pop_canvas_cursor (); + + Gdk::Cursor* which_grabber_cursor () const; + Gdk::Cursor* which_track_cursor () const; + Gdk::Cursor* which_mode_cursor () const; + Gdk::Cursor* which_trim_cursor (bool left_side) const; + Gdk::Cursor* which_canvas_cursor (ItemType type) const; + + /** Push the appropriate enter/cursor context on item entry. */ + void choose_canvas_cursor_on_entry (ItemType); + + /** Update all enter cursors based on current settings. */ + void update_all_enter_cursors (); ArdourCanvas::GtkCanvas* _track_canvas; ArdourCanvas::GtkCanvasViewport* _track_canvas_viewport; @@ -702,58 +791,59 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD VerboseCursor* _verbose_cursor; void parameter_changed (std::string); + void ui_parameter_changed (std::string); - bool track_canvas_motion (GdkEvent*); - - Gtk::EventBox time_canvas_event_box; Gtk::EventBox time_bars_event_box; - Gtk::EventBox ruler_label_event_box; + Gtk::VBox time_bars_vbox; ArdourCanvas::Pixbuf *logo_item; #if 0 /* these will be needed when we have canvas rulers */ - ArdourCanvas::Group *minsec_group; - ArdourCanvas::Group *bbt_group; - ArdourCanvas::Group *timecode_group; - ArdourCanvas::Group *frame_group; + ArdourCanvas::Container *minsec_group; + ArdourCanvas::Container *bbt_group; + ArdourCanvas::Container *timecode_group; + ArdourCanvas::Container *frame_group; #endif - ArdourCanvas::Group *tempo_group; - ArdourCanvas::Group *meter_group; - ArdourCanvas::Group *marker_group; - ArdourCanvas::Group *range_marker_group; - ArdourCanvas::Group *transport_marker_group; - ArdourCanvas::Group* cd_marker_group; + ArdourCanvas::Container *tempo_group; + ArdourCanvas::Container *meter_group; + ArdourCanvas::Container *marker_group; + ArdourCanvas::Container *range_marker_group; + ArdourCanvas::Container *transport_marker_group; + ArdourCanvas::Container* cd_marker_group; /* parent for groups which themselves contain time markers */ - ArdourCanvas::Group* _time_markers_group; + ArdourCanvas::Container* _time_markers_group; /* The group containing all other groups that are scrolled vertically and horizontally. */ - ArdourCanvas::Group* hv_scroll_group; + ArdourCanvas::ScrollGroup* hv_scroll_group; - /* The group containing all other groups that are scrolled vertically ONLY + /* The group containing all other groups that are scrolled horizontally ONLY */ - ArdourCanvas::Group* v_scroll_group; + ArdourCanvas::ScrollGroup* h_scroll_group; - /* The group containing all other groups that are scrolled horizontally ONLY + /* Scroll group for cursors, scrolled horizontally, above everything else */ - ArdourCanvas::Group* h_scroll_group; + ArdourCanvas::ScrollGroup* cursor_scroll_group; + + /* The group containing all trackviews. */ + ArdourCanvas::Container* no_scroll_group; /* The group containing all trackviews. */ - ArdourCanvas::Group* _trackview_group; + ArdourCanvas::Container* _trackview_group; /* The group holding things (mostly regions) while dragging so they * are on top of everything else */ - ArdourCanvas::Group* _drag_motion_group; + ArdourCanvas::Container* _drag_motion_group; /* a rect that sits at the bottom of all tracks to act as a drag-no-drop/clickable * target area. */ - ArdourCanvas::Rectangle* _canvas_bottom_rect; - bool canvas_bottom_rect_event (GdkEvent* event); + ArdourCanvas::Rectangle* _canvas_drop_zone; + bool canvas_drop_zone_event (GdkEvent* event); enum RulerType { ruler_metric_timecode = 0, @@ -770,7 +860,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ruler_video_timeline = 10, }; - static GtkCustomMetric ruler_metrics[4]; Glib::RefPtr ruler_timecode_action; Glib::RefPtr ruler_bbt_action; Glib::RefPtr ruler_samples_action; @@ -783,13 +872,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Glib::RefPtr ruler_cd_marker_action; bool no_ruler_shown_update; - bool ruler_button_press (GdkEventButton*); - bool ruler_button_release (GdkEventButton*); - bool ruler_mouse_motion (GdkEventMotion*); - bool ruler_scroll (GdkEventScroll* event); - Gtk::Widget * ruler_grabbed_widget; + RulerDialog* ruler_dialog; + void initialize_rulers (); void update_just_timecode (); void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers @@ -805,16 +891,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void store_ruler_visibility (); void restore_ruler_visibility (); - static gint _metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint); - static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); - static gint _metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint); - static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint); - enum MinsecRulerScale { + + enum MinsecRulerScale { + minsec_show_msecs, minsec_show_seconds, minsec_show_minutes, minsec_show_hours, - minsec_show_frames + minsec_show_many_hours }; MinsecRulerScale minsec_ruler_scale; @@ -829,7 +913,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD timecode_show_frames, timecode_show_seconds, timecode_show_minutes, - timecode_show_hours + timecode_show_hours, + timecode_show_many_hours }; TimecodeRulerScale timecode_ruler_scale; @@ -842,7 +927,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_samples_ruler_scale (framepos_t, framepos_t); enum BBTRulerScale { - bbt_over, + bbt_show_many, bbt_show_64, bbt_show_16, bbt_show_4, @@ -863,23 +948,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin, ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end); - gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint); - gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); - gint metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint); - gint metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint); - - Gtk::Widget *_ruler_separator; - GtkWidget *_timecode_ruler; - GtkWidget *_bbt_ruler; - GtkWidget *_samples_ruler; - GtkWidget *_minsec_ruler; - Gtk::Widget *timecode_ruler; - Gtk::Widget *bbt_ruler; - Gtk::Widget *samples_ruler; - Gtk::Widget *minsec_ruler; - static Editor *ruler_editor; - - static const double timebar_height; + ArdourCanvas::Ruler* timecode_ruler; + ArdourCanvas::Ruler* bbt_ruler; + ArdourCanvas::Ruler* samples_ruler; + ArdourCanvas::Ruler* minsec_ruler; + + static double timebar_height; guint32 visible_timebars; Gtk::Menu *editor_ruler_menu; @@ -903,7 +977,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* videtimline related actions */ Gtk::Label videotl_label; - ArdourCanvas::Group* videotl_group; + ArdourCanvas::Container* videotl_group; Glib::RefPtr ruler_video_action; Glib::RefPtr xjadeo_proc_action; Glib::RefPtr xjadeo_ontop_action; @@ -922,11 +996,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);} int videotl_bar_height; /* in units of timebar_height; default: 4 */ int get_videotl_bar_height () const { return videotl_bar_height; } - void export_video (bool range = false); void toggle_region_video_lock (); - Gtk::VBox time_bars_vbox; - friend class EditorCursor; EditorCursor* playhead_cursor; @@ -962,6 +1033,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD std::vector region_boundary_cache; void build_region_boundary_cache (); + Gtk::HBox toplevel_hpacker; + Gtk::HBox top_hbox; Gtk::HBox bottom_hbox; @@ -999,9 +1072,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -1054,7 +1125,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* track views */ TrackViewList track_views; - std::pair trackview_by_y_position (double); + std::pair trackview_by_y_position (double, bool trackview_relative_offset = true) const; RouteTimeAxisView* axis_view_from_route (boost::shared_ptr) const; TrackViewList get_tracks_for_range_action () const; @@ -1070,7 +1141,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD framepos_t cut_buffer_start; framecnt_t cut_buffer_length; - Gdk::Cursor* pre_press_cursor; + boost::shared_ptr _press_cursor_ctx; ///< Button press cursor context + boost::weak_ptr _trimmable; boost::weak_ptr _movable; @@ -1100,9 +1172,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtkmm2ext::ActionMap editor_action_map; Gtkmm2ext::Bindings key_bindings; + /* CUT/COPY/PASTE */ + + framepos_t last_paste_pos; + unsigned paste_count; + void cut_copy (Editing::CutCopyOp); bool can_cut_copy () const; - void cut_copy_points (Editing::CutCopyOp); + void cut_copy_points (Editing::CutCopyOp, Evoral::Beats earliest=Evoral::Beats(), bool midi=false); void cut_copy_regions (Editing::CutCopyOp, RegionSelection&); void cut_copy_ranges (Editing::CutCopyOp); void cut_copy_midi (Editing::CutCopyOp); @@ -1134,9 +1211,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void change_region_layering_order (bool from_context_menu); void lower_region (); void lower_region_to_bottom (); - void split_regions_at (framepos_t, RegionSelection&); void split_region_at_transients (); - void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false); void crop_region_to_selection (); void crop_region_to (framepos_t start, framepos_t end); void set_sync_point (framepos_t, const RegionSelection&); @@ -1167,6 +1242,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void reset_region_scale_amplitude (); void adjust_region_gain (bool up); void quantize_region (); + void quantize_regions (const RegionSelection& rs); + void legatize_region (bool shrink_only); + void legatize_regions (const RegionSelection& rs, bool shrink_only); + void transform_region (); + void transform_regions (const RegionSelection& rs); void insert_patch_change (bool from_context); void fork_region (); @@ -1213,19 +1293,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); - void temporal_zoom_selection (); + void calc_extra_zoom_edges(framepos_t &start, framepos_t &end); + void temporal_zoom_selection (bool both_axes = false); void temporal_zoom_region (bool both_axes); - void zoom_to_region (bool both_axes); void temporal_zoom_session (); void temporal_zoom (framecnt_t samples_per_pixel); void temporal_zoom_by_frame (framepos_t start, framepos_t end); void temporal_zoom_to_frame (bool coarser, framepos_t frame); - 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); @@ -1242,19 +1319,47 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool idle_drop_paths (std::vector paths, framepos_t frame, double ypos, bool copy); void drop_paths_part_two (const std::vector& paths, framepos_t frame, double ypos, bool copy); - int import_sndfiles (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, - ARDOUR::SrcQuality, framepos_t& pos, - int target_regions, int target_tracks, boost::shared_ptr&, bool); - int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, - Editing::ImportDisposition disposition, Editing::ImportMode mode, - framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr&); - - int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, - Editing::ImportDisposition, 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, framepos_t& pos, Editing::ImportMode mode, - boost::shared_ptr& existing_track); + int import_sndfiles (std::vector paths, + Editing::ImportDisposition disposition, + Editing::ImportMode mode, + ARDOUR::SrcQuality quality, + framepos_t& pos, + int target_regions, + int target_tracks, + boost::shared_ptr& track, + bool replace, + boost::shared_ptr instrument = boost::shared_ptr()); + + int embed_sndfiles (std::vector paths, + bool multiple_files, + bool& check_sample_rate, + Editing::ImportDisposition disposition, + Editing::ImportMode mode, + framepos_t& pos, + int target_regions, + int target_tracks, + boost::shared_ptr& track, + boost::shared_ptr instrument = boost::shared_ptr()); + + int add_sources (std::vector paths, + ARDOUR::SourceList& sources, + framepos_t& pos, + Editing::ImportDisposition disposition, + Editing::ImportMode mode, + int target_regions, + int target_tracks, + boost::shared_ptr& track, + bool add_channel_suffix, + boost::shared_ptr instrument = boost::shared_ptr()); + + int finish_bringing_in_material (boost::shared_ptr region, + uint32_t in_chans, + uint32_t out_chans, + framepos_t& pos, + Editing::ImportMode mode, + boost::shared_ptr& existing_track, + const std::string& new_track_name, + boost::shared_ptr instrument); boost::shared_ptr get_nth_selected_audio_track (int nth) const; boost::shared_ptr get_nth_selected_midi_track (int nth) const; @@ -1306,6 +1411,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void jump_forward_to_mark (); void jump_backward_to_mark (); void cursor_align (bool playhead_to_edit); + void toggle_skip_playback (); void remove_last_capture (); void select_all_selectables_using_time_selection (); @@ -1324,14 +1430,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_punch_from_selection (); void set_punch_from_region (); - void set_loop_from_edit_range (bool play); + void set_session_extents_from_selection (); + void set_loop_from_region (bool play); - void set_punch_from_edit_range (); void set_loop_range (framepos_t start, framepos_t end, std::string cmd); void set_punch_range (framepos_t start, framepos_t end, std::string cmd); void add_location_from_playhead_cursor (); + void remove_location_at_playhead_cursor (); bool select_new_marker; void reverse_selection (); @@ -1361,6 +1468,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD DragManager* _drags; void escape (); + void lock (); + void unlock (); + Gtk::Dialog* lock_dialog; + + struct timeval last_event_time; + bool generic_event_handler (GdkEvent*); + bool lock_timeout_callback (); + void start_lock_event_timing (); Gtk::Menu fade_context_menu; @@ -1377,6 +1492,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_fade_in_active (bool); void set_fade_out_active (bool); + void fade_range (); + std::set > motion_frozen_playlists; bool _dragging_playhead; @@ -1402,6 +1519,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* Canvas event handlers */ + bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas); bool canvas_control_point_event (GdkEvent* event,ArdourCanvas::Item*, ControlPoint*); bool canvas_line_event (GdkEvent* event,ArdourCanvas::Item*, AutomationLine*); bool canvas_selection_rect_event (GdkEvent* event,ArdourCanvas::Item*, SelectionRect*); @@ -1414,18 +1532,19 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*, bool trim = false); bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); + bool canvas_wave_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_frame_handle_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*); bool canvas_feature_line_event (GdkEvent* event, ArdourCanvas::Item*, RegionView*); bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*); bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*); - bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*); bool canvas_tempo_marker_event (GdkEvent* event,ArdourCanvas::Item*, TempoMarker*); bool canvas_meter_marker_event (GdkEvent* event,ArdourCanvas::Item*, MeterMarker*); bool canvas_automation_track_event(GdkEvent* event, ArdourCanvas::Item*, AutomationTimeAxisView*); bool canvas_note_event (GdkEvent* event, ArdourCanvas::Item *); + bool canvas_ruler_event (GdkEvent* event, ArdourCanvas::Item *, ItemType); bool canvas_tempo_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_meter_bar_event (GdkEvent* event, ArdourCanvas::Item*); bool canvas_marker_bar_event (GdkEvent* event, ArdourCanvas::Item*); @@ -1450,15 +1569,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD friend class EditorRouteGroups; friend class EditorRegions; - /** true if the mouse is over a place where region trim can happen */ - bool _over_region_trim_target; - /* non-public event handlers */ bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*); bool track_canvas_scroll (GdkEventScroll* event); - bool track_canvas_scroll_event (GdkEventScroll* event); bool track_canvas_button_press_event (GdkEventButton* event); bool track_canvas_button_release_event (GdkEventButton* event); bool track_canvas_motion_notify_event (GdkEventMotion* event); @@ -1488,8 +1603,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD TempoLines* tempo_lines; - ArdourCanvas::Group* global_rect_group; - ArdourCanvas::Group* time_line_group; + ArdourCanvas::Container* global_rect_group; + ArdourCanvas::Container* time_line_group; void hide_measures (); void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, @@ -1510,7 +1625,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void edit_tempo_marker (TempoMarker&); void edit_meter_marker (MeterMarker&); void edit_control_point (ArdourCanvas::Item*); - void edit_notes (TimeAxisViewItem&); + void edit_notes (MidiRegionView*); void marker_menu_edit (); void marker_menu_remove (); @@ -1574,8 +1689,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void editor_mixer_button_toggled (); void editor_list_button_toggled (); - AudioClock* zoom_range_clock; - ArdourButton zoom_in_button; ArdourButton zoom_out_button; ArdourButton zoom_out_full_button; @@ -1583,10 +1696,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourButton tav_expand_button; ArdourButton tav_shrink_button; ArdourDropdown visible_tracks_selector; + ArdourDropdown zoom_preset_selector; int32_t _visible_track_count; void build_track_count_menu (); void set_visible_track_count (int32_t); + + void set_zoom_preset(int64_t); Gtk::VBox toolbar_clock_vbox; Gtk::VBox toolbar_selection_clock_vbox; @@ -1597,10 +1713,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourButton mouse_select_button; ArdourButton mouse_draw_button; ArdourButton mouse_move_button; - ArdourButton mouse_gain_button; - ArdourButton mouse_zoom_button; ArdourButton mouse_timefx_button; + ArdourButton mouse_content_button; ArdourButton mouse_audition_button; + ArdourButton mouse_cut_button; ArdourButton smart_mode_button; Glib::RefPtr smart_mode_action; @@ -1609,9 +1725,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void mouse_mode_object_range_toggled (); bool ignore_mouse_mode_toggle; - ArdourButton internal_edit_button; - void toggle_internal_editing (); - bool mouse_select_button_release (GdkEventButton*); Gtk::VBox automation_box; @@ -1622,7 +1735,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void edit_mode_selection_done ( ARDOUR::EditMode m ); void build_edit_mode_menu (); Gtk::VBox edit_mode_box; - std::vector edit_mode_strings; void set_edit_mode (ARDOUR::EditMode); void cycle_edit_mode (); @@ -1679,6 +1791,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Selection* selection; Selection* cut_buffer; + SelectionMemento* _selection_memento; void time_selection_changed (); void update_time_selection_display (); @@ -1697,6 +1810,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void point_selection_changed (); void marker_selection_changed (); + bool _ignore_follow_edits; + void cancel_selection (); void cancel_time_selection (); @@ -1734,11 +1849,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourCanvas::Rectangle *rubberband_rect; - /* mouse zoom process */ - - ArdourCanvas::Rectangle *zoom_rect; - void reposition_zoom_rect (framepos_t start, framepos_t end); - EditorRouteGroups* _route_groups; EditorRoutes* _routes; EditorRegions* _regions; @@ -1841,7 +1951,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void write_selection (); - XMLNode *before; /* used in *_reversible_command */ + uint32_t selection_op_cmd_depth; + uint32_t selection_op_history_it; + + std::list selection_op_history; /* used in *_reversible_selection_op */ + std::list before; /* used in *_reversible_command */ void update_title (); void update_title_s (const std::string & snapshot_name); @@ -1923,7 +2037,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void apply_filter (ARDOUR::Filter&, std::string cmd, ProgressReporter* progress = 0); Command* apply_midi_note_edit_op_to_region (ARDOUR::MidiOperator& op, MidiRegionView& mrv); - void apply_midi_note_edit_op (ARDOUR::MidiOperator& op); + void apply_midi_note_edit_op (ARDOUR::MidiOperator& op, const RegionSelection& rs); /* handling cleanup */ @@ -1944,12 +2058,13 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD */ RegionView* entered_regionview; + std::vector _enter_stack; + bool clear_entered_track; 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 (); void reset_canvas_action_sensitivity (bool); @@ -1965,6 +2080,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Glib::RefPtr undo_action; Glib::RefPtr redo_action; + Glib::RefPtr alternate_redo_action; + Glib::RefPtr alternate_alternate_redo_action; + Glib::RefPtr selection_undo_action; + Glib::RefPtr selection_redo_action; void history_changed (); @@ -1982,6 +2101,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void edit_point_chosen (Editing::EditPoint); Glib::RefPtr edit_point_action (Editing::EditPoint); std::vector edit_point_strings; + std::vector edit_mode_strings; void selected_marker_moved (ARDOUR::Location*); @@ -2000,13 +2120,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void select_next_route (); void select_prev_route (); - void snap_to_internal (framepos_t& first, int32_t direction = 0, bool for_mark = false); - void timecode_snap_to_internal (framepos_t& first, int32_t direction = 0, bool for_mark = false); + void snap_to_internal (framepos_t& first, + ARDOUR::RoundMode direction = ARDOUR::RoundNearest, + bool for_mark = false); + + void timecode_snap_to_internal (framepos_t& first, + ARDOUR::RoundMode direction = ARDOUR::RoundNearest, + bool for_mark = false); RhythmFerret* rhythm_ferret; void fit_tracks (TrackViewList &); - void fit_selected_tracks (); + void fit_selection (); void set_track_height (Height); void remove_tracks (); @@ -2071,8 +2196,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::MenuItem& action_menu_item (std::string const &); void action_pre_activated (Glib::RefPtr const &); - void set_canvas_cursor_for_region_view (double, RegionView *); - MouseCursors* _cursors; void follow_mixer_selection (); @@ -2097,10 +2220,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD TimeAxisView* _stepping_axis_view; void zoom_vertical_modifier_released(); + void bring_in_callback (Gtk::Label*, uint32_t n, uint32_t total, std::string name); + void update_bring_in_message (Gtk::Label* label, uint32_t n, uint32_t total, std::string name); + void bring_all_sources_into_session (); + friend class Drag; friend class RegionDrag; friend class RegionMoveDrag; friend class RegionSpliceDrag; + friend class RegionRippleDrag; friend class TrimDrag; friend class MeterMarkerDrag; friend class TempoMarkerDrag;