X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.h;h=38129be33b874fdb57a0e1fe022a116ab8dec367;hb=056ceba16a5ab45aabec0cd10ae3228881e640dc;hp=0f5b2f3edde8a5364b012548f25a595349528bb7;hpb=29d677e6681b02d6940346ac88a432558b6c2a43;p=ardour.git diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 0f5b2f3edd..38129be33b 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -46,6 +46,8 @@ #include #include "pbd/stateful.h" +#include "pbd/signals.h" + #include "ardour/import_status.h" #include "ardour/tempo.h" #include "ardour/location.h" @@ -61,17 +63,19 @@ #include "editing.h" #include "enums.h" #include "editor_items.h" -#include "canvas-noevent-text.h" #include "region_selection.h" #include "canvas.h" #include "editor_summary.h" +namespace Gnome { namespace Canvas { + class NoEventText; +} } + namespace Gtkmm2ext { class TearOff; } namespace ARDOUR { - class AudioDiskstream; class RouteGroup; class Playlist; class AudioPlaylist; @@ -102,7 +106,7 @@ class AutomationTimeAxisView; class BundleManager; class ControlPoint; class CrossfadeView; -class Drag; +class DragManager; class GlobalPortMatrixWindow; class GroupedButtons; class Marker; @@ -118,7 +122,6 @@ class TempoLines; class TimeAxisView; class TimeFXDialog; class TimeSelection; -class TrackSelection; class EditorGroupTabs; class EditorRoutes; class EditorRouteGroups; @@ -150,17 +153,18 @@ struct EditorCursor { void set_length (double units); void set_y_axis (double position); - sigc::signal PositionChanged; + PBD::Signal1 PositionChanged; }; -class Editor : public PublicEditor +class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr { public: Editor (); ~Editor (); - void connect_to_session (ARDOUR::Session *); - ARDOUR::Session* current_session() const { return session; } + void set_session (ARDOUR::Session *); + ARDOUR::Session* session() const { return _session; } + void first_idle (); virtual bool have_idled () const { return _have_idled; } @@ -212,17 +216,12 @@ class Editor : public PublicEditor void consider_auditioning (boost::shared_ptr); void hide_a_region (boost::shared_ptr); - void remove_a_region (boost::shared_ptr); + void show_a_region (boost::shared_ptr); #ifdef USE_RUBBERBAND std::vector rb_opt_strings; #endif - /* option editor-access */ - - 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 (); @@ -327,7 +326,6 @@ class Editor : public PublicEditor 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; @@ -353,13 +351,16 @@ class Editor : public PublicEditor /* playhead/screen stuff */ + void set_stationary_playhead (bool yn); + void toggle_stationary_playhead (); + bool stationary_playhead() const { return _stationary_playhead; } + void set_follow_playhead (bool yn); void toggle_follow_playhead (); bool follow_playhead() const { return _follow_playhead; } bool dragging_playhead () const { return _dragging_playhead; } void toggle_zero_line_visibility (); - void toggle_waveforms_while_recording (); void set_summary (); void set_group_tabs (); void toggle_measure_visibility (); @@ -389,7 +390,6 @@ class Editor : public PublicEditor void scroll_tracks_down_line (); void scroll_tracks_up_line (); - bool new_regionviews_display_gain () { return _new_regionviews_show_envelope; } void prepare_for_cleanup (); void finish_cleanup (); @@ -397,6 +397,7 @@ class Editor : public PublicEditor void restore_editing_space(); void reset_x_origin (nframes64_t); + void reset_x_origin_to_follow_playhead (); void reset_y_origin (double); void reset_zoom (double); void reposition_and_zoom (nframes64_t, double); @@ -409,12 +410,15 @@ class Editor : public PublicEditor void toggle_meter_updating(); 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 (); + TrackViewList const & get_track_views () { return track_views; } @@ -429,6 +433,19 @@ class Editor : public PublicEditor void show_verbose_canvas_cursor_with (const std::string& txt); void hide_verbose_canvas_cursor(); + void center_screen (nframes64_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 (nframes64_t& first, int32_t direction = 0, bool for_mark = false); + void snap_to_with_modifier (nframes64_t& first, GdkEvent const *, int32_t direction = 0, bool for_mark = false); + void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false); + + void begin_reversible_command (std::string cmd_name); + void commit_reversible_command (); + protected: void map_transport_state (); void map_position_change (nframes64_t); @@ -439,7 +456,6 @@ class Editor : public PublicEditor void color_handler (); - ARDOUR::Session *session; ///< The session that we are editing, or 0 bool constructed; // to keep track of the playhead position for control_scroll @@ -481,6 +497,19 @@ class Editor : public PublicEditor Editing::MouseMode mouse_mode; bool _internal_editing; + Editing::MouseMode effective_mouse_mode () const; + + enum JoinObjectRangeState { + JOIN_OBJECT_RANGE_NONE, + /** `join object/range' mode is active and the mouse is over a place where object mode should happen */ + JOIN_OBJECT_RANGE_OBJECT, + /** `join object/range' mode is active and the mouse is over a place where range mode should happen */ + JOIN_OBJECT_RANGE_RANGE + }; + + JoinObjectRangeState _join_object_range_state; + + void update_join_object_range_location (double, double); int post_maximal_editor_width; int post_maximal_pane_position; @@ -500,7 +529,7 @@ class Editor : public PublicEditor void location_changed (ARDOUR::Location *); void location_flags_changed (ARDOUR::Location *, void *); void refresh_location_display (); - void refresh_location_display_s (ARDOUR::Change); + void refresh_location_display_s (const PBD::PropertyChange&); void refresh_location_display_internal (ARDOUR::Locations::LocationList&); void add_new_location (ARDOUR::Location *); void location_gone (ARDOUR::Location *); @@ -556,13 +585,11 @@ class Editor : public PublicEditor CrossfadeView* clicked_crossfadeview; ControlPoint* clicked_control_point; - void sort_track_selection (TrackSelection* sel = 0); + void sort_track_selection (TrackViewList* sel = 0); - void get_relevant_tracks (std::set& relevant_tracks) const; - void get_equivalent_tracks (RouteTimeAxisView*, std::set &, ARDOUR::RouteGroup::Property) const; - void get_equivalent_regions (RegionView* rv, std::vector &, ARDOUR::RouteGroup::Property) const; - RegionSelection get_equivalent_regions (RegionSelection &, ARDOUR::RouteGroup::Property) const; - void mapover_tracks (sigc::slot sl, TimeAxisView*, ARDOUR::RouteGroup::Property) const; + void get_equivalent_regions (RegionView* rv, std::vector &, PBD::PropertyID) const; + RegionSelection get_equivalent_regions (RegionSelection &, PBD::PropertyID) const; + void mapover_tracks (sigc::slot sl, TimeAxisView*, PBD::PropertyID) const; /* functions to be passed to mapover_tracks(), possibly with sigc::bind()-supplied arguments */ @@ -590,6 +617,8 @@ class Editor : public PublicEditor void collect_new_region_view (RegionView *); void collect_and_select_new_region_view (RegionView *); + long select_range_around_region (RegionView *); + Gtk::Menu track_context_menu; Gtk::Menu track_region_context_menu; Gtk::Menu track_selection_context_menu; @@ -614,8 +643,7 @@ class Editor : public PublicEditor void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); void handle_new_route (ARDOUR::RouteList&); - void remove_route (TimeAxisView *); - bool route_removal; + void timeaxisview_deleted (TimeAxisView *); Gtk::HBox global_hpacker; Gtk::VBox global_vpacker; @@ -868,7 +896,6 @@ class Editor : public PublicEditor Gtk::HBox bottom_hbox; Gtk::Table edit_packer; - Gtk::VScrollbar edit_vscrollbar; Gtk::Adjustment vertical_adjustment; Gtk::Adjustment horizontal_adjustment; @@ -878,14 +905,8 @@ class Editor : public PublicEditor void controls_layout_size_request (Gtk::Requisition*); sigc::connection controls_layout_size_request_connection; - Gtk::HScrollbar edit_hscrollbar; - bool _dragging_hscrollbar; - - void reset_hscrollbar_stepping (); - - bool hscrollbar_button_press (GdkEventButton*); - bool hscrollbar_button_release (GdkEventButton*); - void hscrollbar_allocate (Gtk::Allocation &alloc); + void horizontal_scroll_left (); + void horizontal_scroll_right (); double _canvas_width; double _canvas_height; @@ -948,15 +969,14 @@ class Editor : public PublicEditor void queue_visual_change_y (double); void ensure_visual_change_idle_handler (); - void end_location_changed (ARDOUR::Location*); + void session_range_location_changed (ARDOUR::Location*); /* track views */ TrackViewList track_views; std::pair trackview_by_y_position (double); - TimeAxisView* axis_view_from_route (ARDOUR::Route *) const; - TrackSelection axis_views_from_routes (std::list) const; + TimeAxisView* axis_view_from_route (boost::shared_ptr) const; - TrackSelection get_tracks_for_range_action () const; + TrackViewList get_tracks_for_range_action () const; static Gdk::Cursor* cross_hair_cursor; static Gdk::Cursor* trimmer_cursor; @@ -977,12 +997,11 @@ class Editor : public PublicEditor static void build_cursors (); - sigc::connection scroll_connection; + sigc::connection super_rapid_screen_update_connection; nframes64_t last_update_frame; - void center_screen (nframes64_t); void center_screen_internal (nframes64_t, float); - void update_current_screen (); + void super_rapid_screen_update (); void session_going_away (); @@ -1021,7 +1040,7 @@ class Editor : public PublicEditor void toggle_region_lock (); void toggle_region_opaque (); void toggle_record_enable (); - void set_region_lock_style (ARDOUR::Region::PositionLockStyle); + void toggle_region_lock_style (); void raise_region (); void raise_region_to_top (); void lower_region (); @@ -1071,6 +1090,7 @@ class Editor : public PublicEditor void audition_region_from_region_list (); void hide_region_from_region_list (); + void show_region_in_region_list (); void align (ARDOUR::RegionPoint); void align_relative (ARDOUR::RegionPoint); @@ -1134,7 +1154,7 @@ class Editor : public PublicEditor void drop_paths_part_two (const std::vector& paths, nframes64_t frame, double ypos); int import_sndfiles (std::vector paths, Editing::ImportMode mode, ARDOUR::SrcQuality, nframes64_t& pos, - int target_regions, int target_tracks, boost::shared_ptr, bool, uint32_t total); + int target_regions, int target_tracks, boost::shared_ptr&, bool); int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, nframes64_t& pos, int target_regions, int target_tracks, boost::shared_ptr&); @@ -1146,17 +1166,6 @@ class Editor : public PublicEditor 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 */ - - ArdourDialog* interthread_progress_window; - Gtk::Label interthread_progress_label; - Gtk::VBox interthread_progress_vbox; - Gtk::ProgressBar interthread_progress_bar; - Gtk::Button interthread_cancel_button; - Gtk::Label interthread_cancel_label; - sigc::connection interthread_progress_connection; - void interthread_cancel_clicked (); - void build_interthread_progress_window (); ARDOUR::InterThreadInfo* current_interthread_info; AnalysisWindow* analysis_window; @@ -1173,7 +1182,6 @@ class Editor : public PublicEditor }; EditorImportStatus import_status; - gint import_progress_timeout (void *); static void *_import_thread (void *); void* import_thread (); void finish_import (); @@ -1244,14 +1252,11 @@ class Editor : public PublicEditor void reverse_selection (); void edit_envelope (); - void start_scrolling (); - void stop_scrolling (); - double last_scrub_x; int scrubbing_direction; int scrub_reversals; int scrub_reverse_distance; - void scrub (); + void scrub (nframes64_t, double); void keyboard_selection_begin (); void keyboard_selection_finish (bool add); @@ -1270,9 +1275,9 @@ class Editor : public PublicEditor bool ignore_gui_changes; - Drag* _drag; + DragManager* _drags; - void break_drag (); + void escape (); Gtk::Menu fade_context_menu; void popup_fade_context_menu (int, int, ArdourCanvas::Item*, ItemType); @@ -1286,7 +1291,6 @@ class Editor : public PublicEditor void set_fade_out_active (bool); std::set > motion_frozen_playlists; - RegionSelection pre_drag_region_selection; bool _dragging_playhead; bool _dragging_edit_point; @@ -1296,10 +1300,10 @@ class Editor : public PublicEditor gint mouse_rename_region (ArdourCanvas::Item*, GdkEvent*); - void start_region_grab (ArdourCanvas::Item*, GdkEvent*, RegionView*); + void add_region_drag (ArdourCanvas::Item*, GdkEvent*, RegionView*); void start_create_region_grab (ArdourCanvas::Item*, GdkEvent*); - void start_region_copy_grab (ArdourCanvas::Item*, GdkEvent*, RegionView*); - void start_region_brush_grab (ArdourCanvas::Item*, GdkEvent*, RegionView*); + void add_region_copy_drag (ArdourCanvas::Item*, GdkEvent*, RegionView*); + void add_region_brush_drag (ArdourCanvas::Item*, GdkEvent*, RegionView*); void start_selection_grab (ArdourCanvas::Item*, GdkEvent*); void region_view_item_click (AudioRegionView&, GdkEventButton*); @@ -1333,8 +1337,8 @@ class Editor : public PublicEditor private: ArdourCanvas::Item *last_item_entered; int last_item_entered_n; -public: +public: bool canvas_region_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*); @@ -1363,6 +1367,11 @@ public: bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*); bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*); + private: + friend class DragManager; + friend class EditorRouteGroups; + friend class EditorRegions; + /* non-public event handlers */ bool canvas_playhead_cursor_event (GdkEvent* event, ArdourCanvas::Item*); @@ -1395,8 +1404,8 @@ public: bool _show_measures; /// true if the editor should follow the playhead, otherwise false bool _follow_playhead; - /// true if waveforms should be shown while recording audio tracks, otherwise false - bool _show_waveforms_recording; + /// true if we scroll the tracks rather than the playhead + bool _stationary_playhead; ARDOUR::TempoMap::BBTPointList *current_bbt_points; @@ -1445,17 +1454,18 @@ public: void update_punch_range_view (bool visibility=false); void new_transport_marker_menu_popdown (); void marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); - void tm_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); + void tempo_or_meter_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void new_transport_marker_context_menu (GdkEventButton*, ArdourCanvas::Item*); void build_range_marker_menu (bool loop_or_punch); - void build_marker_menu (bool start_or_end); - void build_tm_marker_menu (); + void build_marker_menu (bool); + void build_tempo_or_meter_marker_menu (bool); void build_new_transport_marker_menu (); + void dynamic_cast_marker_object (void*, MeterMarker**, TempoMarker**) const; - Gtk::Menu* tm_marker_menu; + Gtk::Menu* tempo_or_meter_marker_menu; Gtk::Menu* marker_menu; - Gtk::Menu* start_end_marker_menu; + Gtk::Menu* session_range_marker_menu; Gtk::Menu* range_marker_menu; Gtk::Menu* transport_marker_menu; Gtk::Menu* new_transport_marker_menu; @@ -1469,13 +1479,9 @@ public: 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 tempo_map_changed (const PBD::PropertyChange&); void redisplay_tempo (bool immediate_redraw); - void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false); - void snap_to_with_modifier (nframes64_t& first, GdkEvent const *, int32_t direction = 0, bool for_mark = false); - void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false); - uint32_t bbt_beat_subdivision; /* toolbar */ @@ -1499,14 +1505,14 @@ public: Gtk::Table toolbar_selection_clock_table; Gtk::Label toolbar_selection_cursor_label; - Gtk::HBox mouse_mode_button_box; - Gtkmm2ext::TearOff* mouse_mode_tearoff; + Gtkmm2ext::TearOff* _mouse_mode_tearoff; Gtk::ToggleButton mouse_select_button; Gtk::ToggleButton mouse_move_button; Gtk::ToggleButton mouse_gain_button; Gtk::ToggleButton mouse_zoom_button; Gtk::ToggleButton mouse_timefx_button; Gtk::ToggleButton mouse_audition_button; + Gtk::ToggleButton join_object_range_button; void mouse_mode_toggled (Editing::MouseMode m); bool ignore_mouse_mode_toggle; @@ -1560,7 +1566,9 @@ public: void setup_toolbar (); - Gtkmm2ext::TearOff* tools_tearoff; + void setup_tooltips (); + + Gtkmm2ext::TearOff* _tools_tearoff; Gtk::HBox toolbar_hbox; Gtk::EventBox toolbar_base; Gtk::Frame toolbar_frame; @@ -1622,7 +1630,7 @@ public: /* object rubberband select process */ - bool select_all_within (nframes64_t start, nframes64_t end, gdouble topy, gdouble boty, const TrackViewList&, Selection::Operation op); + bool select_all_within (nframes64_t, nframes64_t, double, double, TrackViewList const &, Selection::Operation op); ArdourCanvas::SimpleRect *rubberband_rect; @@ -1667,10 +1675,10 @@ public: bool allow_vertical_scroll; /* trimming */ - void point_trim (GdkEvent*); - 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 point_trim (GdkEvent *, nframes64_t); + void single_contents_trim (RegionView&, nframes64_t, bool, bool); + void single_start_trim (RegionView&, nframes64_t, bool); + void single_end_trim (RegionView&, nframes64_t, bool); void thaw_region_after_trim (RegionView& rv); @@ -1748,9 +1756,6 @@ public: XMLNode *before; /* used in *_reversible_command */ - void begin_reversible_command (std::string cmd_name); - void commit_reversible_command (); - void update_title (); void update_title_s (const std::string & snapshot_name); @@ -1762,9 +1767,6 @@ public: ~State (); }; - void store_state (State&) const; - void restore_state (State *); - void instant_save (); boost::shared_ptr last_audition_region; @@ -1772,7 +1774,6 @@ public: /* freeze operations */ ARDOUR::InterThreadInfo freeze_status; - gint freeze_progress_timeout (void *); static void* _freeze_thread (void*); void* freeze_thread (); @@ -1812,9 +1813,7 @@ public: 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); @@ -1901,7 +1900,7 @@ public: int playlist_deletion_dialog (boost::shared_ptr); - std::vector session_connections; + PBD::ScopedConnectionList session_connections; /* tracking step changes of track height */ @@ -1923,8 +1922,6 @@ public: void ensure_track_visible (TimeAxisView*); gint left_automation_track (); - bool _new_regionviews_show_envelope; - void reset_canvas_action_sensitivity (bool); void toggle_gain_envelope_visibility (); void toggle_gain_envelope_active (); @@ -1958,15 +1955,13 @@ public: 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_at (RegionSelection&, nframes64_t where, const TrackViewList& ts) const; + void get_regions_after (RegionSelection&, nframes64_t where, const TrackViewList& ts) const; void get_regions_for_action (RegionSelection&, bool allow_entered = false, bool allow_edit_position = true); - sigc::connection fast_screen_update_connection; - gint start_updating (); - gint stop_updating (); - void fast_update_strips (); + void start_updating_meters (); + void stop_updating_meters (); bool meters_running; void select_next_route (); @@ -1979,7 +1974,7 @@ public: BundleManager* _bundle_manager; GlobalPortMatrixWindow* _global_port_matrix[ARDOUR::DataType::num_types]; - void fit_tracks (TrackSelection &); + void fit_tracks (TrackViewList &); void fit_selected_tracks (); void set_track_height (uint32_t h); @@ -1988,16 +1983,25 @@ public: bool _have_idled; int resize_idle_id; + static gboolean _idle_resize (gpointer); bool idle_resize(); - friend gboolean _idle_resize (gpointer); int32_t _pending_resize_amount; TimeAxisView* _pending_resize_view; void visible_order_range (int*, int*) const; void located (); + + /** true if we've made a locate request that hasn't yet been processed */ bool _pending_locate_request; + + /** if true, there is a pending Session locate which is the initial one when loading a session; + we need to know this so that we don't (necessarily) set the viewport to show the playhead + initially. + */ + bool _pending_initial_locate; + Gtk::HBox _summary_hbox; EditorSummary* _summary; void region_view_added (RegionView *);