Remove GetLink(ed) in clip-moving functions

This commit is contained in:
Paul Licameli 2017-12-25 16:22:24 -05:00
parent 46557a9a2d
commit f276373f3c
2 changed files with 65 additions and 59 deletions

View File

@ -3856,13 +3856,14 @@ double MenuCommandHandler::OnClipMove
auto t0 = selectedRegion.t0();
state.capturedClip = wt->GetClipAtTime( t0 );
if (state.capturedClip == nullptr && track->GetLinked() && track->GetLink()) {
// the clips in the right channel may be different from the left
track = track->GetLink();
wt = static_cast<WaveTrack*>(track);
state.capturedClip = wt->GetClipAtTime(t0);
// Find the first channel that has a clip at time t0
for (auto channel : TrackList::Channels(wt) ) {
if( nullptr != (state.capturedClip = channel->GetClipAtTime( t0 )) ) {
wt = channel;
break;
}
}
if (state.capturedClip == nullptr)
return 0.0;
@ -6906,34 +6907,29 @@ int MenuCommandHandler::FindClips
std::vector<FoundClip> results;
int nTracksSearched = 0;
int trackNum = 1;
for (auto track : tracks->Leaders()) {
if (track->GetKind() == Track::Wave && (!anyWaveTracksSelected || track->GetSelected())) {
auto waveTrack = static_cast<const WaveTrack*>(track);
bool stereoAndDiff = waveTrack->GetLinked() && !ChannelsHaveSameClipBoundaries(waveTrack);
auto leaders = tracks->Leaders();
auto range = leaders.Filter<const WaveTrack>();
if (anyWaveTracksSelected)
range = range + &Track::GetSelected;
for (auto waveTrack : range) {
bool stereoAndDiff = ChannelsHaveDifferentClipBoundaries(waveTrack);
auto result = next ? FindNextClip(project, waveTrack, t0, t1) :
FindPrevClip(project, waveTrack, t0, t1);
auto range = stereoAndDiff
? TrackList::Channels( waveTrack )
: TrackList::SingletonRange( waveTrack );
for ( auto wt : range ) {
auto result = next ? FindNextClip(project, wt, t0, t1) :
FindPrevClip(project, wt, t0, t1);
if (result.found) {
result.trackNum = trackNum;
result.trackNum =
1 + std::distance( leaders.begin(), leaders.find( waveTrack ) );
result.channel = stereoAndDiff;
results.push_back(result);
}
if (stereoAndDiff) {
auto waveTrack2 = static_cast<const WaveTrack*>(track->GetLink());
auto result = next ? FindNextClip(project, waveTrack2, t0, t1) :
FindPrevClip(project, waveTrack2, t0, t1);
if (result.found) {
result.trackNum = trackNum;
result.channel = stereoAndDiff;
results.push_back(result);
}
}
nTracksSearched++;
}
trackNum++;
nTracksSearched++;
}
@ -6974,14 +6970,13 @@ int MenuCommandHandler::FindClips
return nTracksSearched; // can be used for screen reader messages if required
}
// Whether the two channels of a stereo track have the same clips
bool MenuCommandHandler::ChannelsHaveSameClipBoundaries(const WaveTrack* wt)
{
bool sameClips = false;
if (wt->GetLinked() && wt->GetLink()) {
auto& left = wt->GetClips();
auto& right = static_cast<const WaveTrack*>(wt->GetLink())->GetClips();
namespace {
bool TwoChannelsHaveSameBoundaries
( const WaveTrack *first, const WaveTrack *second )
{
bool sameClips = false;
auto& left = first->GetClips();
auto& right = second->GetClips();
if (left.size() == right.size()) {
sameClips = true;
for (unsigned int i = 0; i < left.size(); i++) {
@ -6992,9 +6987,24 @@ bool MenuCommandHandler::ChannelsHaveSameClipBoundaries(const WaveTrack* wt)
}
}
}
return sameClips;
}
}
bool MenuCommandHandler::ChannelsHaveDifferentClipBoundaries(
const WaveTrack* wt)
{
// This is quadratic in the number of channels
auto channels = TrackList::Channels(wt);
while (!channels.empty()) {
auto channel = *channels.first++;
for (auto other : channels) {
if (!TwoChannelsHaveSameBoundaries(channel, other))
return true;
}
}
return sameClips;
return false;
}
void MenuCommandHandler::OnSelectPrevClip(const CommandContext &context)
@ -8120,34 +8130,29 @@ int MenuCommandHandler::FindClipBoundaries
std::vector<FoundClipBoundary> results;
int nTracksSearched = 0;
int trackNum = 1;
for (auto track : tracks->Leaders()) {
if (track->GetKind() == Track::Wave && (!anyWaveTracksSelected || track->GetSelected())) {
auto waveTrack = static_cast<const WaveTrack*>(track);
bool stereoAndDiff = waveTrack->GetLinked() && !ChannelsHaveSameClipBoundaries(waveTrack);
auto leaders = tracks->Leaders();
auto range = leaders.Filter<const WaveTrack>();
if (anyWaveTracksSelected)
range = range + &Track::GetSelected;
for (auto waveTrack : range) {
bool stereoAndDiff = ChannelsHaveDifferentClipBoundaries(waveTrack);
auto result = next ? FindNextClipBoundary(waveTrack, time) :
FindPrevClipBoundary(waveTrack, time);
auto range = stereoAndDiff
? TrackList::Channels( waveTrack )
: TrackList::SingletonRange(waveTrack);
for (auto wt : range) {
auto result = next ? FindNextClipBoundary(wt, time) :
FindPrevClipBoundary(wt, time);
if (result.nFound > 0) {
result.trackNum = trackNum;
result.trackNum =
1 + std::distance( leaders.begin(), leaders.find( waveTrack ) );
result.channel = stereoAndDiff;
results.push_back(result);
}
if (stereoAndDiff) {
waveTrack = static_cast<const WaveTrack*>(track->GetLink());
result = next ? FindNextClipBoundary(waveTrack, time) :
FindPrevClipBoundary(waveTrack, time);
if (result.nFound > 0) {
result.trackNum = trackNum;
result.channel = stereoAndDiff;
results.push_back(result);
}
}
nTracksSearched++;
}
trackNum++;
nTracksSearched++;
}
@ -8215,7 +8220,8 @@ wxString MenuCommandHandler::FoundTrack::ComposeTrackName() const
: name;
auto longName = shortName;
if (channel) {
if ( waveTrack->GetLinked() )
// TODO: more-than-two-channels-message
if ( waveTrack->IsLeader() )
/* i18n-hint: given the name of a track, specify its left channel */
longName = wxString::Format(_("%s left"), shortName);
else

View File

@ -357,7 +357,7 @@ FoundClip FindPrevClip
int FindClips
(AudacityProject &project,
double t0, double t1, bool next, std::vector<FoundClip>& results);
bool ChannelsHaveSameClipBoundaries(const WaveTrack* wt);
bool ChannelsHaveDifferentClipBoundaries(const WaveTrack* wt);
void OnSelectPrevClip(const CommandContext &context );
void OnSelectNextClip(const CommandContext &context );
void OnSelectClip(AudacityProject &project, bool next);