diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-11-19 01:53:39 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-11-19 01:53:39 +0000 |
commit | ed9bdd08945def40da97448af36301452b1b01df (patch) | |
tree | 27bf90fb296cde7cd12920657cd2f3f05d71b3f1 | |
parent | 86f7d4ef8735134fcb2a0abd065381370d028ab1 (diff) |
a ton of changes based on discussions at SAE; to be documented later
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2694 d708f5d6-7413-0410-9779-e7cbd77b26cf
27 files changed, 424 insertions, 272 deletions
diff --git a/gtk2_ardour/ardour-sae.menus b/gtk2_ardour/ardour-sae.menus index 25c832ad76..f24559f0de 100644 --- a/gtk2_ardour/ardour-sae.menus +++ b/gtk2_ardour/ardour-sae.menus @@ -12,19 +12,23 @@ <menuitem action='SaveTemplate'/> <separator/> <menuitem action='AddTrackBus'/> + + <menu name='Files' action='Files'> + <menuitem action='addExistingAudioFiles'/> + <separator/> + <menuitem action='ExportSession'/> + <menuitem action='ExportSelection'/> + </menu> + <separator/> <menu name='Cleanup' action='Cleanup'> <menuitem action='CleanupUnused'/> <menuitem action='FlushWastebasket'/> </menu> + <separator/> + <menuitem action='ToggleOptionsEditor'/> + <menuitem action='About'/> </menu> - <menu name='Files' action='Files'> - <menuitem action='addExistingAudioFiles'/> - <separator/> - <menuitem action='ExportSession'/> - <menuitem action='ExportSelection'/> - <menuitem action='ExportRangeMarkers'/> - </menu> <menu name='Transport' action='Transport'> <menuitem action='ToggleRoll'/> <menuitem action='ToggleRollForgetCapture'/> @@ -57,17 +61,15 @@ <separator/> <menuitem action='playhead-to-range-start'/> <menuitem action='playhead-to-range-end'/> - <menu action='TransportOptions'> - <menuitem action='ToggleTimeMaster'/> - <menuitem action='TogglePunchIn'/> - <menuitem action='TogglePunchOut'/> - <menuitem action='ToggleAutoInput'/> - <menuitem action='ToggleAutoPlay'/> - <menuitem action='ToggleAutoReturn'/> - <menuitem action='ToggleClick'/> - <menuitem action='toggle-follow-playhead'/> - <menuitem action='ToggleVideoSync'/> - </menu> + <separator/> + <menuitem action='ToggleTimeMaster'/> + <menuitem action='TogglePunchIn'/> + <menuitem action='TogglePunchOut'/> + <menuitem action='ToggleAutoInput'/> + <menuitem action='ToggleAutoPlay'/> + <menuitem action='ToggleAutoReturn'/> + <menuitem action='ToggleClick'/> + <menuitem action='toggle-follow-playhead'/> </menu> <menu name='Edit' action='Edit'> <menuitem action='undo'/> @@ -81,6 +83,18 @@ <separator/> <menuitem action='remove-last-capture'/> <separator/> + <menuitem action='select-all'/> + <menuitem action='deselect-all'/> + <menuitem action='invert-selection'/> + <menuitem action='select-all-after-edit-cursor'/> + <menuitem action='select-all-before-edit-cursor'/> + <menuitem action='select-all-after-playhead'/> + <menuitem action='select-all-before-playhead'/> + <menuitem action='select-all-between-cursors'/> + <menuitem action='select-all-within-cursors'/> + <menuitem action='select-all-in-punch-range'/> + <menuitem action='select-all-in-loop-range'/> + <separator/> <menu action='EditCursorMovementOptions'> <menuitem action='edit-cursor-to-next-region-start'/> <menuitem action='edit-cursor-to-next-region-end'/> @@ -103,28 +117,11 @@ <menuitem action='set-mouse-mode-gain'/> <menuitem action='set-mouse-mode-zoom'/> <menuitem action='set-mouse-mode-timefx'/> + <separator/> + <menuitem action='cycle-edit-point'/> + <menuitem action='cycle-edit-mode'/> </menu> - <separator/> - <menuitem action='ToggleOptionsEditor'/> </menu> - <menu name='Select' action='Select'> - <menuitem action='select-range-between-cursors'/> - <menuitem action='extend-range-to-start-of-region'/> - <menuitem action='extend-range-to-end-of-region'/> - <menuitem action='start-range'/> - <menuitem action='finish-range'/> - <menuitem action='finish-add-range'/> - <separator/> - <menuitem action='select-all'/> - <menuitem action='select-all-after-edit-cursor'/> - <menuitem action='select-all-before-edit-cursor'/> - <menuitem action='select-all-after-playhead'/> - <menuitem action='select-all-before-playhead'/> - <menuitem action='select-all-between-cursors'/> - <menuitem action='select-all-within-cursors'/> - <menuitem action='select-all-in-punch-range'/> - <menuitem action='select-all-in-loop-range'/> - </menu> <menu name='Regions' action='Regions'> <menuitem action='crop'/> <menuitem action='duplicate-region'/> @@ -154,6 +151,8 @@ <menuitem action='trim-region-to-punch'/> </menu> <menu name='View' action = 'View'> + <menuitem action='ToggleMaximalEditor'/> + <separator/> <menu name='ZoomFocus' action='ZoomFocus'> <menuitem action='zoom-focus-left'/> <menuitem action='zoom-focus-right'/> @@ -163,11 +162,13 @@ <menuitem action='zoom-focus-mouse'/> </menu> <menu name='SnapMode' action='SnapMode'> + <menuitem action='snap-off'/> <menuitem action='snap-normal'/> <menuitem action='snap-magnetic'/> + <separator/> + <menuitem action='cycle-snap-mode'/> </menu> <menu name='SnapTo' action='SnapTo'> - <menuitem action='snap-to-frame'/> <menuitem action='snap-to-cd-frame'/> <menuitem action='snap-to-smpte-frame'/> <menuitem action='snap-to-smpte-seconds'/> @@ -182,11 +183,11 @@ <menuitem action='snap-to-beat'/> <menuitem action='snap-to-bar'/> <menuitem action='snap-to-mark'/> - <menuitem action='snap-to-edit-cursor'/> <menuitem action='snap-to-region-start'/> <menuitem action='snap-to-region-end'/> <menuitem action='snap-to-region-sync'/> <menuitem action='snap-to-region-boundary'/> + <menuitem action='cycle-snap-choice'/> </menu> <separator/> @@ -208,76 +209,21 @@ <menuitem action='show-editor-mixer'/> <menuitem action='SyncEditorAndMixerTrackOrder'/> <menuitem action='ToggleLogoVisibility'/> - </menu> - <menu name='JACK' action='JACK'> - <menuitem action='JACKDisconnect'/> - <menuitem action='JACKReconnect'/> - <menu name='Latency' action='Latency'> - <menuitem action='JACKLatency32'/> - <menuitem action='JACKLatency64'/> - <menuitem action='JACKLatency128'/> - <menuitem action='JACKLatency256'/> - <menuitem action='JACKLatency512'/> - <menuitem action='JACKLatency1024'/> - <menuitem action='JACKLatency2048'/> - <menuitem action='JACKLatency4096'/> - <menuitem action='JACKLatency8192'/> - </menu> - </menu> - <menu name='Windows' action = 'Windows'> - <menuitem action='ToggleMaximalEditor'/> <separator/> <menuitem action='goto-editor'/> <menuitem action='goto-mixer'/> - <menuitem action='ToggleInspector'/> <menuitem action='ToggleLocations'/> + <menuitem action='ToggleKeyEditor'/> <menuitem action='ToggleThemeManager'/> <menuitem action='ToggleBigClock'/> - <separator/> </menu> <menu name='Options' action='Options'> - <menu action='AudioFileFormat'> - <menu action='AudioFileFormatData'> - <menuitem action='FileDataFormatFloat'/> - <menuitem action='FileDataFormat24bit'/> - <menuitem action='FileDataFormat16bit'/> - </menu> - <menu action='AudioFileFormatHeader'> - <menuitem action='FileHeaderFormatBWF'/> - <menuitem action='FileHeaderFormatWAVE'/> - <menuitem action='FileHeaderFormatWAVE64'/> - <menuitem action='FileHeaderFormatCAF'/> - </menu> - </menu> <menu action='Monitoring'> - <menuitem action='UseHardwareMonitoring'/> <menuitem action='UseSoftwareMonitoring'/> <menuitem action='UseExternalMonitoring'/> </menu> - <menu action='Metering'> - <menu action='MeteringFallOffRate'> - <menuitem action='MeterFalloffOff'/> - <menuitem action='MeterFalloffSlowest'/> - <menuitem action='MeterFalloffSlow'/> - <menuitem action='MeterFalloffMedium'/> - <menuitem action='MeterFalloffFast'/> - <menuitem action='MeterFalloffFaster'/> - <menuitem action='MeterFalloffFastest'/> - </menu> - <menu action='MeteringHoldTime'> - <menuitem action='MeterHoldOff'/> - <menuitem action='MeterHoldShort'/> - <menuitem action='MeterHoldMedium'/> - <menuitem action='MeterHoldLong'/> - </menu> - </menu> - <menu action='Solo'> - <menuitem action='LatchedSolo'/> - </menu> + <menuitem action='LatchedSolo'/> </menu> - <menu name='Help' action='Help'> - <menuitem action='About'/> - </menu> </menubar> <popup name='redirectmenu'> diff --git a/gtk2_ardour/ardour.bindings.in b/gtk2_ardour/ardour.bindings.in index 732854fabf..368d7294d5 100644 --- a/gtk2_ardour/ardour.bindings.in +++ b/gtk2_ardour/ardour.bindings.in @@ -10,6 +10,10 @@ ; (gtk_accel_path "<Actions>/Editor/Autoconnect" "") ; (gtk_accel_path "<Actions>/Editor/Edit" "") (gtk_accel_path "<Actions>/Editor/playhead-to-previous-region-end" "<Control>comma") +(gtk_accel_path "<Actions>/Editor/cycle-snap-mode" "<Alt>KP_Decimal") +(gtk_accel_path "<Actions>/Editor/cycle-snap-choice" "KP_Decimal") +(gtk_accel_path "<Actions>/Editor/cycle-edit-point" "KP_Divide") +(gtk_accel_path "<Actions>/Editor/cycle-edit-mode" "KP_Multiply") ; (gtk_accel_path "<Actions>/redirectmenu/copy" "") ; (gtk_accel_path "<Actions>/options/MeterFalloffFaster" "") (gtk_accel_path "<Actions>/Transport/ToggleRollForgetCapture" "<Control>space") @@ -233,6 +237,7 @@ ; (gtk_accel_path "<Actions>/Editor/PullupMinus1" "") ; (gtk_accel_path "<Actions>/Editor/snap-normal" "") (gtk_accel_path "<Actions>/Common/ToggleBigClock" "<Alt>b") +(gtk_accel_path "<Actions>/Common/ToggleKeyEditor" "<Alt>k") ; (gtk_accel_path "<Actions>/Snap/snap-to-asixteenthbeat" "") (gtk_accel_path "<Actions>/Editor/select-all-in-punch-range" "<Control>d") ; (gtk_accel_path "<Actions>/redirectmenu/edit" "") @@ -282,7 +287,7 @@ ; (gtk_accel_path "<Actions>/options/FileHeaderFormatCAF" "") (gtk_accel_path "<Actions>/Common/ToggleLocations" "<Alt>l") ; (gtk_accel_path "<Actions>/Editor/ToggleGeneric MIDISurface" "") -(gtk_accel_path "<Actions>/Editor/editor-delete" "Delete") +(gtk_accel_path "<Actions>/Editor/editor-delete" "BackSpace") ; (gtk_accel_path "<Actions>/JACK/JACKLatency256" "") (gtk_accel_path "<Actions>/Editor/select-all-between-cursors" "u") ; (gtk_accel_path "<Actions>/Editor/LayerAddHigher" "") diff --git a/gtk2_ardour/ardour.menus b/gtk2_ardour/ardour.menus index c6bb4af23f..9a98659d65 100644 --- a/gtk2_ardour/ardour.menus +++ b/gtk2_ardour/ardour.menus @@ -169,11 +169,13 @@ <menuitem action='zoom-focus-mouse'/> </menu> <menu name='SnapMode' action='SnapMode'> + <menuitem action='snap-off'/> <menuitem action='snap-normal'/> <menuitem action='snap-magnetic'/> + <separator/> + <menuitem action='cycle-snap-mode'/> </menu> <menu name='SnapTo' action='SnapTo'> - <menuitem action='snap-to-frame'/> <menuitem action='snap-to-cd-frame'/> <menuitem action='snap-to-smpte-frame'/> <menuitem action='snap-to-smpte-seconds'/> @@ -188,7 +190,6 @@ <menuitem action='snap-to-beat'/> <menuitem action='snap-to-bar'/> <menuitem action='snap-to-mark'/> - <menuitem action='snap-to-edit-cursor'/> <menuitem action='snap-to-region-start'/> <menuitem action='snap-to-region-end'/> <menuitem action='snap-to-region-sync'/> diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 2ad5612808..62b88cf1a5 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -115,7 +115,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) /* big clock */ - big_clock (X_("bigclock"), false, "BigClockNonRecording", false, false, true), + big_clock (X_("bigclock"), false, "BigClockNonRecording", true, false, true), /* transport */ @@ -1879,6 +1879,14 @@ ARDOUR_UI::primary_clock_value_changed () } void +ARDOUR_UI::big_clock_value_changed () +{ + if (session) { + session->request_locate (big_clock.current_time ()); + } +} + +void ARDOUR_UI::secondary_clock_value_changed () { if (session) { diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 4d9da2044c..cab635e5a7 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -470,6 +470,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void solo_alert_toggle (); void audition_alert_toggle (); + void big_clock_value_changed (); void primary_clock_value_changed (); void secondary_clock_value_changed (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 190b7a2fff..17a9153797 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -315,6 +315,7 @@ ARDOUR_UI::setup_transport () primary_clock.ValueChanged.connect (mem_fun(*this, &ARDOUR_UI::primary_clock_value_changed)); secondary_clock.ValueChanged.connect (mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed)); + big_clock.ValueChanged.connect (mem_fun(*this, &ARDOUR_UI::big_clock_value_changed)); ARDOUR_UI::instance()->tooltips().set_tip (primary_clock, _("Primary clock")); ARDOUR_UI::instance()->tooltips().set_tip (secondary_clock, _("secondary clock")); @@ -407,12 +408,16 @@ ARDOUR_UI::setup_transport () if (!ARDOUR::Profile->get_small_screen()) { clock_box->pack_start (secondary_clock, false, false); } - VBox* time_controls_box = manage (new VBox); - time_controls_box->pack_start (sync_option_combo, false, false); - time_controls_box->pack_start (time_master_button, false, false); - clock_box->pack_start (*time_controls_box, false, false, 1); + + if (!Profile->get_sae()) { + VBox* time_controls_box = manage (new VBox); + time_controls_box->pack_start (sync_option_combo, false, false); + time_controls_box->pack_start (time_master_button, false, false); + clock_box->pack_start (*time_controls_box, false, false, 1); + } + transport_tearoff_hbox.pack_start (*clock_box, false, false, 0); - + HBox* toggle_box = manage(new HBox); VBox* punch_box = manage (new VBox); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 0e484f3d64..e221d06b92 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -82,7 +82,7 @@ ARDOUR_UI::install_actions () /* menus + submenus that need action items */ ActionManager::register_action (main_actions, X_("Session"), _("Session")); - ActionManager::register_action (main_actions, X_("Files"), _("Files")); + ActionManager::register_action (main_actions, X_("Files"), _("Import/Export")); ActionManager::register_action (main_actions, X_("Regions"), _("Regions")); ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup")); ActionManager::register_action (main_actions, X_("Sync"), _("Sync")); diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 29becbdde6..10fdba8974 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -1,7 +1,7 @@ /* Copyright (C) 2001-2006 Paul Davis - This program is free software; you can redistribute it and/or modify + This program is free software; you can r>edistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -1165,3 +1165,34 @@ AudioRegionView::color_handler () envelope_active_changed(); } +void +AudioRegionView::set_frame_color () +{ + if (!frame) { + return; + } + + if (_region->opaque()) { + fill_opacity = 130; + } else { + fill_opacity = 0; + } + + uint32_t r,g,b,a; + + if (_selected && should_show_selection) { + frame->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_WaveForm.get(); + + UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a); + for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) { + (*w)->property_wave_color() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a);// Lets still use the theme's opacity value if Opaque is not set + } + } else { + UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a); + frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a); + + for (vector<ArdourCanvas::WaveView*>::iterator w = waves.begin(); w != waves.end(); ++w) { + (*w)->property_wave_color() = ARDOUR_UI::config()->canvasvar_WaveForm.get(); + } + } +} diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 2ac313fdab..f84b0e25cc 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -143,7 +143,8 @@ class AudioRegionView : public RegionView void compute_colors (Gdk::Color&); void reset_width_dependent_items (double pixel_width); void set_waveview_data_src(); - + void set_frame_color (); + void color_handler (); vector<GnomeCanvasWaveViewCache*> wave_caches; diff --git a/gtk2_ardour/editing_syms.h b/gtk2_ardour/editing_syms.h index cb4d80fada..c324136502 100644 --- a/gtk2_ardour/editing_syms.h +++ b/gtk2_ardour/editing_syms.h @@ -18,7 +18,6 @@ */ /* Changing this order will break the menu */ -SNAPTYPE(SnapToFrame) SNAPTYPE(SnapToCDFrame) SNAPTYPE(SnapToSMPTEFrame) SNAPTYPE(SnapToSMPTESeconds) @@ -33,13 +32,13 @@ SNAPTYPE(SnapToAThirdBeat) SNAPTYPE(SnapToBeat) SNAPTYPE(SnapToBar) SNAPTYPE(SnapToMark) -SNAPTYPE(SnapToEditPoint) SNAPTYPE(SnapToRegionStart) SNAPTYPE(SnapToRegionEnd) SNAPTYPE(SnapToRegionSync) SNAPTYPE(SnapToRegionBoundary) /* Changing this order will break the menu */ +SNAPMODE(SnapOff) SNAPMODE(SnapNormal) SNAPMODE(SnapMagnetic) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 0fc1e49e62..e8eebe5060 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -106,7 +106,6 @@ const double Editor::timebar_height = 15.0; #include "editor_xpms" static const gchar *_snap_type_strings[] = { - N_("None"), N_("CD Frames"), N_("SMPTE Frames"), N_("SMPTE Seconds"), @@ -121,7 +120,6 @@ static const gchar *_snap_type_strings[] = { N_("Beats"), N_("Bars"), N_("Marks"), - N_("Edit Point"), N_("Region starts"), N_("Region ends"), N_("Region syncs"), @@ -130,7 +128,8 @@ static const gchar *_snap_type_strings[] = { }; static const gchar *_snap_mode_strings[] = { - N_("Normal"), + N_("No Grid"), + N_("Grid"), N_("Magnetic"), 0 }; @@ -178,7 +177,7 @@ Editor::Editor () minsec_label (_("Mins:Secs")), bbt_label (_("Bars:Beats")), smpte_label (_("Timecode")), - frame_label (_("Frames")), + frame_label (_("Samples")), tempo_label (_("Tempo")), meter_label (_("Meter")), mark_label (_("Location Markers")), @@ -245,10 +244,9 @@ Editor::Editor () zoom_focus_strings = I18N (_zoom_focus_strings); edit_point_strings = I18N (_edit_point_strings); - snap_type = SnapToFrame; + snap_type = SnapToBeat; set_snap_to (snap_type); - - snap_mode = SnapNormal; + snap_mode = SnapOff; set_snap_mode (snap_mode); _edit_point = EditAtMouse; @@ -651,9 +649,12 @@ Editor::Editor () nlabel = manage (new Label (_("Edit Groups"))); nlabel->set_angle (-90); the_notebook.append_page (*edit_group_display_packer, *nlabel); - nlabel = manage (new Label (_("Chunks"))); - nlabel->set_angle (-90); - the_notebook.append_page (named_selection_scroller, *nlabel); + + if (!Profile->get_sae()) { + nlabel = manage (new Label (_("Chunks"))); + nlabel->set_angle (-90); + the_notebook.append_page (named_selection_scroller, *nlabel); + } the_notebook.set_show_tabs (true); the_notebook.set_scrollable (true); @@ -2356,7 +2357,7 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark) Location* before = 0; Location* after = 0; - if (!session) { + if (!session || snap_mode == SnapOff) { return; } @@ -2367,9 +2368,6 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark) nframes64_t presnap = start; switch (snap_type) { - case SnapToFrame: - break; - case SnapToCDFrame: if (direction) { start = (nframes_t) ceil ((double) start / (one_second / 75)) * (one_second / 75); @@ -2471,10 +2469,6 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark) start = session->tempo_map().round_to_beat_subdivision (start, 3); break; - case SnapToEditPoint: - start = get_preferred_edit_position (); - break; - case SnapToMark: if (for_mark) { return; @@ -2555,6 +2549,7 @@ Editor::snap_to (nframes64_t& start, int32_t direction, bool for_mark) } default: + /* handled at entry */ return; } @@ -3099,6 +3094,25 @@ Editor::set_verbose_canvas_cursor_text (const string & txt) } void +Editor::set_edit_mode (EditMode m) +{ + Config->set_edit_mode (m); +} + +void +Editor::cycle_edit_mode () +{ + switch (Config->get_edit_mode()) { + case Slide: + Config->set_edit_mode (Splice); + break; + case Splice: + Config->set_edit_mode (Slide); + break; + } +} + +void Editor::edit_mode_selection_done () { if (session == 0) { @@ -3121,7 +3135,7 @@ void Editor::snap_type_selection_done () { string choice = snap_type_selector.get_active_text(); - SnapType snaptype = SnapToFrame; + SnapType snaptype = SnapToBeat; if (choice == _("Beats/3")) { snaptype = SnapToAThirdBeat; @@ -3139,8 +3153,6 @@ Editor::snap_type_selection_done () snaptype = SnapToBar; } else if (choice == _("Marks")) { snaptype = SnapToMark; - } else if (choice == _("Edit Point")) { - snaptype = SnapToEditPoint; } else if (choice == _("Region starts")) { snaptype = SnapToRegionStart; } else if (choice == _("Region ends")) { @@ -3161,8 +3173,6 @@ Editor::snap_type_selection_done () snaptype = SnapToSeconds; } else if (choice == _("Minutes")) { snaptype = SnapToMinutes; - } else if (choice == _("None")) { - snaptype = SnapToFrame; } RefPtr<RadioAction> ract = snap_type_action (snaptype); @@ -3177,7 +3187,9 @@ Editor::snap_mode_selection_done () string choice = snap_mode_selector.get_active_text(); SnapMode mode = SnapNormal; - if (choice == _("Normal")) { + if (choice == _("No Grid")) { + mode = SnapOff; + } else if (choice == _("Grid")) { mode = SnapNormal; } else if (choice == _("Magnetic")) { mode = SnapMagnetic; @@ -3191,6 +3203,22 @@ Editor::snap_mode_selection_done () } void +Editor::cycle_edit_point () +{ + switch (_edit_point) { + case EditAtMouse: + set_edit_point_preference (EditAtPlayhead); + break; + case EditAtPlayhead: + set_edit_point_preference (EditAtSelectedMarker); + break; + case EditAtSelectedMarker: + set_edit_point_preference (EditAtMouse); + break; + } +} + +void Editor::edit_point_selection_done () { string choice = edit_point_selector.get_active_text(); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 5d71009163..1c17ad4220 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -134,6 +134,8 @@ class Editor : public PublicEditor return (nframes_t) floor (canvas_width * frames_per_unit); } + void cycle_snap_mode (); + void cycle_snap_choice (); void set_snap_to (Editing::SnapType); void set_snap_mode (Editing::SnapMode); void set_snap_threshold (double pixel_distance) {snap_threshold = pixel_distance;} @@ -394,6 +396,7 @@ class Editor : public PublicEditor void location_gone (ARDOUR::Location *); void remove_marker (ArdourCanvas::Item&, GdkEvent*); gint really_remove_marker (ARDOUR::Location* loc); + void goto_nth_marker (int nth); uint32_t location_marker_color; uint32_t location_range_color; @@ -456,11 +459,12 @@ class Editor : public PublicEditor void catch_vanishing_regionview (RegionView *); - bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false); + void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove=false); void select_all_tracks (); bool set_selected_control_point_from_click (Selection::Operation op = Selection::Set, bool no_remove=false); - bool set_selected_track_from_click (bool press, 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); + void set_selected_track_as_side_effect (bool force = false); bool set_selected_regionview_from_click (bool press, Selection::Operation op = Selection::Set, bool no_track_remove=false); void set_selected_regionview_from_region_list (boost::shared_ptr<ARDOUR::Region> region, Selection::Operation op = Selection::Set); @@ -1383,6 +1387,8 @@ class Editor : public PublicEditor Gtk::ComboBoxText edit_mode_selector; Gtk::VBox edit_mode_box; + void set_edit_mode (ARDOUR::EditMode); + void cycle_edit_mode (); void edit_mode_selection_done (); Gtk::ComboBoxText snap_type_selector; @@ -1921,6 +1927,7 @@ class Editor : public PublicEditor Gtk::ComboBoxText edit_point_selector; void set_edit_point_preference (Editing::EditPoint ep); + void cycle_edit_point (); void set_edit_point (); void edit_point_selection_done (); void edit_point_chosen (Editing::EditPoint); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index bd8f7b6430..36dba0c43f 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -98,23 +98,23 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "playhead-to-previous-region-sync", _("Playhead to Previous Region Sync"), bind (mem_fun(*this, &Editor::cursor_to_previous_region_point), playhead_cursor, RegionPoint (SyncPoint))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-start", _("Edit Cursor to Next Region Start"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (Start))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-start", _("to Next Region Start"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (Start))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-end", _("Edit Cursor to Next Region End"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (End))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-end", _("to Next Region End"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (End))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-sync", _("Edit Cursor to Next Region Sync"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (SyncPoint))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-next-region-sync", _("to Next Region Sync"), bind (mem_fun(*this, &Editor::edit_point_to_next_region_point), RegionPoint (SyncPoint))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-start", _("Edit Cursor to Previous Region Start"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (Start))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-start", _("to Previous Region Start"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (Start))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-end", _("Edit Cursor to Previous Region End"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (End))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-end", _("to Previous Region End"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (End))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-sync", _("Edit Cursor to Previous Region Sync"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (SyncPoint))); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-previous-region-sync", _("to Previous Region Sync"), bind (mem_fun(*this, &Editor::edit_point_to_previous_region_point), RegionPoint (SyncPoint))); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-range-start", _("Edit Cursor to Range Start"), mem_fun(*this, &Editor::edit_point_to_selection_start)); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-range-start", _("to Range Start"), mem_fun(*this, &Editor::edit_point_to_selection_start)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "edit-cursor-to-range-end", _("Edit Cursor to Range End"), mem_fun(*this, &Editor::edit_point_to_selection_end)); + act = ActionManager::register_action (editor_actions, "edit-cursor-to-range-end", _("to Range End"), mem_fun(*this, &Editor::edit_point_to_selection_end)); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "playhead-to-range-start", _("Playhead to Range Start"), bind (mem_fun(*this, &Editor::cursor_to_selection_start), playhead_cursor)); @@ -122,11 +122,15 @@ Editor::register_actions () act = ActionManager::register_action (editor_actions, "playhead-to-range-end", _("Playhead to Range End"), bind (mem_fun(*this, &Editor::cursor_to_selection_end), playhead_cursor)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "select-all", _("select all"), bind (mem_fun(*this, &Editor::select_all), Selection::Set)); + act = ActionManager::register_action (editor_actions, "select-all", _("Select All"), bind (mem_fun(*this, &Editor::select_all), Selection::Set)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "select-all-after-edit-cursor", _("Select All After Edit Cursor"), bind (mem_fun(*this, &Editor::select_all_selectables_using_edit), true)); + act = ActionManager::register_action (editor_actions, "deselect-all", _("Deselect All"), bind (mem_fun(*this, &Editor::select_all), Selection::Set)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "select-all-before-edit-cursor", _("Select All Before Edit Cursor"), bind (mem_fun(*this, &Editor::select_all_selectables_using_edit), false)); + act = ActionManager::register_action (editor_actions, "invert-selection", _("Invert Selection"), bind (mem_fun(*this, &Editor::select_all), Selection::Set)); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_action (editor_actions, "select-all-after-edit-cursor", _("Select All After Edit Point"), bind (mem_fun(*this, &Editor::select_all_selectables_using_edit), true)); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_action (editor_actions, "select-all-before-edit-cursor", _("Select All Before Edit Point"), bind (mem_fun(*this, &Editor::select_all_selectables_using_edit), false)); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "select-all-after-playhead", _("Select All After Playhead"), bind (mem_fun(*this, &Editor::select_all_selectables_using_cursor), playhead_cursor, true)); @@ -135,7 +139,7 @@ Editor::register_actions () ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "select-all-between-cursors", _("Select All Between Playhead & Edit Point"), bind (mem_fun(*this, &Editor::select_all_selectables_between), false)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (editor_actions, "select-all-within-cursors", _("Select All Between Playhead & Edit Point"), bind (mem_fun(*this, &Editor::select_all_selectables_between), true)); + act = ActionManager::register_action (editor_actions, "select-all-within-cursors", _("Select All Within Playhead & Edit Point"), bind (mem_fun(*this, &Editor::select_all_selectables_between), true)); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (editor_actions, "select-range-between-cursors", _("Select Range Between Playhead & Edit Point"), mem_fun(*this, &Editor::select_range_between)); @@ -334,17 +338,26 @@ Editor::register_actions () ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-mouse"), _("Mouse"), (bind (mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead))); ActionManager::register_radio_action (editor_actions, edit_point_group, X_("edit-at-selected-marker"), _("Marker"), (bind (mem_fun(*this, &Editor::edit_point_chosen), Editing::EditAtPlayhead))); + ActionManager::register_action (editor_actions, "cycle-edit-point", _("Change edit point"), mem_fun (*this, &Editor::cycle_edit_point)); + + ActionManager::register_action (editor_actions, "set-edit-splice", _("Splice"), bind (mem_fun (*this, &Editor::set_edit_mode), Splice)); + ActionManager::register_action (editor_actions, "set-edit-slide", _("Slide"), bind (mem_fun (*this, &Editor::set_edit_mode), Slide)); + ActionManager::register_action (editor_actions, "toggle-edit-mode", _("Toggle Edit Mode"), mem_fun (*this, &Editor::cycle_edit_mode)); + ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap To")); ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode")); RadioAction::Group snap_mode_group; - ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Normal"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal))); + ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-off"), _("No Grid"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapOff))); + ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-normal"), _("Grid"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapNormal))); ActionManager::register_radio_action (editor_actions, snap_mode_group, X_("snap-magnetic"), _("Magnetic"), (bind (mem_fun(*this, &Editor::snap_mode_chosen), Editing::SnapMagnetic))); + ActionManager::register_action (editor_actions, X_("cycle-snap-mode"), _("Next Snap Mode"), mem_fun (*this, &Editor::cycle_snap_mode)); + ActionManager::register_action (editor_actions, X_("cycle-snap-choice"), _("Next Snap Choice"), mem_fun (*this, &Editor::cycle_snap_choice)); + Glib::RefPtr<ActionGroup> snap_actions = ActionGroup::create (X_("Snap")); RadioAction::Group snap_choice_group; - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-frame"), _("Snap to frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToFrame))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-cd-frame"), _("Snap to cd frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToCDFrame))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-frame"), _("Snap to SMPTE frame"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTEFrame))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-smpte-seconds"), _("Snap to SMPTE seconds"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToSMPTESeconds))); @@ -359,7 +372,6 @@ Editor::register_actions () ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-beat"), _("Snap to beat"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBeat))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-bar"), _("Snap to bar"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToBar))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-mark"), _("Snap to mark"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToMark))); - ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-edit-cursor"), _("Snap to edit point"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToEditPoint))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-start"), _("Snap to region start"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionStart))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-end"), _("Snap to region end"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionEnd))); ActionManager::register_radio_action (snap_actions, snap_choice_group, X_("snap-to-region-sync"), _("Snap to region sync"), (bind (mem_fun(*this, &Editor::snap_type_chosen), Editing::SnapToRegionSync))); @@ -722,9 +734,6 @@ Editor::snap_type_action (SnapType type) RefPtr<Action> act; switch (type) { - case Editing::SnapToFrame: - action = "snap-to-frame"; - break; case Editing::SnapToCDFrame: action = "snap-to-cd-frame"; break; @@ -767,9 +776,6 @@ Editor::snap_type_action (SnapType type) case Editing::SnapToMark: action = "snap-to-mark"; break; - case Editing::SnapToEditPoint: - action = "snap-to-edit-cursor"; - break; case Editing::SnapToRegionStart: action = "snap-to-region-start"; break; @@ -800,6 +806,67 @@ Editor::snap_type_action (SnapType type) } void +Editor::cycle_snap_choice() +{ + switch (snap_type) { + case Editing::SnapToCDFrame: + set_snap_to (Editing::SnapToSMPTEFrame); + break; + case Editing::SnapToSMPTEFrame: + set_snap_to (Editing::SnapToSMPTESeconds); + break; + case Editing::SnapToSMPTESeconds: + set_snap_to (Editing::SnapToSMPTEMinutes); + break; + case Editing::SnapToSMPTEMinutes: + set_snap_to (Editing::SnapToSeconds); + break; + case Editing::SnapToSeconds: + set_snap_to (Editing::SnapToMinutes); + break; + case Editing::SnapToMinutes: + set_snap_to (Editing::SnapToAThirtysecondBeat); + break; + case Editing::SnapToAThirtysecondBeat: + set_snap_to (Editing::SnapToASixteenthBeat); + break; + case Editing::SnapToASixteenthBeat: + set_snap_to (Editing::SnapToAEighthBeat); + break; + case Editing::SnapToAEighthBeat: + set_snap_to (Editing::SnapToAQuarterBeat); + break; + case Editing::SnapToAQuarterBeat: + set_snap_to (Editing::SnapToAThirdBeat); + break; + case Editing::SnapToAThirdBeat: + set_snap_to (Editing::SnapToBeat); + break; + case Editing::SnapToBeat: + set_snap_to (Editing::SnapToBar); + break; + case Editing::SnapToBar: + set_snap_to (Editing::SnapToMark); + break; + case Editing::SnapToMark: + set_snap_to (Editing::SnapToRegionStart); + break; + case Editing::SnapToRegionStart: + set_snap_to (Editing::SnapToRegionEnd); + break; + case Editing::SnapToRegionEnd: + set_snap_to (Editing::SnapToRegionSync); + break; + case Editing::SnapToRegionSync: + set_snap_to (Editing::SnapToRegionBoundary); + break; + case Editing::SnapToRegionBoundary: + set_snap_to (Editing::SnapToCDFrame); + break; + } +} + +void Editor::snap_type_chosen (SnapType type) { /* this is driven by a toggle on a radio group, and so is invoked twice, @@ -821,6 +888,9 @@ Editor::snap_mode_action (SnapMode mode) RefPtr<Action> act; switch (mode) { + case Editing::SnapOff: + action = X_("snap-off"); + break; case Editing::SnapNormal: action = X_("snap-normal"); break; @@ -845,6 +915,22 @@ Editor::snap_mode_action (SnapMode mode) } void +Editor::cycle_snap_mode () +{ + switch (snap_mode) { + case SnapOff: + set_snap_mode (SnapNormal); + break; + case SnapNormal: + set_snap_mode (SnapMagnetic); + break; + case SnapMagnetic: + set_snap_mode (SnapOff); + break; + } +} + +void Editor::snap_mode_chosen (SnapMode mode) { /* this is driven by a toggle on a radio group, and so is invoked twice, diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index 0f98982251..294aaa1746 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -1108,3 +1108,23 @@ Editor::selected_marker_moved (Location* loc) { edit_point_clock.set (loc->start()); } + +void +Editor::goto_nth_marker (int n) +{ +#if 0 + if (!session) { + return; + } + const Locations::LocationList& l (session->locations()->list()); + LocationList ordered; + ordered = l; + + for (Locations::LocationList::iterator i = locations.begin(); n > 0 && i != ordered.end(); ++i) { + if (loc->is_mark() && !loc->is_hidden() && !loc->is_start()) { + session->request_locate ((*i)->start(), session->transport_rolling()); + break; + } + } +#endif +} diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index d19029c58e..10b170d46a 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -328,8 +328,6 @@ Editor::step_mouse_mode (bool next) void Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) { - bool commit = false; - /* in object/audition/timefx mode, any button press sets the selection if the object can be selected. this is a bit of hack, because we want to avoid this if the @@ -368,18 +366,18 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it switch (item_type) { case RegionItem: if (mouse_mode != MouseRange) { - commit = set_selected_regionview_from_click (press, op, true); + set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { - commit = set_selected_track_from_click (press, op, false); + set_selected_track_as_side_effect (); } break; case RegionViewNameHighlight: case RegionViewName: if (mouse_mode != MouseRange) { - commit = set_selected_regionview_from_click (press, op, true); + set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { - commit = set_selected_track_from_click (press, op, false); + set_selected_track_as_side_effect (); } break; @@ -388,41 +386,37 @@ Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType it case FadeOutHandleItem: case FadeOutItem: if (mouse_mode != MouseRange) { - commit = set_selected_regionview_from_click (press, op, true); + set_selected_regionview_from_click (press, op, true); } else if (event->type == GDK_BUTTON_PRESS) { - commit = set_selected_track_from_click (press, op, false); + set_selected_track_as_side_effect (); } break; case GainAutomationControlPointItem: case PanAutomationControlPointItem: case RedirectAutomationControlPointItem: - commit = set_selected_track_from_click (press, op, true); + set_selected_track_as_side_effect (); if (mouse_mode != MouseRange) { - commit |= set_selected_control_point_from_click (op, false); + set_selected_control_point_from_click (op, false); } break; case StreamItem: /* for context click or range selection, select track */ if (event->button.button == 3) { - commit = set_selected_track_from_click (press, op, true); + set_selected_track_as_side_effect (); } else if (event->type == GDK_BUTTON_PRESS && mouse_mode == MouseRange) { - commit = set_selected_track_from_click (press, op, false); + set_selected_track_as_side_effect (); } break; case AutomationTrackItem: - commit = set_selected_track_from_click (press, op, true); + set_selected_track_as_side_effect (true); break; default: break; } - -// if (commit) { -// commit_reversible_command (); -// } } const static double ZERO_GAIN_FRACTION = gain_to_slider_position(dB_to_coefficient(0.0)); @@ -2063,7 +2057,7 @@ Editor::cursor_drag_motion_callback (ArdourCanvas::Item* item, GdkEvent* event) } if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::snap_modifier())) { - if (cursor == playhead_cursor && snap_type != SnapToEditPoint) { + if (cursor == playhead_cursor) { snap_to (adjusted_frame); } } @@ -4437,7 +4431,7 @@ Editor::trim_finished_callback (ArdourCanvas::Item* item, GdkEvent* event) if (!drag_info.first_move) { trim_motion_callback (item, event); - if (!clicked_regionview->get_selected()) { + if (!selection->selected (clicked_regionview)) { thaw_region_after_trim (*clicked_regionview); } else { @@ -4479,7 +4473,7 @@ Editor::point_trim (GdkEvent* event) trim_op = StartTrim; begin_reversible_command (_("Start point trim")); - if (rv->get_selected()) { + if (selection->selected (rv)) { for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) @@ -4511,7 +4505,7 @@ Editor::point_trim (GdkEvent* event) trim_op = EndTrim; begin_reversible_command (_("End point trim")); - if (rv->get_selected()) { + if (selection->selected (rv)) { for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) { @@ -5060,9 +5054,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, nframes_t pos) } switch (snap_type) { - case SnapToFrame: case SnapToMark: - case SnapToEditPoint: return; default: diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index bb18ffd2ce..b0791f789a 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -164,9 +164,7 @@ Editor::ruler_button_press (GdkEventButton* ev) case 2: /* edit point */ - if (snap_type != Editing::SnapToEditPoint) { - snap_to (where); - } + snap_to (where); break; default: @@ -205,9 +203,7 @@ Editor::ruler_button_release (GdkEventButton* ev) case 2: /* edit point */ - if (snap_type != Editing::SnapToEditPoint) { - snap_to (where); - } + snap_to (where); break; case 3: @@ -379,7 +375,7 @@ Editor::popup_ruler_menu (nframes_t where, ItemType t) mitem->set_active(true); } - ruler_items.push_back (CheckMenuElem (_("Frames"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_frames))); + ruler_items.push_back (CheckMenuElem (_("Samples"), bind (mem_fun(*this, &Editor::ruler_toggled), (int)ruler_metric_frames))); mitem = (CheckMenuItem *) &ruler_items.back(); if (ruler_shown[ruler_metric_frames]) { mitem->set_active(true); diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 9177bb2d71..28aeddd8bd 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -159,36 +159,47 @@ Editor::select_all_tracks () selection->set (track_views); } -bool +void +Editor::set_selected_track_as_side_effect (bool force) +{ + if (!clicked_trackview) { + return; + } + + if (!selection->tracks.empty()) { + if (!selection->selected (clicked_trackview)) { + selection->add (clicked_trackview); + } + + } else if (force) { + selection->set (clicked_trackview); + } +} + +void Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no_remove) { - bool commit = false; switch (op) { case Selection::Toggle: if (selection->selected (&view)) { if (!no_remove) { selection->remove (&view); - commit = true; } } else { selection->add (&view); - commit = false; } break; case Selection::Add: if (!selection->selected (&view)) { selection->add (&view); - commit = true; } break; case Selection::Set: - if (selection->selected (&view) && selection->tracks.size() == 1) { - /* no commit necessary */ - } else { - + if (selection->selected (&view) && selection->tracks.size() > 1) { + /* reset track selection if there is only 1 other track selected OR if no_remove is not set (its there to prevent deselecting a multi-track selection @@ -198,34 +209,30 @@ Editor::set_selected_track (TimeAxisView& view, Selection::Operation op, bool no if (selection->tracks.empty()) { selection->set (&view); - commit = true; } else if (selection->tracks.size() == 1 || !no_remove) { selection->set (&view); - commit = true; } } break; case Selection::Extend: - commit = extend_selection_to_track (view); + extend_selection_to_track (view); break; } - - return commit; } -bool +void Editor::set_selected_track_from_click (bool press, Selection::Operation op, bool no_remove) { if (!clicked_trackview) { - return false; + return; } if (!press) { - return false; + return; } - return set_selected_track (*clicked_trackview, op, no_remove); + set_selected_track (*clicked_trackview, op, no_remove); } bool @@ -386,7 +393,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, switch (op) { case Selection::Toggle: - if (clicked_regionview->get_selected()) { + if (selection->selected (clicked_regionview)) { if (press) { /* whatever was clicked was selected already; do nothing here but allow @@ -436,7 +443,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, break; case Selection::Set: - if (!clicked_regionview->get_selected()) { + if (!selection->selected (clicked_regionview)) { get_equivalent_regions (clicked_regionview, all_equivalent_regions); selection->set (all_equivalent_regions); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index bd8e71f269..ef6c0a1de6 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -133,7 +133,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulThingWithGoingAway virtual void copy_playlists (TimeAxisView*) = 0; virtual void clear_playlists (TimeAxisView*) = 0; virtual void select_all_tracks () = 0; - virtual bool set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove = false) = 0; + virtual void set_selected_track (TimeAxisView&, Selection::Operation op = Selection::Set, bool no_remove = false) = 0; virtual void set_selected_mixer_strip (TimeAxisView&) = 0; virtual void hide_track_in_display (TimeAxisView& tv) = 0; virtual void show_track_in_display (TimeAxisView& tv) = 0; diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index e3ab94e79e..d038c4d610 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -378,8 +378,8 @@ RegionView::fake_set_opaque (bool yn) } else { fill_opacity = 0; } - - TimeAxisViewItem::set_frame_color (); + + set_frame_color (); } void diff --git a/gtk2_ardour/selectable.h b/gtk2_ardour/selectable.h index 51fc5da027..ca316c6450 100644 --- a/gtk2_ardour/selectable.h +++ b/gtk2_ardour/selectable.h @@ -34,7 +34,6 @@ class Selectable : public virtual sigc::trackable virtual void set_selected (bool yn) { if (yn != _selected) { _selected = yn; - Selected (_selected); /* EMIT_SIGNAL */ } } @@ -42,9 +41,6 @@ class Selectable : public virtual sigc::trackable return _selected; } - /** Emitted when the selected status of this Selectable changes */ - sigc::signal<void, bool> Selected ; - protected: bool _selected; }; diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 24dc8750f9..d8afa18fba 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -373,7 +373,6 @@ StreamView::set_selected_regionviews (RegionSelection& regions) { bool selected; - // cerr << _trackview.name() << " (selected = " << regions.size() << ")" << endl; for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) { selected = false; @@ -383,8 +382,7 @@ StreamView::set_selected_regionviews (RegionSelection& regions) selected = true; } } - - // cerr << "\tregion " << (*i)->region().name() << " selected = " << selected << endl; + (*i)->set_selected (selected); } } diff --git a/gtk2_ardour/tape_region_view.cc b/gtk2_ardour/tape_region_view.cc index 08d8450036..9022e35896 100644 --- a/gtk2_ardour/tape_region_view.cc +++ b/gtk2_ardour/tape_region_view.cc @@ -96,5 +96,5 @@ void TapeAudioRegionView::set_frame_color () { fill_opacity = 255; - TimeAxisViewItem::set_frame_color (); + AudioRegionView::set_frame_color (); } diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 20666fb30d..f49b638835 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -520,10 +520,7 @@ TimeAxisView::popup_display_menu (guint32 when) build_display_menu (); } - if (!get_selected()) { - editor.set_selected_track (*this, Selection::Set); - } - + editor.set_selected_track (*this, Selection::Add); display_menu->popup (1, when); } diff --git a/gtk2_ardour/time_axis_view_item.h b/gtk2_ardour/time_axis_view_item.h index beab5d0b22..a9877d5b24 100644 --- a/gtk2_ardour/time_axis_view_item.h +++ b/gtk2_ardour/time_axis_view_item.h @@ -362,7 +362,7 @@ class TimeAxisViewItem : public Selectable /** * Sets the frame color depending on whether this item is selected */ - void set_frame_color() ; + virtual void set_frame_color() ; /** * Sets the colors of the start and end trim handle depending on object state diff --git a/libs/ardour/ardour/location.h b/libs/ardour/ardour/location.h index 5ffb716598..53d9489823 100644 --- a/libs/ardour/ardour/location.h +++ b/libs/ardour/ardour/location.h @@ -146,6 +146,8 @@ class Locations : public PBD::StatefulDestructible Locations (); ~Locations (); + const LocationList& list() { return locations; } + void add (Location *, bool make_current = false); void remove (Location *); void clear (); diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 241353d4ba..f09afc2f54 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -231,11 +231,11 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f void sort_regions (); - void possibly_splice (); - void possibly_splice_unlocked(); - void core_splice (); - void splice_locked (); - void splice_unlocked (); + void possibly_splice (nframes_t at, nframes64_t distance); + void possibly_splice_unlocked(nframes_t at, nframes64_t distance); + void core_splice (nframes_t at, nframes64_t distance); + void splice_locked (nframes_t at, nframes64_t distance); + void splice_unlocked (nframes_t at, nframes64_t distance); virtual void finalize_split_region (boost::shared_ptr<Region> original, boost::shared_ptr<Region> left, boost::shared_ptr<Region> right) {} diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index e83a29048f..f53283a98e 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -30,6 +30,7 @@ #include <pbd/failed_constructor.h> #include <pbd/stl_delete.h> #include <pbd/xml++.h> +#include <pbd/stacktrace.h> #include <ardour/playlist.h> #include <ardour/session.h> @@ -426,7 +427,6 @@ Playlist::flush_notifications () if (n || pending_modified) { if (!in_set_state) { - possibly_splice (); relayer (); } pending_modified = false; @@ -465,12 +465,7 @@ Playlist::add_region (boost::shared_ptr<Region> region, nframes_t position, floa --itimes; } - /* later regions will all be spliced anyway */ - if (!holding_state ()) { - possibly_splice_unlocked (); - } - /* note that itimes can be zero if we being asked to just insert a single fraction of the region. */ @@ -481,13 +476,18 @@ Playlist::add_region (boost::shared_ptr<Region> region, nframes_t position, floa pos += region->length(); } + nframes_t length = 0; + if (floor (times) != times) { - nframes_t length = (nframes_t) floor (region->length() * (times - floor (times))); + length = (nframes_t) floor (region->length() * (times - floor (times))); string name; _session.region_name (name, region->name(), false); boost::shared_ptr<Region> sub = RegionFactory::create (region, 0, length, name, region->layer(), region->flags()); add_region_internal (sub, pos); } + + + possibly_splice_unlocked (position, (pos + length) - position); } void @@ -549,27 +549,27 @@ Playlist::replace_region (boost::shared_ptr<Region> old, boost::shared_ptr<Regio { RegionLock rlock (this); + bool old_sp = _splicing; + _splicing = true; + remove_region_internal (old); add_region_internal (newr, pos); - if (!holding_state ()) { - possibly_splice_unlocked (); - } + _splicing = old_sp; + + possibly_splice_unlocked (pos, (nframes64_t) old->length() - (nframes64_t) newr->length()); } void Playlist::remove_region (boost::shared_ptr<Region> region) { RegionLock rlock (this); + nframes_t pos = region->position(); remove_region_internal (region); - - if (!holding_state ()) { - possibly_splice_unlocked (); - } } int -Playlist::remove_region_internal (boost::shared_ptr<Region>region) +Playlist::remove_region_internal (boost::shared_ptr<Region> region) { RegionList::iterator i; nframes_t old_length = 0; @@ -586,8 +586,13 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region) for (i = regions.begin(); i != regions.end(); ++i) { if (*i == region) { + nframes_t pos = (*i)->position(); + nframes64_t distance = (*i)->length(); + regions.erase (i); + possibly_splice_unlocked (pos, -distance); + if (!holding_state ()) { relayer (); remove_dependents (region); @@ -601,6 +606,9 @@ Playlist::remove_region_internal (boost::shared_ptr<Region>region) return 0; } } + + + return -1; } @@ -891,7 +899,6 @@ Playlist::cut (nframes_t start, nframes_t cnt, bool result_is_hidden) } partition_internal (start, start+cnt-1, true, thawlist); - possibly_splice (); for (RegionList::iterator i = thawlist.begin(); i != thawlist.end(); ++i) { (*i)->thaw ("playlist cut"); @@ -945,7 +952,6 @@ Playlist::paste (boost::shared_ptr<Playlist> other, nframes_t position, float ti pos += shift; } - possibly_splice_unlocked (); /* XXX shall we handle fractional cases at some point? */ @@ -1005,10 +1011,14 @@ Playlist::split_region (boost::shared_ptr<Region> region, nframes_t playlist_pos string before_name; string after_name; + /* split doesn't change anything about length, so don't try to splice */ + + bool old_sp = _splicing; + _splicing = true; + before = playlist_position - region->position(); after = region->length() - before; - _session.region_name (before_name, region->name(), false); left = RegionFactory::create (region, 0, before, before_name, region->layer(), Region::Flag (region->flags()|Region::LeftOfSplit)); @@ -1017,7 +1027,7 @@ Playlist::split_region (boost::shared_ptr<Region> region, nframes_t playlist_pos add_region_internal (left, region->position()); add_region_internal (right, region->position() + before); - + uint64_t orig_layer_op = region->last_layer_op(); for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { if ((*i)->last_layer_op() > orig_layer_op) { @@ -1032,63 +1042,78 @@ Playlist::split_region (boost::shared_ptr<Region> region, nframes_t playlist_pos finalize_split_region (region, left, right); - if (remove_region_internal (region)) { - return; - } + remove_region_internal (region); + + _splicing = old_sp; } void -Playlist::possibly_splice () +Playlist::possibly_splice (nframes_t at, nframes64_t distance) { + if (_splicing || in_set_state) { + /* don't respond to splicing moves or state setting */ + return; + } + if (_edit_mode == Splice) { - splice_locked (); + splice_locked (at, distance); } } void -Playlist::possibly_splice_unlocked () +Playlist::possibly_splice_unlocked (nframes_t at, nframes64_t distance) { + if (_splicing || in_set_state) { + /* don't respond to splicing moves or state setting */ + return; + } + if (_edit_mode == Splice) { - splice_unlocked (); + splice_unlocked (at, distance); } } void -Playlist::splice_locked () +Playlist::splice_locked (nframes_t at, nframes64_t distance) { { RegionLock rl (this); - core_splice (); + core_splice (at, distance); } notify_length_changed (); } void -Playlist::splice_unlocked () +Playlist::splice_unlocked (nframes_t at, nframes64_t distance) { - core_splice (); + core_splice (at, distance); notify_length_changed (); } void -Playlist::core_splice () +Playlist::core_splice (nframes_t at, nframes64_t distance) { + stacktrace (cerr, 12); + _splicing = true; + + cerr << "core splice, move everything >= " << at << " by " << distance << endl; for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { - - RegionList::iterator next; - - next = i; - ++next; - - if (next == regions.end()) { - break; + if ((*i)->position() >= at) { + nframes64_t new_pos = (*i)->position() + distance; + if (new_pos < 0) { + new_pos = 0; + } else if (new_pos >= max_frames - (*i)->length()) { + new_pos = max_frames - (*i)->length(); + } + + cerr << "\tmove " << (*i)->name() << " to " << new_pos << endl; + (*i)->set_position (new_pos, this); } - - (*next)->set_position ((*i)->last_frame() + 1, this); } + _splicing = false; } @@ -1130,8 +1155,9 @@ Playlist::region_bounds_changed (Change what_changed, boost::shared_ptr<Region> /* it moved or changed length, so change the timestamp */ timestamp_layer_op (region); } - - possibly_splice (); + + // XXX NEED TO SPLICE HERE ... HOW TO GET DISTANCE ? + notify_length_changed (); relayer (); check_dependents (region, false); |