X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.h;h=38129be33b874fdb57a0e1fe022a116ab8dec367;hb=056ceba16a5ab45aabec0cd10ae3228881e640dc;hp=a29df6ebb62ed6668aa82c2c385e70b544dd2640;hpb=f6fdd8dcbf41f864e9f0cc32dabe81fe3533ddfe;p=ardour.git diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index a29df6ebb6..38129be33b 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -46,7 +46,7 @@ #include #include "pbd/stateful.h" -#include "pbd/scoped_connections.h" +#include "pbd/signals.h" #include "ardour/import_status.h" #include "ardour/tempo.h" @@ -76,7 +76,6 @@ namespace Gtkmm2ext { } namespace ARDOUR { - class AudioDiskstream; class RouteGroup; class Playlist; class AudioPlaylist; @@ -107,7 +106,7 @@ class AutomationTimeAxisView; class BundleManager; class ControlPoint; class CrossfadeView; -class Drag; +class DragManager; class GlobalPortMatrixWindow; class GroupedButtons; class Marker; @@ -154,7 +153,7 @@ struct EditorCursor { void set_length (double units); void set_y_axis (double position); - sigc::signal PositionChanged; + PBD::Signal1 PositionChanged; }; class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr @@ -217,17 +216,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 (); @@ -357,13 +351,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* 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 (); @@ -393,7 +390,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 (); @@ -401,6 +397,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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); @@ -418,6 +415,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; } @@ -435,6 +436,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 (); @@ -487,6 +497,19 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -506,7 +529,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 *); @@ -564,9 +587,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void sort_track_selection (TrackViewList* sel = 0); - 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 */ @@ -594,6 +617,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -618,8 +643,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -945,7 +969,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -973,11 +997,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD static void build_cursors (); - sigc::connection scroll_connection; + sigc::connection super_rapid_screen_update_connection; nframes64_t last_update_frame; void center_screen_internal (nframes64_t, float); - void update_current_screen (); + void super_rapid_screen_update (); void session_going_away (); @@ -1016,7 +1040,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 (); @@ -1066,6 +1090,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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); @@ -1129,7 +1154,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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&); @@ -1141,17 +1166,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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; @@ -1168,7 +1182,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD }; EditorImportStatus import_status; - gint import_progress_timeout (void *); static void *_import_thread (void *); void* import_thread (); void finish_import (); @@ -1239,14 +1252,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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); @@ -1265,9 +1275,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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); @@ -1290,10 +1300,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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*); @@ -1327,8 +1337,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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*); @@ -1357,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*); @@ -1389,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; @@ -1439,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; @@ -1463,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 */ @@ -1493,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; @@ -1554,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; @@ -1616,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; @@ -1661,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); @@ -1742,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); @@ -1756,9 +1767,6 @@ public: ~State (); }; - void store_state (State&) const; - void restore_state (State *); - void instant_save (); boost::shared_ptr last_audition_region; @@ -1766,7 +1774,6 @@ public: /* freeze operations */ ARDOUR::InterThreadInfo freeze_status; - gint freeze_progress_timeout (void *); static void* _freeze_thread (void*); void* freeze_thread (); @@ -1806,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); @@ -1917,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 (); @@ -1957,10 +1960,8 @@ public: 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 (); @@ -1982,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 *);