1#include "../AdornedRulerPanel.h"
3#include "../CommonCommandFlags.h"
7#include "../ProjectAudioManager.h"
10#include "../ProjectSelectionManager.h"
11#include "../ProjectSettings.h"
12#include "../ProjectWindow.h"
13#include "../ProjectWindows.h"
14#include "../SelectUtilities.h"
15#include "../SyncLock.h"
16#include "../TrackPanel.h"
17#include "../WaveTrack.h"
18#include "../LabelTrack.h"
19#include "../commands/CommandContext.h"
20#include "../commands/CommandManager.h"
21#include "../toolbars/ControlToolBar.h"
22#include "../tracks/ui/SelectHandle.h"
23#include "../tracks/labeltrack/ui/LabelTrackView.h"
24#include "../tracks/playabletrack/wavetrack/ui/WaveTrackView.h"
36 auto windowSize = size_t(std::max(1.0, rate / 100));
37 Floats dist{ windowSize,
true };
40 for (
auto one : tracks.Selected<
const WaveTrack >()) {
41 auto oneWindowSize = size_t(std::max(1.0, one->GetRate() / 100));
42 Floats oneDist{ oneWindowSize };
43 auto s = one->TimeToLongSamples(t0);
46 one->GetFloats(oneDist.get(),
47 s - (
int)oneWindowSize/2, oneWindowSize,
fillTwo);
52 for(
size_t i=0; i<oneWindowSize; i++){
53 float fDist = fabs( oneDist[i]);
54 if( prev * oneDist[i] > 0 )
65 for(
size_t i = 0; i < windowSize; i++) {
67 if (windowSize != oneWindowSize)
68 j = i * (oneWindowSize-1) / (windowSize-1);
72 dist[i] += oneDist[j];
76 0.1 * (abs(
int(i) -
int(windowSize/2))) /
float(windowSize/2);
84 for(
size_t i=0; i<windowSize; i++) {
92 if(( nTracks == 1 ) && (
min > (0.2*nTracks) ))
95 if(( nTracks > 1 ) && (
min > (0.6*nTracks) ))
98 return t0 + (argmin - (int)windowSize/2) / rate;
106 auto &project = context.
project;
107 auto evt = context.
pEvt;
108 bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP;
137 wxLongLong mLastSelectionAdjustment { ::wxGetUTCTimeMillis() };
138 double mSeekShort{ 0.0 };
139 double mSeekLong{ 0.0 };
145#ifdef EXPERIMENTAL_IMPROVED_SEEKING
146 if (gAudioIO->GetLastPlaybackTime() < lastSelectionAdjustment) {
153 lastSelectionAdjustment = ::wxGetUTCTimeMillis();
155 gAudioIO->SeekStream(seekStep);
178 if (std::abs(viewInfo.TimeToPosition(result) - viewInfo.TimeToPosition(t))
183 result = viewInfo.OffsetTimeByPixels(t, minPix);
191 double t,
double offset,
TimeUnit timeUnit,
int snapToTime)
199 return viewInfo.OffsetTimeByPixels(t, (
int)offset);
201 return GridMove(project, t, (
int)offset);
216 int snapToTime =
settings.GetSnapTo();
217 const double t0 = viewInfo.selectedRegion.t0();
218 const double end = std::max(
220 viewInfo.GetScreenEndTime());
224 if( viewInfo.selectedRegion.isPoint() )
227 t0, seekStep, timeUnit, snapToTime);
229 newT = std::max(0.0, newT);
232 viewInfo.selectedRegion.setT0(
235 viewInfo.selectedRegion.collapseToT0();
238 trackPanel.DrawOverlays(
false);
239 ruler.DrawOverlays(
false);
245 viewInfo.selectedRegion.collapseToT0();
247 viewInfo.selectedRegion.collapseToT1();
248 trackPanel.Refresh(
false);
252 window.ScrollIntoView(viewInfo.selectedRegion.t1());
271 int snapToTime =
settings.GetSnapTo();
272 const double t0 = viewInfo.selectedRegion.t0();
273 const double t1 = viewInfo.selectedRegion.t1();
274 const double end = std::max(
276 viewInfo.GetScreenEndTime());
283 bMoveT0 ? t0 : t1, seekStep, timeUnit, snapToTime);
285 newT = std::max( 0.0, newT );
289 newT = bMoveT0 ?
std::min( t1, newT ) : std::max( t0, newT );
293 viewInfo.selectedRegion.setT0( newT );
295 viewInfo.selectedRegion.setT1( newT );
298 window.ScrollIntoView(newT);
325 const wxLongLong curtime = ::wxGetUTCTimeMillis();
326 enum { MIN_INTERVAL = 50 };
333 enum { LARGER_MULTIPLIER = 4 };
334 const double seekStep = (fast ? LARGER_MULTIPLIER : 1.0) * direction;
342 wxLongLong &lastSelectionAdjustment)
349 lastSelectionAdjustment = ::wxGetUTCTimeMillis();
367 wxLongLong curtime = ::wxGetUTCTimeMillis();
377 bool bMoveT0 = (step < 0 );
382 double indicator = gAudioIO->GetStreamTime();
384 viewInfo.selectedRegion.setT0(indicator,
false);
386 viewInfo.selectedRegion.setT1(indicator);
392 const double t0 = viewInfo.selectedRegion.t0();
393 const double t1 = viewInfo.selectedRegion.t1();
394 const double end = std::max(
396 viewInfo.GetScreenEndTime());
398 double newT = viewInfo.OffsetTimeByPixels( bMoveT0 ? t0 : t1, pixels);
400 newT = std::max( 0.0, newT );
408 viewInfo.selectedRegion.setT0( newT );
410 viewInfo.selectedRegion.setT1( newT );
413 window.ScrollIntoView(newT);
436 for (
auto lt : tracks.Selected<
LabelTrack >()) {
438 if (view.SelectAllText(context.
project)) {
439 trackPanel.Refresh(
false);
446 for (
auto wt : tracks.Any<
WaveTrack>()) {
448 if (view.SelectAllText(context.
project)) {
449 trackPanel.Refresh(
false);
459 auto &project = context.
project;
469 auto &project = context.
project;
475 auto &project = context.
project;
478 bool selected =
false;
481 t->SetSelected(
true);
492 true,
true,
XO(
"Set Left Selection Boundary"));
498 false,
true,
XO(
"Set Right Selection Boundary"));
503 auto &project = context.
project;
507 double kWayOverToRight = std::numeric_limits<double>::max();
509 auto range = tracks.Selected();
516 (kWayOverToRight * (1 - std::numeric_limits<double>::epsilon()) ))
519 selectedRegion.setT0(minOffset);
526 auto &project = context.
project;
530 double kWayOverToLeft = std::numeric_limits<double>::lowest();
532 auto range = tracks.Selected();
539 (kWayOverToLeft * (1 - std::numeric_limits<double>::epsilon()) ))
542 selectedRegion.setT1(maxEndOffset);
549 auto &project = context.
project;
553 auto range = tracks.Selected();
557 if( maxEndOffset < minOffset)
560 viewInfo.selectedRegion.setTimes( minOffset, maxEndOffset );
569 auto &project = context.
project;
577 auto &project = context.
project;
586 window.ScrollIntoView(selectedRegion.t0());
597 auto &project = context.
project;
603 double cursorPositionCurrent = isAudioActive
604 ? gAudioIO->GetStreamTime()
605 : selectedRegion.t0();
606 selectedRegion.setTimes(
616 auto &project = context.
project;
622 isAudioActive ? gAudioIO->GetStreamTime() : selectedRegion.t0();
628 auto &project = context.
project;
632 if (selectedRegion.isPoint())
633 selectedRegion.setTimes(t0, t0);
638 selectedRegion.setTimes(t0, t1);
646 auto &project = context.
project;
652 auto &project = context.
project;
658 auto &project = context.
project;
664 auto &project = context.
project;
672 auto &project = context.
project;
674 window.SkipEnd(
true);
721 auto &project = context.
project;
725 selectedRegion.collapseToT0();
727 window.ScrollIntoView(selectedRegion.t0());
732 auto &project = context.
project;
736 selectedRegion.collapseToT1();
738 window.ScrollIntoView(selectedRegion.t1());
743 auto &project = context.
project;
748 double kWayOverToRight = std::numeric_limits<double>::max();
751 if (trackRange.empty())
759 (kWayOverToRight * (1 - std::numeric_limits<double>::epsilon()) ))
762 selectedRegion.setTimes(minOffset, minOffset);
764 window.ScrollIntoView(selectedRegion.t0());
769 auto &project = context.
project;
774 double kWayOverToLeft = std::numeric_limits<double>::lowest();
777 if (trackRange.empty())
785 (kWayOverToLeft * (1 - std::numeric_limits<double>::epsilon()) ))
788 selectedRegion.setTimes(maxEndOffset, maxEndOffset);
790 window.ScrollIntoView(selectedRegion.t1());
795 auto &project = context.
project;
799 controlToolBar.OnRewind(evt);
805 auto &project = context.
project;
809 controlToolBar.OnFF(evt);
853 auto &project = context.
project;
859 auto &project = context.
project;
865 auto &project = context.
project;
871 auto &project = context.
project;
879 auto &project = context.
project;
904 return std::make_unique< SelectActions::Handler >(); } };
912#define FN(X) (& SelectActions::Handler :: X)
935 FN(OnSelectAllTracks),
937 wxT(
"Ctrl+Shift+K") )
939 #ifdef EXPERIMENTAL_SYNC_LOCK
941 Command(
wxT(
"SelSyncLockTracks"),
XXO(
"In All &Sync-Locked Tracks"),
942 FN(OnSelectSyncLockSel),
944 Options{
wxT(
"Ctrl+Shift+Y"),
XO(
"Select Sync-Locked") } )
952 Command(
wxT(
"SetLeftSelection"),
XXO(
"&Left at Playback Position"),
954 Options{
wxT(
"["),
XO(
"Set Selection Left at Play Position") } ),
955 Command(
wxT(
"SetRightSelection"),
XXO(
"&Right at Playback Position"),
957 Options{
wxT(
"]"),
XO(
"Set Selection Right at Play Position") } ),
958 Command(
wxT(
"SelTrackStartToCursor"),
XXO(
"Track &Start to Cursor"),
960 Options{
wxT(
"Shift+J"),
XO(
"Select Track Start to Cursor") } ),
961 Command(
wxT(
"SelCursorToTrackEnd"),
XXO(
"Cursor to Track &End"),
963 Options{
wxT(
"Shift+K"),
XO(
"Select Cursor to Track End") } ),
964 Command(
wxT(
"SelTrackStartToEnd"),
XXO(
"Track Start to En&d"),
989 XXO(
"Cursor to Stored &Cursor Position"),
993 Command(
wxT(
"StoreCursorPosition"),
XXO(
"Store Cursor Pos&ition"),
994 FN(OnCursorPositionStore),
1024 Command(
wxT(
"SnapToPrior"),
XXO(
"Snap-To &Prior"),
FN(OnSnapToPrior),
1026 Command(
wxT(
"SelStart"),
XXO(
"Selection to &Start"),
FN(OnSelToStart),
1031 FN(OnSelExtendLeft),
1033 Options{
wxT(
"Shift+Left") }.WantKeyUp().AllowDup() ),
1034 Command(
wxT(
"SelExtRight"),
XXO(
"Selection Extend &Right"),
1035 FN(OnSelExtendRight),
1037 Options{
wxT(
"Shift+Right") }.WantKeyUp().AllowDup() ),
1038 Command(
wxT(
"SelSetExtLeft"),
XXO(
"Set (or Extend) Le&ft Selection"),
1039 FN(OnSelSetExtendLeft),
1041 Command(
wxT(
"SelSetExtRight"),
XXO(
"Set (or Extend) Rig&ht Selection"),
1042 FN(OnSelSetExtendRight),
1044 Command(
wxT(
"SelCntrLeft"),
XXO(
"Selection Contract L&eft"),
1045 FN(OnSelContractLeft),
1047 Options{
wxT(
"Ctrl+Shift+Right") }.WantKeyUp() ),
1048 Command(
wxT(
"SelCntrRight"),
XXO(
"Selection Contract R&ight"),
1049 FN(OnSelContractRight),
1051 Options{
wxT(
"Ctrl+Shift+Left") }.WantKeyUp() )
1057 wxT(
"Optional/Extra/Part1"),
1077 FN(OnCursorSelStart),
1086 FN(OnCursorTrackStart),
1090 FN(OnCursorTrackEnd),
1097 Options{
wxT(
"Home"),
XO(
"Cursor to Project Start") } ),
1106 wxT(
"Transport/Basic"),
1118 Options{
wxT(
"Left") }.WantKeyUp().AllowDup() ),
1121 Options{
wxT(
"Right") }.WantKeyUp().AllowDup() ),
1122 Command(
wxT(
"CursorShortJumpLeft"),
XXO(
"Cursor Sh&ort Jump Left"),
1123 FN(OnCursorShortJumpLeft),
1125 Command(
wxT(
"CursorShortJumpRight"),
XXO(
"Cursor Shor&t Jump Right"),
1126 FN(OnCursorShortJumpRight),
1128 Command(
wxT(
"CursorLongJumpLeft"),
XXO(
"Cursor Long J&ump Left"),
1129 FN(OnCursorLongJumpLeft),
1131 Command(
wxT(
"CursorLongJumpRight"),
XXO(
"Cursor Long Ju&mp Right"),
1132 FN(OnCursorLongJumpRight),
1139 wxT(
"Optional/Extra/Part2"),
1149 Command(
wxT(
"SeekLeftShort"),
XXO(
"Short Seek &Left During Playback"),
1153 XXO(
"Short Seek &Right During Playback"),
FN(OnSeekRightShort),
1156 Command(
wxT(
"SeekLeftLong"),
XXO(
"Long Seek Le&ft During Playback"),
1159 Command(
wxT(
"SeekRightLong"),
XXO(
"Long Seek Rig&ht During Playback"),
1167 wxT(
"Optional/Extra/Part1"),
AttachedItem sAttachment1
AttachedItem sAttachment2
constexpr CommandFlag AlwaysEnabledFlag
wxEvtHandler CommandHandlerObject
const ReservedCommandFlag & AudioIOBusyFlag()
const ReservedCommandFlag & AudioIONotBusyFlag()
const ReservedCommandFlag & IsSyncLockedFlag()
const ReservedCommandFlag & TimeSelectedFlag()
const ReservedCommandFlag & EditableTracksSelectedFlag()
const ReservedCommandFlag & TracksExistFlag()
const ReservedCommandFlag & WaveTracksExistFlag()
const ReservedCommandFlag & WaveTracksSelectedFlag()
const ReservedCommandFlag & TrackPanelHasFocus()
XXO("&Cut/Copy/Paste Toolbar")
const ReservedCommandFlag & CanStopAudioStreamFlag()
an object holding per-project preferred sample rate
static Settings & settings()
static AdornedRulerPanel & Get(AudacityProject &project)
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Client code makes static instance from a factory of attachments; passes it to Get or Find as a retrie...
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
AudacityProject & project
A LabelTrack is a Track that holds labels (LabelStruct).
static LabelTrackView & Get(LabelTrack &)
NumericConverter provides the advanced formatting control used in the selection bar of Audacity.
void SetValue(double newValue)
A listener notified of changes in preferences.
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static ProjectRate & Get(AudacityProject &project)
void AS_SetSnapTo(int snap) override
static ProjectSelectionManager & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
static ProjectWindow & Get(AudacityProject &project)
Defines a selected portion of a project.
static bool IsSyncLockSelected(const Track *pTrack)
virtual bool SupportsBasicEditing() const
Whether this track type implements cut-copy-paste; by default, true.
virtual double GetStartTime() const =0
virtual double GetOffset() const =0
virtual double GetEndTime() const =0
static TrackList & Get(AudacityProject &project)
static TrackPanel & Get(AudacityProject &project)
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
A Track that contains audio waveform data.
static WaveTrackView & Get(WaveTrack &track)
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
std::shared_ptr< BaseItem > BaseItemSharedPtr
void SelectNone(AudacityProject &project)
void DoSelectAll(AudacityProject &project)
void OnSetRegion(AudacityProject &project, bool left, bool selection, const TranslatableString &dialogTitle)
Adjust left or right of selection or play region.
void DoSelectTimeAndTracks(AudacityProject &project, bool bAllTime, bool bAllTracks)
CommandManager::Options Options
A convenient default parameter for class template Site.
Options && LongName(const TranslatableString &value) &&
void OnSetLeftSelection(const CommandContext &context)
double mCursorPositionStored
void OnCursorLeft(const CommandContext &context)
void OnSnapToOff(const CommandContext &context)
void OnCursorRight(const CommandContext &context)
Handler & operator=(const Handler &) PROHIBITED
void OnSelExtendRight(const CommandContext &context)
void OnSelectionSave(const CommandContext &context)
void OnSkipEnd(const CommandContext &context)
void OnSelContractRight(const CommandContext &context)
void OnSelContractLeft(const CommandContext &context)
void OnSelectAll(const CommandContext &context)
SelectedRegion mRegionSave
void OnCursorLongJumpRight(const CommandContext &context)
void UpdatePrefs() override
void OnSeekRightShort(const CommandContext &context)
void OnSnapToNearest(const CommandContext &context)
void OnSelToStart(const CommandContext &context)
void OnCursorLongJumpLeft(const CommandContext &context)
void OnSeekLeftShort(const CommandContext &context)
void OnSelectAllTime(const CommandContext &context)
void OnSnapToPrior(const CommandContext &context)
void OnSelectTrackStartToEnd(const CommandContext &context)
void OnCursorTrackEnd(const CommandContext &context)
void OnZeroCrossing(const CommandContext &context)
void OnCursorShortJumpRight(const CommandContext &context)
void OnCursorShortJumpLeft(const CommandContext &context)
void OnCursorTrackStart(const CommandContext &context)
void OnSelectNone(const CommandContext &context)
void OnSelSetExtendLeft(const CommandContext &context)
void OnSelectCursorEnd(const CommandContext &context)
void OnSelectSyncLockSel(const CommandContext &context)
Handler(const Handler &) PROHIBITED
void OnSelectCursorStoredCursor(const CommandContext &context)
void OnSelToEnd(const CommandContext &context)
void OnSelSetExtendRight(const CommandContext &context)
void OnCursorSelStart(const CommandContext &context)
void OnSkipStart(const CommandContext &context)
void OnSelectStartCursor(const CommandContext &context)
void OnSelectionRestore(const CommandContext &context)
void OnSeekRightLong(const CommandContext &context)
void OnSelExtendLeft(const CommandContext &context)
void OnSelectAllTracks(const CommandContext &context)
void OnSetRightSelection(const CommandContext &context)
void OnSeekLeftLong(const CommandContext &context)
void OnCursorPositionStore(const CommandContext &context)
bool mCursorPositionHasBeenStored
void OnCursorSelEnd(const CommandContext &context)