mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-23 17:30:17 +01:00
Use track selection for SetTrack, SetClip and SetEnvelope
These commands now have shorter dialogs. Also fixed SetEnvelope optionals, which were not being honoured.
This commit is contained in:
@@ -32,8 +32,6 @@ SetEnvelopeCommand::SetEnvelopeCommand()
|
||||
|
||||
|
||||
bool SetEnvelopeCommand::DefineParams( ShuttleParams & S ){
|
||||
S.OptionalY( bHasTrackIndex ).Define( mTrackIndex, wxT("Track"), 0, 0, 100 );
|
||||
S.OptionalN( bHasChannelIndex ).Define( mChannelIndex, wxT("Channel"), 0, 0, 100 );
|
||||
S.OptionalY( bHasT ).Define( mT, wxT("Time"), 0.0, 0.0, 100000.0);
|
||||
S.OptionalY( bHasV ).Define( mV, wxT("Value"), 1.0, 0.0, 2.0);
|
||||
S.OptionalN( bHasDelete ).Define( mbDelete, wxT("Delete"), false );
|
||||
@@ -46,8 +44,6 @@ void SetEnvelopeCommand::PopulateOrExchange(ShuttleGui & S)
|
||||
|
||||
S.StartMultiColumn(3, wxALIGN_CENTER);
|
||||
{
|
||||
S.Optional( bHasTrackIndex ).TieNumericTextBox( _("Track Index:"), mTrackIndex );
|
||||
S.Optional( bHasChannelIndex).TieNumericTextBox( _("Channel Index:"), mChannelIndex );
|
||||
S.Optional( bHasT ).TieNumericTextBox( _("Time:"), mT );
|
||||
S.Optional( bHasV ).TieNumericTextBox( _("Value:"), mV );
|
||||
S.Optional( bHasDelete ).TieCheckBox( _("Delete:"), mbDelete );
|
||||
@@ -55,54 +51,29 @@ void SetEnvelopeCommand::PopulateOrExchange(ShuttleGui & S)
|
||||
S.EndMultiColumn();
|
||||
}
|
||||
|
||||
bool SetEnvelopeCommand::Apply(const CommandContext & context)
|
||||
bool SetEnvelopeCommand::ApplyInner( const CommandContext & context, Track * t )
|
||||
{
|
||||
// \todo we have similar code for finding the nth Label, Clip, Track etc.
|
||||
// this code could be put in subroutines/reduced.
|
||||
if( (t->GetKind() != Track::Wave))
|
||||
return true;
|
||||
|
||||
TrackList *tracks = context.GetProject()->GetTracks();
|
||||
TrackListIterator iter(tracks);
|
||||
Track *t = iter.First();
|
||||
WaveClip * pClip = NULL;
|
||||
int i=0;
|
||||
int j=0;
|
||||
|
||||
bool bIsSecondChannel = false;
|
||||
|
||||
while (t )
|
||||
{
|
||||
bool bThisTrack =
|
||||
(bHasTrackIndex && (i==mTrackIndex)) ||
|
||||
(bHasChannelIndex && (j==mChannelIndex ) ) ||
|
||||
(!bHasTrackIndex && !bHasChannelIndex) ;
|
||||
|
||||
if( bThisTrack && (t->GetKind() == Track::Wave)) {
|
||||
bool bFound = false;
|
||||
WaveTrack *waveTrack = static_cast<WaveTrack*>(t);
|
||||
WaveClipPointers ptrs( waveTrack->SortedClipArray());
|
||||
for(auto it = ptrs.begin(); (it != ptrs.end()); it++ ){
|
||||
pClip = *it;
|
||||
bFound =
|
||||
!bHasT || (
|
||||
( pClip->GetStartTime() <= mT) &&
|
||||
( pClip->GetEndTime() >= mT )
|
||||
);
|
||||
if( bFound )
|
||||
{
|
||||
// Inside this IF is where we actually apply the command
|
||||
Envelope* pEnv = pClip->GetEnvelope();
|
||||
if( mbDelete )
|
||||
pEnv->mEnv.clear();
|
||||
else
|
||||
pEnv->InsertOrReplace( mT, mV );
|
||||
}
|
||||
}
|
||||
WaveTrack *waveTrack = static_cast<WaveTrack*>(t);
|
||||
WaveClipPointers ptrs( waveTrack->SortedClipArray());
|
||||
for(auto it = ptrs.begin(); (it != ptrs.end()); it++ ){
|
||||
WaveClip * pClip = *it;
|
||||
bool bFound =
|
||||
!bHasT || (
|
||||
( pClip->GetStartTime() <= mT) &&
|
||||
( pClip->GetEndTime() >= mT )
|
||||
);
|
||||
if( bFound )
|
||||
{
|
||||
// Inside this IF is where we actually apply the command
|
||||
Envelope* pEnv = pClip->GetEnvelope();
|
||||
if( bHasDelete && mbDelete )
|
||||
pEnv->mEnv.clear();
|
||||
if( bHasT && bHasV )
|
||||
pEnv->InsertOrReplace( mT, mV );
|
||||
}
|
||||
bIsSecondChannel = t->GetLinked();
|
||||
if( !bIsSecondChannel )
|
||||
++i;
|
||||
j++;
|
||||
t = iter.Next();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user