2#include "../Clipboard.h"
3#include "../CommonCommandFlags.h"
4#include "../LabelTrack.h"
9#include "../ProjectWindow.h"
10#include "../SelectUtilities.h"
12#include "../TrackPanelAx.h"
13#include "../TrackPanel.h"
16#include "../commands/CommandContext.h"
17#include "../commands/CommandManager.h"
18#include "../tracks/labeltrack/ui/LabelTrackView.h"
35 const auto &test = [&](
const LabelTrack *pTrack ){
36 const auto &labels = pTrack->GetLabels();
37 return std::any_of( labels.begin(), labels.end(),
40 label.getT0() >= selectedRegion.t0()
42 label.getT1() <= selectedRegion.t1()
49 return !range.empty();
56 bool preserveFocus =
false)
65 gPrefs->
Read(
wxT(
"/GUI/DialogForNameNewLabel"), &useDialog,
false);
73 const auto pFocusedTrack = trackFocus.Get();
77 auto iter = pFocusedTrack
78 ?
tracks.Find(pFocusedTrack)
92 lt->SetSelected(
true);
96 index = lt->AddLabel(region,
title);
99 int focusTrackNumber = -1;
100 if (pFocusedTrack && preserveFocus) {
104 focusTrackNumber = std::distance(
begin, iter);
117 trackPanel.SetFocus();
130 for (
int i = 0; i < lt->GetNumLabels(); i++)
140 if( regions.size() == 0 )
144 std::sort(regions.begin(), regions.end());
145 unsigned int selected = 1;
146 while( selected < regions.size() )
148 const Region &cur = regions.at( selected );
149 Region &last = regions.at( selected - 1 );
154 regions.erase( regions.begin() + selected );
189 const bool playable =
dynamic_cast<const PlayableTrack *
>(t) !=
nullptr;
191 for (
size_t i = regions.size(); i--;) {
192 const Region ®ion = regions.at(i);
193 action(*t, region.
start, region.
end);
202 std::function<std::shared_ptr<TrackList>(
Track &,
double,
double)>;
227 auto &newClipboard = *pNewClipboard;
234 const bool playable =
dynamic_cast<const PlayableTrack *
>(t) !=
nullptr;
237 std::shared_ptr<TrackList> merged;
238 for (
size_t i = regions.size(); i--;) {
239 const Region ®ion = regions.at(i);
240 if (
auto dest = action(*t, region.
start, region.
end)) {
244 const auto pMerged = *merged->begin();
247 if (i + 1 < regions.size())
249 regions.at(i + 1).start - region.
end);
256 pMerged->Paste(0.0, *dest);
262 if (i + 1 < regions.size() && merged)
264 ->ShiftBy(regions.at(i + 1).start - region.
end);
267 newClipboard.Append(std::move(*merged));
272 clipboard.Assign( std::move( newClipboard ),
273 regions.front().start, regions.back().end,
project.shared_from_this() );
304 gAudioIO->IsStreamActive(token)) {
305 double indicator = gAudioIO->GetStreamTime();
319 bool bPastedSomething =
false;
323 if (trackRange.empty())
351 view.AddLabel(selectedRegion);
352 if (view.PasteSelectedText( context.
project, selectedRegion.t0(),
353 selectedRegion.t1() ))
354 bPastedSomething =
true;
365 trackPanel.SetFocus();
368 if (bPastedSomething) {
370 XO(
"Pasted from the clipboard"),
XO(
"Paste Text to New Label"));
376 bool typeToCreateLabel;
377 gPrefs->
Read(
wxT(
"/GUI/TypeToCreateLabel"), &typeToCreateLabel,
false);
389 if (selectedRegion.isPoint())
394 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
396 std::shared_ptr<TrackList> result;
403 auto editfunc = [&](
Track &track,
double t0,
double t1) {
419 selectedRegion.collapseToT0();
424 XO(
"Cut labeled audio regions to clipboard"),
426 XO(
"Cut Labeled Audio"));
435 if (selectedRegion.isPoint())
438 auto editfunc = [&](
Track &track,
double t0,
double t1) {
444 selectedRegion.collapseToT0();
448 XO(
"Deleted labeled audio regions"),
450 XO(
"Delete Labeled Audio"));
459 if (selectedRegion.isPoint())
462 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
464 std::shared_ptr<TrackList> result;
470 result = t.Copy(t0, t1);
481 XO(
"Split Cut labeled audio regions to clipboard"),
483 XO(
"Split Cut Labeled Audio"));
492 if (selectedRegion.isPoint())
495 auto editfunc = [&](
Track &track,
double t0,
double t1) {
511 XO(
"Split Deleted labeled audio regions"),
514 XO(
"Split Delete Labeled Audio"));
523 if (selectedRegion.isPoint())
526 auto editfunc = [&](
Track &track,
double t0,
double t1) {
536 XO(
"Silenced labeled audio regions"),
538 XO(
"Silence Labeled Audio"));
547 if (selectedRegion.isPoint())
550 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
552 std::shared_ptr<TrackList> result;
559 .
PushState(
XO(
"Copied labeled audio regions to clipboard"),
561 XO(
"Copy Labeled Audio"));
570 if (selectedRegion.isPoint())
573 auto editfunc = [&](
Track &track,
double t0,
double t1) {
582 XO(
"Split labeled audio (points or regions)"),
584 XO(
"Split Labeled Audio"));
593 if (selectedRegion.isPoint())
596 auto editfunc = [&](
Track &track,
double t0,
double t1) {
605 XO(
"Joined labeled audio (points or regions)"),
607 XO(
"Join Labeled Audio"));
616 if (selectedRegion.isPoint())
619 auto editfunc = [&](
Track &track,
double t0,
double t1) {
632 XO(
"Detached labeled audio regions"),
634 XO(
"Detach Labeled Audio"));
646 track->SetSelected(
true);
663 static const auto NotBusyLabelsAndWaveFlags =
682 XXO(
"Add Label at &Playback Position"),
690 Command(
wxT(
"PasteNewLabel"),
XXO(
"Paste Te&xt to New Label"),
697 XXO(
"&Typing Creates New Labels"),
725 Options{
wxT(
"Alt+Shift+K"),
XO(
"Label Split Delete") } )
734 NotBusyLabelsAndWaveFlags,
745 NotBusyLabelsAndWaveFlags,
759 { OrderingHint::Before,
wxT(
"EditMetaData") } },
AttachedItem sAttachment1
AttachedItem sAttachment2
constexpr CommandFlag AlwaysEnabledFlag
const ReservedCommandFlag & AudioIOBusyFlag()
const ReservedCommandFlag & AudioIONotBusyFlag()
const ReservedCommandFlag & TimeSelectedFlag()
const ReservedCommandFlag & WaveTracksExistFlag()
XXO("&Cut/Copy/Paste Toolbar")
audacity::BasicSettings * gPrefs
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
AudacityProject & project
A LabelStruct holds information for ONE label in a LabelTrack.
SelectedRegion selectedRegion
A LabelTrack is a Track that holds labels (LabelStruct).
static LabelTrack * Create(TrackList &trackList, const wxString &name)
Create a new LabelTrack with specified name and append it to the trackList.
void ResetTextSelection()
static LabelTrackView & Get(LabelTrack &)
static int DialogForLabelName(AudacityProject &project, const SelectedRegion ®ion, const wxString &initialValue, wxString &value)
int AddLabel(const SelectedRegion ®ion, const wxString &title={}, int restoreFocus=-1)
static void DoEditLabels(AudacityProject &project, LabelTrack *lt=nullptr, int index=-1)
AudioTrack subclass that can also be audibly replayed by the program.
int GetAudioIOToken() const
static ProjectAudioIO & Get(AudacityProject &project)
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
static ProjectHistory & Get(AudacityProject &project)
Defines a selected portion of a project.
static bool IsSyncLockSelected(const Track *pTrack)
bool IsSyncLocked() const
static SyncLockState & Get(AudacityProject &project)
Abstract base class for an object holding data associated with points on a time axis.
void EnsureVisible(bool modifyState=false)
virtual void SetSelected(bool s)
R TypeSwitch(const Functions &...functions)
virtual void Clear(double t0, double t1)=0
bool IsLeader() const override
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
static TrackListHolder Create(AudacityProject *pOwner)
static TrackList & Get(AudacityProject &project)
auto Selected() -> TrackIterRange< TrackType >
static TrackPanel & Get(AudacityProject &project)
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
A Track that contains audio waveform data.
void SplitDelete(double t0, double t1)
std::vector< Region > Regions
void Silence(double t0, double t1, ProgressReporter reportProgress) override
void Join(double t0, double t1)
void ClearAndAddCutLine(double t0, double t1)
void Clear(double t0, double t1) override
void Split(double t0, double t1)
void Disjoin(double t0, double t1)
TrackListHolder Copy(double t0, double t1, bool forClipboard=true) const override
Create new tracks and don't modify this track.
TrackListHolder SplitCut(double t0, double t1)
virtual bool Flush() noexcept=0
virtual bool Write(const wxString &key, bool value)=0
bool ReadBool(const wxString &key, bool defaultValue) const
virtual bool Read(const wxString &key, bool *value) const =0
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
std::unique_ptr< detail::IndirectItem< Item > > Indirect(const std::shared_ptr< Item > &ptr)
A convenience function.
std::shared_ptr< BaseItem > BaseItemSharedPtr
void SelectNone(AudacityProject &project)
CommandManager::Options Options
Options && CheckTest(const CheckFn &fn) &&
Structure to hold region of a wavetrack and a comparison function for sortability.