1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00

New Track virtual eliminates a track_cast in CommonCommandFlags...

... Also a better name for one of the command flags

This allows removal of special mention of TimeTrack
This commit is contained in:
Paul Licameli 2020-09-29 12:21:20 -04:00
parent 89f572f798
commit badb1643fa
10 changed files with 43 additions and 28 deletions

View File

@ -41,16 +41,16 @@ cycles.
*/ */
// Really means, some track is selected, that isn't a time track // Strong predicate excludes tracks that do not support basic editing.
bool TracksSelectedPred( const AudacityProject &project ) bool EditableTracksSelectedPred( const AudacityProject &project )
{ {
auto range = TrackList::Get( project ).Selected() auto range = TrackList::Get( project ).Selected()
- []( const Track *pTrack ){ - []( const Track *pTrack ){
return track_cast<const TimeTrack*>( pTrack ); }; return !pTrack->SupportsBasicEditing(); };
return !range.empty(); return !range.empty();
}; };
// This predicate includes time tracks too. // Weaker predicate.
bool AnyTracksSelectedPred( const AudacityProject &project ) bool AnyTracksSelectedPred( const AudacityProject &project )
{ {
auto range = TrackList::Get( project ).Selected(); auto range = TrackList::Get( project ).Selected();
@ -177,8 +177,8 @@ const ReservedCommandFlag&
CommandFlagOptions{}.DisableDefaultMessage() CommandFlagOptions{}.DisableDefaultMessage()
}; return flag; } }; return flag; }
const ReservedCommandFlag& const ReservedCommandFlag&
TracksSelectedFlag() { static ReservedCommandFlag flag{ EditableTracksSelectedFlag() { static ReservedCommandFlag flag{
TracksSelectedPred, // exclude TimeTracks EditableTracksSelectedPred,
{ []( const TranslatableString &Name ){ return { []( const TranslatableString &Name ){ return
// i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks". // i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks".
XO("\"%s\" requires one or more tracks to be selected.").Format( Name ); XO("\"%s\" requires one or more tracks to be selected.").Format( Name );
@ -186,7 +186,7 @@ const ReservedCommandFlag&
}; return flag; } }; return flag; }
const ReservedCommandFlag& const ReservedCommandFlag&
AnyTracksSelectedFlag() { static ReservedCommandFlag flag{ AnyTracksSelectedFlag() { static ReservedCommandFlag flag{
AnyTracksSelectedPred, // Allow TimeTracks AnyTracksSelectedPred,
{ []( const TranslatableString &Name ){ return { []( const TranslatableString &Name ){ return
// i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks". // i18n-hint: %s will be replaced by the name of an action, such as "Remove Tracks".
XO("\"%s\" requires one or more tracks to be selected.").Format( Name ); XO("\"%s\" requires one or more tracks to be selected.").Format( Name );

View File

@ -15,7 +15,7 @@ Paul Licameli split from Menus.cpp
#include "commands/CommandFlag.h" #include "commands/CommandFlag.h"
bool TracksSelectedPred( const AudacityProject &project ); bool EditableTracksSelectedPred( const AudacityProject &project );
bool AudioIOBusyPred( const AudacityProject &project ); bool AudioIOBusyPred( const AudacityProject &project );
bool TimeSelectedPred( const AudacityProject &project ); bool TimeSelectedPred( const AudacityProject &project );
extern const CommandFlagOptions &cutCopyOptions(); extern const CommandFlagOptions &cutCopyOptions();
@ -27,7 +27,7 @@ extern AUDACITY_DLL_API const ReservedCommandFlag
&TimeSelectedFlag(), // This is equivalent to check if there is a valid selection, so it's used for Zoom to Selection too &TimeSelectedFlag(), // This is equivalent to check if there is a valid selection, so it's used for Zoom to Selection too
&WaveTracksSelectedFlag(), &WaveTracksSelectedFlag(),
&TracksExistFlag(), &TracksExistFlag(),
&TracksSelectedFlag(), &EditableTracksSelectedFlag(),
&AnyTracksSelectedFlag(), &AnyTracksSelectedFlag(),
&TrackPanelHasFocus(); //lll &TrackPanelHasFocus(); //lll

View File

@ -85,7 +85,7 @@ void SelectAllIfNone( AudacityProject &project )
{ {
auto &viewInfo = ViewInfo::Get( project ); auto &viewInfo = ViewInfo::Get( project );
auto flags = MenuManager::Get( project ).GetUpdateFlags(); auto flags = MenuManager::Get( project ).GetUpdateFlags();
if((flags & TracksSelectedFlag()).none() || if((flags & EditableTracksSelectedFlag()).none() ||
viewInfo.selectedRegion.isPoint()) viewInfo.selectedRegion.isPoint())
DoSelectAllAudio( project ); DoSelectAllAudio( project );
} }
@ -98,7 +98,7 @@ bool SelectAllIfNoneAndAllowed( AudacityProject &project )
auto &viewInfo = ViewInfo::Get( project ); auto &viewInfo = ViewInfo::Get( project );
auto flags = MenuManager::Get( project ).GetUpdateFlags(); auto flags = MenuManager::Get( project ).GetUpdateFlags();
if((flags & TracksSelectedFlag()).none() || if((flags & EditableTracksSelectedFlag()).none() ||
viewInfo.selectedRegion.isPoint()) { viewInfo.selectedRegion.isPoint()) {
if (!allowed) { if (!allowed) {
return false; return false;

View File

@ -131,6 +131,11 @@ void TimeTrack::SetRangeUpper(double upper)
mEnvelope->SetRangeUpper( upper ); mEnvelope->SetRangeUpper( upper );
} }
bool TimeTrack::SupportsBasicEditing() const
{
return false;
}
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 );

View File

@ -40,6 +40,8 @@ class TimeTrack final : public Track {
virtual ~TimeTrack(); virtual ~TimeTrack();
bool SupportsBasicEditing() 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;

View File

@ -1224,6 +1224,11 @@ std::shared_ptr<const Track> Track::SubstituteOriginalTrack() const
return SharedPointer(); return SharedPointer();
} }
bool Track::SupportsBasicEditing() const
{
return true;
}
auto Track::GetIntervals() const -> ConstIntervals auto Track::GetIntervals() const -> ConstIntervals
{ {
return {}; return {};

View File

@ -318,6 +318,9 @@ class AUDACITY_DLL_API Track /* not final */
using ConstInterval = ConstTrackInterval; using ConstInterval = ConstTrackInterval;
using ConstIntervals = std::vector< ConstInterval >; using ConstIntervals = std::vector< ConstInterval >;
//! Whether this track type implements cut-copy-paste; by default, true
virtual bool SupportsBasicEditing() const;
//! 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.

View File

@ -1004,7 +1004,7 @@ static const ReservedCommandFlag
if ( if (
TimeSelectedPred( project ) TimeSelectedPred( project )
&& &&
TracksSelectedPred( project ) EditableTracksSelectedPred( project )
) )
return true; return true;
@ -1020,7 +1020,7 @@ BaseItemSharedPtr EditMenu()
using Options = CommandManager::Options; using Options = CommandManager::Options;
static const auto NotBusyTimeAndTracksFlags = static const auto NotBusyTimeAndTracksFlags =
AudioIONotBusyFlag() | TimeSelectedFlag() | TracksSelectedFlag(); AudioIONotBusyFlag() | TimeSelectedFlag() | EditableTracksSelectedFlag();
// The default shortcut key for Redo is different on different platforms. // The default shortcut key for Redo is different on different platforms.
static constexpr auto redoKey = static constexpr auto redoKey =
@ -1065,7 +1065,7 @@ BaseItemSharedPtr EditMenu()
AudioIONotBusyFlag() | CutCopyAvailableFlag() | NoAutoSelect(), AudioIONotBusyFlag() | CutCopyAvailableFlag() | NoAutoSelect(),
wxT("Ctrl+X") ), wxT("Ctrl+X") ),
Command( wxT("Delete"), XXO("&Delete"), FN(OnDelete), Command( wxT("Delete"), XXO("&Delete"), FN(OnDelete),
AudioIONotBusyFlag() | TracksSelectedFlag() | TimeSelectedFlag() | NoAutoSelect(), AudioIONotBusyFlag() | EditableTracksSelectedFlag() | TimeSelectedFlag() | NoAutoSelect(),
wxT("Ctrl+K") ), wxT("Ctrl+K") ),
/* i18n-hint: (verb)*/ /* i18n-hint: (verb)*/
Command( wxT("Copy"), XXO("&Copy"), FN(OnCopy), Command( wxT("Copy"), XXO("&Copy"), FN(OnCopy),
@ -1160,7 +1160,7 @@ BaseItemSharedPtr ExtraEditMenu()
{ {
using Options = CommandManager::Options; using Options = CommandManager::Options;
static const auto flags = static const auto flags =
AudioIONotBusyFlag() | TracksSelectedFlag() | TimeSelectedFlag(); AudioIONotBusyFlag() | EditableTracksSelectedFlag() | TimeSelectedFlag();
static BaseItemSharedPtr menu{ static BaseItemSharedPtr menu{
( FinderScope{ findCommandHandler }, ( FinderScope{ findCommandHandler },
Menu( wxT("Edit"), XXO("&Edit"), Menu( wxT("Edit"), XXO("&Edit"),
@ -1184,7 +1184,7 @@ auto selectAll = []( AudacityProject &project, CommandFlag flagsRqd ){
RegisteredMenuItemEnabler selectTracks{{ RegisteredMenuItemEnabler selectTracks{{
[]{ return TracksExistFlag(); }, []{ return TracksExistFlag(); },
[]{ return TracksSelectedFlag(); }, []{ return EditableTracksSelectedFlag(); },
canSelectAll, canSelectAll,
selectAll selectAll
}}; }};

View File

@ -1059,7 +1059,7 @@ BaseItemSharedPtr SelectMenu()
, ,
Command( wxT("SelSyncLockTracks"), XXO("In All &Sync-Locked Tracks"), Command( wxT("SelSyncLockTracks"), XXO("In All &Sync-Locked Tracks"),
FN(OnSelectSyncLockSel), FN(OnSelectSyncLockSel),
TracksSelectedFlag() | IsSyncLockedFlag(), EditableTracksSelectedFlag() | IsSyncLockedFlag(),
Options{ wxT("Ctrl+Shift+Y"), XO("Select Sync-Locked") } ) Options{ wxT("Ctrl+Shift+Y"), XO("Select Sync-Locked") } )
#endif #endif
), ),
@ -1131,7 +1131,7 @@ BaseItemSharedPtr SelectMenu()
Section( "", Section( "",
Command( wxT("ZeroCross"), XXO("At &Zero Crossings"), Command( wxT("ZeroCross"), XXO("At &Zero Crossings"),
FN(OnZeroCrossing), TracksSelectedFlag(), FN(OnZeroCrossing), EditableTracksSelectedFlag(),
Options{ wxT("Z"), XO("Select Zero Crossing") } ) Options{ wxT("Z"), XO("Select Zero Crossing") } )
) )
) ) }; ) ) };
@ -1216,11 +1216,11 @@ BaseItemSharedPtr CursorMenu()
Command( wxT("CursTrackStart"), XXO("Track &Start"), Command( wxT("CursTrackStart"), XXO("Track &Start"),
FN(OnCursorTrackStart), FN(OnCursorTrackStart),
TracksSelectedFlag(), EditableTracksSelectedFlag(),
Options{ wxT("J"), XO("Cursor to Track Start") } ), Options{ wxT("J"), XO("Cursor to Track Start") } ),
Command( wxT("CursTrackEnd"), XXO("Track &End"), Command( wxT("CursTrackEnd"), XXO("Track &End"),
FN(OnCursorTrackEnd), FN(OnCursorTrackEnd),
TracksSelectedFlag(), EditableTracksSelectedFlag(),
Options{ wxT("K"), XO("Cursor to Track End") } ), Options{ wxT("K"), XO("Cursor to Track End") } ),
Command( wxT("CursProjectStart"), XXO("&Project Start"), Command( wxT("CursProjectStart"), XXO("&Project Start"),

View File

@ -1356,9 +1356,9 @@ BaseItemSharedPtr TracksMenu()
Command( wxT("UnmuteAllTracks"), XXO("&Unmute All Tracks"), Command( wxT("UnmuteAllTracks"), XXO("&Unmute All Tracks"),
FN(OnUnmuteAllTracks), TracksExistFlag(), wxT("Ctrl+Shift+U") ), FN(OnUnmuteAllTracks), TracksExistFlag(), wxT("Ctrl+Shift+U") ),
Command( wxT("MuteTracks"), XXO("Mut&e Tracks"), Command( wxT("MuteTracks"), XXO("Mut&e Tracks"),
FN(OnMuteSelectedTracks), TracksSelectedFlag(), wxT("Ctrl+Alt+U") ), FN(OnMuteSelectedTracks), EditableTracksSelectedFlag(), wxT("Ctrl+Alt+U") ),
Command( wxT("UnmuteTracks"), XXO("U&nmute Tracks"), Command( wxT("UnmuteTracks"), XXO("U&nmute Tracks"),
FN(OnUnmuteSelectedTracks), TracksSelectedFlag(), wxT("Ctrl+Alt+Shift+U") ) FN(OnUnmuteSelectedTracks), EditableTracksSelectedFlag(), wxT("Ctrl+Alt+Shift+U") )
), ),
Menu( wxT("Pan"), XXO("&Pan"), Menu( wxT("Pan"), XXO("&Pan"),
@ -1367,13 +1367,13 @@ BaseItemSharedPtr TracksMenu()
// in the project could very easily be lost unless we // in the project could very easily be lost unless we
// require the tracks to be selected. // require the tracks to be selected.
Command( wxT("PanLeft"), XXO("&Left"), FN(OnPanLeft), Command( wxT("PanLeft"), XXO("&Left"), FN(OnPanLeft),
TracksSelectedFlag(), EditableTracksSelectedFlag(),
Options{}.LongName( XO("Pan Left") ) ), Options{}.LongName( XO("Pan Left") ) ),
Command( wxT("PanRight"), XXO("&Right"), FN(OnPanRight), Command( wxT("PanRight"), XXO("&Right"), FN(OnPanRight),
TracksSelectedFlag(), EditableTracksSelectedFlag(),
Options{}.LongName( XO("Pan Right") ) ), Options{}.LongName( XO("Pan Right") ) ),
Command( wxT("PanCenter"), XXO("&Center"), FN(OnPanCenter), Command( wxT("PanCenter"), XXO("&Center"), FN(OnPanCenter),
TracksSelectedFlag(), EditableTracksSelectedFlag(),
Options{}.LongName( XO("Pan Center") ) ) Options{}.LongName( XO("Pan Center") ) )
) )
), ),
@ -1387,14 +1387,14 @@ BaseItemSharedPtr TracksMenu()
{ wxT("EndToEnd"), XXO("&Align End to End") }, { wxT("EndToEnd"), XXO("&Align End to End") },
{ wxT("Together"), XXO("Align &Together") }, { wxT("Together"), XXO("Align &Together") },
}, },
FN(OnAlignNoSync), AudioIONotBusyFlag() | TracksSelectedFlag()) FN(OnAlignNoSync), AudioIONotBusyFlag() | EditableTracksSelectedFlag())
), ),
Section( "", Section( "",
// Alignment commands using selection or zero // Alignment commands using selection or zero
CommandGroup(wxT("Align"), CommandGroup(wxT("Align"),
alignLabels(), alignLabels(),
FN(OnAlign), AudioIONotBusyFlag() | TracksSelectedFlag()) FN(OnAlign), AudioIONotBusyFlag() | EditableTracksSelectedFlag())
), ),
Section( "", Section( "",
@ -1411,7 +1411,7 @@ BaseItemSharedPtr TracksMenu()
// Do we need this sub-menu at all? // Do we need this sub-menu at all?
Menu( wxT("MoveSelectionAndTracks"), XO("Move Sele&ction and Tracks"), { Menu( wxT("MoveSelectionAndTracks"), XO("Move Sele&ction and Tracks"), {
CommandGroup(wxT("AlignMove"), alignLabels(), CommandGroup(wxT("AlignMove"), alignLabels(),
FN(OnAlignMoveSel), AudioIONotBusyFlag() | TracksSelectedFlag()), FN(OnAlignMoveSel), AudioIONotBusyFlag() | EditableTracksSelectedFlag()),
} ), } ),
#endif #endif