1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-14 17:14:07 +01:00

Most functions defining menus compute once and cache the result...

... Except a few where project or plugin manager state or preferences are
needed to compute the items, so evaluation is delayed, often inside lambdas

Comment "Delayed evaluation" wherever there are exceptions
This commit is contained in:
Paul Licameli
2019-01-09 11:27:32 -05:00
parent 33b4b409e8
commit f6e5696146
18 changed files with 354 additions and 261 deletions

View File

@@ -258,7 +258,7 @@ static const ReservedCommandFlag
HasWaveDataFlag{ HasWaveDataPred }; // jkc
namespace {
const struct MenuItem {
struct MenuItem {
CommandID name;
TranslatableString label;
TranslatableString status;
@@ -268,7 +268,11 @@ namespace {
bool (Scrubber::*StatusTest)() const;
const TranslatableString &GetStatus() const { return status; }
} menuItems[] = {
};
using MenuItems = std::vector< MenuItem >;
const MenuItems &menuItems()
{
static MenuItems theItems{
/* i18n-hint: These commands assist the user in finding a sound by ear. ...
"Scrubbing" is variable-speed playback, ...
"Seeking" is normal speed playback but with skips, ...
@@ -287,13 +291,13 @@ namespace {
AlwaysEnabledFlag,
&Scrubber::OnToggleScrubRuler, false, &Scrubber::ShowsBar,
},
};
return theItems;
};
enum { nMenuItems = sizeof(menuItems) / sizeof(*menuItems) };
inline const MenuItem &FindMenuItem(bool seek)
{
return *std::find_if(menuItems, menuItems + nMenuItems,
return *std::find_if(menuItems().begin(), menuItems().end(),
[=](const MenuItem &item) {
return seek == item.seek;
}
@@ -1055,7 +1059,7 @@ BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler)
EVT_MENU(CMD_ID + 2, THUNK(OnToggleScrubRuler))
END_EVENT_TABLE()
static_assert(nMenuItems == 3, "wrong number of items");
//static_assert(menuItems().size() == 3, "wrong number of items");
static auto sPlayAtSpeedStatus = XO("Playing at Speed");
@@ -1101,7 +1105,7 @@ registeredStatusWidthFunction{
if ( field == stateStatusBarField ) {
TranslatableStrings strings;
// Note that Scrubbing + Paused is not allowed.
for (const auto &item : menuItems)
for (const auto &item : menuItems())
strings.push_back( item.GetStatus() );
strings.push_back(
XO("%s Paused.").Format( sPlayAtSpeedStatus )
@@ -1121,36 +1125,44 @@ bool Scrubber::CanScrub() const
HasWaveDataPred( *mProject );
}
MenuTable::BaseItemPtr Scrubber::Menu()
MenuTable::BaseItemSharedPtr Scrubber::Menu()
{
using namespace MenuTable;
using Options = CommandManager::Options;
auto scope = MenuTable::FinderScope(
static BaseItemSharedPtr menu {
FinderScope(
[](AudacityProject &project) -> CommandHandlerObject&
{ return Scrubber::Get( project ); } );
MenuTable::BaseItemPtrs ptrs;
for (const auto &item : menuItems) {
ptrs.push_back( MenuTable::Command( item.name, item.label,
item.memFn,
item.flags,
item.StatusTest
? // a checkmark item
Options{}.CheckTest( [&item](AudacityProject &project){
return ( Scrubber::Get(project).*(item.StatusTest) )(); } )
: // not a checkmark item
Options{}
) );
}
return MenuTable::Menu( XO("Scru&bbing"), std::move( ptrs ) );
{ return Scrubber::Get( project ); }
).Eval(
MenuTable::Menu(
XO("Scru&bbing"),
[]{
BaseItemPtrs ptrs;
for (const auto &item : menuItems()) {
ptrs.push_back( MenuTable::Command( item.name, item.label,
item.memFn,
item.flags,
item.StatusTest
? // a checkmark item
Options{}.CheckTest( [&item](AudacityProject &project){
return ( Scrubber::Get(project).*(item.StatusTest) )(); } )
: // not a checkmark item
Options{}
) );
}
return ptrs;
}()
) ) };
return menu;
}
void Scrubber::PopulatePopupMenu(wxMenu &menu)
{
int id = CMD_ID;
auto &cm = CommandManager::Get( *mProject );
for (const auto &item : menuItems) {
for (const auto &item : menuItems()) {
if (cm.GetEnabled(item.name)) {
auto test = item.StatusTest;
menu.Append(id, item.label.Translation(), wxString{},
@@ -1165,7 +1177,7 @@ void Scrubber::PopulatePopupMenu(wxMenu &menu)
void Scrubber::CheckMenuItems()
{
auto &cm = CommandManager::Get( *mProject );
for (const auto &item : menuItems) {
for (const auto &item : menuItems()) {
auto test = item.StatusTest;
if (test)
cm.Check(item.name, (this->*test)());

View File

@@ -118,7 +118,7 @@ public:
bool CanScrub() const;
// For the toolbar
static MenuTable::BaseItemPtr Menu();
static MenuTable::BaseItemSharedPtr Menu();
// For popup
void PopulatePopupMenu(wxMenu &menu);