summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-11-19 01:53:39 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-11-19 01:53:39 +0000
commited9bdd08945def40da97448af36301452b1b01df (patch)
tree27bf90fb296cde7cd12920657cd2f3f05d71b3f1
parent86f7d4ef8735134fcb2a0abd065381370d028ab1 (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
-rw-r--r--gtk2_ardour/ardour-sae.menus140
-rw-r--r--gtk2_ardour/ardour.bindings.in7
-rw-r--r--gtk2_ardour/ardour.menus5
-rw-r--r--gtk2_ardour/ardour_ui.cc10
-rw-r--r--gtk2_ardour/ardour_ui.h1
-rw-r--r--gtk2_ardour/ardour_ui2.cc15
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc2
-rw-r--r--gtk2_ardour/audio_region_view.cc33
-rw-r--r--gtk2_ardour/audio_region_view.h3
-rw-r--r--gtk2_ardour/editing_syms.h3
-rw-r--r--gtk2_ardour/editor.cc76
-rw-r--r--gtk2_ardour/editor.h11
-rw-r--r--gtk2_ardour/editor_actions.cc128
-rw-r--r--gtk2_ardour/editor_markers.cc20
-rw-r--r--gtk2_ardour/editor_mouse.cc38
-rw-r--r--gtk2_ardour/editor_rulers.cc10
-rw-r--r--gtk2_ardour/editor_selection.cc47
-rw-r--r--gtk2_ardour/public_editor.h2
-rw-r--r--gtk2_ardour/region_view.cc4
-rw-r--r--gtk2_ardour/selectable.h4
-rw-r--r--gtk2_ardour/streamview.cc4
-rw-r--r--gtk2_ardour/tape_region_view.cc2
-rw-r--r--gtk2_ardour/time_axis_view.cc5
-rw-r--r--gtk2_ardour/time_axis_view_item.h2
-rw-r--r--libs/ardour/ardour/location.h2
-rw-r--r--libs/ardour/ardour/playlist.h10
-rw-r--r--libs/ardour/playlist.cc112
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);