X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor.cc;h=7cdd7d5b1f489fdd2de48ea9baa47f526ff94dde;hb=67e19c177f473807cd6510751bcf4a48574e6088;hp=6f2773e138be2ccf4363a064a79260a29de84499;hpb=9ec393422f960f98a3a970805699b2bd05ec803c;p=ardour.git diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 6f2773e138..7cdd7d5b1f 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -59,7 +59,6 @@ #include "gtkmm2ext/bindings.h" #include "gtkmm2ext/grouped_buttons.h" #include "gtkmm2ext/gtk_ui.h" -#include "gtkmm2ext/tearoff.h" #include "gtkmm2ext/utils.h" #include "gtkmm2ext/window_title.h" #include "gtkmm2ext/choice.h" @@ -68,6 +67,7 @@ #include "ardour/audio_track.h" #include "ardour/audioengine.h" #include "ardour/audioregion.h" +#include "ardour/lmath.h" #include "ardour/location.h" #include "ardour/profile.h" #include "ardour/route_group.h" @@ -114,6 +114,7 @@ #include "note_base.h" #include "playlist_selector.h" #include "public_editor.h" +#include "quantize_dialog.h" #include "region_layering_order_editor.h" #include "rgb_macros.h" #include "rhythm_ferret.h" @@ -122,6 +123,8 @@ #include "tempo_lines.h" #include "time_axis_view.h" #include "timers.h" +#include "tooltips.h" +#include "ui_config.h" #include "utils.h" #include "verbose_cursor.h" @@ -231,7 +234,7 @@ pane_size_watcher (Paned* pane) X: hard to access Quartz: impossible to access - + so stop that by preventing it from ever getting too narrow. 35 pixels is basically a rough guess at the tab width. @@ -248,10 +251,85 @@ pane_size_watcher (Paned* pane) } Editor::Editor () - : _join_object_range_state (JOIN_OBJECT_RANGE_NONE) - + : PublicEditor (global_hpacker) + , editor_mixer_strip_width (Wide) + , constructed (false) + , _playlist_selector (0) + , no_save_visual (false) + , leftmost_frame (0) + , samples_per_pixel (2048) + , zoom_focus (ZoomFocusPlayhead) + , mouse_mode (MouseObject) + , pre_internal_snap_type (SnapToBeat) + , pre_internal_snap_mode (SnapOff) + , internal_snap_type (SnapToBeat) + , internal_snap_mode (SnapOff) + , _join_object_range_state (JOIN_OBJECT_RANGE_NONE) + , _notebook_shrunk (false) + , location_marker_color (0) + , location_range_color (0) + , location_loop_color (0) + , location_punch_color (0) + , location_cd_marker_color (0) + , entered_marker (0) + , _show_marker_lines (false) + , clicked_axisview (0) + , clicked_routeview (0) + , clicked_regionview (0) + , clicked_selection (0) + , clicked_control_point (0) + , button_release_can_deselect (true) , _mouse_changed_selection (false) - /* time display buttons */ + , region_edit_menu_split_item (0) + , region_edit_menu_split_multichannel_item (0) + , track_region_edit_playlist_menu (0) + , track_edit_playlist_submenu (0) + , track_selection_edit_playlist_submenu (0) + , _popup_region_menu_item (0) + , _track_canvas (0) + , _track_canvas_viewport (0) + , within_track_canvas (false) + , _verbose_cursor (0) + , logo_item (0) + , tempo_group (0) + , meter_group (0) + , marker_group (0) + , range_marker_group (0) + , transport_marker_group (0) + , cd_marker_group (0) + , _time_markers_group (0) + , hv_scroll_group (0) + , h_scroll_group (0) + , cursor_scroll_group (0) + , no_scroll_group (0) + , _trackview_group (0) + , _drag_motion_group (0) + , _canvas_drop_zone (0) + , no_ruler_shown_update (false) + , ruler_grabbed_widget (0) + , ruler_dialog (0) + , minsec_mark_interval (0) + , minsec_mark_modulo (0) + , minsec_nmarks (0) + , timecode_mark_modulo (0) + , timecode_nmarks (0) + , _samples_ruler_interval (0) + , bbt_bars (0) + , bbt_nmarks (0) + , bbt_bar_helper_on (0) + , bbt_accent_modulo (0) + , timecode_ruler (0) + , bbt_ruler (0) + , samples_ruler (0) + , minsec_ruler (0) + , visible_timebars (0) + , editor_ruler_menu (0) + , tempo_bar (0) + , meter_bar (0) + , marker_bar (0) + , range_marker_bar (0) + , transport_marker_bar (0) + , cd_marker_bar (0) , minsec_label (_("Mins:Secs")) , bbt_label (_("Bars:Beats")) , timecode_label (_("Timecode")) @@ -263,70 +341,141 @@ Editor::Editor () , transport_mark_label (_("Loop/Punch Ranges")) , cd_mark_label (_("CD Markers")) , videotl_label (_("Video Timeline")) + , videotl_group (0) + , playhead_cursor (0) , edit_packer (4, 4, true) - - /* the values here don't matter: layout widgets - reset them as needed. - */ - , vertical_adjustment (0.0, 0.0, 10.0, 400.0) , horizontal_adjustment (0.0, 0.0, 1e16) , unused_adjustment (0.0, 0.0, 10.0, 400.0) - , controls_layout (unused_adjustment, vertical_adjustment) - - /* tool bar related */ - - , toolbar_selection_clock_table (2,3) - , _mouse_mode_tearoff (0) - , automation_mode_button (_("mode")) - , _zoom_tearoff (0) - , _tools_tearoff (0) - - , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10))) + , _scroll_callbacks (0) + , _visible_canvas_width (0) + , _visible_canvas_height (0) + , _full_canvas_height (0) + , edit_controls_left_menu (0) + , edit_controls_right_menu (0) + , last_update_frame (0) + , cut_buffer_start (0) + , cut_buffer_length (0) + , button_bindings (0) + , last_paste_pos (0) + , paste_count (0) + , sfbrowser (0) + , current_interthread_info (0) + , analysis_window (0) + , select_new_marker (false) + , last_scrub_x (0) + , scrubbing_direction (0) + , scrub_reversals (0) + , scrub_reverse_distance (0) + , have_pending_keyboard_selection (false) + , pending_keyboard_selection_start (0) + , _snap_type (SnapToBeat) + , _snap_mode (SnapOff) + , snap_threshold (5.0) + , ignore_gui_changes (false) + , _drags (new DragManager (this)) + , lock_dialog (0) + /* , last_event_time { 0, 0 } */ /* this initialization style requires C++11 */ + , _dragging_playhead (false) + , _dragging_edit_point (false) + , _show_measures (true) + , _follow_playhead (true) + , _stationary_playhead (false) + , _maximised (false) + , tempo_lines (0) + , global_rect_group (0) + , time_line_group (0) + , tempo_or_meter_marker_menu (0) + , marker_menu (0) + , range_marker_menu (0) + , transport_marker_menu (0) + , new_transport_marker_menu (0) + , cd_marker_menu (0) + , marker_menu_item (0) + , bbt_beat_subdivision (4) + , _visible_track_count (-1) + , toolbar_selection_clock_table (2,3) + , automation_mode_button (_("mode")) + , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10))) + , selection (new Selection (this)) + , cut_buffer (new Selection (this)) + , _selection_memento (new SelectionMemento()) + , _all_region_actions_sensitized (false) + , _ignore_region_action (false) + , _last_region_menu_was_main (false) + , _ignore_follow_edits (false) + , cd_marker_bar_drag_rect (0) + , range_bar_drag_rect (0) + , transport_bar_drag_rect (0) + , transport_bar_range_rect (0) + , transport_bar_preroll_rect (0) + , transport_bar_postroll_rect (0) + , transport_loop_range_rect (0) + , transport_punch_range_rect (0) + , transport_punchin_line (0) + , transport_punchout_line (0) + , transport_preroll_rect (0) + , transport_postroll_rect (0) + , temp_location (0) + , rubberband_rect (0) + , _route_groups (0) + , _routes (0) + , _regions (0) + , _snapshots (0) + , _locations (0) + , autoscroll_horizontal_allowed (false) + , autoscroll_vertical_allowed (false) + , autoscroll_cnt (0) + , autoscroll_widget (0) + , show_gain_after_trim (false) , selection_op_cmd_depth (0) , selection_op_history_it (0) - - /* nudge */ - - , nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true)) - , meters_running(false) + , current_timefx (0) + , current_mixer_strip (0) + , show_editor_mixer_when_tracks_arrive (false) + , nudge_clock (new AudioClock (X_("nudge"), false, X_("nudge"), true, false, true)) + , current_stepping_trackview (0) + , last_track_height_step_timestamp (0) + , entered_track (0) + , entered_regionview (0) + , clear_entered_track (false) + , _edit_point (EditAtMouse) + , meters_running (false) + , rhythm_ferret (0) + , _have_idled (false) + , resize_idle_id (-1) + , _pending_resize_amount (0) + , _pending_resize_view (0) , _pending_locate_request (false) , _pending_initial_locate (false) + , _summary (0) + , _group_tabs (0) + , _last_motion_y (0) + , layering_order_editor (0) , _last_cut_copy_source_track (0) - , _region_selection_change_updates_region_list (true) + , _cursors (0) , _following_mixer_selection (false) , _control_point_toggled_on_press (false) , _stepping_axis_view (0) + , quantize_dialog (0) + , _main_menu_disabler (0) { - constructed = false; - /* we are a singleton */ PublicEditor::_instance = this; _have_idled = false; - - selection = new Selection (this); - cut_buffer = new Selection (this); - _selection_memento = new SelectionMemento (); + + last_event_time.tv_sec = 0; + last_event_time.tv_usec = 0; + + global_hpacker.set_data ("ardour-bindings", &bindings); + selection_op_history.clear(); before.clear(); - clicked_regionview = 0; - clicked_axisview = 0; - clicked_routeview = 0; - clicked_control_point = 0; - last_update_frame = 0; - last_paste_pos = 0; - paste_count = 0; - _drags = new DragManager (this); - lock_dialog = 0; - ruler_dialog = 0; - current_mixer_strip = 0; - tempo_lines = 0; - snap_type_strings = I18N (_snap_type_strings); snap_mode_strings = I18N (_snap_mode_strings); zoom_focus_strings = I18N (_zoom_focus_strings); @@ -344,76 +493,16 @@ Editor::Editor () build_snap_type_menu(); build_edit_point_menu(); - snap_threshold = 5.0; - bbt_beat_subdivision = 4; - _visible_canvas_width = 0; - _visible_canvas_height = 0; - autoscroll_horizontal_allowed = false; - autoscroll_vertical_allowed = false; - logo_item = 0; - - analysis_window = 0; - - current_interthread_info = 0; - _show_measures = true; - _maximised = false; - show_gain_after_trim = false; - - have_pending_keyboard_selection = false; - _follow_playhead = true; - _stationary_playhead = false; - editor_ruler_menu = 0; - no_ruler_shown_update = false; - marker_menu = 0; - range_marker_menu = 0; - marker_menu_item = 0; - tempo_or_meter_marker_menu = 0; - transport_marker_menu = 0; - new_transport_marker_menu = 0; - editor_mixer_strip_width = Wide; - show_editor_mixer_when_tracks_arrive = false; - region_edit_menu_split_multichannel_item = 0; - region_edit_menu_split_item = 0; - temp_location = 0; - leftmost_frame = 0; - current_stepping_trackview = 0; - entered_track = 0; - entered_regionview = 0; - entered_marker = 0; - clear_entered_track = false; - current_timefx = 0; - playhead_cursor = 0; - button_release_can_deselect = true; - _dragging_playhead = false; - _dragging_edit_point = false; - select_new_marker = false; - rhythm_ferret = 0; - layering_order_editor = 0; - no_save_visual = false; - resize_idle_id = -1; - within_track_canvas = false; - - scrubbing_direction = 0; - - sfbrowser = 0; - location_marker_color = ARDOUR_UI::config()->color ("location marker"); location_range_color = ARDOUR_UI::config()->color ("location range"); location_cd_marker_color = ARDOUR_UI::config()->color ("location cd marker"); location_loop_color = ARDOUR_UI::config()->color ("location loop"); location_punch_color = ARDOUR_UI::config()->color ("location punch"); - zoom_focus = ZoomFocusLeft; - _edit_point = EditAtMouse; - _visible_track_count = -1; + timebar_height = std::max(12., ceil (15. * ARDOUR_UI::ui_scale)); - samples_per_pixel = 2048; /* too early to use reset_zoom () */ - - timebar_height = std::max(12., ceil (15. * ARDOUR_UI::config()->get_font_scale() / 102400.)); TimeAxisView::setup_sizes (); - Marker::setup_sizes (timebar_height); - - _scroll_callbacks = 0; + ArdourMarker::setup_sizes (timebar_height); bbt_label.set_name ("EditorRulerLabel"); bbt_label.set_size_request (-1, (int)timebar_height); @@ -525,8 +614,8 @@ Editor::Editor () controls_layout.signal_scroll_event().connect (sigc::mem_fun(*this, &Editor::control_layout_scroll), false); _cursors = new MouseCursors; - _cursors->set_cursor_set (ARDOUR_UI::config()->get_icon_set()); - cerr << "Set cursor set to " << ARDOUR_UI::config()->get_icon_set() << endl; + _cursors->set_cursor_set (UIConfiguration::instance().get_icon_set()); + cerr << "Set cursor set to " << UIConfiguration::instance().get_icon_set() << endl; /* Push default cursor to ever-present bottom of cursor stack. */ push_canvas_cursor(_cursors->grabber); @@ -652,40 +741,20 @@ Editor::Editor () global_vpacker.pack_start (top_hbox, false, false); global_vpacker.pack_start (*hbox, true, true); - global_hpacker.pack_start (global_vpacker, true, true); - set_name ("EditorWindow"); - add_accel_group (ActionManager::ui_manager->get_accel_group()); - - status_bar_hpacker.show (); + /* need to show the "contents" widget so that notebook will show if tab is switched to + */ - vpacker.pack_end (status_bar_hpacker, false, false); - vpacker.pack_end (global_hpacker, true, true); + global_hpacker.show (); /* register actions now so that set_state() can find them and set toggles/checks etc */ register_actions (); - /* when we start using our own keybinding system for the editor, this - * will be uncommented - */ - // load_bindings (); + load_bindings (); setup_toolbar (); - set_zoom_focus (zoom_focus); - set_visible_track_count (_visible_track_count); - _snap_type = SnapToBeat; - set_snap_to (_snap_type); - _snap_mode = SnapOff; - set_snap_mode (_snap_mode); - set_mouse_mode (MouseObject, true); - pre_internal_snap_type = _snap_type; - pre_internal_snap_mode = _snap_mode; - internal_snap_type = _snap_type; - internal_snap_mode = _snap_mode; - set_edit_point_preference (EditAtMouse, true); - _playlist_selector = new PlaylistSelector(); _playlist_selector->signal_delete_event().connect (sigc::bind (sigc::ptr_fun (just_hide_it), static_cast (_playlist_selector))); @@ -694,48 +763,15 @@ Editor::Editor () /* nudge stuff */ nudge_forward_button.set_name ("nudge button"); - nudge_forward_button.set_image(::get_icon("nudge_right")); + nudge_forward_button.set_icon(ArdourIcon::NudgeRight); nudge_backward_button.set_name ("nudge button"); - nudge_backward_button.set_image(::get_icon("nudge_left")); + nudge_backward_button.set_icon(ArdourIcon::NudgeLeft); fade_context_menu.set_name ("ArdourContextMenu"); - /* icons, titles, WM stuff */ - - list > window_icons; - Glib::RefPtr icon; - - if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { - window_icons.push_back (icon); - } - if (!window_icons.empty()) { - // set_icon_list (window_icons); - set_default_icon_list (window_icons); - } - - WindowTitle title(Glib::get_application_name()); - title += _("Editor"); - set_title (title.get_string()); - set_wmclass (X_("ardour_editor"), PROGRAM_NAME); - - add (vpacker); - add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); - - signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); - signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); - Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released)); - + /* allow external control surfaces/protocols to do various things */ ControlProtocol::ZoomToSession.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_session, this), gui_context()); @@ -766,7 +802,7 @@ Editor::Editor () Session::AskAboutPlaylistDeletion.connect_same_thread (*this, boost::bind (&Editor::playlist_deletion_dialog, this, _1)); Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context()); - ARDOUR_UI::config()->ParameterChanged.connect (sigc::mem_fun (*this, &Editor::ui_parameter_changed)); + UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &Editor::ui_parameter_changed)); TimeAxisView::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Editor::timeaxisview_deleted, this, _1), gui_context()); @@ -780,12 +816,12 @@ Editor::Editor () /* Button bindings */ - button_bindings = new Bindings; + button_bindings = new Bindings ("editor-mouse"); XMLNode* node = button_settings(); if (node) { for (XMLNodeList::const_iterator i = node->children().begin(); i != node->children().end(); ++i) { - button_bindings->load (**i); + button_bindings->load_operation (**i); } } @@ -793,7 +829,7 @@ Editor::Editor () /* grab current parameter state */ boost::function pc (boost::bind (&Editor::ui_parameter_changed, this, _1)); - ARDOUR_UI::config()->map_parameters (pc); + UIConfiguration::instance().map_parameters (pc); setup_fade_images (); @@ -808,6 +844,17 @@ Editor::~Editor() delete _track_canvas_viewport; delete _drags; delete nudge_clock; + delete quantize_dialog; + delete _summary; + delete _group_tabs; + delete _regions; + delete _snapshots; + delete _locations; + delete _playlist_selector; + + for (list::iterator i = selection_op_history.begin(); i != selection_op_history.end(); ++i) { + delete *i; + } } XMLNode* @@ -823,25 +870,6 @@ Editor::button_settings () const return node; } -void -Editor::add_toplevel_menu (Container& cont) -{ - vpacker.pack_start (cont, false, false); - cont.show_all (); -} - -void -Editor::add_transport_frame (Container& cont) -{ - if(ARDOUR::Profile->get_mixbus()) { - global_vpacker.pack_start (cont, false, false); - global_vpacker.reorder_child (cont, 0); - cont.show_all (); - } else { - vpacker.pack_start (cont, false, false); - } -} - bool Editor::get_smart_mode () const { @@ -911,44 +939,6 @@ Editor::set_entered_track (TimeAxisView* tav) } } -void -Editor::show_window () -{ - if (!is_visible ()) { - DisplaySuspender ds; - show_all (); - - /* XXX: this is a bit unfortunate; it would probably - be nicer if we could just call show () above rather - than needing the show_all () - */ - - /* re-hide stuff if necessary */ - editor_list_button_toggled (); - parameter_changed ("show-summary"); - parameter_changed ("show-group-tabs"); - parameter_changed ("show-zoom-tools"); - - /* now reset all audio_time_axis heights, because widgets might need - to be re-hidden - */ - - TimeAxisView *tv; - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - tv = (static_cast(*i)); - tv->reset_height (); - } - - if (current_mixer_strip) { - current_mixer_strip->hide_things (); - current_mixer_strip->parameter_changed ("mixer-element-visibility"); - } - } - - present (); -} - void Editor::instant_save () { @@ -1000,12 +990,12 @@ Editor::control_unselect () } void -Editor::control_select (uint32_t rid, Selection::Operation op) +Editor::control_select (uint32_t rid, Selection::Operation op) { /* handles the (static) signal from the ControlProtocol class that * requests setting the selected track to a given RID */ - + if (!_session) { return; } @@ -1141,14 +1131,11 @@ Editor::access_action (std::string action_group, std::string action_item) void Editor::on_realize () { - Window::on_realize (); Realized (); - if (ARDOUR_UI::config()->get_lock_gui_after_seconds()) { + if (UIConfiguration::instance().get_lock_gui_after_seconds()) { start_lock_event_timing (); } - - signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler)); } void @@ -1168,7 +1155,9 @@ Editor::generic_event_handler (GdkEvent* ev) case GDK_MOTION_NOTIFY: case GDK_KEY_PRESS: case GDK_KEY_RELEASE: - gettimeofday (&last_event_time, 0); + if (contents().is_mapped()) { + gettimeofday (&last_event_time, 0); + } break; case GDK_LEAVE_NOTIFY: @@ -1176,7 +1165,7 @@ Editor::generic_event_handler (GdkEvent* ev) case GDK_NOTIFY_UNKNOWN: case GDK_NOTIFY_INFERIOR: case GDK_NOTIFY_ANCESTOR: - break; + break; case GDK_NOTIFY_VIRTUAL: case GDK_NOTIFY_NONLINEAR: case GDK_NOTIFY_NONLINEAR_VIRTUAL: @@ -1204,7 +1193,7 @@ Editor::lock_timeout_callback () timersub (&now, &last_event_time, &delta); - if (delta.tv_sec > (time_t) ARDOUR_UI::config()->get_lock_gui_after_seconds()) { + if (delta.tv_sec > (time_t) UIConfiguration::instance().get_lock_gui_after_seconds()) { lock (); /* don't call again. Returning false will effectively disconnect us from the timer callback. @@ -1265,8 +1254,12 @@ Editor::center_screen_internal (framepos_t frame, float page) void Editor::update_title () { - ENSURE_GUI_THREAD (*this, &Editor::update_title) + ENSURE_GUI_THREAD (*this, &Editor::update_title); + if (!own_window()) { + return; + } + if (_session) { bool dirty = _session->dirty(); @@ -1284,7 +1277,7 @@ Editor::update_title () WindowTitle title(session_name); title += Glib::get_application_name(); - set_title (title.get_string()); + own_window()->set_title (title.get_string()); } else { /* ::session_going_away() will have taken care of it */ } @@ -1450,18 +1443,18 @@ Editor::fill_xfade_menu (Menu_Helpers::MenuList& items, bool start) sigc::bind (sigc::mem_fun (*this, emf), FadeLinear) ) ); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Constant power"), *(*images)[FadeConstantPower], sigc::bind (sigc::mem_fun (*this, emf), FadeConstantPower) )); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Symmetric"), @@ -1469,25 +1462,25 @@ Editor::fill_xfade_menu (Menu_Helpers::MenuList& items, bool start) sigc::bind (sigc::mem_fun (*this, emf), FadeSymmetric) ) ); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Slow"), *(*images)[FadeSlow], sigc::bind (sigc::mem_fun (*this, emf), FadeSlow) )); - + dynamic_cast(&items.back())->set_always_show_image (); - + items.push_back ( ImageMenuElem ( _("Fast"), *(*images)[FadeFast], sigc::bind (sigc::mem_fun (*this, emf), FadeFast) )); - + dynamic_cast(&items.back())->set_always_show_image (); } @@ -1795,10 +1788,18 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items, boost::sha _popup_region_menu_item->set_label (menu_item_name); } - const framepos_t position = get_preferred_edit_position (false, true); + /* No latering allowed in later is higher layering model */ + RefPtr act = ActionManager::get_action (X_("EditorMenu"), X_("RegionMenuLayering")); + if (act && Config->get_layer_model() == LaterHigher) { + act->set_sensitive (false); + } else if (act) { + act->set_sensitive (true); + } + + const framepos_t position = get_preferred_edit_position (EDIT_IGNORE_NONE, true); edit_items.push_back (*_popup_region_menu_item); - if (track->playlist()->count_regions_at (position) > 1 && (layering_order_editor == 0 || !layering_order_editor->is_visible ())) { + if (Config->get_layer_model() == Manual && track->playlist()->count_regions_at (position) > 1 && (layering_order_editor == 0 || !layering_order_editor->is_visible ())) { edit_items.push_back (*manage (_region_actions->get_action ("choose-top-region-context-menu")->create_menu_item ())); } edit_items.push_back (SeparatorElem()); @@ -1868,14 +1869,13 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items) edit_items.push_back (SeparatorElem()); edit_items.push_back (MenuElem (_("Crop Region to Range"), sigc::mem_fun(*this, &Editor::crop_region_to_selection))); - edit_items.push_back (MenuElem (_("Fill Range with Region"), sigc::mem_fun(*this, &Editor::region_fill_selection))); edit_items.push_back (MenuElem (_("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_range), false))); edit_items.push_back (SeparatorElem()); edit_items.push_back (MenuElem (_("Consolidate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, false))); - edit_items.push_back (MenuElem (_("Consolidate Range With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, true))); + edit_items.push_back (MenuElem (_("Consolidate Range with Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), true, true))); edit_items.push_back (MenuElem (_("Bounce Range to Region List"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, false))); - edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true))); + edit_items.push_back (MenuElem (_("Bounce Range to Region List with Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true))); edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection))); if (ARDOUR_UI::instance()->video_timeline->get_duration() > 0) { edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*(ARDOUR_UI::instance()), &ARDOUR_UI::export_video), true))); @@ -1894,8 +1894,8 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); - play_items.push_back (MenuElem (_("Play From Start"), sigc::mem_fun(*this, &Editor::play_from_start))); + play_items.push_back (MenuElem (_("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); + play_items.push_back (MenuElem (_("Play from Start"), sigc::mem_fun(*this, &Editor::play_from_start))); play_items.push_back (MenuElem (_("Play Region"), sigc::mem_fun(*this, &Editor::play_selected_region))); play_items.push_back (SeparatorElem()); play_items.push_back (MenuElem (_("Loop Region"), sigc::bind (sigc::mem_fun (*this, &Editor::set_loop_from_region), true))); @@ -1915,9 +1915,10 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items) select_items.push_back (SeparatorElem()); select_items.push_back (MenuElem (_("Set Range to Loop Range"), sigc::mem_fun(*this, &Editor::set_selection_from_loop))); select_items.push_back (MenuElem (_("Set Range to Punch Range"), sigc::mem_fun(*this, &Editor::set_selection_from_punch))); + select_items.push_back (MenuElem (_("Set Range to Selected Regions"), sigc::mem_fun(*this, &Editor::set_selection_from_region))); select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true))); - select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false))); + select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true, true))); + select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false, true))); select_items.push_back (MenuElem (_("Select All After Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true))); select_items.push_back (MenuElem (_("Select All Before Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, false))); select_items.push_back (MenuElem (_("Select All Between Playhead and Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), false))); @@ -1975,8 +1976,8 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) MenuList& play_items = play_menu->items(); play_menu->set_name ("ArdourContextMenu"); - play_items.push_back (MenuElem (_("Play From Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); - play_items.push_back (MenuElem (_("Play From Start"), sigc::mem_fun(*this, &Editor::play_from_start))); + play_items.push_back (MenuElem (_("Play from Edit Point"), sigc::mem_fun(*this, &Editor::play_from_edit_point))); + play_items.push_back (MenuElem (_("Play from Start"), sigc::mem_fun(*this, &Editor::play_from_start))); edit_items.push_back (MenuElem (_("Play"), *play_menu)); /* Selection */ @@ -1990,8 +1991,8 @@ Editor::add_bus_context_items (Menu_Helpers::MenuList& edit_items) select_items.push_back (MenuElem (_("Invert Selection in Track"), sigc::mem_fun(*this, &Editor::invert_selection_in_track))); select_items.push_back (MenuElem (_("Invert Selection"), sigc::mem_fun(*this, &Editor::invert_selection))); select_items.push_back (SeparatorElem()); - select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true))); - select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false))); + select_items.push_back (MenuElem (_("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true, true))); + select_items.push_back (MenuElem (_("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false, true))); select_items.push_back (MenuElem (_("Select All After Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true))); select_items.push_back (MenuElem (_("Select All Before Playhead"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, false))); @@ -2078,7 +2079,7 @@ Editor::set_snap_to (SnapType st) case SnapToBeatDiv2: { ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), current_bbt_points_begin, current_bbt_points_end); compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(), @@ -2123,6 +2124,7 @@ Editor::set_snap_mode (SnapMode mode) instant_save (); } + void Editor::set_edit_point_preference (EditPoint ep, bool force) { @@ -2176,55 +2178,13 @@ Editor::set_edit_point_preference (EditPoint ep, bool force) } int -Editor::set_state (const XMLNode& node, int /*version*/) +Editor::set_state (const XMLNode& node, int version) { const XMLProperty* prop; - XMLNode* geometry; - int x, y; - Gdk::Geometry g; - set_id (node); - g.base_width = default_width; - g.base_height = default_height; - x = 1; - y = 1; - - if ((geometry = find_named_node (node, "geometry")) != 0) { - - XMLProperty* prop; - - if ((prop = geometry->property("x_size")) == 0) { - prop = geometry->property ("x-size"); - } - if (prop) { - g.base_width = atoi(prop->value()); - } - if ((prop = geometry->property("y_size")) == 0) { - prop = geometry->property ("y-size"); - } - if (prop) { - g.base_height = atoi(prop->value()); - } - - if ((prop = geometry->property ("x_pos")) == 0) { - prop = geometry->property ("x-pos"); - } - if (prop) { - x = atoi (prop->value()); - - } - if ((prop = geometry->property ("y_pos")) == 0) { - prop = geometry->property ("y-pos"); - } - if (prop) { - y = atoi (prop->value()); - } - } - - set_default_size (g.base_width, g.base_height); - move (x, y); - + Tabbable::set_state (node, version); + if (_session && (prop = node.property ("playhead"))) { framepos_t pos; sscanf (prop->value().c_str(), "%" PRIi64, &pos); @@ -2321,37 +2281,16 @@ Editor::set_state (const XMLNode& node, int /*version*/) if ((prop = node.property ("show-measures"))) { bool yn = string_is_affirmative (prop->value()); _show_measures = yn; - RefPtr act = ActionManager::get_action (X_("Editor"), X_("ToggleMeasureVisibility")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - /* do it twice to force the change */ - tact->set_active (!yn); - tact->set_active (yn); - } } if ((prop = node.property ("follow-playhead"))) { bool yn = string_is_affirmative (prop->value()); set_follow_playhead (yn); - RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-follow-playhead")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - if (tact->get_active() != yn) { - tact->set_active (yn); - } - } } if ((prop = node.property ("stationary-playhead"))) { bool yn = string_is_affirmative (prop->value()); set_stationary_playhead (yn); - RefPtr act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); - if (act) { - RefPtr tact = RefPtr::cast_dynamic(act); - if (tact->get_active() != yn) { - tact->set_active (yn); - } - } } if ((prop = node.property ("region-list-sort-type"))) { @@ -2427,44 +2366,62 @@ Editor::set_state (const XMLNode& node, int /*version*/) nudge_clock->set (_session->frame_rate() * 5, true); } + { + /* apply state + * Not all properties may have been in XML, but + * those that are linked to a private variable may need changing + */ + RefPtr act; + bool yn; + + act = ActionManager::get_action (X_("Editor"), X_("ToggleMeasureVisibility")); + if (act) { + yn = _show_measures; + RefPtr tact = RefPtr::cast_dynamic(act); + /* do it twice to force the change */ + tact->set_active (!yn); + tact->set_active (yn); + } + + act = ActionManager::get_action (X_("Editor"), X_("toggle-follow-playhead")); + yn = _follow_playhead; + if (act) { + RefPtr tact = RefPtr::cast_dynamic(act); + if (tact->get_active() != yn) { + tact->set_active (yn); + } + } + + act = ActionManager::get_action (X_("Editor"), X_("toggle-stationary-playhead")); + yn = _stationary_playhead; + if (act) { + RefPtr tact = RefPtr::cast_dynamic(act); + if (tact->get_active() != yn) { + tact->set_active (yn); + } + } + } + return 0; } XMLNode& Editor::get_state () { - XMLNode* node = new XMLNode ("Editor"); + XMLNode* node = new XMLNode (X_("Editor")); char buf[32]; id().print (buf, sizeof (buf)); node->add_property ("id", buf); - if (is_realized()) { - Glib::RefPtr win = get_window(); - - int x, y, width, height; - win->get_root_origin(x, y); - win->get_size(width, height); - - XMLNode* geometry = new XMLNode ("geometry"); - - snprintf(buf, sizeof(buf), "%d", width); - geometry->add_property("x-size", string(buf)); - snprintf(buf, sizeof(buf), "%d", height); - geometry->add_property("y-size", string(buf)); - snprintf(buf, sizeof(buf), "%d", x); - geometry->add_property("x-pos", string(buf)); - snprintf(buf, sizeof(buf), "%d", y); - geometry->add_property("y-pos", string(buf)); - snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&edit_pane)->gobj())); - geometry->add_property("edit-horizontal-pane-pos", string(buf)); - geometry->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0"); - snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&editor_summary_pane)->gobj())); - geometry->add_property("edit-vertical-pane-pos", string(buf)); - - node->add_child_nocopy (*geometry); - } - + node->add_child_nocopy (Tabbable::get_state()); + + snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&edit_pane)->gobj())); + node->add_property("edit-horizontal-pane-pos", string(buf)); + node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0"); + snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast(&editor_summary_pane)->gobj())); + node->add_property("edit-vertical-pane-pos", string(buf)); + maybe_add_mixer_strip_width (*node); node->add_property ("zoom-focus", enum_2_string (zoom_focus)); @@ -2548,9 +2505,9 @@ Editor::trackview_by_y_position (double y, bool trackview_relative_offset) const } for (TrackViewList::const_iterator iter = track_views.begin(); iter != track_views.end(); ++iter) { - + std::pair const r = (*iter)->covers_y_position (y); - + if (r.first) { return r; } @@ -2571,25 +2528,28 @@ Editor::snap_to_with_modifier (framepos_t& start, GdkEvent const * event, RoundM return; } - if (Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { + if (ArdourKeyboard::indicates_snap (event->button.state)) { if (_snap_mode == SnapOff) { snap_to_internal (start, direction, for_mark); } } else { if (_snap_mode != SnapOff) { snap_to_internal (start, direction, for_mark); + } else if (ArdourKeyboard::indicates_snap_delta (event->button.state)) { + /* SnapOff, but we pressed the snap_delta modifier */ + snap_to_internal (start, direction, for_mark); } } } void -Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark) +Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark, bool ensure_snap) { - if (!_session || _snap_mode == SnapOff) { + if (!_session || (_snap_mode == SnapOff && !ensure_snap)) { return; } - snap_to_internal (start, direction, for_mark); + snap_to_internal (start, direction, for_mark, ensure_snap); } void @@ -2659,7 +2619,7 @@ Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool } void -Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark) +Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark, bool ensure_snap) { const framepos_t one_second = _session->frame_rate(); const framepos_t one_minute = _session->frame_rate() * 60; @@ -2829,6 +2789,10 @@ Editor::snap_to_internal (framepos_t& start, RoundMode direction, bool for_mark) case SnapMagnetic: + if (ensure_snap) { + return; + } + if (presnap > start) { if (presnap > (start + pixel_to_sample(snap_threshold))) { start = presnap; @@ -2902,7 +2866,7 @@ Editor::setup_toolbar () if (!ARDOUR::Profile->get_mixbus()) { mouse_mode_hbox->pack_start (mouse_cut_button, false, false); } - + if (!ARDOUR::Profile->get_trx()) { mouse_mode_hbox->pack_start (mouse_timefx_button, false, false); mouse_mode_hbox->pack_start (mouse_audition_button, false, false); @@ -2922,25 +2886,9 @@ Editor::setup_toolbar () if (!ARDOUR::Profile->get_trx()) { mode_box->pack_start (edit_mode_selector, false, false); } + mode_box->pack_start (*mouse_mode_box, false, false); - - _mouse_mode_tearoff = manage (new TearOff (*mode_box)); - _mouse_mode_tearoff->set_name ("MouseModeBase"); - _mouse_mode_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_mouse_mode_tearoff->tearoff_window()), false); - - if (Profile->get_sae() || Profile->get_mixbus() ) { - _mouse_mode_tearoff->set_can_be_torn_off (false); - } - - _mouse_mode_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window())); - _mouse_mode_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window(), 1)); - _mouse_mode_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window())); - _mouse_mode_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_mouse_mode_tearoff->tearoff_window(), 1)); - + /* Zoom */ _zoom_box.set_spacing (2); @@ -2953,17 +2901,17 @@ Editor::setup_toolbar () zoom_preset_selector.set_size_request (42, -1); zoom_in_button.set_name ("zoom button"); - zoom_in_button.set_image(::get_icon ("zoom_in")); + zoom_in_button.set_icon (ArdourIcon::ZoomIn); act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-in")); zoom_in_button.set_related_action (act); zoom_out_button.set_name ("zoom button"); - zoom_out_button.set_image(::get_icon ("zoom_out")); + zoom_out_button.set_icon (ArdourIcon::ZoomOut); act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-out")); zoom_out_button.set_related_action (act); zoom_out_full_button.set_name ("zoom button"); - zoom_out_full_button.set_image(::get_icon ("zoom_full")); + zoom_out_full_button.set_icon (ArdourIcon::ZoomFull); act = ActionManager::get_action (X_("Editor"), X_("zoom-to-session")); zoom_out_full_button.set_related_action (act); @@ -2991,12 +2939,12 @@ Editor::setup_toolbar () } tav_expand_button.set_name ("zoom button"); - tav_expand_button.set_image(::get_icon ("tav_exp")); + tav_expand_button.set_icon (ArdourIcon::TimeAxisExpand); act = ActionManager::get_action (X_("Editor"), X_("expand-tracks")); tav_expand_button.set_related_action (act); tav_shrink_button.set_name ("zoom button"); - tav_shrink_button.set_image(::get_icon ("tav_shrink")); + tav_shrink_button.set_icon (ArdourIcon::TimeAxisShrink); act = ActionManager::get_action (X_("Editor"), X_("shrink-tracks")); tav_shrink_button.set_related_action (act); @@ -3011,23 +2959,6 @@ Editor::setup_toolbar () _zoom_box.pack_start (tav_expand_button); } - if (!ARDOUR::Profile->get_trx()) { - _zoom_tearoff = manage (new TearOff (_zoom_box)); - - _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_zoom_tearoff->tearoff_window())); - _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_zoom_tearoff->tearoff_window(), 0)); - _zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_zoom_tearoff->tearoff_window())); - _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_zoom_tearoff->tearoff_window(), 0)); - } - - if (Profile->get_sae() || Profile->get_mixbus() ) { - _zoom_tearoff->set_can_be_torn_off (false); - } - snap_box.set_spacing (2); snap_box.set_border_width (2); @@ -3060,41 +2991,19 @@ Editor::setup_toolbar () HBox* hbox = manage (new HBox); hbox->set_spacing(2); - _tools_tearoff = manage (new TearOff (*hbox)); - _tools_tearoff->set_name ("MouseModeBase"); - _tools_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), &_tools_tearoff->tearoff_window()), false); - - if (Profile->get_sae() || Profile->get_mixbus()) { - _tools_tearoff->set_can_be_torn_off (false); - } - - _tools_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_tools_tearoff->tearoff_window())); - _tools_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_tools_tearoff->tearoff_window(), 0)); - _tools_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast(&toolbar_hbox), - &_tools_tearoff->tearoff_window())); - _tools_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast (&toolbar_hbox), - &_tools_tearoff->tearoff_window(), 0)); - toolbar_hbox.set_spacing (2); toolbar_hbox.set_border_width (1); - toolbar_hbox.pack_start (*_mouse_mode_tearoff, false, false); + toolbar_hbox.pack_start (*mode_box, false, false); if (!ARDOUR::Profile->get_trx()) { - toolbar_hbox.pack_start (*_zoom_tearoff, false, false); - toolbar_hbox.pack_start (*_tools_tearoff, false, false); + toolbar_hbox.pack_start (_zoom_box, false, false); + toolbar_hbox.pack_start (*hbox, false, false); } if (!ARDOUR::Profile->get_trx()) { hbox->pack_start (snap_box, false, false); - if ( !Profile->get_small_screen() || Profile->get_mixbus() ) { - hbox->pack_start (*nudge_box, false, false); - } else { - ARDOUR_UI::instance()->editor_transport_box().pack_start (*nudge_box, false, false); - } + hbox->pack_start (*nudge_box, false, false); } - hbox->pack_start (panic_box, false, false); hbox->show_all (); @@ -3127,7 +3036,7 @@ void Editor::build_edit_mode_menu () { using namespace Menu_Helpers; - + edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Slide], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Slide))); // edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Splice], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Splice))); edit_mode_selector.AddMenuElem (MenuElem ( edit_mode_strings[(int)Ripple], sigc::bind (sigc::mem_fun(*this, &Editor::edit_mode_selection_done), (EditMode) Ripple))); @@ -3191,30 +3100,30 @@ Editor::build_snap_type_menu () void Editor::setup_tooltips () { - ARDOUR_UI::instance()->set_tip (smart_mode_button, _("Smart Mode (add Range functions to Grab mode)")); - ARDOUR_UI::instance()->set_tip (mouse_move_button, _("Grab Mode (select/move objects)")); - ARDOUR_UI::instance()->set_tip (mouse_cut_button, _("Cut Mode (split regions)")); - ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Range Mode (select time ranges)")); - ARDOUR_UI::instance()->set_tip (mouse_draw_button, _("Draw Mode (draw and edit gain/notes/automation)")); - ARDOUR_UI::instance()->set_tip (mouse_timefx_button, _("Stretch Mode (time-stretch audio and midi regions, preserving pitch)")); - ARDOUR_UI::instance()->set_tip (mouse_audition_button, _("Audition Mode (listen to regions)")); - ARDOUR_UI::instance()->set_tip (mouse_content_button, _("Internal Edit Mode (edit notes and gain curves inside regions)")); - ARDOUR_UI::instance()->set_tip (*_group_tabs, _("Groups: click to (de)activate\nContext-click for other operations")); - ARDOUR_UI::instance()->set_tip (nudge_forward_button, _("Nudge Region/Selection Later")); - ARDOUR_UI::instance()->set_tip (nudge_backward_button, _("Nudge Region/Selection Earlier")); - ARDOUR_UI::instance()->set_tip (zoom_in_button, _("Zoom In")); - ARDOUR_UI::instance()->set_tip (zoom_out_button, _("Zoom Out")); - ARDOUR_UI::instance()->set_tip (zoom_preset_selector, _("Zoom to Time Scale")); - ARDOUR_UI::instance()->set_tip (zoom_out_full_button, _("Zoom to Session")); - ARDOUR_UI::instance()->set_tip (zoom_focus_selector, _("Zoom focus")); - ARDOUR_UI::instance()->set_tip (tav_expand_button, _("Expand Tracks")); - ARDOUR_UI::instance()->set_tip (tav_shrink_button, _("Shrink Tracks")); - ARDOUR_UI::instance()->set_tip (visible_tracks_selector, _("Number of visible tracks")); - ARDOUR_UI::instance()->set_tip (snap_type_selector, _("Snap/Grid Units")); - ARDOUR_UI::instance()->set_tip (snap_mode_selector, _("Snap/Grid Mode")); - ARDOUR_UI::instance()->set_tip (edit_point_selector, _("Edit point")); - ARDOUR_UI::instance()->set_tip (edit_mode_selector, _("Edit Mode")); - ARDOUR_UI::instance()->set_tip (nudge_clock, _("Nudge Clock\n(controls distance used to nudge regions and selections)")); + set_tooltip (smart_mode_button, _("Smart Mode (add range functions to Grab Mode)")); + set_tooltip (mouse_move_button, _("Grab Mode (select/move objects)")); + set_tooltip (mouse_cut_button, _("Cut Mode (split regions)")); + set_tooltip (mouse_select_button, _("Range Mode (select time ranges)")); + set_tooltip (mouse_draw_button, _("Draw Mode (draw and edit gain/notes/automation)")); + set_tooltip (mouse_timefx_button, _("Stretch Mode (time-stretch audio and midi regions, preserving pitch)")); + set_tooltip (mouse_audition_button, _("Audition Mode (listen to regions)")); + set_tooltip (mouse_content_button, _("Internal Edit Mode (edit notes and automation points)")); + set_tooltip (*_group_tabs, _("Groups: click to (de)activate\nContext-click for other operations")); + set_tooltip (nudge_forward_button, _("Nudge Region/Selection Later")); + set_tooltip (nudge_backward_button, _("Nudge Region/Selection Earlier")); + set_tooltip (zoom_in_button, _("Zoom In")); + set_tooltip (zoom_out_button, _("Zoom Out")); + set_tooltip (zoom_preset_selector, _("Zoom to Time Scale")); + set_tooltip (zoom_out_full_button, _("Zoom to Session")); + set_tooltip (zoom_focus_selector, _("Zoom Focus")); + set_tooltip (tav_expand_button, _("Expand Tracks")); + set_tooltip (tav_shrink_button, _("Shrink Tracks")); + set_tooltip (visible_tracks_selector, _("Number of visible tracks")); + set_tooltip (snap_type_selector, _("Snap/Grid Units")); + set_tooltip (snap_mode_selector, _("Snap/Grid Mode")); + set_tooltip (edit_point_selector, _("Edit Point")); + set_tooltip (edit_mode_selector, _("Edit Mode")); + set_tooltip (nudge_clock, _("Nudge Clock\n(controls distance used to nudge regions and selections)")); } int @@ -3358,11 +3267,11 @@ Editor::commit_reversible_selection_op () The user has undone some selection ops and then made a new one, making anything earlier in the list invalid. */ - + list::iterator it = selection_op_history.begin(); list::iterator e_it = it; advance (e_it, selection_op_history_it); - + for ( ; it != e_it; ++it) { delete *it; } @@ -3492,8 +3401,10 @@ Editor::history_changed () if (redo_action && _session) { if (_session->redo_depth() == 0) { label = _("Redo"); + redo_action->set_sensitive (false); } else { label = string_compose(_("Redo (%1)"), _session->next_redo()); + redo_action->set_sensitive (true); } redo_action->property_label() = label; } @@ -3558,7 +3469,7 @@ Editor::duplicate_range (bool with_dialog) } else if (get_smart_mode()) { if (selection->time.length()) { duplicate_selection (times); - } else + } else duplicate_some_regions (rs, times); } else { duplicate_some_regions (rs, times); @@ -3722,7 +3633,7 @@ Editor::set_zoom_preset (int64_t ms) temporal_zoom_session(); return; } - + ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); temporal_zoom( (sample_rate * ms / 1000) / _visible_canvas_width ); } @@ -3737,7 +3648,7 @@ Editor::set_visible_track_count (int32_t n) allocation happens, we will get called again and then we can do the real work. */ - + if (_visible_canvas_height <= 1) { return; } @@ -3745,7 +3656,7 @@ Editor::set_visible_track_count (int32_t n) int h; string str; DisplaySuspender ds; - + if (_visible_track_count > 0) { h = trackviews_height() / _visible_track_count; std::ostringstream s; @@ -3761,7 +3672,7 @@ Editor::set_visible_track_count (int32_t n) h = trackviews_height() / n; str = _("All"); } else { - /* negative value means that the visible track count has + /* negative value means that the visible track count has been overridden by explicit track height changes. */ visible_tracks_selector.set_text (X_("*")); @@ -3769,9 +3680,9 @@ Editor::set_visible_track_count (int32_t n) } for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - (*i)->set_height (h); + (*i)->set_height (h, TimeAxisView::HeightPerLane); } - + if (str != visible_tracks_selector.get_text()) { visible_tracks_selector.set_text (str); } @@ -3788,7 +3699,7 @@ bool Editor::edit_controls_button_release (GdkEventButton* ev) { if (Keyboard::is_context_menu_event (ev)) { - ARDOUR_UI::instance()->add_route (this); + ARDOUR_UI::instance()->add_route (current_toplevel()); } else if (ev->button == 1) { selection->clear_tracks (); } @@ -3848,12 +3759,6 @@ Editor::cycle_zoom_focus () } } -void -Editor::ensure_float (Window& win) -{ - win.set_transient_for (*this); -} - void Editor::pane_allocation_handler (Allocation &alloc, Paned* which) { @@ -3922,24 +3827,6 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which) } } -void -Editor::detach_tearoff (Box* /*b*/, Window* /*w*/) -{ - if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) && - (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) && - (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) { - top_hbox.remove (toolbar_frame); - } -} - -void -Editor::reattach_tearoff (Box* /*b*/, Window* /*w*/, int32_t /*n*/) -{ - if (toolbar_frame.get_parent() == 0) { - top_hbox.pack_end (toolbar_frame); - } -} - void Editor::set_show_measures (bool yn) { @@ -3953,10 +3840,10 @@ Editor::set_show_measures (bool yn) ARDOUR::TempoMap::BBTPointList::const_iterator begin; ARDOUR::TempoMap::BBTPointList::const_iterator end; - + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end); draw_measures (begin, end); - } + } instant_save (); } @@ -4112,19 +3999,34 @@ Editor::playlist_deletion_dialog (boost::shared_ptr pl) label.show (); + dialog.add_button (_("Delete All Unused"), RESPONSE_YES); // needs clarification. this and all remaining ones dialog.add_button (_("Delete Playlist"), RESPONSE_ACCEPT); - dialog.add_button (_("Keep Playlist"), RESPONSE_REJECT); + Button* keep = dialog.add_button (_("Keep Playlist"), RESPONSE_REJECT); + dialog.add_button (_("Keep Remaining"), RESPONSE_NO); // ditto dialog.add_button (_("Cancel"), RESPONSE_CANCEL); + // by default gtk uses the left most button + keep->grab_focus (); + switch (dialog.run ()) { + case RESPONSE_NO: + /* keep this and all remaining ones */ + return -2; + break; + + case RESPONSE_YES: + /* delete this and all others */ + return 2; + break; + case RESPONSE_ACCEPT: /* delete the playlist */ - return 0; + return 1; break; case RESPONSE_REJECT: /* keep the playlist */ - return 1; + return 0; break; default: @@ -4204,25 +4106,6 @@ Editor::session_state_saved (string) _snapshots->redisplay (); } -void -Editor::update_tearoff_visibility() -{ - bool visible = ARDOUR_UI::config()->get_keep_tearoffs(); - _mouse_mode_tearoff->set_visible (visible); - _tools_tearoff->set_visible (visible); - if (_zoom_tearoff) { - _zoom_tearoff->set_visible (visible); - } -} - -void -Editor::reattach_all_tearoffs () -{ - if (_mouse_mode_tearoff) _mouse_mode_tearoff->put_it_back (); - if (_tools_tearoff) _tools_tearoff->put_it_back (); - if (_zoom_tearoff) _zoom_tearoff->put_it_back (); -} - void Editor::maximise_editing_space () { @@ -4230,9 +4113,12 @@ Editor::maximise_editing_space () return; } - fullscreen (); + Gtk::Window* toplevel = current_toplevel(); - _maximised = true; + if (toplevel) { + toplevel->fullscreen (); + _maximised = true; + } } void @@ -4242,9 +4128,12 @@ Editor::restore_editing_space () return; } - unfullscreen(); + Gtk::Window* toplevel = current_toplevel(); - _maximised = false; + if (toplevel) { + toplevel->unfullscreen(); + _maximised = false; + } } /** @@ -4287,7 +4176,7 @@ Editor::copy_playlists (TimeAxisView* v) void Editor::clear_playlists (TimeAxisView* v) { - begin_reversible_command (_("clear playlists")); + begin_reversible_command (_("clear playlists")); vector > playlists; _session->playlists->get (playlists); mapover_tracks (sigc::mem_fun (*this, &Editor::mapped_clear_playlist), v, ARDOUR::Properties::select.property_id); @@ -4312,19 +4201,6 @@ Editor::mapped_clear_playlist (RouteTimeAxisView& atv, uint32_t /*sz*/) atv.clear_playlist (); } -bool -Editor::on_key_press_event (GdkEventKey* ev) -{ - return key_press_focus_accelerator_handler (*this, ev); -} - -bool -Editor::on_key_release_event (GdkEventKey* ev) -{ - return Gtk::Window::on_key_release_event (ev); - // return key_press_focus_accelerator_handler (*this, ev); -} - double Editor::get_y_origin () const { @@ -4392,7 +4268,7 @@ Editor::current_visual_state (bool with_tracks) vs->leftmost_frame = leftmost_frame; vs->zoom_focus = zoom_focus; - if (with_tracks) { + if (with_tracks) { *vs->gui_state = *ARDOUR_UI::instance()->gui_object_state; } @@ -4456,11 +4332,12 @@ Editor::use_visual_state (VisualState& vs) set_zoom_focus (vs.zoom_focus); reposition_and_zoom (vs.leftmost_frame, vs.samples_per_pixel); - + if (vs.gui_state) { *ARDOUR_UI::instance()->gui_object_state = *vs.gui_state; - - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + (*i)->clear_property_cache(); (*i)->reset_visual_state (); } } @@ -4569,7 +4446,7 @@ Editor::idle_visual_changer () pending_visual_change.idle_handler_id = -1; pending_visual_change.being_handled = true; - + VisualChange vc = pending_visual_change; pending_visual_change.pending = (VisualChange::Type) 0; @@ -4593,7 +4470,7 @@ Editor::visual_changer (const VisualChange& vc) ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; - + compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), current_bbt_points_begin, current_bbt_points_end); compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(), @@ -4638,15 +4515,15 @@ Editor::sort_track_selection (TrackViewList& sel) } framepos_t -Editor::get_preferred_edit_position (bool ignore_playhead, bool from_context_menu, bool from_outside_canvas) +Editor::get_preferred_edit_position (EditIgnoreOption ignore, bool from_context_menu, bool from_outside_canvas) { bool ignored; framepos_t where = 0; EditPoint ep = _edit_point; - if(Profile->get_mixbus()) + if (Profile->get_mixbus()) if (ep == EditAtSelectedMarker) - ep=EditAtPlayhead; + ep = EditAtPlayhead; if (from_outside_canvas && (ep == EditAtMouse)) { ep = EditAtPlayhead; @@ -4659,19 +4536,21 @@ Editor::get_preferred_edit_position (bool ignore_playhead, bool from_context_men return entered_marker->position(); } - if (ignore_playhead && ep == EditAtPlayhead) { + if ( (ignore==EDIT_IGNORE_PHEAD) && ep == EditAtPlayhead) { ep = EditAtSelectedMarker; } + if ( (ignore==EDIT_IGNORE_MOUSE) && ep == EditAtMouse) { + ep = EditAtPlayhead; + } + switch (ep) { case EditAtPlayhead: if (_dragging_playhead) { - if (!mouse_frame (where, ignored)) { - /* XXX not right but what can we do ? */ - return 0; - } - } else + where = *_control_scroll_target; + } else { where = _session->audible_frame(); + } DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("GPEP: use playhead @ %1\n", where)); break; @@ -4863,7 +4742,7 @@ Editor::get_regions_from_selection_and_edit_point () if (!tracks.empty()) { /* no region selected or entered, but some selected tracks: * act on all regions on the selected tracks at the edit point - */ + */ framepos_t const where = get_preferred_edit_position (); get_regions_at(regions, where, tracks); } @@ -4900,7 +4779,7 @@ Editor::get_regions_from_selection_and_mouse (framepos_t pos) if (!tracks.empty()) { /* no region selected or entered, but some selected tracks: * act on all regions on the selected tracks at the edit point - */ + */ get_regions_at(regions, pos, tracks); } } @@ -4930,17 +4809,17 @@ Editor::get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) cons { for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { RouteTimeAxisView* rtav; - + if ((rtav = dynamic_cast (*i)) != 0) { boost::shared_ptr pl; std::vector > results; boost::shared_ptr tr; - + if ((tr = rtav->track()) == 0) { /* bus */ continue; } - + if ((pl = (tr->playlist())) != 0) { boost::shared_ptr r = pl->region_by_id (id); if (r) { @@ -4966,7 +4845,7 @@ Editor::get_per_region_note_selection (listget_per_region_note_selection (selection); } } - + } void @@ -5022,10 +4901,10 @@ void Editor::first_idle () { MessageDialog* dialog = 0; - + if (track_views.size() > 1) { + Timers::TimerSuspender t; dialog = new MessageDialog ( - *this, string_compose (_("Please wait while %1 loads visual data."), PROGRAM_NAME), true ); @@ -5209,6 +5088,7 @@ void Editor::resume_route_redisplay () { if (_routes) { + _routes->redisplay(); // queue redisplay _routes->resume_redisplay(); } } @@ -5258,6 +5138,7 @@ Editor::add_routes (RouteList& routes) } if (!from_scratch) { + selection->tracks.clear(); selection->add (new_selection); begin_selection_op_history(); } @@ -5365,7 +5246,7 @@ Editor::sync_track_view_list_and_routes () { track_views = TrackViewList (_routes->views ()); - _summary->set_dirty (); + _summary->set_background_dirty(); _group_tabs->set_dirty (); return false; // do not call again (until needed) @@ -5556,7 +5437,7 @@ Editor::reset_x_origin_to_follow_playhead () } else { framepos_t l = 0; - + if (frame < leftmost_frame) { /* moving left */ if (_session->transport_rolling()) { @@ -5580,7 +5461,7 @@ Editor::reset_x_origin_to_follow_playhead () if (l < 0) { l = 0; } - + center_screen_internal (l + (current_page_samples() / 2), current_page_samples ()); } } @@ -5596,7 +5477,7 @@ Editor::super_rapid_screen_update () /* METERING / MIXER STRIPS */ /* update track meters, if required */ - if (is_mapped() && meters_running) { + if (contents().is_mapped() && meters_running) { RouteTimeAxisView* rtv; for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { if ((rtv = dynamic_cast(*i)) != 0) { @@ -5647,24 +5528,20 @@ Editor::super_rapid_screen_update () } else { - /* don't do continuous scroll till the new position is in the rightmost quarter of the - editor canvas - */ -#if 0 - // FIXME DO SOMETHING THAT WORKS HERE - this is 2.X code - double target = ((double)frame - (double)current_page_samples()/2.0) / samples_per_pixel; - if (target <= 0.0) { - target = 0.0; - } - if (fabs(target - current) < current_page_samples() / samples_per_pixel) { - target = (target * 0.15) + (current * 0.85); - } else { - /* relax */ + if (!_dragging_playhead && _follow_playhead && _session->requested_return_frame() < 0 && !pending_visual_change.being_handled) { + framepos_t const frame = playhead_cursor->current_frame (); + double target = ((double)frame - (double)current_page_samples()/2.0); + if (target <= 0.0) { + target = 0.0; + } + // compare to EditorCursor::set_position() + double const old_pos = sample_to_pixel_unrounded (leftmost_frame); + double const new_pos = sample_to_pixel_unrounded (target); + if (rint (new_pos) != rint (old_pos)) { + reset_x_origin (pixel_to_sample (floor (new_pos))); + } } - current = target; - set_horizontal_position (current); -#endif } } @@ -5729,13 +5606,16 @@ Editor::session_going_away () clear_marker_display (); stop_step_editing (); - - /* get rid of any existing editor mixer strip */ - - WindowTitle title(Glib::get_application_name()); - title += _("Editor"); - set_title (title.get_string()); + if (own_window()) { + + /* get rid of any existing editor mixer strip */ + + WindowTitle title(Glib::get_application_name()); + title += _("Editor"); + + own_window()->set_title (title.get_string()); + } SessionHandlePtr::session_going_away (); } @@ -5754,7 +5634,7 @@ Editor::show_editor_list (bool yn) void Editor::change_region_layering_order (bool from_context_menu) { - const framepos_t position = get_preferred_edit_position (false, from_context_menu); + const framepos_t position = get_preferred_edit_position (EDIT_IGNORE_NONE, from_context_menu); if (!clicked_routeview) { if (layering_order_editor) { @@ -5805,7 +5685,7 @@ Editor::setup_fade_images () _fade_out_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadeout-fast-cut"))); _fade_out_images[FadeSlow] = new Gtk::Image (get_icon_path (X_("fadeout-slow-cut"))); _fade_out_images[FadeConstantPower] = new Gtk::Image (get_icon_path (X_("fadeout-constant-power"))); - + _xfade_in_images[FadeLinear] = new Gtk::Image (get_icon_path (X_("fadein-linear"))); _xfade_in_images[FadeSymmetric] = new Gtk::Image (get_icon_path (X_("fadein-symmetric"))); _xfade_in_images[FadeFast] = new Gtk::Image (get_icon_path (X_("fadein-fast-cut"))); @@ -5876,10 +5756,10 @@ void Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* event) { using namespace Menu_Helpers; - + MenuList& items = _control_point_context_menu.items (); items.clear (); - + items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &Editor::edit_control_point), item))); items.push_back (MenuElem (_("Delete"), sigc::bind (sigc::mem_fun (*this, &Editor::remove_control_point), item))); if (!can_remove_control_point (item)) { @@ -5905,20 +5785,41 @@ Editor::popup_note_context_menu (ArdourCanvas::Item* item, GdkEvent* event) MidiRegionView& mrv = note->region_view(); const RegionSelection rs = get_regions_from_selection_and_entered (); + const uint32_t sel_size = mrv.selection_size (); MenuList& items = _note_context_menu.items(); items.clear(); - items.push_back(MenuElem(_("Delete"), - sigc::mem_fun(mrv, &MidiRegionView::delete_selection))); + if (sel_size > 0) { + items.push_back(MenuElem(_("Delete"), + sigc::mem_fun(mrv, &MidiRegionView::delete_selection))); + } + items.push_back(MenuElem(_("Edit..."), - sigc::bind(sigc::mem_fun(*this, &Editor::edit_notes), &mrv))); + sigc::bind(sigc::mem_fun(*this, &Editor::edit_notes), &mrv))); + if (sel_size != 1) { + items.back().set_sensitive (false); + } + + items.push_back(MenuElem(_("Transpose..."), + sigc::bind(sigc::mem_fun(*this, &Editor::transpose_regions), rs))); + + items.push_back(MenuElem(_("Legatize"), - sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, false))); + sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, false))); + if (sel_size < 2) { + items.back().set_sensitive (false); + } + items.push_back(MenuElem(_("Quantize..."), sigc::bind(sigc::mem_fun(*this, &Editor::quantize_regions), rs))); + items.push_back(MenuElem(_("Remove Overlap"), - sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, true))); + sigc::bind(sigc::mem_fun(*this, &Editor::legatize_regions), rs, true))); + if (sel_size < 2) { + items.back().set_sensitive (false); + } + items.push_back(MenuElem(_("Transform..."), sigc::bind(sigc::mem_fun(*this, &Editor::transform_regions), rs))); @@ -5938,11 +5839,63 @@ Editor::ui_parameter_changed (string parameter) while (!_cursor_stack.empty()) { _cursor_stack.pop_back(); } - _cursors->set_cursor_set (ARDOUR_UI::config()->get_icon_set()); + _cursors->set_cursor_set (UIConfiguration::instance().get_icon_set()); _cursor_stack.push_back(_cursors->grabber); } else if (parameter == "draggable-playhead") { if (_verbose_cursor) { - playhead_cursor->set_sensitive (ARDOUR_UI::config()->get_draggable_playhead()); + playhead_cursor->set_sensitive (UIConfiguration::instance().get_draggable_playhead()); } } } + +Gtk::Window* +Editor::use_own_window (bool and_fill_it) +{ + bool new_window = !own_window(); + + Gtk::Window* win = Tabbable::use_own_window (and_fill_it); + + if (win && new_window) { + win->set_name ("EditorWindow"); + + ARDOUR_UI::instance()->setup_toplevel_window (*win, _("Editor"), this); + + // win->signal_realize().connect (*this, &Editor::on_realize); + win->signal_event().connect (sigc::mem_fun (*this, &Editor::generic_event_handler)); + win->set_data ("ardour-bindings", &bindings); + + update_title (); + } + + DisplaySuspender ds; + contents().show_all (); + + /* XXX: this is a bit unfortunate; it would probably + be nicer if we could just call show () above rather + than needing the show_all () + */ + + /* re-hide stuff if necessary */ + editor_list_button_toggled (); + parameter_changed ("show-summary"); + parameter_changed ("show-group-tabs"); + parameter_changed ("show-zoom-tools"); + + /* now reset all audio_time_axis heights, because widgets might need + to be re-hidden + */ + + TimeAxisView *tv; + + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + tv = (static_cast(*i)); + tv->reset_height (); + } + + if (current_mixer_strip) { + current_mixer_strip->hide_things (); + current_mixer_strip->parameter_changed ("mixer-element-visibility"); + } + + return win; +}