From 7b6cbeec22a8d55588109e97cd0e2faab1dce0c8 Mon Sep 17 00:00:00 2001 From: lllucius Date: Tue, 16 Dec 2014 21:41:58 +0000 Subject: [PATCH] Distinct button bars for graphical and textual modes This bit the textual mode plain old text based buttons and retains the bitmap buttons for graphical mode. It also allowed me to remove the manual accelerator table building (no access keys in GUI mode) which was a good thing as I really didn't know if the was gonna work for non-English keyboards anyway. --- include/audacity/EffectInterface.h | 1 + src/effects/Effect.cpp | 259 ++++++++++++--------- src/effects/Effect.h | 17 +- src/effects/VST/VSTEffect.cpp | 5 + src/effects/VST/VSTEffect.h | 1 + src/effects/audiounits/AudioUnitEffect.cpp | 5 + src/effects/audiounits/AudioUnitEffect.h | 1 + src/effects/ladspa/LadspaEffect.cpp | 5 + src/effects/ladspa/LadspaEffect.h | 1 + 9 files changed, 181 insertions(+), 114 deletions(-) diff --git a/include/audacity/EffectInterface.h b/include/audacity/EffectInterface.h index 0e20543d3..de862919c 100644 --- a/include/audacity/EffectInterface.h +++ b/include/audacity/EffectInterface.h @@ -158,6 +158,7 @@ public: virtual void SetUIHost(EffectUIHostInterface *host) = 0; virtual bool PopulateUI(wxWindow *parent) = 0; + virtual bool IsGraphicalUI() = 0; virtual bool ValidateUI() = 0; virtual bool HideUI() = 0; virtual bool CloseUI() = 0; diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index acaec6a67..b6b48deae 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -2148,52 +2148,11 @@ bool EffectUIHost::Initialize() mCapturing = gAudioIO->IsStreamActive() && gAudioIO->GetNumCaptureChannels() > 0; wxPanel *bar = new wxPanel(this, wxID_ANY); - wxBoxSizer *bs = new wxBoxSizer(wxHORIZONTAL); - bar->SetSizer(bs); - - mMenuBtn = new wxBitmapButton(bar, kMenuID, CreateBitmap(effect_menu_xpm, true, false)); - SetLabelAndTip(mMenuBtn, _("&Manage")); - bs->Add(mMenuBtn); - - mOnBM = CreateBitmap(effect_on_xpm, true, false); - mOffBM = CreateBitmap(effect_off_xpm, true, false); - mOffDisabledBM = CreateBitmap(effect_off_disabled_xpm, true, false); - mPowerBtn = new wxBitmapButton(bar, kPowerID, mOnBM); - mPowerBtn->SetBitmapDisabled(mOffDisabledBM); - bs->Add(mPowerBtn); - - bs->Add(5, 5); - - mPlayBM = CreateBitmap(effect_play_xpm, true, false); - mPlayDisabledBM = CreateBitmap(effect_play_disabled_xpm, true, false); - mStopBM = CreateBitmap(effect_stop_xpm, true, false); - mStopDisabledBM = CreateBitmap(effect_stop_disabled_xpm, true, false); - mPlayBtn = new wxBitmapButton(bar, kPlayID, mPlayBM); - mPlayBtn->SetBitmapDisabled(mPlayDisabledBM); - bs->Add(mPlayBtn); - - mRewindBtn = new wxBitmapButton(bar, kRewindID, CreateBitmap(effect_rewind_xpm, true, true)); - mRewindBtn->SetBitmapDisabled(CreateBitmap(effect_rewind_disabled_xpm, true, true)); - SetLabelAndTip(mRewindBtn, _("Skip &backward")); - bs->Add(mRewindBtn); - - mFFwdBtn = new wxBitmapButton(bar, kFFwdID, CreateBitmap(effect_ffwd_xpm, true, true)); - mFFwdBtn->SetBitmapDisabled(CreateBitmap(effect_ffwd_disabled_xpm, true, true)); - SetLabelAndTip(mFFwdBtn, _("Skip &forward")); - bs->Add(mFFwdBtn); - - // All done...generate and set the accelerator table - SetLabelAndTip(NULL); - - bar->SetSizerAndFit(bs); - wxSizer *s = CreateStdButtonSizer(this, eApplyButton | eCloseButton, bar); mApplyBtn = (wxButton *) FindWindowById(wxID_APPLY); mCloseBtn = (wxButton *) FindWindowById(wxID_CANCEL); - UpdateControls(); - hs->Add(w, 1, wxEXPAND); vs->Add(hs, 1, wxEXPAND); vs->Add(s, 0, wxEXPAND | wxALIGN_CENTER_VERTICAL); @@ -2204,6 +2163,93 @@ bool EffectUIHost::Initialize() return false; } + mIsGUI = mClient->IsGraphicalUI(); + + wxBoxSizer *bs = new wxBoxSizer(wxHORIZONTAL); + bar->SetSizer(bs); + + wxBitmapButton *bb; + + if (!mIsGUI) + { + mMenuBtn = new wxButton(bar, kMenuID, _("&Manage")); + } + else + { + mMenuBtn = new wxBitmapButton(bar, kMenuID, CreateBitmap(effect_menu_xpm, true, false)); + } + mMenuBtn->SetToolTip(_("Manage presets and options")); + bs->Add(mMenuBtn); + + if (!mIsGUI) + { + mPowerToggleBtn = new wxButton(bar, kPowerID, _("Turn Power &On")); + mPowerToggleBtn->SetToolTip(_("Power effect on or off (enable or disable")); + bs->Add(mPowerToggleBtn); + } + else + { + mOnBM = CreateBitmap(effect_on_xpm, true, false); + mOffBM = CreateBitmap(effect_off_xpm, true, false); + mOffDisabledBM = CreateBitmap(effect_off_disabled_xpm, true, false); + bb = new wxBitmapButton(bar, kPowerID, mOnBM); + bb->SetBitmapDisabled(mOffDisabledBM); + mPowerBtn = bb; + mPowerBtn->SetToolTip(_("Power effect on or off (enable or disable")); + bs->Add(mPowerBtn); + } + + bs->Add(5, 5); + + if (!mIsGUI) + { + mPlayToggleBtn = new wxButton(bar, kPlayID, _("Start &Playback")); + mPlayToggleBtn->SetToolTip(_("Start and stop playback")); + bs->Add(mPlayToggleBtn); + } + else + { + mPlayBM = CreateBitmap(effect_play_xpm, true, false); + mPlayDisabledBM = CreateBitmap(effect_play_disabled_xpm, true, false); + mStopBM = CreateBitmap(effect_stop_xpm, true, false); + mStopDisabledBM = CreateBitmap(effect_stop_disabled_xpm, true, false); + bb = new wxBitmapButton(bar, kPlayID, mPlayBM); + bb->SetBitmapDisabled(mPlayDisabledBM); + mPlayBtn = bb; + mPlayBtn->SetToolTip(_("Start and stop playback")); + bs->Add(mPlayBtn); + } + + if (!mIsGUI) + { + mRewindBtn = new wxButton(bar, kRewindID, _("Skip &Backward")); + } + else + { + bb = new wxBitmapButton(bar, kRewindID, CreateBitmap(effect_rewind_xpm, true, true)); + bb->SetBitmapDisabled(CreateBitmap(effect_rewind_disabled_xpm, true, true)); + mRewindBtn = bb; + } + mRewindBtn->SetToolTip(_("Skip backward")); + bs->Add(mRewindBtn); + + if (!mIsGUI) + { + mFFwdBtn = new wxButton(bar, kFFwdID, _("Skip &Forward")); + } + else + { + bb = new wxBitmapButton(bar, kFFwdID, CreateBitmap(effect_ffwd_xpm, true, true)); + bb->SetBitmapDisabled(CreateBitmap(effect_ffwd_disabled_xpm, true, true)); + mFFwdBtn = bb; + } + mFFwdBtn->SetToolTip(_("Skip forward")); + bs->Add(mFFwdBtn); + + UpdateControls(); + + bar->Layout(); + bar->Fit(); Layout(); Fit(); Center(); @@ -2705,91 +2751,88 @@ wxBitmap EffectUIHost::CreateBitmap(const char *xpm[], bool up, bool pusher) return mod; } -// We use an accelerator table in addition to the normal "&" mnemonic -// so that they work on Windows and GTK...no accelerators on OSX and -// the wxBitmapButton under GTK didn't seem to like the mnemonics. -// -// On Windows, this also keeps the focus from jumping to the associated -// button, forcing keyboard users to have to constantly TAB back to the -// control they were on. This problem appears to be related to the use -// of wxBitmapButton and how it is currently implemented in wx2.8.12. -// -// I'm hoping that when we transition to wx3 all of this can go away. -void EffectUIHost::SetLabelAndTip(wxBitmapButton *btn, const wxString & label, bool setAccel) -{ - if (btn != NULL) - { - size_t pos = label.Find(wxT('&')); - if (pos != wxNOT_FOUND && pos < label.Length() - 1) - { - wxChar c = wxToupper(label[pos + 1]); - if (setAccel) - { - mAccels.Add(wxAcceleratorEntry(wxACCEL_ALT, c, btn->GetId())); - } -#if defined(__WXMAC__) - btn->SetName(label); -#else - btn->SetLabel(label); -#endif - btn->SetToolTip(wxStripMenuCodes(label) -#if !defined(__WXMAC__) - + wxT(" (ALT+") + c + wxT(")") -#endif - ); - } - } - else - { - wxAcceleratorEntry *entries = new wxAcceleratorEntry[mAccels.GetCount()]; - for (size_t i = 0, cnt = mAccels.GetCount(); i < cnt; i++) - { - entries[i] = mAccels[i]; - } - SetAcceleratorTable(wxAcceleratorTable(mAccels.GetCount(), entries)); - delete [] entries; - mAccels.Empty(); - } -} - void EffectUIHost::UpdateControls() { mApplyBtn->Enable(!mCapturing); - mPowerBtn->Enable(!mCapturing); - mPlayBtn->Enable(!mCapturing); mRewindBtn->Enable(!mCapturing); mFFwdBtn->Enable(!mCapturing); + wxBitmapButton *bb; + if (mPlaying) { - mPlayBtn->SetBitmapLabel(mStopBM); - mPlayBtn->SetBitmapDisabled(mStopDisabledBM); - /* i18n-hint: The access key "&P" should be the same in - "Stop &Playback" and "Start &Playback" */ - SetLabelAndTip(mPlayBtn, _("Stop &Playback"), false); + if (!mIsGUI) + { + /* i18n-hint: The access key "&P" should be the same in + "Stop &Playback" and "Start &Playback" */ + mPlayToggleBtn->SetLabel(_("Stop &Playback")); + //mPlayToggleBtn->SetValue(true); + mPlayToggleBtn->Enable(!mCapturing); + mPlayToggleBtn->Refresh(); + } + else + { + bb = (wxBitmapButton *) mPlayBtn; + bb->SetBitmapLabel(mStopBM); + bb->SetBitmapDisabled(mStopDisabledBM); + mPlayBtn->Enable(!mCapturing); + } } else { - mPlayBtn->SetBitmapLabel(mPlayBM); - mPlayBtn->SetBitmapDisabled(mPlayDisabledBM); - /* i18n-hint: The access key "&P" should be the same in - "Stop &Playback" and "Start &Playback" */ - SetLabelAndTip(mPlayBtn, _("Start &Playback"), false); + if (!mIsGUI) + { + /* i18n-hint: The access key "&P" should be the same in + "Stop &Playback" and "Start &Playback" */ + mPlayToggleBtn->SetLabel(_("Start &Playback")); + //mPlayToggleBtn->SetValue(false); + mPlayToggleBtn->Enable(!mCapturing); + mPlayToggleBtn->Refresh(); + } + else + { + bb = (wxBitmapButton *) mPlayBtn; + bb->SetBitmapLabel(mPlayBM); + bb->SetBitmapDisabled(mPlayDisabledBM); + mPlayBtn->Enable(!mCapturing); + } } if (mPowerOn) { - mPowerBtn->SetBitmapLabel(mOnBM); - /* i18n-hint: The access key "&O" should be the same in - "Turn Power &Off" and "Turn Power &On" */ - SetLabelAndTip(mPowerBtn, _("Turn Power &Off"), false); + if (!mIsGUI) + { + /* i18n-hint: The access key "&O" should be the same in + "Turn Power &Off" and "Turn Power &On" */ + mPowerToggleBtn->SetLabel(_("Turn Power &Off")); + //mPowerToggleBtn->SetValue(true); + mPowerToggleBtn->Enable(!mCapturing); + mPowerToggleBtn->Refresh(); + } + else + { + bb = (wxBitmapButton *) mPowerBtn; + bb->SetBitmapLabel(mOnBM); + mPowerBtn->Enable(!mCapturing); + } } else { - mPowerBtn->SetBitmapLabel(mOffBM); - /* i18n-hint: The access key "&O" should be the same in - "Turn Power &Off" and "Turn Power &On" */ - SetLabelAndTip(mPowerBtn, _("Turn Power &On"), false); + if (!mIsGUI) + { + /* i18n-hint: The access key "&O" should be the same in + "Turn Power &Off" and "Turn Power &On" */ + mPowerToggleBtn->SetLabel(_("Turn Power &On")); + //mPowerToggleBtn->SetValue(false); + mPowerToggleBtn->Enable(!mCapturing); + mPowerToggleBtn->Refresh(); + } + else + { + bb = (wxBitmapButton *) mPowerBtn; + bb->SetBitmapLabel(mOffBM); + mPowerBtn->Enable(!mCapturing); + } } } diff --git a/src/effects/Effect.h b/src/effects/Effect.h index aa140fec9..9ee1829ad 100644 --- a/src/effects/Effect.h +++ b/src/effects/Effect.h @@ -18,6 +18,7 @@ #include #include #include +#include class wxDialog; class wxWindow; @@ -519,7 +520,6 @@ private: void UpdateControls(); wxBitmap CreateBitmap(const char *xpm[], bool up, bool pusher); - void SetLabelAndTip(wxBitmapButton *btn, const wxString & label = wxEmptyString, bool setAccel = true); void LoadUserPresets(); private: @@ -530,13 +530,18 @@ private: wxArrayString mUserPresets; bool mInitialized; + bool mIsGUI; + wxButton *mApplyBtn; wxButton *mCloseBtn; - wxBitmapButton *mMenuBtn; - wxBitmapButton *mPowerBtn; - wxBitmapButton *mPlayBtn; - wxBitmapButton *mRewindBtn; - wxBitmapButton *mFFwdBtn; + wxButton *mMenuBtn; + wxButton *mPowerBtn; + wxButton *mPlayBtn; + wxButton *mRewindBtn; + wxButton *mFFwdBtn; + + wxButton *mPowerToggleBtn; + wxButton *mPlayToggleBtn; wxBitmap mPlayBM; wxBitmap mPlayDisabledBM; diff --git a/src/effects/VST/VSTEffect.cpp b/src/effects/VST/VSTEffect.cpp index b5f5dc4d6..0f23810e4 100644 --- a/src/effects/VST/VSTEffect.cpp +++ b/src/effects/VST/VSTEffect.cpp @@ -2158,6 +2158,11 @@ bool VSTEffect::PopulateUI(wxWindow *parent) return true; } +bool VSTEffect::IsGraphicalUI() +{ + return mGui; +} + bool VSTEffect::ValidateUI() { return true; diff --git a/src/effects/VST/VSTEffect.h b/src/effects/VST/VSTEffect.h index c99f42436..82dc17e2d 100644 --- a/src/effects/VST/VSTEffect.h +++ b/src/effects/VST/VSTEffect.h @@ -132,6 +132,7 @@ class VSTEffect : public EffectClientInterface, virtual void SetUIHost(EffectUIHostInterface *host); virtual bool PopulateUI(wxWindow *parent); + virtual bool IsGraphicalUI(); virtual bool ValidateUI(); virtual bool HideUI(); virtual bool CloseUI(); diff --git a/src/effects/audiounits/AudioUnitEffect.cpp b/src/effects/audiounits/AudioUnitEffect.cpp index 7e862edd9..1d3455ca0 100644 --- a/src/effects/audiounits/AudioUnitEffect.cpp +++ b/src/effects/audiounits/AudioUnitEffect.cpp @@ -1988,6 +1988,11 @@ bool AudioUnitEffect::PopulateUI(wxWindow *parent) return true; } +bool AudioUnitEffect::IsGraphicalUI() +{ + return !mIsGeneric; +} + bool AudioUnitEffect::ValidateUI() { #if 0 diff --git a/src/effects/audiounits/AudioUnitEffect.h b/src/effects/audiounits/AudioUnitEffect.h index 22107ae04..9bf4f293e 100644 --- a/src/effects/audiounits/AudioUnitEffect.h +++ b/src/effects/audiounits/AudioUnitEffect.h @@ -106,6 +106,7 @@ public: virtual void SetUIHost(EffectUIHostInterface *host); virtual bool PopulateUI(wxWindow *parent); + virtual bool IsGraphicalUI(); virtual bool ValidateUI(); virtual bool HideUI(); virtual bool CloseUI(); diff --git a/src/effects/ladspa/LadspaEffect.cpp b/src/effects/ladspa/LadspaEffect.cpp index c5aca6ad0..5174180e8 100644 --- a/src/effects/ladspa/LadspaEffect.cpp +++ b/src/effects/ladspa/LadspaEffect.cpp @@ -1356,6 +1356,11 @@ bool LadspaEffect::PopulateUI(wxWindow *parent) return true; } +bool LadspaEffect::IsGraphicalUI() +{ + return false; +} + bool LadspaEffect::ValidateUI() { if (!mParent->Validate()) diff --git a/src/effects/ladspa/LadspaEffect.h b/src/effects/ladspa/LadspaEffect.h index 012bb2122..46fece7c5 100644 --- a/src/effects/ladspa/LadspaEffect.h +++ b/src/effects/ladspa/LadspaEffect.h @@ -103,6 +103,7 @@ public: virtual void SetUIHost(EffectUIHostInterface *host); virtual bool PopulateUI(wxWindow *parent); + virtual bool IsGraphicalUI(); virtual bool ValidateUI(); virtual bool HideUI(); virtual bool CloseUI();