Remove GetLink(ed) in clip-moving functions
This commit is contained in:
parent
46557a9a2d
commit
f276373f3c
122
src/Menus.cpp
122
src/Menus.cpp
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue