3#include "../Clipboard.h"
4#include "../CommonCommandFlags.h"
5#include "../LabelTrack.h"
11#include "../SelectUtilities.h"
14#include "../TrackPanel.h"
20#include "../tracks/labeltrack/ui/LabelTrackView.h"
37 const auto &test = [&](
const LabelTrack *pTrack ){
38 const auto &labels = pTrack->GetLabels();
39 return std::any_of( labels.begin(), labels.end(),
42 label.getT0() >= selectedRegion.t0()
44 label.getT1() <= selectedRegion.t1()
51 return !range.empty();
58 bool preserveFocus =
false)
67 gPrefs->
Read(
wxT(
"/GUI/DialogForNameNewLabel"), &useDialog,
false);
75 const auto pFocusedTrack = trackFocus.Get();
79 auto iter = pFocusedTrack
80 ?
tracks.Find(pFocusedTrack)
94 lt->SetSelected(
true);
98 index = lt->AddLabel(region,
title);
101 int focusTrackNumber = -1;
102 if (pFocusedTrack && preserveFocus) {
106 focusTrackNumber = std::distance(
begin, iter);
119 trackPanel.SetFocus();
132 for (
int i = 0; i < lt->GetNumLabels(); i++)
142 if( regions.size() == 0 )
146 std::sort(regions.begin(), regions.end());
147 unsigned int selected = 1;
148 while( selected < regions.size() )
150 const Region &cur = regions.at( selected );
151 Region &last = regions.at( selected - 1 );
156 regions.erase( regions.begin() + selected );
191 const auto tracksToEdit =
tracks.Any<
Track>() + [&](
const auto pTrack) {
193 (notLocked &&
dynamic_cast<const PlayableTrack*
>(pTrack) !=
nullptr);
197 tracksToEdit.begin(), tracksToEdit.end(),
202 BasicUI::SplitProgress(
203 regions.rbegin(), regions.rend(),
204 [&](const Region& region, const ProgressReporter& grandChild) {
205 action(*aTrack, region.start, region.end, grandChild);
219 action(track, t0, t1);
227 std::function<std::shared_ptr<TrackList>(
Track &,
double,
double)>;
252 auto &newClipboard = *pNewClipboard;
259 const bool playable =
dynamic_cast<const PlayableTrack *
>(t) !=
nullptr;
262 std::shared_ptr<TrackList> merged;
263 for (
size_t i = regions.size(); i--;) {
264 const Region ®ion = regions.at(i);
265 if (
auto dest = action(*t, region.
start, region.
end)) {
269 const auto pMerged = *merged->begin();
272 if (i + 1 < regions.size())
274 regions.at(i + 1).start - region.
end);
281 pMerged->Paste(0.0, *dest);
287 if (i + 1 < regions.size() && merged)
289 ->ShiftBy(regions.at(i + 1).start - region.
end);
292 newClipboard.Append(std::move(*merged));
297 clipboard.Assign( std::move( newClipboard ),
298 regions.front().start, regions.back().end,
project.shared_from_this() );
329 gAudioIO->IsStreamActive(token)) {
330 double indicator = gAudioIO->GetStreamTime();
344 bool bPastedSomething =
false;
348 if (trackRange.empty())
376 view.AddLabel(selectedRegion);
377 if (view.PasteSelectedText( context.
project, selectedRegion.t0(),
378 selectedRegion.t1() ))
379 bPastedSomething =
true;
390 trackPanel.SetFocus();
393 if (bPastedSomething) {
395 XO(
"Pasted from the clipboard"),
XO(
"Paste Text to New Label"));
401 bool typeToCreateLabel;
402 gPrefs->
Read(
wxT(
"/GUI/TypeToCreateLabel"), &typeToCreateLabel,
false);
414 if (selectedRegion.isPoint())
419 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
421 std::shared_ptr<TrackList> result;
428 auto editfunc = [&](
Track &track,
double t0,
double t1) {
444 selectedRegion.collapseToT0();
449 XO(
"Cut labeled audio regions to clipboard"),
451 XO(
"Cut Labeled Audio"));
460 if (selectedRegion.isPoint())
463 auto editfunc = [&](
Track &track,
double t0,
double t1) {
469 selectedRegion.collapseToT0();
473 XO(
"Deleted labeled audio regions"),
475 XO(
"Delete Labeled Audio"));
484 if (selectedRegion.isPoint())
487 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
489 std::shared_ptr<TrackList> result;
495 result = t.Copy(t0, t1);
506 XO(
"Split Cut labeled audio regions to clipboard"),
508 XO(
"Split Cut Labeled Audio"));
517 if (selectedRegion.isPoint())
520 auto editfunc = [&](
Track &track,
double t0,
double t1) {
536 XO(
"Split Deleted labeled audio regions"),
539 XO(
"Split Delete Labeled Audio"));
548 if (selectedRegion.isPoint())
551 auto editfunc = [&](
Track &track,
double t0,
double t1) {
561 XO(
"Silenced labeled audio regions"),
563 XO(
"Silence Labeled Audio"));
572 if (selectedRegion.isPoint())
575 auto copyfunc = [&](
Track &track,
double t0,
double t1) {
577 std::shared_ptr<TrackList> result;
584 .
PushState(
XO(
"Copied labeled audio regions to clipboard"),
586 XO(
"Copy Labeled Audio"));
595 if (selectedRegion.isPoint())
598 auto editfunc = [&](
Track &track,
double t0,
double t1) {
607 XO(
"Split labeled audio (points or regions)"),
609 XO(
"Split Labeled Audio"));
618 if (selectedRegion.isPoint())
624 [&](
WaveTrack& t) { t.
Join(t0, t1, std::move(reportProgress)); });
634 XO(
"Joined labeled audio (points or regions)"),
636 XO(
"Join Labeled Audio"));
645 if (selectedRegion.isPoint())
648 auto editfunc = [&](
Track &track,
double t0,
double t1) {
661 XO(
"Detached labeled audio regions"),
663 XO(
"Detach Labeled Audio"));
675 track->SetSelected(
true);
691 static const auto NotBusyLabelsAndWaveFlags =
697 static auto menus = std::shared_ptr{
710 XXO(
"Add Label at &Playback Position"),
718 Command(
wxT(
"PasteNewLabel"),
XXO(
"Paste Te&xt to New Label"),
725 XXO(
"&Typing Creates New Labels"),
753 Options{
wxT(
"Alt+Shift+K"),
XO(
"Label Split Delete") } )
762 NotBusyLabelsAndWaveFlags,
773 NotBusyLabelsAndWaveFlags,
787 { OrderingHint::Before,
wxT(
"EditMetaData") } }
793 wxT(
"Tracks/Add/Add")
Toolkit-neutral facade for basic user interface services.
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
std::function< void(double)> ProgressReporter
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)
Generates classes whose instances register items at construction.
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.
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)
void ShowTrack(const Track &track)
static Viewport & 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, const ProgressReporter &reportProgress)
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
void SplitProgress(ItType first, ItType last, FnType action, ProgressReporter parent)
Helper for the update of a task's progress bar when this task is made of a range's subtasks.
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.
void SelectNone(AudacityProject &project)
WAVE_TRACK_API void WithClipRenderingProgress(std::function< void(const ProgressReporter &)> action, TranslatableString title=defaultStretchRenderingTitle, TranslatableString message=XO("Rendering Clip"))
Structure to hold region of a wavetrack and a comparison function for sortability.