1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-22 23:30:07 +02:00

Track::GetLink and GetLinked are private, but SetLinked isn't yet

This commit is contained in:
Paul Licameli 2018-09-18 11:05:21 -04:00
parent b36c3efec1
commit 2ee87082cb
5 changed files with 76 additions and 64 deletions

View File

@ -5478,20 +5478,10 @@ void MenuCommandHandler::OnRedo(const CommandContext &context)
ModifyUndoMenuItems(project); ModifyUndoMenuItems(project);
} }
void MenuCommandHandler::FinishCopy
(const Track *n, Track *dest)
{
if (dest) {
dest->SetChannel(n->GetChannel());
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
}
}
void MenuCommandHandler::FinishCopy void MenuCommandHandler::FinishCopy
(const Track *n, Track::Holder &&dest, TrackList &list) (const Track *n, Track::Holder &&dest, TrackList &list)
{ {
FinishCopy( n, dest.get() ); Track::FinishCopy( n, dest.get() );
if (dest) if (dest)
list.Add(std::move(dest)); list.Add(std::move(dest));
} }
@ -6037,7 +6027,7 @@ bool MenuCommandHandler::HandlePasteNothingSelected(AudacityProject &project)
if (uNewTrack) if (uNewTrack)
FinishCopy(pClip, std::move(uNewTrack), *tracks); FinishCopy(pClip, std::move(uNewTrack), *tracks);
else else
FinishCopy(pClip, pNewTrack); Track::FinishCopy(pClip, pNewTrack);
} }
// Select some pasted samples, which is probably impossible to get right // Select some pasted samples, which is probably impossible to get right

View File

@ -270,10 +270,7 @@ void OnExit(const CommandContext &context );
void OnUndo(const CommandContext &context ); void OnUndo(const CommandContext &context );
void OnRedo(const CommandContext &context ); void OnRedo(const CommandContext &context );
static void FinishCopy(const Track *n, Track *dest); static void FinishCopy(const Track *n, Track::Holder &&dest, TrackList &list);
static void FinishCopy
(const Track *n, Track::Holder &&dest, TrackList &list);
void OnCut(const CommandContext &context ); void OnCut(const CommandContext &context );
void OnSplitCut(const CommandContext &context ); void OnSplitCut(const CommandContext &context );

View File

