26 auto range =
tracks.Selected();
27 using Iter =
decltype(range.begin());
30 std::optional<Iter> focus;
32 auto iter =
tracks.Find(*range.begin());
34 focus.emplace(--iter);
37 while (!range.empty())
39 tracks.Remove(**range.first++);
41 if (!(focus.has_value() && **focus))
43 focus.emplace(
tracks.end().advance(-1));
48 if (
const auto nextF = * ++ *focus)
60 trackPanel.UpdateViewIfNoTracks();
73 bool chosen = (t == leader);
74 leader->SetMute(chosen);
75 leader->SetSolo(
false);
85 pt->SetMute(!wasMute);
95 auto nPlayableTracks = range.
size();
97 for (
auto track : range)
98 track->SetSolo((nPlaying == 1) &&
99 (nPlayableTracks > 1) && !track->GetMute());
120 bool bSoloMultiple = !simple ^ exclusive;
128 pt->SetSolo(!bWasSolo);
133 bool chosen = (t == leader);
135 leader->SetSolo(!bWasSolo);
137 leader->SetMute(
false);
140 leader->SetSolo(
false);
142 leader->SetMute(!bWasSolo);
159 const auto iter =
tracks.Find(toRemove);
164 bool toRemoveWasFocused = trackFocus.Get() == *iter;
165 std::optional<
decltype(iter)> newFocus{};
166 if (toRemoveWasFocused) {
167 auto iterNext = iter,
169 newFocus.emplace(++iterNext);
171 newFocus.emplace(--iterPrev);
177 assert((*iter)->IsLeader());
180 if (toRemoveWasFocused)
181 trackFocus.Set(**newFocus);
199 longDesc =
XO(
"Moved '%s' to Top");
200 shortDesc =
XO(
"Move Track to Top");
204 while (
tracks.CanMoveUp(target))
205 tracks.Move(target,
true);
210 longDesc =
XO(
"Moved '%s' to Bottom");
211 shortDesc =
XO(
"Move Track to Bottom");
215 while (
tracks.CanMoveDown(target))
216 tracks.Move(target,
false);
225 bUp?
XO(
"Moved '%s' Up")
226 :
XO(
"Moved '%s' Down");
229 bUp?
XO(
"Move Track Up")
230 :
XO(
"Move Track Down");
const TranslatableString name
EnumSetting< SoloBehavior > TracksBehaviorsSolo
Extends Track with notions of mute and solo setting.
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
size_t size() const
How many attachment pointers are in the Site.
AudioTrack subclass that can also be audibly replayed by the program.
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
Abstract base class for an object holding data associated with points on a time axis.
const wxString & GetName() const
Name is always the same for all channels of a group.
static TrackList & Get(AudacityProject &project)
static TrackPanel & Get(AudacityProject &project)
Holds a msgid for the translation catalog; may also bind format arguments.
TranslatableString & Format(Args &&...args) &
Capture variadic format arguments (by copy) when there is no plural.
void ShowTrack(const Track &track)
static Viewport & Get(AudacityProject &project)
void DoTrackMute(AudacityProject &project, Track *t, bool exclusive)
void DoMoveTrack(AudacityProject &project, Track *target, MoveChoice choice)
Move a track up, down, to top or to bottom.
void DoTrackSolo(AudacityProject &project, Track *t, bool exclusive)
void DoRemoveTrack(AudacityProject &project, Track *toRemove)
void DoRemoveTracks(AudacityProject &project)