mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10:06 +02:00
Define virtual Track::PasteInto to simplfy Paste...
... Also making EditMenus not dependent on TimeTrack
This commit is contained in:
parent
8543d2dd30
commit
15313a27f7
@ -85,6 +85,13 @@ LabelTrack::LabelTrack(const LabelTrack &orig) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track::Holder LabelTrack::PasteInto( AudacityProject & ) const
|
||||||
|
{
|
||||||
|
auto pNewTrack = std::make_shared<LabelTrack>();
|
||||||
|
pNewTrack->Paste(0.0, this);
|
||||||
|
return pNewTrack;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename IntervalType>
|
template<typename IntervalType>
|
||||||
static IntervalType DoMakeInterval(const LabelStruct &label, size_t index)
|
static IntervalType DoMakeInterval(const LabelStruct &label, size_t index)
|
||||||
{
|
{
|
||||||
|
@ -155,6 +155,8 @@ public:
|
|||||||
int FindNextLabel(const SelectedRegion& currentSelection);
|
int FindNextLabel(const SelectedRegion& currentSelection);
|
||||||
int FindPrevLabel(const SelectedRegion& currentSelection);
|
int FindPrevLabel(const SelectedRegion& currentSelection);
|
||||||
|
|
||||||
|
Track::Holder PasteInto( AudacityProject & ) const override;
|
||||||
|
|
||||||
struct IntervalData final : Track::IntervalData {
|
struct IntervalData final : Track::IntervalData {
|
||||||
size_t index;
|
size_t index;
|
||||||
explicit IntervalData(size_t index) : index{index} {};
|
explicit IntervalData(size_t index) : index{index} {};
|
||||||
|
@ -683,6 +683,13 @@ QuantizedTimeAndBeat NoteTrack::NearestBeatTime( double time ) const
|
|||||||
return { seq_time + GetOffset(), beat };
|
return { seq_time + GetOffset(), beat };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track::Holder NoteTrack::PasteInto( AudacityProject & ) const
|
||||||
|
{
|
||||||
|
auto pNewTrack = std::make_shared<NoteTrack>();
|
||||||
|
pNewTrack->Paste(0.0, this);
|
||||||
|
return pNewTrack;
|
||||||
|
}
|
||||||
|
|
||||||
auto NoteTrack::GetIntervals() const -> ConstIntervals
|
auto NoteTrack::GetIntervals() const -> ConstIntervals
|
||||||
{
|
{
|
||||||
ConstIntervals results;
|
ConstIntervals results;
|
||||||
|
@ -185,6 +185,8 @@ public:
|
|||||||
mVisibleChannels = CHANNEL_BIT(c);
|
mVisibleChannels = CHANNEL_BIT(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track::Holder PasteInto( AudacityProject & ) const override;
|
||||||
|
|
||||||
ConstIntervals GetIntervals() const override;
|
ConstIntervals GetIntervals() const override;
|
||||||
Intervals GetIntervals() override;
|
Intervals GetIntervals() override;
|
||||||
|
|
||||||
|
@ -136,6 +136,18 @@ bool TimeTrack::SupportsBasicEditing() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track::Holder TimeTrack::PasteInto( AudacityProject &project ) const
|
||||||
|
{
|
||||||
|
// Maintain uniqueness of the time track!
|
||||||
|
std::shared_ptr<TimeTrack> pNewTrack;
|
||||||
|
if( auto pTrack = *TrackList::Get( project ).Any<TimeTrack>().begin() )
|
||||||
|
pNewTrack = pTrack->SharedPointer<TimeTrack>();
|
||||||
|
else
|
||||||
|
pNewTrack = std::make_shared<TimeTrack>( &ViewInfo::Get( project ) );
|
||||||
|
pNewTrack->Paste(0.0, this);
|
||||||
|
return pNewTrack;
|
||||||
|
}
|
||||||
|
|
||||||
Track::Holder TimeTrack::Cut( double t0, double t1 )
|
Track::Holder TimeTrack::Cut( double t0, double t1 )
|
||||||
{
|
{
|
||||||
auto result = Copy( t0, t1, false );
|
auto result = Copy( t0, t1, false );
|
||||||
|
@ -42,6 +42,8 @@ class TimeTrack final : public Track {
|
|||||||
|
|
||||||
bool SupportsBasicEditing() const override;
|
bool SupportsBasicEditing() const override;
|
||||||
|
|
||||||
|
Holder PasteInto( AudacityProject & ) const override;
|
||||||
|
|
||||||
Holder Cut( double t0, double t1 ) override;
|
Holder Cut( double t0, double t1 ) override;
|
||||||
Holder Copy( double t0, double t1, bool forClipboard ) const override;
|
Holder Copy( double t0, double t1, bool forClipboard ) const override;
|
||||||
void Clear(double t0, double t1) override;
|
void Clear(double t0, double t1) override;
|
||||||
|
@ -321,6 +321,12 @@ class AUDACITY_DLL_API Track /* not final */
|
|||||||
//! Whether this track type implements cut-copy-paste; by default, true
|
//! Whether this track type implements cut-copy-paste; by default, true
|
||||||
virtual bool SupportsBasicEditing() const;
|
virtual bool SupportsBasicEditing() const;
|
||||||
|
|
||||||
|
using Holder = std::shared_ptr<Track>;
|
||||||
|
|
||||||
|
//! Find or create the destination track for a paste, maybe in a different project
|
||||||
|
/*! @return A smart pointer to the track; its `use_count()` can tell whether it is new */
|
||||||
|
virtual Holder PasteInto( AudacityProject & ) const = 0;
|
||||||
|
|
||||||
//! Report times on the track where important intervals begin and end, for UI to snap to
|
//! Report times on the track where important intervals begin and end, for UI to snap to
|
||||||
/*!
|
/*!
|
||||||
Some intervals may be empty, and no ordering of the intervals is assumed.
|
Some intervals may be empty, and no ordering of the intervals is assumed.
|
||||||
@ -393,7 +399,6 @@ private:
|
|||||||
|
|
||||||
void Init(const Track &orig);
|
void Init(const Track &orig);
|
||||||
|
|
||||||
using Holder = std::shared_ptr<Track>;
|
|
||||||
// public nonvirtual duplication function that invokes Clone():
|
// public nonvirtual duplication function that invokes Clone():
|
||||||
virtual Holder Duplicate() const;
|
virtual Holder Duplicate() const;
|
||||||
|
|
||||||
|
@ -334,6 +334,15 @@ static Container MakeIntervals(const std::vector<WaveClipHolder> &clips)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Track::Holder WaveTrack::PasteInto( AudacityProject &project ) const
|
||||||
|
{
|
||||||
|
auto &trackFactory = WaveTrackFactory::Get( project );
|
||||||
|
auto &pSampleBlockFactory = trackFactory.GetSampleBlockFactory();
|
||||||
|
auto pNewTrack = EmptyCopy( pSampleBlockFactory );
|
||||||
|
pNewTrack->Paste(0.0, this);
|
||||||
|
return pNewTrack;
|
||||||
|
}
|
||||||
|
|
||||||
auto WaveTrack::GetIntervals() const -> ConstIntervals
|
auto WaveTrack::GetIntervals() const -> ConstIntervals
|
||||||
{
|
{
|
||||||
return MakeIntervals<ConstIntervals>( mClips );
|
return MakeIntervals<ConstIntervals>( mClips );
|
||||||
|
@ -537,6 +537,8 @@ private:
|
|||||||
std::shared_ptr<WaveClip> pClip;
|
std::shared_ptr<WaveClip> pClip;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Track::Holder PasteInto( AudacityProject & ) const override;
|
||||||
|
|
||||||
ConstIntervals GetIntervals() const override;
|
ConstIntervals GetIntervals() const override;
|
||||||
Intervals GetIntervals() override;
|
Intervals GetIntervals() override;
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include "../ProjectSettings.h"
|
#include "../ProjectSettings.h"
|
||||||
#include "../ProjectWindow.h"
|
#include "../ProjectWindow.h"
|
||||||
#include "../SelectUtilities.h"
|
#include "../SelectUtilities.h"
|
||||||
#include "../TimeTrack.h"
|
|
||||||
#include "../TrackPanel.h"
|
#include "../TrackPanel.h"
|
||||||
#include "../TrackPanelAx.h"
|
#include "../TrackPanelAx.h"
|
||||||
#include "../UndoManager.h"
|
#include "../UndoManager.h"
|
||||||
@ -76,8 +75,6 @@ bool DoPasteText(AudacityProject &project)
|
|||||||
bool DoPasteNothingSelected(AudacityProject &project)
|
bool DoPasteNothingSelected(AudacityProject &project)
|
||||||
{
|
{
|
||||||
auto &tracks = TrackList::Get( project );
|
auto &tracks = TrackList::Get( project );
|
||||||
auto &trackFactory = WaveTrackFactory::Get( project );
|
|
||||||
auto &pSampleBlockFactory = trackFactory.GetSampleBlockFactory();
|
|
||||||
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
|
||||||
auto &viewInfo = ViewInfo::Get( project );
|
auto &viewInfo = ViewInfo::Get( project );
|
||||||
auto &window = ProjectWindow::Get( project );
|
auto &window = ProjectWindow::Get( project );
|
||||||
@ -94,44 +91,18 @@ bool DoPasteNothingSelected(AudacityProject &project)
|
|||||||
|
|
||||||
Track* pFirstNewTrack = NULL;
|
Track* pFirstNewTrack = NULL;
|
||||||
for (auto pClip : clipTrackRange) {
|
for (auto pClip : clipTrackRange) {
|
||||||
Track::Holder uNewTrack;
|
auto pNewTrack = pClip->PasteInto( project );
|
||||||
Track *pNewTrack;
|
bool newTrack = (pNewTrack.use_count() == 1);
|
||||||
pClip->TypeSwitch(
|
|
||||||
[&](const WaveTrack *wc) {
|
|
||||||
uNewTrack = wc->EmptyCopy( pSampleBlockFactory );
|
|
||||||
pNewTrack = uNewTrack.get();
|
|
||||||
},
|
|
||||||
#ifdef USE_MIDI
|
|
||||||
[&](const NoteTrack *) {
|
|
||||||
uNewTrack = std::make_shared<NoteTrack>(),
|
|
||||||
pNewTrack = uNewTrack.get();
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
[&](const LabelTrack *) {
|
|
||||||
uNewTrack = std::make_shared<LabelTrack>(),
|
|
||||||
pNewTrack = uNewTrack.get();
|
|
||||||
},
|
|
||||||
[&](const TimeTrack *) {
|
|
||||||
// Maintain uniqueness of the time track!
|
|
||||||
pNewTrack = *tracks.Any<TimeTrack>().begin();
|
|
||||||
if (!pNewTrack)
|
|
||||||
uNewTrack = std::make_shared<TimeTrack>( &viewInfo ),
|
|
||||||
pNewTrack = uNewTrack.get();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
wxASSERT(pClip);
|
wxASSERT(pClip);
|
||||||
|
|
||||||
pNewTrack->Paste(0.0, pClip);
|
|
||||||
|
|
||||||
if (!pFirstNewTrack)
|
if (!pFirstNewTrack)
|
||||||
pFirstNewTrack = pNewTrack;
|
pFirstNewTrack = pNewTrack.get();
|
||||||
|
|
||||||
pNewTrack->SetSelected(true);
|
pNewTrack->SetSelected(true);
|
||||||
if (uNewTrack)
|
if (newTrack)
|
||||||
FinishCopy(pClip, uNewTrack, tracks);
|
FinishCopy(pClip, pNewTrack, tracks);
|
||||||
else
|
else
|
||||||
Track::FinishCopy(pClip, pNewTrack);
|
Track::FinishCopy(pClip, pNewTrack.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select some pasted samples, which is probably impossible to get right
|
// Select some pasted samples, which is probably impossible to get right
|
||||||
|
Loading…
x
Reference in New Issue
Block a user