@ -3138,46 +3138,7 @@ void AudacityProject::OpenFile(const wxString &fileNameArg, bool addtohistory)
err = true; err = true;
} }
// Sanity checks for linked tracks; unsetting the linked property err = ( !t->LinkConsistencyCheck() ) || err;
// doesn't fix the problem, but it likely leaves us with orphaned
// blockfiles instead of much worse problems.
if (t->GetLinked())
{
Track *l = t->GetLink();
if (l)
{
// A linked track's partner should never itself be linked
if (l->GetLinked())
{
wxLogWarning(
wxT("Left track %s had linked right track %s with extra right track link.\n Removing extra link from right track."),
t->GetName(), l->GetName());
err = true;
l->SetLinked(false);
}
// Channels should be left and right
if ( !( (t->GetChannel() == Track::LeftChannel &&
l->GetChannel() == Track::RightChannel) ||
(t->GetChannel() == Track::RightChannel &&
l->GetChannel() == Track::LeftChannel) ) )
{
wxLogWarning(
wxT("Track %s and %s had left/right track links out of order. Setting tracks to not be linked."),
t->GetName(), l->GetName());
err = true;
t->SetLinked(false);
}
}
else
{
wxLogWarning(
wxT("Track %s had link to NULL track. Setting it to not be linked."),
t->GetName());
err = true;
t->SetLinked(false);
}
}
mLastSavedTracks->Add(t->Duplicate()); mLastSavedTracks->Add(t->Duplicate());
} }
@ -5222,7 +5183,7 @@ void AudacityProject::EditClipboardByLabel( EditDestFunction action )
auto dest = ( wt->*action )( region.start, region.end ); auto dest = ( wt->*action )( region.start, region.end );
if( dest ) if( dest )
{ {
MenuCommandHandler::FinishCopy( wt, dest.get() ); Track::FinishCopy( wt, dest.get() );
if( !merged ) if( !merged )
merged = std::move(dest); merged = std::move(dest);
else else

View File

@ -408,6 +408,63 @@ bool Track::IsLeader() const
bool Track::IsSelectedLeader() const bool Track::IsSelectedLeader() const
{ return IsSelected() && IsLeader(); } { return IsSelected() && IsLeader(); }
void Track::FinishCopy
(const Track *n, Track *dest)
{
if (dest) {
dest->SetChannel(n->GetChannel());
dest->SetLinked(n->GetLinked());
dest->SetName(n->GetName());
}
}
bool Track::LinkConsistencyCheck()
{
// Sanity checks for linked tracks; unsetting the linked property
// doesn't fix the problem, but it likely leaves us with orphaned
// blockfiles instead of much worse problems.
bool err = false;
if (GetLinked())
{
Track *l = GetLink();
if (l)
{
// A linked track's partner should never itself be linked
if (l->GetLinked())
{
wxLogWarning(
wxT("Left track %s had linked right track %s with extra right track link.\n Removing extra link from right track."),
GetName().c_str(), l->GetName());
err = true;
l->SetLinked(false);
}
// Channels should be left and right
if ( !( (GetChannel() == Track::LeftChannel &&
l->GetChannel() == Track::RightChannel) ||
(GetChannel() == Track::RightChannel &&
l->GetChannel() == Track::LeftChannel) ) )
{
wxLogWarning(
wxT("Track %s and %s had left/right track links out of order. Setting tracks to not be linked."),
GetName(), l->GetName());
err = true;
SetLinked(false);
}
}
else
{
wxLogWarning(
wxT("Track %s had link to NULL track. Setting it to not be linked."),
GetName());
err = true;
SetLinked(false);
}
}
return ! err;
}
std::pair<Track *, Track *> TrackList::FindSyncLockGroup(Track *pMember) const std::pair<Track *, Track *> TrackList::FindSyncLockGroup(Track *pMember) const
{ {
if (!pMember) if (!pMember)

View File

@ -315,13 +315,24 @@ public:
void SetMinimized(bool isMinimized); void SetMinimized(bool isMinimized);
protected: protected:
virtual void DoSetMinimized(bool isMinimized); virtual void DoSetMinimized(bool isMinimized);
public:
Track *GetLink() const; public:
static void FinishCopy (const Track *n, Track *dest);
// For use when loading a file. Return true if ok, else make repair
bool LinkConsistencyCheck();
private: private:
std::shared_ptr<TrackList> GetOwner() const { return mList.lock(); } std::shared_ptr<TrackList> GetOwner() const { return mList.lock(); }
Track *GetLink() const;
bool GetLinked () const { return mLinked; }
public:
void SetLinked (bool l);
private:
// No need yet to make this virtual
void DoSetLinked(bool l);
TrackNodePointer GetNode() const; TrackNodePointer GetNode() const;
void SetOwner void SetOwner
(const std::weak_ptr<TrackList> &list, TrackNodePointer node); (const std::weak_ptr<TrackList> &list, TrackNodePointer node);
@ -358,13 +369,9 @@ private:
void SetDefaultName( const wxString &n ) { mDefaultName = n; } void SetDefaultName( const wxString &n ) { mDefaultName = n; }
bool GetSelected() const { return mSelected; } bool GetSelected() const { return mSelected; }
virtual void SetSelected(bool s); virtual void SetSelected(bool s);
bool GetLinked () const { return mLinked; }
void SetLinked (bool l);
private:
// No need yet to make this virtual
void DoSetLinked(bool l);
public: public:
virtual ChannelType GetChannel() const { return mChannel;} virtual ChannelType GetChannel() const { return mChannel;}