mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-27 06:07:59 +02:00
Merge branch 'master' into misc
This commit is contained in:
commit
9f25b637a1
@ -229,3 +229,12 @@ wxString Internat::StripAccelerators(const wxString &s)
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString Internat::Parenthesize(const wxString &str)
|
||||||
|
{
|
||||||
|
/* i18n-hint: An opening parenthesis, in some languages a right parenthesis */
|
||||||
|
auto open = _("(");
|
||||||
|
/* i18n-hint: A closing parenthesis, in some languages a left parenthesis */
|
||||||
|
auto close = _(")");
|
||||||
|
return open + str + close;
|
||||||
|
}
|
||||||
|
@ -73,6 +73,8 @@ public:
|
|||||||
* when they aren't, saving translators effort. */
|
* when they aren't, saving translators effort. */
|
||||||
static wxString StripAccelerators(const wxString& str);
|
static wxString StripAccelerators(const wxString& str);
|
||||||
|
|
||||||
|
static wxString Parenthesize(const wxString &str);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static wxChar mDecimalSeparator;
|
static wxChar mDecimalSeparator;
|
||||||
|
|
||||||
|
@ -545,7 +545,7 @@ AudacityProject *CreateNewAudacityProject()
|
|||||||
|
|
||||||
// Okay, GetActiveProject() is ready. Now we can get its CommandManager,
|
// Okay, GetActiveProject() is ready. Now we can get its CommandManager,
|
||||||
// and add the shortcut keys to the tooltips.
|
// and add the shortcut keys to the tooltips.
|
||||||
p->GetControlToolBar()->RegenerateToolsTooltips();
|
p->GetToolManager()->RegenerateTooltips();
|
||||||
|
|
||||||
ModuleManager::Get().Dispatch(ProjectInitialized);
|
ModuleManager::Get().Dispatch(ProjectInitialized);
|
||||||
|
|
||||||
|
@ -78,7 +78,6 @@ class Scrubber;
|
|||||||
class ScrubbingToolBar;
|
class ScrubbingToolBar;
|
||||||
class SelectionBar;
|
class SelectionBar;
|
||||||
class SpectralSelectionBar;
|
class SpectralSelectionBar;
|
||||||
class Toolbar;
|
|
||||||
class ToolManager;
|
class ToolManager;
|
||||||
class ToolsToolBar;
|
class ToolsToolBar;
|
||||||
class TranscriptionToolBar;
|
class TranscriptionToolBar;
|
||||||
|
@ -491,6 +491,9 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
|
|||||||
mAdjustLeftSelectionCursor = std::make_unique<wxCursor>(wxCURSOR_POINT_LEFT);
|
mAdjustLeftSelectionCursor = std::make_unique<wxCursor>(wxCURSOR_POINT_LEFT);
|
||||||
mAdjustRightSelectionCursor = std::make_unique<wxCursor>(wxCURSOR_POINT_RIGHT);
|
mAdjustRightSelectionCursor = std::make_unique<wxCursor>(wxCURSOR_POINT_RIGHT);
|
||||||
|
|
||||||
|
// Menu pointers are set to NULL here. Delay building of menus until after
|
||||||
|
// the command managter is finished, so that we can look up shortcut
|
||||||
|
// key strings that need to appear in some of the popup menus.
|
||||||
mWaveTrackMenu = NULL;
|
mWaveTrackMenu = NULL;
|
||||||
mChannelItemsInsertionPoint = 0;
|
mChannelItemsInsertionPoint = 0;
|
||||||
|
|
||||||
@ -500,8 +503,6 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id,
|
|||||||
|
|
||||||
mRulerWaveformMenu = mRulerSpectrumMenu = NULL;
|
mRulerWaveformMenu = mRulerSpectrumMenu = NULL;
|
||||||
|
|
||||||
BuildMenus();
|
|
||||||
|
|
||||||
mTrackArtist = new TrackArtist();
|
mTrackArtist = new TrackArtist();
|
||||||
mTrackArtist->SetInset(1, kTopMargin, kRightMargin, kBottomMargin);
|
mTrackArtist->SetInset(1, kTopMargin, kRightMargin, kBottomMargin);
|
||||||
|
|
||||||
@ -586,6 +587,12 @@ TrackPanel::~TrackPanel()
|
|||||||
delete mInitialTrackSelection;
|
delete mInitialTrackSelection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrackPanel::BuildMenusIfNeeded(void)
|
||||||
|
{
|
||||||
|
if (!mRateMenu)
|
||||||
|
BuildMenus();
|
||||||
|
}
|
||||||
|
|
||||||
void TrackPanel::BuildMenus(void)
|
void TrackPanel::BuildMenus(void)
|
||||||
{
|
{
|
||||||
// Get rid of existing menus
|
// Get rid of existing menus
|
||||||
@ -676,6 +683,8 @@ void TrackPanel::BuildCommonDropMenuItems(wxMenu * menu)
|
|||||||
{
|
{
|
||||||
menu->Append(OnSetNameID, _("&Name..."));
|
menu->Append(OnSetNameID, _("&Name..."));
|
||||||
menu->AppendSeparator();
|
menu->AppendSeparator();
|
||||||
|
// It is not correct to use KeyStringDisplay here -- wxWidgets will apply
|
||||||
|
// its equivalent to the key names passed to menu functions.
|
||||||
menu->Append(OnMoveUpID, _("Move Track &Up") + wxT("\t") +
|
menu->Append(OnMoveUpID, _("Move Track &Up") + wxT("\t") +
|
||||||
(GetProject()->GetCommandManager()->GetKeyFromName(wxT("TrackMoveUp"))));
|
(GetProject()->GetCommandManager()->GetKeyFromName(wxT("TrackMoveUp"))));
|
||||||
menu->Append(OnMoveDownID, _("Move Track &Down") + wxT("\t") +
|
menu->Append(OnMoveDownID, _("Move Track &Down") + wxT("\t") +
|
||||||
@ -708,6 +717,8 @@ void TrackPanel::DeleteMenus(void)
|
|||||||
{
|
{
|
||||||
// Note that the submenus (mRateMenu, ...)
|
// Note that the submenus (mRateMenu, ...)
|
||||||
// are deleted by their parent
|
// are deleted by their parent
|
||||||
|
mRateMenu = mFormatMenu = nullptr;
|
||||||
|
|
||||||
if (mWaveTrackMenu) {
|
if (mWaveTrackMenu) {
|
||||||
delete mWaveTrackMenu;
|
delete mWaveTrackMenu;
|
||||||
mWaveTrackMenu = NULL;
|
mWaveTrackMenu = NULL;
|
||||||
@ -7480,6 +7491,8 @@ void TrackPanel::ScrollIntoView(int x)
|
|||||||
|
|
||||||
void TrackPanel::OnTrackMenu(Track *t)
|
void TrackPanel::OnTrackMenu(Track *t)
|
||||||
{
|
{
|
||||||
|
BuildMenusIfNeeded();
|
||||||
|
|
||||||
if(!t) {
|
if(!t) {
|
||||||
t = GetFocusedTrack();
|
t = GetFocusedTrack();
|
||||||
if(!t) return;
|
if(!t) return;
|
||||||
@ -8083,6 +8096,8 @@ void TrackPanel::SetRate(Track * pTrack, double rate)
|
|||||||
/// track menu.
|
/// track menu.
|
||||||
void TrackPanel::OnFormatChange(wxCommandEvent & event)
|
void TrackPanel::OnFormatChange(wxCommandEvent & event)
|
||||||
{
|
{
|
||||||
|
BuildMenusIfNeeded();
|
||||||
|
|
||||||
int id = event.GetId();
|
int id = event.GetId();
|
||||||
wxASSERT(id >= On16BitID && id <= OnFloatID);
|
wxASSERT(id >= On16BitID && id <= OnFloatID);
|
||||||
wxASSERT(mPopupMenuTarget
|
wxASSERT(mPopupMenuTarget
|
||||||
@ -8174,6 +8189,8 @@ static int gRates[nRates] = { 8000, 11025, 16000, 22050, 44100, 48000, 88200, 96
|
|||||||
/// submenu of the track menu, except for "Other" (/see OnRateOther).
|
/// submenu of the track menu, except for "Other" (/see OnRateOther).
|
||||||
void TrackPanel::OnRateChange(wxCommandEvent & event)
|
void TrackPanel::OnRateChange(wxCommandEvent & event)
|
||||||
{
|
{
|
||||||
|
BuildMenusIfNeeded();
|
||||||
|
|
||||||
int id = event.GetId();
|
int id = event.GetId();
|
||||||
wxASSERT(id >= OnRate8ID && id <= OnRate384ID);
|
wxASSERT(id >= OnRate8ID && id <= OnRate384ID);
|
||||||
wxASSERT(mPopupMenuTarget
|
wxASSERT(mPopupMenuTarget
|
||||||
@ -8199,6 +8216,8 @@ int TrackPanel::IdOfRate( int rate )
|
|||||||
|
|
||||||
void TrackPanel::OnRateOther(wxCommandEvent &event)
|
void TrackPanel::OnRateOther(wxCommandEvent &event)
|
||||||
{
|
{
|
||||||
|
BuildMenusIfNeeded();
|
||||||
|
|
||||||
wxASSERT(mPopupMenuTarget
|
wxASSERT(mPopupMenuTarget
|
||||||
&& mPopupMenuTarget->GetKind() == Track::Wave);
|
&& mPopupMenuTarget->GetKind() == Track::Wave);
|
||||||
|
|
||||||
|
@ -147,6 +147,7 @@ class AUDACITY_DLL_API TrackPanel final : public OverlayPanel {
|
|||||||
|
|
||||||
virtual ~ TrackPanel();
|
virtual ~ TrackPanel();
|
||||||
|
|
||||||
|
virtual void BuildMenusIfNeeded(void);
|
||||||
virtual void BuildMenus(void);
|
virtual void BuildMenus(void);
|
||||||
|
|
||||||
virtual void DeleteMenus(void);
|
virtual void DeleteMenus(void);
|
||||||
@ -758,20 +759,20 @@ protected:
|
|||||||
mStretchCursor, mStretchLeftCursor, mStretchRightCursor;
|
mStretchCursor, mStretchLeftCursor, mStretchRightCursor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxMenu *mWaveTrackMenu;
|
wxMenu *mWaveTrackMenu {};
|
||||||
size_t mChannelItemsInsertionPoint;
|
size_t mChannelItemsInsertionPoint {};
|
||||||
|
|
||||||
wxMenu *mNoteTrackMenu;
|
wxMenu *mNoteTrackMenu {};
|
||||||
wxMenu *mTimeTrackMenu;
|
wxMenu *mTimeTrackMenu {};
|
||||||
wxMenu *mLabelTrackMenu;
|
wxMenu *mLabelTrackMenu {};
|
||||||
wxMenu *mRateMenu;
|
wxMenu *mRateMenu {};
|
||||||
wxMenu *mFormatMenu;
|
wxMenu *mFormatMenu {};
|
||||||
wxMenu *mLabelTrackInfoMenu;
|
wxMenu *mLabelTrackInfoMenu {};
|
||||||
|
|
||||||
wxMenu *mRulerWaveformMenu;
|
wxMenu *mRulerWaveformMenu {};
|
||||||
wxMenu *mRulerSpectrumMenu;
|
wxMenu *mRulerSpectrumMenu {};
|
||||||
|
|
||||||
Track *mPopupMenuTarget;
|
Track *mPopupMenuTarget {};
|
||||||
|
|
||||||
friend class TrackPanelAx;
|
friend class TrackPanelAx;
|
||||||
|
|
||||||
|
@ -43,13 +43,25 @@ wxString KeyStringNormalize(const wxString & key)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString KeyStringDisplay(const wxString & key)
|
wxString KeyStringDisplay(const wxString & key, bool useSspecialChars)
|
||||||
{
|
{
|
||||||
wxString newkey = KeyStringNormalize(key);
|
wxString newkey = KeyStringNormalize(key);
|
||||||
#if defined(__WXMAC__)
|
#if defined(__WXMAC__)
|
||||||
|
|
||||||
|
if (!useSspecialChars) {
|
||||||
|
// Compose user-visible keystroke names, all ASCII
|
||||||
newkey.Replace(wxT("XCtrl+"), wxT("Control+"));
|
newkey.Replace(wxT("XCtrl+"), wxT("Control+"));
|
||||||
newkey.Replace(wxT("Alt+"), wxT("Option+"));
|
newkey.Replace(wxT("Alt+"), wxT("Option+"));
|
||||||
newkey.Replace(wxT("Ctrl+"), wxT("Command+"));
|
newkey.Replace(wxT("Ctrl+"), wxT("Command+"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Compuse user-visible keystroke names, with special characters
|
||||||
|
newkey.Replace(wxT("Shift+"), wxT("\u21e7"));
|
||||||
|
newkey.Replace(wxT("XCtrl+"), wxT("Control+"));
|
||||||
|
newkey.Replace(wxT("Alt+"), wxT("\u2325"));
|
||||||
|
newkey.Replace(wxT("Ctrl+"), wxT("\u2318"));
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return newkey;
|
return newkey;
|
||||||
|
@ -14,5 +14,5 @@
|
|||||||
#include <wx/string.h>
|
#include <wx/string.h>
|
||||||
|
|
||||||
wxString KeyStringNormalize(const wxString & key);
|
wxString KeyStringNormalize(const wxString & key);
|
||||||
wxString KeyStringDisplay(const wxString & key);
|
wxString KeyStringDisplay(const wxString & key, bool useSpecialChars = false);
|
||||||
wxString KeyEventToKeyString(const wxKeyEvent & keyEvent);
|
wxString KeyEventToKeyString(const wxKeyEvent & keyEvent);
|
||||||
|
@ -188,7 +188,7 @@ void ControlToolBar::Populate()
|
|||||||
mRecord->FollowModifierKeys();
|
mRecord->FollowModifierKeys();
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
RegenerateToolsTooltips();
|
RegenerateTooltips();
|
||||||
wxToolTip::Enable(true);
|
wxToolTip::Enable(true);
|
||||||
wxToolTip::SetDelay(1000);
|
wxToolTip::SetDelay(1000);
|
||||||
#endif
|
#endif
|
||||||
@ -197,47 +197,41 @@ void ControlToolBar::Populate()
|
|||||||
ArrangeButtons();
|
ArrangeButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlToolBar::RegenerateToolsTooltips()
|
void ControlToolBar::RegenerateTooltips()
|
||||||
{
|
{
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
|
std::vector<wxString> commands;
|
||||||
for (long iWinID = ID_PLAY_BUTTON; iWinID < BUTTON_COUNT; iWinID++)
|
for (long iWinID = ID_PLAY_BUTTON; iWinID < BUTTON_COUNT; iWinID++)
|
||||||
{
|
{
|
||||||
wxWindow* pCtrl = this->FindWindow(iWinID);
|
commands.clear();
|
||||||
wxString strToolTip = pCtrl->GetLabel();
|
auto pCtrl = static_cast<AButton*>(this->FindWindow(iWinID));
|
||||||
AudacityProject* pProj = GetActiveProject();
|
commands.push_back(pCtrl->GetLabel());
|
||||||
CommandManager* pCmdMgr = (pProj) ? pProj->GetCommandManager() : NULL;
|
|
||||||
if (pCmdMgr)
|
|
||||||
{
|
|
||||||
wxString strKey(wxT(" ("));
|
|
||||||
switch (iWinID)
|
switch (iWinID)
|
||||||
{
|
{
|
||||||
case ID_PLAY_BUTTON:
|
case ID_PLAY_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("Play"));
|
commands.push_back(wxT("Play"));
|
||||||
strKey += _(") / Loop Play (");
|
commands.push_back(_("Loop Play"));
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("PlayLooped"));
|
commands.push_back(wxT("PlayLooped"));
|
||||||
break;
|
break;
|
||||||
case ID_RECORD_BUTTON:
|
case ID_RECORD_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("Record"));
|
commands.push_back(wxT("Record"));
|
||||||
strKey += _(") / Append Record (");
|
commands.push_back(_("Append Record"));
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("RecordAppend"));
|
commands.push_back(wxT("RecordAppend"));
|
||||||
break;
|
break;
|
||||||
case ID_PAUSE_BUTTON:
|
case ID_PAUSE_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("Pause"));
|
commands.push_back(wxT("Pause"));
|
||||||
break;
|
break;
|
||||||
case ID_STOP_BUTTON:
|
case ID_STOP_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("Stop"));
|
commands.push_back(wxT("Stop"));
|
||||||
break;
|
break;
|
||||||
case ID_FF_BUTTON:
|
case ID_FF_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("SkipEnd"));
|
commands.push_back(wxT("SkipEnd"));
|
||||||
break;
|
break;
|
||||||
case ID_REW_BUTTON:
|
case ID_REW_BUTTON:
|
||||||
strKey += pCmdMgr->GetKeyFromName(wxT("SkipStart"));
|
commands.push_back(wxT("SkipStart"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strKey += wxT(")");
|
ToolBar::SetButtonToolTip(*pCtrl, commands);
|
||||||
strToolTip += strKey;
|
|
||||||
}
|
|
||||||
pCtrl->SetToolTip(strToolTip);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -262,14 +256,14 @@ void ControlToolBar::UpdatePrefs()
|
|||||||
|
|
||||||
if( updated )
|
if( updated )
|
||||||
{
|
{
|
||||||
ReCreateButtons(); // side effect: calls RegenerateToolsTooltips()
|
ReCreateButtons(); // side effect: calls RegenerateTooltips()
|
||||||
Updated();
|
Updated();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// The other reason to regenerate tooltips is if keyboard shortcuts for
|
// The other reason to regenerate tooltips is if keyboard shortcuts for
|
||||||
// transport buttons changed, but that's too much work to check for, so just
|
// transport buttons changed, but that's too much work to check for, so just
|
||||||
// always do it. (Much cheaper than calling ReCreateButtons() in all cases.
|
// always do it. (Much cheaper than calling ReCreateButtons() in all cases.
|
||||||
RegenerateToolsTooltips();
|
RegenerateTooltips();
|
||||||
|
|
||||||
|
|
||||||
// Set label to pull in language change
|
// Set label to pull in language change
|
||||||
@ -383,7 +377,7 @@ void ControlToolBar::ReCreateButtons()
|
|||||||
|
|
||||||
EnableDisableButtons();
|
EnableDisableButtons();
|
||||||
|
|
||||||
RegenerateToolsTooltips();
|
RegenerateTooltips();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlToolBar::Repaint( wxDC *dc )
|
void ControlToolBar::Repaint( wxDC *dc )
|
||||||
|
@ -101,7 +101,7 @@ class ControlToolBar final : public ToolBar {
|
|||||||
void EnableDisableButtons() override;
|
void EnableDisableButtons() override;
|
||||||
|
|
||||||
void ReCreateButtons() override;
|
void ReCreateButtons() override;
|
||||||
void RegenerateToolsTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
int WidthForStatusBar(wxStatusBar* const);
|
int WidthForStatusBar(wxStatusBar* const);
|
||||||
void UpdateStatusBar(AudacityProject *pProject);
|
void UpdateStatusBar(AudacityProject *pProject);
|
||||||
|
@ -63,7 +63,7 @@ class DeviceToolBar final : public ToolBar {
|
|||||||
void SetDevices(const DeviceSourceMap *in, const DeviceSourceMap *out);
|
void SetDevices(const DeviceSourceMap *in, const DeviceSourceMap *out);
|
||||||
void RepositionCombos();
|
void RepositionCombos();
|
||||||
void SetNames();
|
void SetNames();
|
||||||
void RegenerateTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
void ShowComboDialog(wxChoice *combo, const wxString &title);
|
void ShowComboDialog(wxChoice *combo, const wxString &title);
|
||||||
|
|
||||||
|
@ -198,24 +198,40 @@ void EditToolBar::UpdatePrefs()
|
|||||||
void EditToolBar::RegenerateTooltips()
|
void EditToolBar::RegenerateTooltips()
|
||||||
{
|
{
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
mButtons[ETBCutID]->SetToolTip(_("Cut"));
|
static const struct Entry {
|
||||||
mButtons[ETBCopyID]->SetToolTip(_("Copy"));
|
int tool;
|
||||||
mButtons[ETBPasteID]->SetToolTip(_("Paste"));
|
wxString commandName;
|
||||||
mButtons[ETBTrimID]->SetToolTip(_("Trim Audio"));
|
wxString untranslatedLabel;
|
||||||
mButtons[ETBSilenceID]->SetToolTip(_("Silence Audio"));
|
} table[] = {
|
||||||
mButtons[ETBUndoID]->SetToolTip(_("Undo"));
|
{ ETBCutID, wxT("Cut"), XO("Cut") },
|
||||||
mButtons[ETBRedoID]->SetToolTip(_("Redo"));
|
{ ETBCopyID, wxT("Copy"), XO("Copy") },
|
||||||
#ifdef EXPERIMENTAL_SYNC_LOCK
|
{ ETBPasteID, wxT("Paste"), XO("Paste") },
|
||||||
mButtons[ETBSyncLockID]->SetToolTip(_("Sync-Lock Tracks"));
|
{ ETBTrimID, wxT("Trim"), XO("Trim Audio") },
|
||||||
#endif
|
{ ETBSilenceID, wxT("Silence"), XO("Silence Audio") },
|
||||||
mButtons[ETBZoomInID]->SetToolTip(_("Zoom In"));
|
{ ETBUndoID, wxT("Undo"), XO("Undo") },
|
||||||
mButtons[ETBZoomOutID]->SetToolTip(_("Zoom Out"));
|
{ ETBRedoID, wxT("Redo"), XO("Redo") },
|
||||||
mButtons[ETBZoomSelID]->SetToolTip(_("Fit Selection"));
|
|
||||||
mButtons[ETBZoomFitID]->SetToolTip(_("Fit Project"));
|
#ifdef EXPERIMENTAL_SYNC_LOCK
|
||||||
|
{ ETBSyncLockID, wxT("SyncLock"), XO("Sync-Lock Tracks") },
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{ ETBZoomInID, wxT("ZoomIn"), XO("Zoom In") },
|
||||||
|
{ ETBZoomOutID, wxT("ZoomOut"), XO("Zoom Out") },
|
||||||
|
{ ETBZoomSelID, wxT("ZoomSel"), XO("Fit Selection") },
|
||||||
|
{ ETBZoomFitID, wxT("FitInWindow"), XO("Fit Project") },
|
||||||
|
|
||||||
#if defined(EXPERIMENTAL_EFFECTS_RACK)
|
#if defined(EXPERIMENTAL_EFFECTS_RACK)
|
||||||
mButtons[ETBEffectsID]->SetToolTip(_("Open Effects Rack"));
|
{ ETBEffectsID, wxT(""), XO("Open Effects Rack") },
|
||||||
#endif
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<wxString> commands;
|
||||||
|
for (const auto &entry : table) {
|
||||||
|
commands.clear();
|
||||||
|
commands.push_back(wxGetTranslation(entry.untranslatedLabel));
|
||||||
|
commands.push_back(entry.commandName);
|
||||||
|
ToolBar::SetButtonToolTip(*mButtons[entry.tool], commands);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ class EditToolBar final : public ToolBar {
|
|||||||
|
|
||||||
void MakeButtons();
|
void MakeButtons();
|
||||||
|
|
||||||
void RegenerateTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
AButton *mButtons[ETBNumButtons];
|
AButton *mButtons[ETBNumButtons];
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ public:
|
|||||||
void EnableDisableButtons();
|
void EnableDisableButtons();
|
||||||
void UpdatePrefs();
|
void UpdatePrefs();
|
||||||
|
|
||||||
void RegenerateTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ class MeterToolBar final : public ToolBar {
|
|||||||
wxSize GetDockedSize();
|
wxSize GetDockedSize();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void RegenerateTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
AudacityProject *mProject;
|
AudacityProject *mProject;
|
||||||
int mWhichMeters;
|
int mWhichMeters;
|
||||||
|
@ -196,6 +196,8 @@ void MixerToolBar::UpdatePrefs()
|
|||||||
// Set label to pull in language change
|
// Set label to pull in language change
|
||||||
SetLabel(_("Mixer"));
|
SetLabel(_("Mixer"));
|
||||||
|
|
||||||
|
RegenerateTooltips();
|
||||||
|
|
||||||
// Give base class a chance
|
// Give base class a chance
|
||||||
ToolBar::UpdatePrefs();
|
ToolBar::UpdatePrefs();
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,8 @@ class MixerToolBar final : public ToolBar {
|
|||||||
void AdjustOutputGain(int adj);
|
void AdjustOutputGain(int adj);
|
||||||
void AdjustInputGain(int adj);
|
void AdjustInputGain(int adj);
|
||||||
|
|
||||||
|
void RegenerateTooltips() override {};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float mInputSliderVolume;
|
float mInputSliderVolume;
|
||||||
float mOutputSliderVolume;
|
float mOutputSliderVolume;
|
||||||
|
@ -296,6 +296,8 @@ void SelectionBar::UpdatePrefs()
|
|||||||
// Set label to pull in language change
|
// Set label to pull in language change
|
||||||
SetLabel(_("Selection"));
|
SetLabel(_("Selection"));
|
||||||
|
|
||||||
|
RegenerateTooltips();
|
||||||
|
|
||||||
// Give base class a chance
|
// Give base class a chance
|
||||||
ToolBar::UpdatePrefs();
|
ToolBar::UpdatePrefs();
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ class SelectionBar final : public ToolBar {
|
|||||||
void SetSelectionFormat(const wxString & format);
|
void SetSelectionFormat(const wxString & format);
|
||||||
void SetRate(double rate);
|
void SetRate(double rate);
|
||||||
void SetListener(SelectionBarListener *l);
|
void SetListener(SelectionBarListener *l);
|
||||||
|
void RegenerateTooltips() override {};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -209,6 +209,8 @@ void SpectralSelectionBar::UpdatePrefs()
|
|||||||
// Set label to pull in language change
|
// Set label to pull in language change
|
||||||
SetLabel(_("Spectral Selection"));
|
SetLabel(_("Spectral Selection"));
|
||||||
|
|
||||||
|
RegenerateTooltips();
|
||||||
|
|
||||||
// Give base class a chance
|
// Give base class a chance
|
||||||
ToolBar::UpdatePrefs();
|
ToolBar::UpdatePrefs();
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,8 @@ public:
|
|||||||
void SetBandwidthSelectionFormatName(const wxString & formatName);
|
void SetBandwidthSelectionFormatName(const wxString & formatName);
|
||||||
void SetListener(SpectralSelectionBarListener *l);
|
void SetListener(SpectralSelectionBarListener *l);
|
||||||
|
|
||||||
|
void RegenerateTooltips() override {};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void ValuesToControls();
|
void ValuesToControls();
|
||||||
|
@ -48,6 +48,7 @@ in which buttons can be placed.
|
|||||||
#include "../ImageManipulation.h"
|
#include "../ImageManipulation.h"
|
||||||
#include "../Project.h"
|
#include "../Project.h"
|
||||||
#include "../Theme.h"
|
#include "../Theme.h"
|
||||||
|
#include "../commands/Keyboard.h"
|
||||||
#include "../widgets/AButton.h"
|
#include "../widgets/AButton.h"
|
||||||
#include "../widgets/Grabber.h"
|
#include "../widgets/Grabber.h"
|
||||||
|
|
||||||
@ -761,6 +762,33 @@ void ToolBar::MakeAlternateImages(AButton &button, int idx,
|
|||||||
button.SetAlternateImages(idx, *up, *hilite, *down, *disable);
|
button.SetAlternateImages(idx, *up, *hilite, *down, *disable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolBar::SetButtonToolTip
|
||||||
|
(AButton &button, const std::vector<wxString> &commands, const wxString &separator)
|
||||||
|
{
|
||||||
|
const auto project = GetActiveProject();
|
||||||
|
const auto commandManager = project ? project->GetCommandManager() : nullptr;
|
||||||
|
wxString result;
|
||||||
|
auto iter = commands.begin(), end = commands.end();
|
||||||
|
while (iter != end) {
|
||||||
|
result += *iter++;
|
||||||
|
if (iter != end) {
|
||||||
|
if (!iter->empty()) {
|
||||||
|
if (commandManager) {
|
||||||
|
auto keyStr = commandManager->GetKeyFromName(*iter);
|
||||||
|
if (keyStr.empty())
|
||||||
|
keyStr = _("no key");
|
||||||
|
result += wxT(" ");
|
||||||
|
result += Internat::Parenthesize(KeyStringDisplay(keyStr, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++iter;
|
||||||
|
}
|
||||||
|
if (iter != end)
|
||||||
|
result += separator;
|
||||||
|
}
|
||||||
|
button.SetToolTip(result);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// This changes the state a button (from up to down or vice versa)
|
// This changes the state a button (from up to down or vice versa)
|
||||||
//
|
//
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "../Experimental.h"
|
#include "../Experimental.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include <wx/defs.h>
|
#include <wx/defs.h>
|
||||||
#include <wx/panel.h>
|
#include <wx/panel.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
@ -98,6 +99,7 @@ class ToolBar /* not final */ : public wxPanel
|
|||||||
virtual void EnableDisableButtons() = 0;
|
virtual void EnableDisableButtons() = 0;
|
||||||
virtual void ReCreateButtons();
|
virtual void ReCreateButtons();
|
||||||
virtual void UpdatePrefs();
|
virtual void UpdatePrefs();
|
||||||
|
virtual void RegenerateTooltips() = 0;
|
||||||
|
|
||||||
int GetType();
|
int GetType();
|
||||||
wxString GetTitle();
|
wxString GetTitle();
|
||||||
@ -150,6 +152,17 @@ class ToolBar /* not final */ : public wxPanel
|
|||||||
teBmps eDisabled,
|
teBmps eDisabled,
|
||||||
wxSize size);
|
wxSize size);
|
||||||
|
|
||||||
|
static
|
||||||
|
void SetButtonToolTip
|
||||||
|
(AButton &button,
|
||||||
|
// An array, alternating 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<wxString> &commands,
|
||||||
|
// If more than one pair of strings is given, then use this separator.
|
||||||
|
const wxString &separator = wxT(" / "));
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void SetButton(bool down, AButton *button);
|
void SetButton(bool down, AButton *button);
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -13,6 +13,8 @@
|
|||||||
#ifndef __AUDACITY_TOOLDOCK__
|
#ifndef __AUDACITY_TOOLDOCK__
|
||||||
#define __AUDACITY_TOOLDOCK__
|
#define __AUDACITY_TOOLDOCK__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "../MemoryX.h" // for std::move
|
||||||
#include <wx/defs.h>
|
#include <wx/defs.h>
|
||||||
#include <wx/panel.h>
|
#include <wx/panel.h>
|
||||||
|
|
||||||
@ -45,23 +47,270 @@ enum
|
|||||||
DockCount = 2
|
DockCount = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ToolBarConfiguration
|
||||||
|
{
|
||||||
|
struct Tree;
|
||||||
|
using Forest = std::vector<Tree>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void Swap(ToolBarConfiguration &that)
|
||||||
|
{
|
||||||
|
mForest.swap(that.mForest);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
mForest.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Position {
|
||||||
|
ToolBar *rightOf {};
|
||||||
|
ToolBar *below {};
|
||||||
|
bool adopt {true};
|
||||||
|
bool valid {true};
|
||||||
|
|
||||||
|
// Default constructor
|
||||||
|
Position() {}
|
||||||
|
|
||||||
|
Position(
|
||||||
|
ToolBar *r,
|
||||||
|
ToolBar *b = nullptr,
|
||||||
|
bool shouldAdopt = true
|
||||||
|
)
|
||||||
|
: rightOf{ r }, below{ b }, adopt{ shouldAdopt }
|
||||||
|
{}
|
||||||
|
|
||||||
|
// Constructor for the invalid value
|
||||||
|
explicit Position(bool /* dummy */) : valid{ false } {}
|
||||||
|
|
||||||
|
friend inline bool operator ==
|
||||||
|
(const Position &lhs, const Position &rhs)
|
||||||
|
{ return lhs.valid == rhs.valid &&
|
||||||
|
(!lhs.valid ||
|
||||||
|
(lhs.rightOf == rhs.rightOf
|
||||||
|
&& lhs.below == rhs.below
|
||||||
|
&& lhs.adopt == rhs.adopt
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
friend inline bool operator !=
|
||||||
|
(const Position &lhs, const Position &rhs)
|
||||||
|
{ return !(lhs == rhs); }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Position UnspecifiedPosition;
|
||||||
|
|
||||||
|
struct Place {
|
||||||
|
Tree *pTree {};
|
||||||
|
Position position;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This iterator visits the nodes of the forest in pre-order, and at each
|
||||||
|
// stop, makes the parent, previous sibling, and children accessible.
|
||||||
|
class Iterator
|
||||||
|
: public std::iterator<std::forward_iterator_tag, Place>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
const Place &operator * () const { return mPlace; }
|
||||||
|
const Place *operator -> () const { return &**this; }
|
||||||
|
Iterator &operator ++ ()
|
||||||
|
{
|
||||||
|
// This is a feature: advance position even at the end
|
||||||
|
mPlace.position =
|
||||||
|
{ mPlace.pTree ? mPlace.pTree->pBar : nullptr };
|
||||||
|
|
||||||
|
if (!mIters.empty())
|
||||||
|
{
|
||||||
|
auto triple = &mIters.back();
|
||||||
|
auto &children = triple->current->children;
|
||||||
|
if (children.empty()) {
|
||||||
|
while (++triple->current == triple->end) {
|
||||||
|
mIters.pop_back();
|
||||||
|
if (mIters.empty())
|
||||||
|
break;
|
||||||
|
triple = &mIters.back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto b = children.begin();
|
||||||
|
mIters.push_back( Triple { b, b, children.end() } );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mIters.empty()) {
|
||||||
|
mPlace.pTree = nullptr;
|
||||||
|
// Leave mPlace.position as above
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const auto &triple = mIters.back();
|
||||||
|
mPlace.pTree = &*triple.current;
|
||||||
|
|
||||||
|
if (mIters.size() == 1)
|
||||||
|
mPlace.position.rightOf = nullptr;
|
||||||
|
else
|
||||||
|
mPlace.position.rightOf = (mIters.rbegin() + 1)->current->pBar;
|
||||||
|
|
||||||
|
if (triple.begin == triple.current)
|
||||||
|
mPlace.position.below = nullptr;
|
||||||
|
else
|
||||||
|
mPlace.position.below = (triple.current - 1)->pBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This may be called on the end iterator, and then returns empty
|
||||||
|
std::vector<int> GetPath() const
|
||||||
|
{
|
||||||
|
std::vector<int> path;
|
||||||
|
path.reserve(mIters.size());
|
||||||
|
for (const auto &triple : mIters)
|
||||||
|
path.push_back(triple.current - triple.begin);
|
||||||
|
return std::move(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
friend inline bool operator ==
|
||||||
|
(const Iterator &lhs, const Iterator &rhs)
|
||||||
|
{
|
||||||
|
const auto &li = lhs.mIters;
|
||||||
|
const auto &ri = rhs.mIters;
|
||||||
|
return li.size() == ri.size() &&
|
||||||
|
std::equal(li.begin(), li.end(), ri.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
friend inline bool operator !=
|
||||||
|
(const Iterator &lhs, const Iterator &rhs)
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend ToolBarConfiguration;
|
||||||
|
Iterator () {}
|
||||||
|
explicit Iterator(ToolBarConfiguration &conf)
|
||||||
|
{
|
||||||
|
auto &forest = conf.mForest;
|
||||||
|
if (!forest.empty()) {
|
||||||
|
auto b = forest.begin();
|
||||||
|
mIters.push_back( Triple { b, b, forest.end() } );
|
||||||
|
mPlace.pTree = &*b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Place mPlace;
|
||||||
|
|
||||||
|
using FIter = Forest::iterator;
|
||||||
|
struct Triple
|
||||||
|
{
|
||||||
|
Triple (FIter b, FIter c, FIter e)
|
||||||
|
: begin{b}, current{c}, end{e} {}
|
||||||
|
FIter begin, current, end;
|
||||||
|
|
||||||
|
friend inline bool operator ==
|
||||||
|
(const Triple &lhs, const Triple &rhs)
|
||||||
|
{
|
||||||
|
// Really need only to compare current
|
||||||
|
return
|
||||||
|
// lhs.begin == rhs.begin &&
|
||||||
|
lhs.current == rhs.current
|
||||||
|
// lhs.end == rhs.end
|
||||||
|
;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
std::vector<Triple> mIters;
|
||||||
|
};
|
||||||
|
|
||||||
|
Iterator begin() { return Iterator { *this }; }
|
||||||
|
Iterator end() const { return Iterator {}; }
|
||||||
|
|
||||||
|
Position Find(const ToolBar *bar) const;
|
||||||
|
|
||||||
|
bool Contains(const ToolBar *bar) const
|
||||||
|
{
|
||||||
|
return Find(bar) != UnspecifiedPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default position inserts at the end
|
||||||
|
void Insert(ToolBar *bar,
|
||||||
|
Position position = UnspecifiedPosition);
|
||||||
|
void InsertAtPath(ToolBar *bar, const std::vector<int> &path);
|
||||||
|
void Remove(const ToolBar *bar);
|
||||||
|
|
||||||
|
// Future: might allow a state that the configuration remembers
|
||||||
|
// a hidden bar, but for now, it's equivalent to Contains():
|
||||||
|
bool Shows(const ToolBar *bar) const { return Contains(bar); }
|
||||||
|
|
||||||
|
void Show(ToolBar *bar);
|
||||||
|
void Hide(ToolBar *bar);
|
||||||
|
|
||||||
|
bool IsRightmost(const ToolBar *bar) const;
|
||||||
|
|
||||||
|
struct Legacy {
|
||||||
|
std::vector<ToolBar*> bars;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool Read
|
||||||
|
(ToolBarConfiguration *pConfiguration,
|
||||||
|
Legacy *pLegacy,
|
||||||
|
ToolBar *bar, bool &visible, bool defaultVisible);
|
||||||
|
void PostRead(Legacy &legacy);
|
||||||
|
|
||||||
|
static void Write
|
||||||
|
(const ToolBarConfiguration *pConfiguration, const ToolBar *bar);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void Remove(Forest &forest, Forest::iterator iter);
|
||||||
|
void RemoveNulls(Forest &forest);
|
||||||
|
|
||||||
|
struct Tree
|
||||||
|
{
|
||||||
|
ToolBar *pBar {};
|
||||||
|
Forest children;
|
||||||
|
|
||||||
|
void swap(Tree &that)
|
||||||
|
{
|
||||||
|
std::swap(pBar, that.pBar);
|
||||||
|
children.swap(that.children);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Iterator FindPlace(const ToolBar *bar) const;
|
||||||
|
std::pair<Forest*, Forest::iterator> FindParent(const ToolBar *bar);
|
||||||
|
|
||||||
|
Forest mForest;
|
||||||
|
};
|
||||||
|
|
||||||
class ToolDock final : public wxPanel
|
class ToolDock final : public wxPanel
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
public:
|
|
||||||
|
|
||||||
ToolDock( ToolManager *manager, wxWindow *parent, int dockid );
|
ToolDock( ToolManager *manager, wxWindow *parent, int dockid );
|
||||||
~ToolDock();
|
~ToolDock();
|
||||||
|
|
||||||
bool AcceptsFocus() const override { return false; };
|
bool AcceptsFocus() const override { return false; };
|
||||||
|
|
||||||
|
void LoadConfig();
|
||||||
void LayoutToolBars();
|
void LayoutToolBars();
|
||||||
void Expose( int type, bool show );
|
void Expose( int type, bool show );
|
||||||
int Find(ToolBar *bar) const;
|
|
||||||
int GetOrder( ToolBar *bar );
|
int GetOrder( ToolBar *bar );
|
||||||
void Dock( ToolBar *bar, bool deflate, int ndx = -1 );
|
void Dock( ToolBar *bar, bool deflate,
|
||||||
|
ToolBarConfiguration::Position ndx
|
||||||
|
= ToolBarConfiguration::UnspecifiedPosition);
|
||||||
void Undock( ToolBar *bar );
|
void Undock( ToolBar *bar );
|
||||||
int PositionBar( ToolBar *t, wxPoint & pos, wxRect & rect );
|
ToolBarConfiguration::Position
|
||||||
|
PositionBar( ToolBar *t, const wxPoint & pos, wxRect & rect );
|
||||||
|
|
||||||
|
ToolBarConfiguration &GetConfiguration()
|
||||||
|
{ return mConfiguration; }
|
||||||
|
|
||||||
|
// backup gets old contents of the configuration; the configuration is
|
||||||
|
// set to the wrapped configuration.
|
||||||
|
void WrapConfiguration(ToolBarConfiguration &backup);
|
||||||
|
|
||||||
|
// Reverse what was done by WrapConfiguration.
|
||||||
|
void RestoreConfiguration(ToolBarConfiguration &backup);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@ -72,6 +321,9 @@ class ToolDock final : public wxPanel
|
|||||||
void OnMouseEvents(wxMouseEvent &event);
|
void OnMouseEvents(wxMouseEvent &event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
class LayoutVisitor;
|
||||||
|
void VisitLayout(LayoutVisitor &visitor,
|
||||||
|
ToolBarConfiguration *pWrappedConfiguration = nullptr);
|
||||||
|
|
||||||
void Updated();
|
void Updated();
|
||||||
|
|
||||||
@ -80,7 +332,12 @@ class ToolDock final : public wxPanel
|
|||||||
|
|
||||||
ToolManager *mManager;
|
ToolManager *mManager;
|
||||||
|
|
||||||
wxArrayPtrVoid mDockedBars;
|
// Stores adjacency relations that we want to realize in the dock layout
|
||||||
|
ToolBarConfiguration mConfiguration;
|
||||||
|
|
||||||
|
// Configuration as modified by the constraint of the main window width
|
||||||
|
ToolBarConfiguration mWrappedConfiguration;
|
||||||
|
|
||||||
ToolBar *mBars[ ToolBarCount ];
|
ToolBar *mBars[ ToolBarCount ];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -498,16 +498,59 @@ ToolManager::~ToolManager()
|
|||||||
delete mDown;
|
delete mDown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This table describes the default configuration of the toolbars as
|
||||||
|
// a "tree" and must be kept in pre-order traversal.
|
||||||
|
|
||||||
|
// In fact this tree is more of a broom -- nothing properly branches except
|
||||||
|
// at the root.
|
||||||
|
|
||||||
|
// "Root" corresponds to left edge of the main window, and successive siblings
|
||||||
|
// go from top to bottom. But in practice layout may wrap this abstract
|
||||||
|
// configuration if the window size is narrow.
|
||||||
|
|
||||||
|
static struct DefaultConfigEntry {
|
||||||
|
int barID;
|
||||||
|
int rightOf; // parent
|
||||||
|
int below; // preceding sibling
|
||||||
|
} DefaultConfigTable [] = {
|
||||||
|
// Top dock row, may wrap
|
||||||
|
{ TransportBarID, NoBarID, NoBarID },
|
||||||
|
{ ToolsBarID, TransportBarID, NoBarID },
|
||||||
|
{ RecordMeterBarID, ToolsBarID, NoBarID },
|
||||||
|
{ PlayMeterBarID, RecordMeterBarID, NoBarID },
|
||||||
|
{ MixerBarID, PlayMeterBarID, NoBarID },
|
||||||
|
{ EditBarID, MixerBarID, NoBarID },
|
||||||
|
{ TranscriptionBarID, EditBarID, NoBarID },
|
||||||
|
|
||||||
|
// start another top dock row
|
||||||
|
{ ScrubbingBarID, NoBarID, TransportBarID },
|
||||||
|
{ DeviceBarID, ScrubbingBarID, NoBarID },
|
||||||
|
|
||||||
|
// Hidden by default in top dock
|
||||||
|
{ MeterBarID, NoBarID, NoBarID },
|
||||||
|
|
||||||
|
// Bottom dock
|
||||||
|
{ SelectionBarID, NoBarID, NoBarID },
|
||||||
|
|
||||||
|
// Hidden by default in bottom dock
|
||||||
|
{ SpectralSelectionBarID, NoBarID, NoBarID },
|
||||||
|
};
|
||||||
|
|
||||||
void ToolManager::Reset()
|
void ToolManager::Reset()
|
||||||
{
|
{
|
||||||
int ndx;
|
|
||||||
|
|
||||||
// Disconnect all docked bars
|
// Disconnect all docked bars
|
||||||
for( ndx = 0; ndx < ToolBarCount; ndx++ )
|
for ( const auto &entry : DefaultConfigTable )
|
||||||
{
|
{
|
||||||
|
int ndx = entry.barID;
|
||||||
|
ToolBar *bar = mBars[ ndx ];
|
||||||
|
|
||||||
|
ToolBarConfiguration::Position position {
|
||||||
|
(entry.rightOf == NoBarID) ? nullptr : mBars[ entry.rightOf ],
|
||||||
|
(entry.below == NoBarID) ? nullptr : mBars[ entry.below ]
|
||||||
|
};
|
||||||
|
|
||||||
wxWindow *floater;
|
wxWindow *floater;
|
||||||
ToolDock *dock;
|
ToolDock *dock;
|
||||||
ToolBar *bar = mBars[ ndx ];
|
|
||||||
bool expose = true;
|
bool expose = true;
|
||||||
|
|
||||||
// Disconnect the bar
|
// Disconnect the bar
|
||||||
@ -558,7 +601,7 @@ void ToolManager::Reset()
|
|||||||
if( dock != NULL )
|
if( dock != NULL )
|
||||||
{
|
{
|
||||||
// when we dock, we reparent, so bar is no longer a child of floater.
|
// when we dock, we reparent, so bar is no longer a child of floater.
|
||||||
dock->Dock( bar, false );
|
dock->Dock( bar, false, position );
|
||||||
Expose( ndx, expose );
|
Expose( ndx, expose );
|
||||||
//OK (and good) to DELETE floater, as bar is no longer in it.
|
//OK (and good) to DELETE floater, as bar is no longer in it.
|
||||||
if( floater )
|
if( floater )
|
||||||
@ -598,6 +641,14 @@ void ToolManager::Reset()
|
|||||||
Updated();
|
Updated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ToolManager::RegenerateTooltips()
|
||||||
|
{
|
||||||
|
for (auto bar : mBars) {
|
||||||
|
if (bar)
|
||||||
|
bar->RegenerateTooltips();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Read the toolbar states
|
// Read the toolbar states
|
||||||
//
|
//
|
||||||
@ -605,30 +656,23 @@ void ToolManager::ReadConfig()
|
|||||||
{
|
{
|
||||||
wxString oldpath = gPrefs->GetPath();
|
wxString oldpath = gPrefs->GetPath();
|
||||||
wxArrayInt unordered[ DockCount ];
|
wxArrayInt unordered[ DockCount ];
|
||||||
int order[ DockCount ][ ToolBarCount ];
|
|
||||||
bool show[ ToolBarCount ];
|
bool show[ ToolBarCount ];
|
||||||
int width[ ToolBarCount ];
|
int width[ ToolBarCount ];
|
||||||
int height[ ToolBarCount ];
|
int height[ ToolBarCount ];
|
||||||
int x, y;
|
int x, y;
|
||||||
int dock, ord, ndx;
|
int dock, ndx;
|
||||||
|
bool someFound { false };
|
||||||
|
|
||||||
#if defined(__WXMAC__)
|
#if defined(__WXMAC__)
|
||||||
// Disable window animation
|
// Disable window animation
|
||||||
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
|
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, 1 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Invalidate all order entries
|
|
||||||
for( dock = 0; dock < DockCount; dock++ )
|
|
||||||
{
|
|
||||||
for( ord = 0; ord < ToolBarCount; ord++ )
|
|
||||||
{
|
|
||||||
order[ dock ][ ord ] = NoBarID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Change to the bar root
|
// Change to the bar root
|
||||||
gPrefs->SetPath( wxT("/GUI/ToolBars") );
|
gPrefs->SetPath( wxT("/GUI/ToolBars") );
|
||||||
|
|
||||||
|
ToolBarConfiguration::Legacy topLegacy, botLegacy;
|
||||||
|
|
||||||
// Load and apply settings for each bar
|
// Load and apply settings for each bar
|
||||||
for( ndx = 0; ndx < ToolBarCount; ndx++ )
|
for( ndx = 0; ndx < ToolBarCount; ndx++ )
|
||||||
{
|
{
|
||||||
@ -657,9 +701,27 @@ void ToolManager::ReadConfig()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Read in all the settings
|
// Read in all the settings
|
||||||
gPrefs->Read( wxT("Dock"), &dock, defaultDock );
|
gPrefs->Read( wxT("Dock"), &dock, -1);
|
||||||
gPrefs->Read( wxT("Order"), &ord, NoBarID );
|
const bool found = (dock != -1);
|
||||||
gPrefs->Read( wxT("Show"), &show[ ndx ], bShownByDefault);
|
if (found)
|
||||||
|
someFound = true;
|
||||||
|
if (!found)
|
||||||
|
dock = defaultDock;
|
||||||
|
|
||||||
|
ToolDock *d;
|
||||||
|
ToolBarConfiguration::Legacy *pLegacy;
|
||||||
|
switch(dock)
|
||||||
|
{
|
||||||
|
case TopDockID: d = mTopDock; pLegacy = &topLegacy; break;
|
||||||
|
case BotDockID: d = mBotDock; pLegacy = &botLegacy; break;
|
||||||
|
default: d = nullptr; pLegacy = nullptr; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ordered = ToolBarConfiguration::Read
|
||||||
|
(d ? &d->GetConfiguration() : nullptr,
|
||||||
|
pLegacy,
|
||||||
|
bar, show[ ndx ], bShownByDefault)
|
||||||
|
&& found;
|
||||||
|
|
||||||
gPrefs->Read( wxT("X"), &x, -1 );
|
gPrefs->Read( wxT("X"), &x, -1 );
|
||||||
gPrefs->Read( wxT("Y"), &y, -1 );
|
gPrefs->Read( wxT("Y"), &y, -1 );
|
||||||
@ -719,15 +781,8 @@ void ToolManager::ReadConfig()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// Is order within range and unoccupied?
|
|
||||||
if( ( ord >= 0 ) &&
|
if (!ordered)
|
||||||
( ord < ToolBarCount ) &&
|
|
||||||
( order[ dock - 1 ][ ord ] == NoBarID ) )
|
|
||||||
{
|
|
||||||
// Insert at ordered location
|
|
||||||
order[ dock - 1 ][ ord ] = ndx;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// These must go at the end
|
// These must go at the end
|
||||||
unordered[ dock - 1 ].Add( ndx );
|
unordered[ dock - 1 ].Add( ndx );
|
||||||
@ -768,31 +823,18 @@ void ToolManager::ReadConfig()
|
|||||||
gPrefs->SetPath( wxT("/GUI/ToolBars") );
|
gPrefs->SetPath( wxT("/GUI/ToolBars") );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mTopDock->GetConfiguration().PostRead(topLegacy);
|
||||||
|
mBotDock->GetConfiguration().PostRead(botLegacy);
|
||||||
|
|
||||||
// Add all toolbars to their target dock
|
// Add all toolbars to their target dock
|
||||||
for( dock = 0; dock < DockCount; dock++ )
|
for( dock = 0; dock < DockCount; dock++ )
|
||||||
{
|
{
|
||||||
ToolDock *d = ( dock + 1 == TopDockID ? mTopDock : mBotDock );
|
ToolDock *d = ( dock + 1 == TopDockID ? mTopDock : mBotDock );
|
||||||
|
|
||||||
// Add all ordered toolbars
|
d->LoadConfig();
|
||||||
for( ord = 0; ord < ToolBarCount; ord++ )
|
|
||||||
{
|
|
||||||
ndx = order[ dock ][ ord ];
|
|
||||||
|
|
||||||
// Bypass empty slots
|
|
||||||
if( ndx != NoBarID )
|
|
||||||
{
|
|
||||||
ToolBar *t = mBars[ ndx ];
|
|
||||||
|
|
||||||
// Dock it
|
|
||||||
d->Dock( t, false );
|
|
||||||
|
|
||||||
// Show or hide it
|
|
||||||
Expose( t->GetId(), show[ t->GetId() ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add all unordered toolbars
|
// Add all unordered toolbars
|
||||||
for( ord = 0; ord < (int) unordered[ dock ].GetCount(); ord++ )
|
for( int ord = 0; ord < (int) unordered[ dock ].GetCount(); ord++ )
|
||||||
{
|
{
|
||||||
ToolBar *t = mBars[ unordered[ dock ][ ord ] ];
|
ToolBar *t = mBars[ unordered[ dock ][ ord ] ];
|
||||||
|
|
||||||
@ -811,6 +853,9 @@ void ToolManager::ReadConfig()
|
|||||||
// Reinstate original transition
|
// Reinstate original transition
|
||||||
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
|
wxSystemOptions::SetOption( wxMAC_WINDOW_PLAIN_TRANSITION, mTransition );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!someFound)
|
||||||
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -838,13 +883,14 @@ void ToolManager::WriteConfig()
|
|||||||
gPrefs->SetPath( bar->GetSection() );
|
gPrefs->SetPath( bar->GetSection() );
|
||||||
|
|
||||||
// Search both docks for toolbar order
|
// Search both docks for toolbar order
|
||||||
int to = mTopDock->GetOrder( bar );
|
bool to = mTopDock->GetConfiguration().Contains( bar );
|
||||||
int bo = mBotDock->GetOrder( bar );
|
bool bo = mBotDock->GetConfiguration().Contains( bar );
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
gPrefs->Write( wxT("Dock"), (int) (to ? TopDockID : bo ? BotDockID : NoDockID ));
|
gPrefs->Write( wxT("Dock"), (int) (to ? TopDockID : bo ? BotDockID : NoDockID ));
|
||||||
gPrefs->Write( wxT("Order"), to + bo );
|
auto dock = to ? mTopDock : bo ? mBotDock : nullptr;
|
||||||
gPrefs->Write( wxT("Show"), IsVisible( ndx ) );
|
ToolBarConfiguration::Write
|
||||||
|
(dock ? &dock->GetConfiguration() : nullptr, bar);
|
||||||
|
|
||||||
wxPoint pos( -1, -1 );
|
wxPoint pos( -1, -1 );
|
||||||
wxSize sz = bar->GetSize();
|
wxSize sz = bar->GetSize();
|
||||||
@ -858,13 +904,17 @@ void ToolManager::WriteConfig()
|
|||||||
gPrefs->Write( wxT("W"), sz.x );
|
gPrefs->Write( wxT("W"), sz.x );
|
||||||
gPrefs->Write( wxT("H"), sz.y );
|
gPrefs->Write( wxT("H"), sz.y );
|
||||||
|
|
||||||
// Kill the bar
|
|
||||||
bar->Destroy();
|
|
||||||
|
|
||||||
// Change back to the bar root
|
// Change back to the bar root
|
||||||
gPrefs->SetPath( wxT("..") );
|
gPrefs->SetPath( wxT("..") );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kill the bars
|
||||||
|
for( ndx = 0; ndx < ToolBarCount; ndx++ )
|
||||||
|
{
|
||||||
|
ToolBar *bar = mBars[ ndx ];
|
||||||
|
bar->Destroy();
|
||||||
|
}
|
||||||
|
|
||||||
// Restore original config path
|
// Restore original config path
|
||||||
gPrefs->SetPath( oldpath );
|
gPrefs->SetPath( oldpath );
|
||||||
gPrefs->Flush();
|
gPrefs->Flush();
|
||||||
@ -1245,7 +1295,8 @@ void ToolManager::OnGrabber( GrabberEvent & event )
|
|||||||
if (mDragBar->IsDocked()) {
|
if (mDragBar->IsDocked()) {
|
||||||
mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
|
mPrevDock = dynamic_cast<ToolDock*>(mDragBar->GetParent());
|
||||||
wxASSERT(mPrevDock);
|
wxASSERT(mPrevDock);
|
||||||
mPrevSlot = mPrevDock->Find(mDragBar);
|
mPrevSlot = mPrevDock->GetConfiguration().Find(mDragBar);
|
||||||
|
mPrevDock->WrapConfiguration(mPrevConfiguration);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mPrevPosition = mDragBar->GetParent()->GetPosition();
|
mPrevPosition = mDragBar->GetParent()->GetPosition();
|
||||||
@ -1307,6 +1358,7 @@ void ToolManager::HandleEscapeKey()
|
|||||||
// Why don't you leave me alone?
|
// Why don't you leave me alone?
|
||||||
// Well, I feel so break up
|
// Well, I feel so break up
|
||||||
// I want to go home.
|
// I want to go home.
|
||||||
|
mPrevDock->RestoreConfiguration(mPrevConfiguration);
|
||||||
mPrevDock->Dock( mDragBar, true, mPrevSlot );
|
mPrevDock->Dock( mDragBar, true, mPrevSlot );
|
||||||
|
|
||||||
// Done with the floater
|
// Done with the floater
|
||||||
@ -1340,7 +1392,8 @@ void ToolManager::DoneDragging()
|
|||||||
mDragDock = NULL;
|
mDragDock = NULL;
|
||||||
mDragBar = NULL;
|
mDragBar = NULL;
|
||||||
mPrevDock = NULL;
|
mPrevDock = NULL;
|
||||||
mPrevSlot = -1;
|
mPrevSlot = { ToolBarConfiguration::UnspecifiedPosition };
|
||||||
|
mPrevConfiguration.Clear();
|
||||||
mLastPos.x = mBarPos.x = -1;
|
mLastPos.x = mBarPos.x = -1;
|
||||||
mLastPos.y = mBarPos.y = -1;
|
mLastPos.y = mBarPos.y = -1;
|
||||||
mTimer.Stop();
|
mTimer.Stop();
|
||||||
|
@ -65,6 +65,7 @@ class ToolManager final : public wxEvtHandler
|
|||||||
ToolDock *GetBotDock();
|
ToolDock *GetBotDock();
|
||||||
|
|
||||||
void Reset();
|
void Reset();
|
||||||
|
void RegenerateTooltips();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -90,7 +91,7 @@ class ToolManager final : public wxEvtHandler
|
|||||||
ToolDock *mDragDock;
|
ToolDock *mDragDock;
|
||||||
ToolBar *mDragBar {};
|
ToolBar *mDragBar {};
|
||||||
wxPoint mDragOffset;
|
wxPoint mDragOffset;
|
||||||
int mDragBefore;
|
ToolBarConfiguration::Position mDragBefore {};
|
||||||
|
|
||||||
wxPoint mLastPos;
|
wxPoint mLastPos;
|
||||||
wxRect mBarPos;
|
wxRect mBarPos;
|
||||||
@ -114,7 +115,9 @@ class ToolManager final : public wxEvtHandler
|
|||||||
|
|
||||||
wxPoint mPrevPosition {};
|
wxPoint mPrevPosition {};
|
||||||
ToolDock *mPrevDock {};
|
ToolDock *mPrevDock {};
|
||||||
int mPrevSlot {-1};
|
ToolBarConfiguration::Position mPrevSlot
|
||||||
|
{ ToolBarConfiguration::UnspecifiedPosition };
|
||||||
|
ToolBarConfiguration mPrevConfiguration;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ ToolsToolBar::~ToolsToolBar()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToolsToolBar::RegenerateToolsTooltips()
|
void ToolsToolBar::RegenerateTooltips()
|
||||||
{
|
{
|
||||||
|
|
||||||
// JKC:
|
// JKC:
|
||||||
@ -136,12 +136,28 @@ void ToolsToolBar::RegenerateToolsTooltips()
|
|||||||
// wxSafeYield(); //Deal with some queued up messages...
|
// wxSafeYield(); //Deal with some queued up messages...
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
mTool[selectTool]->SetToolTip(_("Selection Tool"));
|
|
||||||
mTool[envelopeTool]->SetToolTip(_("Envelope Tool"));
|
static const struct Entry {
|
||||||
mTool[slideTool]->SetToolTip(_("Time Shift Tool"));
|
int tool;
|
||||||
mTool[zoomTool]->SetToolTip(_("Zoom Tool"));
|
wxString commandName;
|
||||||
mTool[drawTool]->SetToolTip(_("Draw Tool"));
|
wxString untranslatedLabel;
|
||||||
mTool[multiTool]->SetToolTip(_("Multi-Tool Mode"));
|
} table[] = {
|
||||||
|
{ selectTool, wxT("SelectTool"), XO("Selection Tool") },
|
||||||
|
{ envelopeTool, wxT("EnvelopeTool"), XO("Envelope Tool") },
|
||||||
|
{ slideTool, wxT("TimeShiftTool"), XO("Time Shift Tool") },
|
||||||
|
{ zoomTool, wxT("ZoomTool"), XO("Zoom Tool") },
|
||||||
|
{ drawTool, wxT("DrawTool"), XO("Draw Tool") },
|
||||||
|
{ multiTool, wxT("MultiTool"), XO("Multi Tool") },
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<wxString> commands;
|
||||||
|
for (const auto &entry : table) {
|
||||||
|
commands.clear();
|
||||||
|
commands.push_back(wxGetTranslation(entry.untranslatedLabel));
|
||||||
|
commands.push_back(entry.commandName);
|
||||||
|
ToolBar::SetButtonToolTip(*mTool[entry.tool], commands);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wxSafeYield();
|
// wxSafeYield();
|
||||||
@ -150,7 +166,7 @@ void ToolsToolBar::RegenerateToolsTooltips()
|
|||||||
|
|
||||||
void ToolsToolBar::UpdatePrefs()
|
void ToolsToolBar::UpdatePrefs()
|
||||||
{
|
{
|
||||||
RegenerateToolsTooltips();
|
RegenerateTooltips();
|
||||||
}
|
}
|
||||||
|
|
||||||
AButton * ToolsToolBar::MakeTool( teBmps eTool,
|
AButton * ToolsToolBar::MakeTool( teBmps eTool,
|
||||||
@ -183,7 +199,7 @@ void ToolsToolBar::Populate()
|
|||||||
|
|
||||||
mTool[mCurrentTool]->PushDown();
|
mTool[mCurrentTool]->PushDown();
|
||||||
|
|
||||||
RegenerateToolsTooltips();
|
RegenerateTooltips();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the currently active tool
|
/// Gets the currently active tool
|
||||||
|
@ -70,7 +70,7 @@ class ToolsToolBar final : public ToolBar {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void RegenerateToolsTooltips();
|
void RegenerateTooltips() override;
|
||||||
wxImage *MakeToolImage(wxImage *tool, wxImage *mask, int style);
|
wxImage *MakeToolImage(wxImage *tool, wxImage *mask, int style);
|
||||||
AButton *MakeTool(teBmps eTool, int id, const wxChar *label);
|
AButton *MakeTool(teBmps eTool, int id, const wxChar *label);
|
||||||
|
|
||||||
|
@ -298,7 +298,25 @@ void TranscriptionToolBar::UpdatePrefs()
|
|||||||
|
|
||||||
void TranscriptionToolBar::RegenerateTooltips()
|
void TranscriptionToolBar::RegenerateTooltips()
|
||||||
{
|
{
|
||||||
mButtons[TTB_PlaySpeed]->SetToolTip(_("Play-at-speed"));
|
// We could also mention the shift- and ctrl-modified versions in the
|
||||||
|
// tool tip... but it would get long
|
||||||
|
|
||||||
|
static const struct Entry {
|
||||||
|
int tool;
|
||||||
|
wxString commandName;
|
||||||
|
wxString untranslatedLabel;
|
||||||
|
} table[] = {
|
||||||
|
{ TTB_PlaySpeed, wxT("PlayAtSpeed"), XO("Play-at-speed") },
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<wxString> commands;
|
||||||
|
for (const auto &entry : table) {
|
||||||
|
commands.clear();
|
||||||
|
commands.push_back(wxGetTranslation(entry.untranslatedLabel));
|
||||||
|
commands.push_back(entry.commandName);
|
||||||
|
ToolBar::SetButtonToolTip(*mButtons[entry.tool], commands);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_VOICE_DETECTION
|
#ifdef EXPERIMENTAL_VOICE_DETECTION
|
||||||
mButtons[TTB_StartOn]->SetToolTip(TRANSLATABLE("Left-to-On"));
|
mButtons[TTB_StartOn]->SetToolTip(TRANSLATABLE("Left-to-On"));
|
||||||
|
@ -131,7 +131,7 @@ class TranscriptionToolBar final : public ToolBar {
|
|||||||
int id, unsigned altIdx);
|
int id, unsigned altIdx);
|
||||||
void GetSamples(WaveTrack *t, sampleCount *s0, sampleCount *slen);
|
void GetSamples(WaveTrack *t, sampleCount *s0, sampleCount *slen);
|
||||||
void SetButton(bool newstate, AButton *button);
|
void SetButton(bool newstate, AButton *button);
|
||||||
void RegenerateTooltips();
|
void RegenerateTooltips() override;
|
||||||
|
|
||||||
AButton *mButtons[TTBNumButtons];
|
AButton *mButtons[TTBNumButtons];
|
||||||
wxImage *upImage;
|
wxImage *upImage;
|
||||||
|
@ -426,8 +426,20 @@ void AButton::OnMouseEvent(wxMouseEvent & event)
|
|||||||
if (newState != prevState) {
|
if (newState != prevState) {
|
||||||
Refresh(false);
|
Refresh(false);
|
||||||
|
|
||||||
|
if (mCursorIsInWindow)
|
||||||
|
UpdateStatus();
|
||||||
|
else {
|
||||||
|
GetActiveProject()->TP_DisplayStatusMessage(wxT(""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AButton::UpdateStatus()
|
||||||
|
{
|
||||||
if (mCursorIsInWindow) {
|
if (mCursorIsInWindow) {
|
||||||
#if wxUSE_TOOLTIPS // Not available in wxX11
|
#if wxUSE_TOOLTIPS // Not available in wxX11
|
||||||
// Display the tooltip in the status bar
|
// Display the tooltip in the status bar
|
||||||
wxToolTip * pTip = this->GetToolTip();
|
wxToolTip * pTip = this->GetToolTip();
|
||||||
if( pTip ) {
|
if( pTip ) {
|
||||||
@ -436,14 +448,8 @@ void AButton::OnMouseEvent(wxMouseEvent & event)
|
|||||||
tipText += _(" (disabled)");
|
tipText += _(" (disabled)");
|
||||||
GetActiveProject()->TP_DisplayStatusMessage(tipText);
|
GetActiveProject()->TP_DisplayStatusMessage(tipText);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
GetActiveProject()->TP_DisplayStatusMessage(wxT(""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
event.Skip();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AButton::OnCaptureLost(wxMouseCaptureLostEvent & WXUNUSED(event))
|
void AButton::OnCaptureLost(wxMouseCaptureLostEvent & WXUNUSED(event))
|
||||||
|
@ -99,6 +99,11 @@ class AButton final : public wxWindow {
|
|||||||
void OnPaint(wxPaintEvent & event);
|
void OnPaint(wxPaintEvent & event);
|
||||||
void OnSize(wxSizeEvent & event);
|
void OnSize(wxSizeEvent & event);
|
||||||
void OnMouseEvent(wxMouseEvent & event);
|
void OnMouseEvent(wxMouseEvent & event);
|
||||||
|
|
||||||
|
// Update the status bar message if the pointer is in the button.
|
||||||
|
// Else do nothing.
|
||||||
|
void UpdateStatus();
|
||||||
|
|
||||||
void OnCaptureLost(wxMouseCaptureLostEvent & event);
|
void OnCaptureLost(wxMouseCaptureLostEvent & event);
|
||||||
void OnKeyDown(wxKeyEvent & event);
|
void OnKeyDown(wxKeyEvent & event);
|
||||||
void OnSetFocus(wxFocusEvent & event);
|
void OnSetFocus(wxFocusEvent & event);
|
||||||
|
@ -2060,19 +2060,6 @@ void AdornedRulerPanel::UpdatePrefs()
|
|||||||
RegenerateTooltips(mPrevZone);
|
RegenerateTooltips(mPrevZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
wxString ComposeButtonLabel
|
|
||||||
(AudacityProject &project, const wxString &commandName, const wxString &label)
|
|
||||||
{
|
|
||||||
auto pCmdMgr = project.GetCommandManager();
|
|
||||||
const auto &keyString = pCmdMgr->GetKeyFromName(commandName);
|
|
||||||
return keyString.empty()
|
|
||||||
? label
|
|
||||||
: label + wxT(" (") + keyString + wxT(")");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdornedRulerPanel::ReCreateButtons()
|
void AdornedRulerPanel::ReCreateButtons()
|
||||||
{
|
{
|
||||||
for (auto & button : mButtons) {
|
for (auto & button : mButtons) {
|
||||||
@ -2797,10 +2784,14 @@ void AdornedRulerPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event))
|
|||||||
void AdornedRulerPanel::UpdateButtonStates()
|
void AdornedRulerPanel::UpdateButtonStates()
|
||||||
{
|
{
|
||||||
auto common = [this]
|
auto common = [this]
|
||||||
(wxWindow *button, const wxString &commandName, const wxString &label){
|
(AButton &button, const wxString &commandName, const wxString &label) {
|
||||||
const auto &fullLabel = ComposeButtonLabel(*mProject, commandName, label);
|
std::vector<wxString> commands;
|
||||||
button->SetLabel(fullLabel);
|
commands.push_back(label);
|
||||||
button->SetToolTip(fullLabel);
|
commands.push_back(commandName);
|
||||||
|
ToolBar::SetButtonToolTip(button, commands);
|
||||||
|
button.SetLabel(button.GetToolTipText());
|
||||||
|
|
||||||
|
button.UpdateStatus();
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -2813,7 +2804,7 @@ void AdornedRulerPanel::UpdateButtonStates()
|
|||||||
// (which is, to toggle the state)
|
// (which is, to toggle the state)
|
||||||
? _("Pinned play/record Head")
|
? _("Pinned play/record Head")
|
||||||
: _("Unpinned play/record Head");
|
: _("Unpinned play/record Head");
|
||||||
common(pinButton, wxT("PinnedHead"), label);
|
common(*pinButton, wxT("PinnedHead"), label);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &scrubber = mProject->GetScrubber();
|
auto &scrubber = mProject->GetScrubber();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user