From 6967925e48a20e081fad38d74c3879304868e0cb Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 8 Jan 2018 13:57:51 -0500 Subject: [PATCH] Redo CommandManager::DescribeCommandsAndShortcuts with pairs... ... Later we may make other types for the members of that pair. --- src/commands/CommandManager.cpp | 40 ++++++----- src/commands/CommandManager.h | 6 +- src/toolbars/ControlToolBar.cpp | 66 +++++++++++-------- src/toolbars/EditToolBar.cpp | 7 +- src/toolbars/ScrubbingToolBar.cpp | 5 +- src/toolbars/ToolBar.cpp | 2 +- src/toolbars/ToolBar.h | 6 +- src/toolbars/ToolsToolBar.cpp | 6 +- src/toolbars/TranscriptionToolBar.cpp | 12 ++-- .../ui/PlayableTrackButtonHandles.cpp | 10 ++- src/tracks/ui/TrackButtonHandles.cpp | 10 ++- src/widgets/Ruler.cpp | 5 +- 12 files changed, 91 insertions(+), 84 deletions(-) diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index 1263b0fa5..a4a437f26 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -1310,7 +1310,7 @@ void CommandManager::TellUserWhyDisallowed( const wxString & Name, CommandFlag f } wxString CommandManager::DescribeCommandsAndShortcuts -(const std::vector &commands) const +(const LocalizedCommandNameVector &commands) const { wxString mark; // This depends on the language setting and may change in-session after @@ -1321,36 +1321,34 @@ wxString CommandManager::DescribeCommandsAndShortcuts static const wxString &separatorFormat = wxT("%s / %s"); wxString result; - auto iter = commands.begin(), end = commands.end(); - while (iter != end) { + for (const auto &pair : commands) { // If RTL, then the control character forces right-to-left sequencing of // "/" -separated command names, and puts any "(...)" shortcuts to the // left, consistently with accelerators in menus (assuming matching // operating system prefernces for language), even if the command name // was missing from the translation file and defaulted to the English. - auto piece = wxString::Format(wxT("%s%s"), mark, *iter++); + auto piece = wxString::Format(wxT("%s%s"), mark, pair.first); - if (iter != end) { - if (!iter->empty()) { - auto keyStr = GetKeyFromName(*iter); - if (!keyStr.empty()){ - auto keyString = KeyStringDisplay(keyStr, true); - auto format = wxT("%s %s(%s)"); + wxString name{ pair.second }; + if (!name.empty()) { + auto keyStr = GetKeyFromName(name); + if (!keyStr.empty()){ + auto keyString = KeyStringDisplay(keyStr, true); + auto format = wxT("%s %s(%s)"); #ifdef __WXMAC__ - // The unicode controls push and pop left-to-right embedding. - // This keeps the directionally weak characters, such as uparrow - // for Shift, left of the key name, - // consistently with how menu accelerators appear, even when the - // system language is RTL. - format = wxT("%s %s(\u202a%s\u202c)"); + // The unicode controls push and pop left-to-right embedding. + // This keeps the directionally weak characters, such as uparrow + // for Shift, left of the key name, + // consistently with how menu accelerators appear, even when the + // system language is RTL. + format = wxT("%s %s(\u202a%s\u202c)"); #endif - // The mark makes correctly placed parentheses for RTL, even - // in the case that the piece is untranslated. - piece = wxString::Format(format, piece, mark, keyString); - } + // The mark makes correctly placed parentheses for RTL, even + // in the case that the piece is untranslated. + piece = wxString::Format(format, piece, mark, keyString); } - ++iter; } + if (result.empty()) result = piece; else diff --git a/src/commands/CommandManager.h b/src/commands/CommandManager.h index f662ea6f8..d8111a342 100644 --- a/src/commands/CommandManager.h +++ b/src/commands/CommandManager.h @@ -278,12 +278,14 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler /// /// Formatting summaries that include shortcut keys /// + using LocalizedCommandName = std::pair; + using LocalizedCommandNameVector = std::vector; wxString DescribeCommandsAndShortcuts - (// An array, alternating user-visible strings, and + (// An array of paired user-visible strings, and // non-user-visible command names. If a shortcut key is defined // for the command, then it is appended, parenthesized, after the // user-visible string. - const std::vector &commands) const; + const LocalizedCommandNameVector &commands) const; protected: diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index bf1fe48d8..844ea7453 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -220,56 +220,70 @@ void ControlToolBar::Populate() void ControlToolBar::RegenerateTooltips() { #if wxUSE_TOOLTIPS - std::vector commands; for (long iWinID = ID_PLAY_BUTTON; iWinID < BUTTON_COUNT; iWinID++) { - commands.clear(); auto pCtrl = static_cast(this->FindWindow(iWinID)); - commands.push_back(pCtrl->GetLabel()); + const wxChar *name = nullptr; switch (iWinID) { case ID_PLAY_BUTTON: // Without shift - commands.push_back(wxT("PlayStop")); - // With shift - commands.push_back(_("Loop Play")); - // For the shortcut tooltip. - commands.push_back(wxT("PlayLooped")); + name = wxT("PlayStop"); break; case ID_RECORD_BUTTON: // Without shift - //commands.push_back(wxT("Record")); - commands.push_back(wxT("Record1stChoice")); + //name = wxT("Record"); + name = wxT("Record1stChoice"); + break; + case ID_PAUSE_BUTTON: + name = wxT("Pause"); + break; + case ID_STOP_BUTTON: + name = wxT("Stop"); + break; + case ID_FF_BUTTON: + name = wxT("CursProjectEnd"); + break; + case ID_REW_BUTTON: + name = wxT("CursProjectStart"); + break; + } + LocalizedCommandNameVector commands( 1u, { pCtrl->GetLabel(), name } ); + + // Some have a second + switch (iWinID) + { + case ID_PLAY_BUTTON: + // With shift + commands.push_back( + LocalizedCommandName( _("Loop Play"), wxT("PlayLooped") ) ); + break; + case ID_RECORD_BUTTON: + // With shift { bool bPreferNewTrack; gPrefs->Read("/GUI/PreferNewTrackRecord",&bPreferNewTrack, false); - if( !bPreferNewTrack ){ - commands.push_back(_("Record New Track")); - } else { - commands.push_back(_("Append Record")); - } // For the shortcut tooltip. - commands.push_back(wxT("Record2ndChoice")); + commands.push_back( LocalizedCommandName( + !bPreferNewTrack + ? _("Record New Track") + : _("Append Record"), + wxT("Record2ndChoice") + )); } break; case ID_PAUSE_BUTTON: - commands.push_back(wxT("Pause")); break; case ID_STOP_BUTTON: - commands.push_back(wxT("Stop")); break; case ID_FF_BUTTON: - commands.push_back(wxT("CursProjectEnd")); // With shift - commands.push_back(_("Select to End")); - // For the shortcut tooltip. - commands.push_back(wxT("SelEnd")); + commands.push_back( LocalizedCommandName( + _("Select to End"), wxT("SelEnd") ) ); break; case ID_REW_BUTTON: - commands.push_back(wxT("CursProjectStart")); // With shift - commands.push_back(_("Select to Start")); - // For the shortcut tooltip. - commands.push_back(wxT("SelStart")); + commands.push_back( LocalizedCommandName( + _("Select to Start"), wxT("SelStart") ) ); break; } ToolBar::SetButtonToolTip(*pCtrl, commands); diff --git a/src/toolbars/EditToolBar.cpp b/src/toolbars/EditToolBar.cpp index f586804e6..ca5d24585 100644 --- a/src/toolbars/EditToolBar.cpp +++ b/src/toolbars/EditToolBar.cpp @@ -269,13 +269,12 @@ void EditToolBar::ForAllButtons(int Action) } - std::vector commands; for (const auto &entry : EditToolbarButtonList) { #if wxUSE_TOOLTIPS if( Action & ETBActTooltips ){ - commands.clear(); - commands.push_back(wxGetTranslation(entry.untranslatedLabel)); - commands.push_back(entry.commandName); + LocalizedCommandNameVector commands( 1u, + { wxGetTranslation(entry.untranslatedLabel), entry.commandName } + ); ToolBar::SetButtonToolTip(*mButtons[entry.tool], commands); } #endif diff --git a/src/toolbars/ScrubbingToolBar.cpp b/src/toolbars/ScrubbingToolBar.cpp index a26a6c1a3..4340e24af 100644 --- a/src/toolbars/ScrubbingToolBar.cpp +++ b/src/toolbars/ScrubbingToolBar.cpp @@ -133,13 +133,10 @@ void ScrubbingToolBar::UpdatePrefs() void ScrubbingToolBar::RegenerateTooltips() { #if wxUSE_TOOLTIPS - std::vector commands; auto fn = [&] (AButton &button, const wxString &label, const wxString &command) { - commands.clear(); - commands.push_back(label); - commands.push_back(command); + LocalizedCommandNameVector commands( 1u, { label, command } ); ToolBar::SetButtonToolTip(button, commands); }; diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index 062448f76..3ebeb4e33 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -825,7 +825,7 @@ void ToolBar::MakeAlternateImages(AButton &button, int idx, } void ToolBar::SetButtonToolTip -(AButton &button, const std::vector &commands) +(AButton &button, const LocalizedCommandNameVector &commands) { wxString result; const auto project = GetActiveProject(); diff --git a/src/toolbars/ToolBar.h b/src/toolbars/ToolBar.h index b69b03fad..4e34463cb 100644 --- a/src/toolbars/ToolBar.h +++ b/src/toolbars/ToolBar.h @@ -156,14 +156,16 @@ class ToolBar /* not final */ : public wxPanelWrapper teBmps eDisabled, wxSize size); + using LocalizedCommandName = std::pair; + using LocalizedCommandNameVector = std::vector; static void SetButtonToolTip (AButton &button, - // An array, alternating user-visible strings, and + // An array of paired user-visible strings, and // non-user-visible command names. If a shortcut key is defined // for the command, then it is appended, parenthesized, after the // user-visible string. - const std::vector &commands); + const LocalizedCommandNameVector &commands); protected: void SetButton(bool down, AButton *button); diff --git a/src/toolbars/ToolsToolBar.cpp b/src/toolbars/ToolsToolBar.cpp index 471f8aef1..445e6d119 100644 --- a/src/toolbars/ToolsToolBar.cpp +++ b/src/toolbars/ToolsToolBar.cpp @@ -137,11 +137,9 @@ void ToolsToolBar::RegenerateTooltips() { multiTool, wxT("MultiTool"), XO("Multi Tool") }, }; - std::vector commands; for (const auto &entry : table) { - commands.clear(); - commands.push_back(wxGetTranslation(entry.untranslatedLabel)); - commands.push_back(entry.commandName); + LocalizedCommandNameVector commands( 1u, + { wxGetTranslation(entry.untranslatedLabel), entry.commandName } ); ToolBar::SetButtonToolTip(*mTool[entry.tool], commands); } diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp index 52b686c6a..f6ad84f15 100644 --- a/src/toolbars/TranscriptionToolBar.cpp +++ b/src/toolbars/TranscriptionToolBar.cpp @@ -310,13 +310,15 @@ void TranscriptionToolBar::RegenerateTooltips() }, }; - std::vector commands; + LocalizedCommandNameVector commands; for (const auto &entry : table) { commands.clear(); - commands.push_back(wxGetTranslation(entry.untranslatedLabel)); - commands.push_back(entry.commandName); - commands.push_back(wxGetTranslation(entry.untranslatedLabel2)); - commands.push_back(entry.commandName2); + commands.push_back( LocalizedCommandName( + wxGetTranslation(entry.untranslatedLabel), entry.commandName + ) ); + commands.push_back( LocalizedCommandName( + wxGetTranslation(entry.untranslatedLabel2), entry.commandName2 + ) ); ToolBar::SetButtonToolTip(*mButtons[entry.tool], commands); } diff --git a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp index 63cdfc252..5efafe48e 100644 --- a/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp +++ b/src/tracks/playabletrack/ui/PlayableTrackButtonHandles.cpp @@ -48,9 +48,8 @@ wxString MuteButtonHandle::Tip(const wxMouseState &) const return name; auto commandManager = project->GetCommandManager(); - std::vector commands; - commands.push_back(name); - commands.push_back(wxT("TrackMute")); + CommandManager::LocalizedCommandNameVector commands( 1u, + { name, wxT("TrackMute") } ); return commandManager->DescribeCommandsAndShortcuts(commands); } @@ -106,9 +105,8 @@ wxString SoloButtonHandle::Tip(const wxMouseState &) const return name; auto commandManager = project->GetCommandManager(); - std::vector commands; - commands.push_back(name); - commands.push_back(wxT("TrackSolo")); + CommandManager::LocalizedCommandNameVector commands( 1u, + { name, wxT("TrackSolo") } ); return commandManager->DescribeCommandsAndShortcuts(commands); } diff --git a/src/tracks/ui/TrackButtonHandles.cpp b/src/tracks/ui/TrackButtonHandles.cpp index 4a44c8e2b..d11e4409f 100644 --- a/src/tracks/ui/TrackButtonHandles.cpp +++ b/src/tracks/ui/TrackButtonHandles.cpp @@ -115,9 +115,8 @@ wxString CloseButtonHandle::Tip(const wxMouseState &) const return name; auto commandManager = project->GetCommandManager(); - std::vector commands; - commands.push_back(name); - commands.push_back(wxT("TrackClose")); + CommandManager::LocalizedCommandNameVector commands( 1u, + { name, wxT("TrackClose") } ); return commandManager->DescribeCommandsAndShortcuts(commands); } @@ -176,9 +175,8 @@ wxString MenuButtonHandle::Tip(const wxMouseState &) const return name; auto commandManager = project->GetCommandManager(); - std::vector commands; - commands.push_back(name); - commands.push_back(wxT("TrackMenu")); + CommandManager::LocalizedCommandNameVector commands( 1u, + { name, wxT("TrackMenu") } ); return commandManager->DescribeCommandsAndShortcuts(commands); } diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 6b6195b4b..e6f5f23e4 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2875,9 +2875,8 @@ void AdornedRulerPanel::UpdateButtonStates() { auto common = [this] (AButton &button, const wxString &commandName, const wxString &label) { - std::vector commands; - commands.push_back(label); - commands.push_back(commandName); + CommandManager::LocalizedCommandNameVector commands( 1u, + { label, commandName } ); ToolBar::SetButtonToolTip(button, commands); button.SetLabel(button.GetToolTipText());