X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.h;h=2ff5d24999a5c8e8df0a4a58b3caed06c1e3b0f4;hb=d0227fe5b7c30271cd2950a71d429cf03b0db2db;hp=56abdee4317a3f045b9ae8175d5a01cb00756849;hpb=90e73a3a6dc196f8295291eca7e67e85595b82d4;p=ardour.git diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 56abdee431..2ff5d24999 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -39,9 +39,10 @@ #include #include -#include -#include -#include +#include "gtkmm2ext/selector.h" +#include "gtkmm2ext/click_box.h" +#include "gtkmm2ext/dndtreeview.h" +#include "gtkmm2ext/stateful_button.h" #include "pbd/stateful.h" #include "pbd/signals.h" @@ -128,6 +129,8 @@ class EditorSnapshots; class EditorSummary; class RegionLayeringOrderEditor; class ProgressReporter; +class EditorCursor; +class MouseCursors; /* */ class ImageFrameView; @@ -139,23 +142,6 @@ class ImageFrameSocketHandler ; class TimeAxisViewItem ; /* */ -struct EditorCursor { - Editor& editor; - ArdourCanvas::Points points; - ArdourCanvas::Line canvas_item; - framepos_t current_frame; - double length; - - EditorCursor (Editor&, bool (Editor::*)(GdkEvent*,ArdourCanvas::Item*)); - ~EditorCursor (); - - void set_position (framepos_t); - void set_length (double units); - void set_y_axis (double position); - - PBD::Signal1 PositionChanged; -}; - class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr { public: @@ -306,6 +292,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* export */ void export_audio (); + void stem_export (); void export_selection (); void export_range (); void export_region (); @@ -337,6 +324,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void create_editor_mixer (); void show_editor_list (bool yn); void set_selected_mixer_strip (TimeAxisView&); + void mixer_strip_width_changed (); void hide_track_in_display (TimeAxisView* tv, bool temporary = false); /* nudge is initiated by transport controls owned by ARDOUR_UI */ @@ -358,7 +346,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void toggle_stationary_playhead (); bool stationary_playhead() const { return _stationary_playhead; } - void set_follow_playhead (bool yn); + void set_follow_playhead (bool yn, bool catch_up = true); void toggle_follow_playhead (); bool follow_playhead() const { return _follow_playhead; } bool dragging_playhead () const { return _dragging_playhead; } @@ -371,7 +359,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* fades/xfades */ - void toggle_selected_region_fades (int dir); + void toggle_region_fades (int dir); void update_region_fade_visibility (); bool xfade_visibility() const { return _xfade_visibility; } void update_xfade_visibility (); @@ -428,7 +416,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void get_regions_corresponding_to (boost::shared_ptr region, std::vector& regions); - void show_verbose_canvas_cursor_with (const std::string& txt); + void show_verbose_canvas_cursor_with (const std::string& txt, int32_t xoffset = 0, int32_t yoffset = 0); void hide_verbose_canvas_cursor(); void center_screen (framepos_t); @@ -442,6 +430,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void snap_to (framepos_t& first, framepos_t& last, int32_t direction = 0, bool for_mark = false); void begin_reversible_command (std::string cmd_name); + void begin_reversible_command (GQuark); void commit_reversible_command (); DragManager* drags () const { @@ -450,34 +439,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void maybe_autoscroll (bool, bool); - /* handy cursors for everyone to use */ - - static Gdk::Cursor* cross_hair_cursor; - static Gdk::Cursor* trimmer_cursor; - static Gdk::Cursor* right_side_trim_cursor; - static Gdk::Cursor* left_side_trim_cursor; - static Gdk::Cursor* fade_in_cursor; - static Gdk::Cursor* fade_out_cursor; - static Gdk::Cursor* selector_cursor; - static Gdk::Cursor* grabber_cursor; - static Gdk::Cursor* grabber_note_cursor; - static Gdk::Cursor* grabber_edit_point_cursor; - static Gdk::Cursor* zoom_in_cursor; - static Gdk::Cursor* zoom_out_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* up_down_cursor; - static Gdk::Cursor* wait_cursor; - static Gdk::Cursor* timebar_cursor; - static Gdk::Cursor* transparent_cursor; - Gdk::Cursor* get_canvas_cursor () const { return current_canvas_cursor; } - void set_canvas_cursor (Gdk::Cursor*); + void set_canvas_cursor (Gdk::Cursor*, bool save=false); + void set_current_trimmable (boost::shared_ptr); + void set_current_movable (boost::shared_ptr); + + MouseCursors const * cursors () const { + return _cursors; + } protected: void map_transport_state (); @@ -554,7 +523,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int pre_maximal_editor_height; void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*); - Gtk::Notebook the_notebook; + Gtk::Notebook _the_notebook; + bool _notebook_shrunk; + void add_notebook_page (std::string const &, Gtk::Widget &); + bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *); + Gtk::HPaned edit_pane; Gtk::VPaned editor_summary_pane; @@ -574,6 +547,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void remove_marker (ArdourCanvas::Item&, GdkEvent*); gint really_remove_marker (ARDOUR::Location* loc); void goto_nth_marker (int nth); + void toggle_marker_lines (); + void set_marker_line_visibility (bool); uint32_t location_marker_color; uint32_t location_range_color; @@ -582,28 +557,48 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD uint32_t location_cd_marker_color; struct LocationMarkers { - Marker* start; - Marker* end; - bool valid; - - LocationMarkers () : start(0), end(0), valid (true) {} - - ~LocationMarkers (); - - void hide(); - void show (); - void set_name (const std::string&); - void set_position (framepos_t start, framepos_t end = 0); - void set_color_rgba (uint32_t); + Marker* start; + Marker* end; + bool valid; + + LocationMarkers () : start(0), end(0), valid (true) {} + + ~LocationMarkers (); + + void hide (); + void show (); + + void set_show_lines (bool); + void set_selected (bool); + void canvas_height_set (double); + void setup_lines (); + + void set_name (const std::string&); + void set_position (framepos_t start, framepos_t end = 0); + void set_color_rgba (uint32_t); }; LocationMarkers *find_location_markers (ARDOUR::Location *) const; ARDOUR::Location* find_location_from_marker (Marker *, bool& is_start) const; Marker* entered_marker; + bool _show_marker_lines; typedef std::map LocationMarkerMap; LocationMarkerMap location_markers; + void update_marker_labels (); + void update_marker_labels (ArdourCanvas::Group *); + void check_marker_label (Marker *); + + /** A set of lists of Markers that are in each of the canvas groups + * for the marker sections at the top of the editor. These lists + * are kept sorted in time order between marker movements, so that after + * 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; + 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); @@ -645,6 +640,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 set_selected_control_point_from_click (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); @@ -668,18 +664,18 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Menu * track_edit_playlist_submenu; Gtk::Menu * track_selection_edit_playlist_submenu; - void popup_track_context_menu (int, int, ItemType, bool, framepos_t); - Gtk::Menu* build_track_context_menu (framepos_t); - Gtk::Menu* build_track_bus_context_menu (framepos_t); - Gtk::Menu* build_track_region_context_menu (framepos_t frame); - Gtk::Menu* build_track_crossfade_context_menu (framepos_t); - Gtk::Menu* build_track_selection_context_menu (framepos_t); + void popup_track_context_menu (int, int, ItemType, bool); + Gtk::Menu* build_track_context_menu (); + Gtk::Menu* build_track_bus_context_menu (); + Gtk::Menu* build_track_region_context_menu (); + Gtk::Menu* build_track_crossfade_context_menu (); + Gtk::Menu* build_track_selection_context_menu (); void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&); void add_bus_context_items (Gtk::Menu_Helpers::MenuList&); - void add_region_context_items (StreamView*, std::list >, Gtk::Menu_Helpers::MenuList&, - ARDOUR::framepos_t, bool); + void add_region_context_items (Gtk::Menu_Helpers::MenuList&, boost::shared_ptr); void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr, Gtk::Menu_Helpers::MenuList&, bool many); void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); + Gtk::MenuItem* _popup_region_menu_item; void handle_new_route (ARDOUR::RouteList&); void timeaxisview_deleted (TimeAxisView *); @@ -753,7 +749,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD enum RulerType { ruler_metric_timecode = 0, ruler_metric_bbt = 1, - ruler_metric_frames = 2, + ruler_metric_samples = 2, ruler_metric_minsec = 3, ruler_time_tempo = 4, @@ -800,7 +796,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD static gint _metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint); static gint _metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); - static gint _metric_get_frames (GtkCustomRulerMark **, gdouble, gdouble, gint); + static gint _metric_get_samples (GtkCustomRulerMark **, gdouble, gdouble, gint); static gint _metric_get_minsec (GtkCustomRulerMark **, gdouble, gdouble, gint); enum MinsecRulerScale { @@ -812,10 +808,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD MinsecRulerScale minsec_ruler_scale; - nframes_t minsec_mark_interval; + framecnt_t minsec_mark_interval; gint minsec_mark_modulo; gint minsec_nmarks; - void set_minsec_ruler_scale (gdouble lower, gdouble upper); + void set_minsec_ruler_scale (framepos_t, framepos_t); enum TimecodeRulerScale { timecode_show_bits, @@ -827,10 +823,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD TimecodeRulerScale timecode_ruler_scale; - nframes_t timecode_mark_interval; gint timecode_mark_modulo; gint timecode_nmarks; - void set_timecode_ruler_scale (gdouble lower, gdouble upper); + void set_timecode_ruler_scale (framepos_t, framepos_t); + + framecnt_t _samples_ruler_interval; + void set_samples_ruler_scale (framepos_t, framepos_t); enum BBTRulerScale { bbt_over, @@ -854,17 +852,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD gint metric_get_timecode (GtkCustomRulerMark **, gdouble, gdouble, gint); gint metric_get_bbt (GtkCustomRulerMark **, gdouble, gdouble, gint); - gint metric_get_frames (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 *_frames_ruler; + GtkWidget *_samples_ruler; GtkWidget *_minsec_ruler; Gtk::Widget *timecode_ruler; Gtk::Widget *bbt_ruler; - Gtk::Widget *frames_ruler; + Gtk::Widget *samples_ruler; Gtk::Widget *minsec_ruler; static Editor *ruler_editor; @@ -884,7 +882,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Label minsec_label; Gtk::Label bbt_label; Gtk::Label timecode_label; - Gtk::Label frame_label; + Gtk::Label samples_label; Gtk::Label tempo_label; Gtk::Label meter_label; Gtk::Label mark_label; @@ -937,16 +935,21 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Table edit_packer; Gtk::Adjustment vertical_adjustment; - + Gtk::Layout controls_layout; bool control_layout_scroll (GdkEventScroll* ev); - void controls_layout_size_request (Gtk::Requisition*); - sigc::connection controls_layout_size_request_connection; - - bool horizontal_scroll_left_press (); - void horizontal_scroll_left_release (); - bool horizontal_scroll_right_press (); - void horizontal_scroll_right_release (); + void reset_controls_layout_width (); + void reset_controls_layout_height (int32_t height); + + enum Direction { + LEFT, + RIGHT, + UP, + DOWN + }; + + bool scroll_press (Direction); + void scroll_release (); sigc::connection _scroll_connection; int _scroll_callbacks; @@ -1019,8 +1022,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD TrackViewList get_tracks_for_range_action () const; - static void build_cursors (); - sigc::connection super_rapid_screen_update_connection; framepos_t last_update_frame; void center_screen_internal (framepos_t, float); @@ -1032,6 +1033,10 @@ 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::weak_ptr _trimmable; + boost::weak_ptr _movable; + bool typed_event (ArdourCanvas::Item*, GdkEvent*, ItemType); bool button_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType); bool button_press_handler_1 (ArdourCanvas::Item *, GdkEvent *, ItemType); @@ -1044,6 +1049,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* KEYMAP HANDLING */ void register_actions (); + void register_region_actions (); int ensure_cursor (framepos_t* pos); @@ -1060,31 +1066,30 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* EDITING OPERATIONS */ void reset_point_selection (); - void toggle_region_mute (); void toggle_region_lock (); - void toggle_region_opaque (); + void toggle_opaque_region (); void toggle_record_enable (); void toggle_region_lock_style (); void raise_region (); void raise_region_to_top (); - void change_region_layering_order (ARDOUR::framepos_t); + void change_region_layering_order (); 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); + 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&); - void set_region_sync_from_edit_point (); + void set_region_sync_position (); void remove_region_sync(); - void align_selection (ARDOUR::RegionPoint, framepos_t position, const RegionSelection&); - void align_selection_relative (ARDOUR::RegionPoint point, framepos_t position, const RegionSelection&); + void align_regions (ARDOUR::RegionPoint); + void align_regions_relative (ARDOUR::RegionPoint point); void align_region (boost::shared_ptr, ARDOUR::RegionPoint point, framepos_t position); void align_region_internal (boost::shared_ptr, ARDOUR::RegionPoint point, framepos_t position); void remove_selected_regions (); void remove_clicked_region (); - void edit_region (); + void show_region_properties (); void show_midi_list_editor (); void rename_region (); void duplicate_some_regions (RegionSelection&, float times); @@ -1098,10 +1103,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void reverse_region (); void strip_region_silence (); void normalize_region (); - double _last_normalization_value; void reset_region_scale_amplitude (); - void adjust_region_scale_amplitude (bool up); + void adjust_region_gain (bool up); void quantize_region (); + void insert_patch_change (); void fork_region (); void do_insert_time (); @@ -1109,7 +1114,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void tab_to_transient (bool forward); - void use_region_as_bar (); + void set_tempo_from_region (); void use_range_as_bar (); void define_one_bar (framepos_t start, framepos_t end); @@ -1118,13 +1123,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void hide_region_from_region_list (); void show_region_in_region_list (); - void align (ARDOUR::RegionPoint); - void align_relative (ARDOUR::RegionPoint); - void naturalize (); + void naturalize_region (); void reset_focus (); - void split (); + void split_region (); void cut (); void copy (); @@ -1135,10 +1138,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void snap_regions_to_grid (); void close_region_gaps (); - int get_prefix (float&, bool&); - void keyboard_paste (); - void keyboard_insert_region_list_selection (); void region_from_selection (); void create_region_from_selection (std::vector >&); @@ -1148,7 +1148,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void play_from_edit_point_and_return (); void play_selected_region (); void play_edit_range (); - void loop_selected_region (); void play_location (ARDOUR::Location&); void loop_location (ARDOUR::Location&); @@ -1160,9 +1159,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void temporal_zoom_by_frame (framepos_t start, framepos_t end, const std::string & op); void temporal_zoom_to_frame (bool coarser, framepos_t frame); - void amplitude_zoom (gdouble scale); - void amplitude_zoom_step (bool in); - void insert_region_list_drag (boost::shared_ptr, int x, int y); void insert_region_list_selection (float times); @@ -1224,25 +1220,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void move_to_start (); void move_to_end (); - void goto_frame (); void center_playhead (); 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); void scroll_backward (float pages=0.8f); void scroll_forward (float pages=0.8f); void scroll_tracks_down (); void scroll_tracks_up (); - void delete_sample_forward (); - void delete_sample_backward (); - void delete_screen (); - void search_backwards (); - void search_forwards (); void set_mark (); void clear_markers (); void clear_ranges (); @@ -1263,8 +1249,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_selection_from_region (); void add_location_mark (framepos_t where); - void add_location_from_audio_region (); - void add_locations_from_audio_region (); + void add_location_from_region (); + void add_locations_from_region (); void add_location_from_selection (); void set_loop_from_selection (bool play); void set_punch_from_selection (); @@ -1317,7 +1303,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_fade_out_shape (ARDOUR::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); @@ -1390,6 +1375,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool canvas_markerview_item_view_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*); bool canvas_markerview_start_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*); bool canvas_markerview_end_handle_event(GdkEvent* event, ArdourCanvas::Item*,MarkerView*); + + PBD::Signal0 EditorFreeze; + PBD::Signal0 EditorThaw; private: friend class DragManager; @@ -1397,6 +1385,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD friend class EditorRegions; ArdourCanvas::Item *last_item_entered; + /** true if the mouse is over a place where region trim can happen */ + bool _over_region_trim_target; /* non-public event handlers */ @@ -1418,7 +1408,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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_mute_unmute_region (); + void toggle_region_mute (); void kbd_brush (); void kbd_do_brush (GdkEvent*); @@ -1486,15 +1476,14 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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, ARDOUR::Location *); + void build_range_marker_menu (bool); + void build_marker_menu (ARDOUR::Location *); 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* tempo_or_meter_marker_menu; Gtk::Menu* marker_menu; - Gtk::Menu* session_range_marker_menu; Gtk::Menu* range_marker_menu; Gtk::Menu* transport_marker_menu; Gtk::Menu* new_transport_marker_menu; @@ -1507,7 +1496,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void remove_metric_marks (); void draw_metric_marks (const ARDOUR::Metrics& metrics); - void compute_current_bbt_points (nframes_t left, nframes_t right); + void compute_current_bbt_points (framepos_t left, framepos_t right); void tempo_map_changed (const PBD::PropertyChange&); void redisplay_tempo (bool immediate_redraw); @@ -1535,19 +1524,19 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::Label toolbar_selection_cursor_label; 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; + Gtkmm2ext::StatefulToggleButton mouse_select_button; + Gtkmm2ext::StatefulToggleButton mouse_move_button; + Gtkmm2ext::StatefulToggleButton mouse_gain_button; + Gtkmm2ext::StatefulToggleButton mouse_zoom_button; + Gtkmm2ext::StatefulToggleButton mouse_timefx_button; + Gtkmm2ext::StatefulToggleButton mouse_audition_button; + Gtkmm2ext::StatefulToggleButton join_object_range_button; void mouse_mode_toggled (Editing::MouseMode m); void mouse_mode_object_range_toggled () {} bool ignore_mouse_mode_toggle; - Gtk::ToggleButton internal_edit_button; + Gtkmm2ext::StatefulToggleButton internal_edit_button; void toggle_internal_editing (); gint mouse_select_button_release (GdkEventButton*); @@ -1558,6 +1547,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::ComboBoxText edit_mode_selector; Gtk::VBox edit_mode_box; + std::vector edit_mode_strings; void set_edit_mode (ARDOUR::EditMode); void cycle_edit_mode (); @@ -1600,7 +1590,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::HBox toolbar_hbox; Gtk::EventBox toolbar_base; Gtk::Frame toolbar_frame; - + Gtk::Viewport _toolbar_viewport; + /* midi toolbar */ Gtk::HBox panic_box; @@ -1620,16 +1611,20 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD 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 sensitize_all_region_actions (bool); + void sensitize_the_right_region_actions (); + bool _all_region_actions_sensitized; + /** Flag to block region action handlers from doing what they normally do; + * I tried Gtk::Action::block_activate() but this doesn't work (ie it doesn't + * block) when setting a ToggleAction's active state. + */ + bool _ignore_region_action; + bool _last_region_menu_was_main; void point_selection_changed (); void marker_selection_changed (); void cancel_selection (); - void region_selection_op (void (ARDOUR::Region::*pmf)(void)); - 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 (framepos_t where); /* transport range select process */ @@ -1658,7 +1653,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* object rubberband select process */ - bool select_all_within (framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool); + void select_all_within (framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool); ArdourCanvas::SimpleRect *rubberband_rect; @@ -1702,18 +1697,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* trimming */ void point_trim (GdkEvent *, framepos_t); - void single_contents_trim (RegionView&, framepos_t, bool, bool); - void single_start_trim (RegionView&, framepos_t, bool); - void single_end_trim (RegionView&, framepos_t, bool); - - void thaw_region_after_trim (RegionView& rv); 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); @@ -1806,11 +1794,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void freeze_route (); void unfreeze_route (); - /* route-group solo + mute */ - - void set_route_group_solo (ARDOUR::Route&, bool); - void set_route_group_mute (ARDOUR::Route&, bool); - /* duplication */ void duplicate_dialog (bool with_dialog); @@ -1830,7 +1813,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD int time_stretch (RegionSelection&, float fraction); int pitch_shift (RegionSelection&, float cents); - void pitch_shift_regions (); + void pitch_shift_region (); int time_fx (RegionSelection&, float val, bool pitching); /* editor-mixer strip */ @@ -1987,8 +1970,10 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void get_regions_at (RegionSelection&, framepos_t where, const TrackViewList& ts) const; void get_regions_after (RegionSelection&, framepos_t where, const TrackViewList& ts) const; - void get_regions_for_action (RegionSelection&, bool allow_entered = false, bool allow_edit_position = true); - + RegionSelection get_regions_from_selection (); + RegionSelection get_regions_from_selection_and_edit_point (); + RegionSelection get_regions_from_selection_and_entered (); + void start_updating_meters (); void stop_updating_meters (); bool meters_running; @@ -2031,7 +2016,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::HBox _summary_hbox; EditorSummary* _summary; + void region_view_added (RegionView *); + void region_view_removed (); void update_canvas_now (); @@ -2047,22 +2034,31 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD double _last_motion_y; RegionLayeringOrderEditor* layering_order_editor; - void update_region_layering_order_editor (ARDOUR::framepos_t); + void update_region_layering_order_editor (); /** Track that was the source for the last cut/copy operation. Used as a place to paste things iff there is no selected track. */ TimeAxisView* _last_cut_copy_source_track; - /** true if the update of the region list's selection from the current Selection - should be blocked if the Selection is empty. See EditorRegions::selection_changed. + /** true if a change in Selection->regions should change the selection in the region list. + See EditorRegions::selection_changed. */ - bool _block_region_list_update_if_empty; + bool _region_selection_change_updates_region_list; void setup_fade_images (); std::map _fade_in_images; std::map _fade_out_images; + 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 resize_text_widgets (); + friend class Drag; friend class RegionDrag; friend class RegionMoveDrag;