mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-15 23:59:37 +02:00
Rewrite QuickFix button (Dark Audacity) without SetClientData...
... Instead, it's easier to capture data in a lambda and use Bind. Eliminates client data, casting, and use of the fields of the event object.
This commit is contained in:
parent
47fa55c4b7
commit
9dfa8f205c
@ -98,19 +98,20 @@ void ShowDiagnostics(
|
||||
*/
|
||||
class QuickFixDialog : public wxDialogWrapper
|
||||
{
|
||||
public:
|
||||
public:
|
||||
using PrefSetter = std::function< void() > ;
|
||||
|
||||
QuickFixDialog(wxWindow * pParent, AudacityProject &project);
|
||||
void Populate();
|
||||
void PopulateOrExchange(ShuttleGui & S);
|
||||
void AddStuck( ShuttleGui & S, bool & bBool, wxString Pref,
|
||||
void AddStuck( ShuttleGui & S, bool & bBool,
|
||||
const PrefSetter &prefSetter,
|
||||
const TranslatableString &Prompt, wxString Help );
|
||||
|
||||
void OnOk(wxCommandEvent &event);
|
||||
void OnCancel(wxCommandEvent &event);
|
||||
void OnHelp(wxCommandEvent &event);
|
||||
void OnFix(wxCommandEvent &event);
|
||||
|
||||
wxString StringFromEvent( wxCommandEvent &event );
|
||||
void OnHelp(const wxString &Str);
|
||||
void OnFix(const PrefSetter &setter, wxWindowID id);
|
||||
|
||||
AudacityProject &mProject;
|
||||
|
||||
@ -121,16 +122,13 @@ public:
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
||||
#define FixButtonID 7001
|
||||
#define HelpButtonID 7011
|
||||
#define FakeButtonID 7021
|
||||
|
||||
BEGIN_EVENT_TABLE(QuickFixDialog, wxDialogWrapper)
|
||||
EVT_BUTTON(wxID_OK, QuickFixDialog::OnOk)
|
||||
EVT_BUTTON(wxID_CANCEL, QuickFixDialog::OnCancel)
|
||||
EVT_BUTTON(wxID_HELP, QuickFixDialog::OnHelp)
|
||||
EVT_COMMAND_RANGE(FixButtonID, HelpButtonID-1, wxEVT_BUTTON, QuickFixDialog::OnFix)
|
||||
EVT_COMMAND_RANGE(HelpButtonID, FakeButtonID-1, wxEVT_BUTTON, QuickFixDialog::OnHelp)
|
||||
END_EVENT_TABLE();
|
||||
|
||||
QuickFixDialog::QuickFixDialog(wxWindow * pParent, AudacityProject &project) :
|
||||
@ -160,16 +158,24 @@ QuickFixDialog::QuickFixDialog(wxWindow * pParent, AudacityProject &project) :
|
||||
Center();
|
||||
}
|
||||
|
||||
void QuickFixDialog::AddStuck(
|
||||
ShuttleGui & S, bool & bBool, wxString Pref,
|
||||
void QuickFixDialog::AddStuck( ShuttleGui & S, bool & bBool,
|
||||
const PrefSetter &prefSetter,
|
||||
const TranslatableString &Prompt, wxString Help )
|
||||
{
|
||||
mItem++;
|
||||
wxWindowID id = FixButtonID + mItem;
|
||||
if( !bBool)
|
||||
return;
|
||||
S.AddFixedText( Prompt );
|
||||
S.Id(FixButtonID + mItem).AddButton( XXO("Fix") )->SetClientObject(
|
||||
safenew wxStringClientData(Pref));
|
||||
|
||||
S
|
||||
.AddFixedText( Prompt );
|
||||
|
||||
S
|
||||
.Id( id )
|
||||
.AddButton( XXO("Fix") )
|
||||
->Bind( wxEVT_BUTTON, [this, prefSetter, id](wxCommandEvent&){
|
||||
OnFix( prefSetter, id );
|
||||
} );
|
||||
|
||||
{
|
||||
// Replace standard Help button with smaller icon button.
|
||||
@ -177,7 +183,9 @@ void QuickFixDialog::AddStuck(
|
||||
auto b = safenew wxBitmapButton(S.GetParent(), HelpButtonID+mItem, theTheme.Bitmap( bmpHelpIcon ));
|
||||
b->SetToolTip( _("Help") );
|
||||
b->SetLabel(_("Help")); // for screen readers
|
||||
b->SetClientObject( safenew wxStringClientData( Help ));
|
||||
b->Bind( wxEVT_BUTTON, [this, Help](const wxCommandEvent&){
|
||||
OnHelp( Help );
|
||||
} );
|
||||
S.AddWindow( b );
|
||||
}
|
||||
}
|
||||
@ -200,13 +208,38 @@ void QuickFixDialog::PopulateOrExchange(ShuttleGui & S)
|
||||
{
|
||||
mItem = -1;
|
||||
|
||||
auto defaultAction =
|
||||
[](AudacityProject *pProject, const wxString &path){ return
|
||||
[pProject, path]{
|
||||
gPrefs->Write(path, 0);
|
||||
gPrefs->Flush();
|
||||
// This is overkill (aka slow), as all preferences are
|
||||
// reloaded and all
|
||||
// toolbars recreated.
|
||||
// Overkill probably doesn't matter, as this command is
|
||||
// infrequently used.
|
||||
DoReloadPreferences( *pProject );
|
||||
};
|
||||
};
|
||||
|
||||
// Use # in the URLs to ensure we go to the online version of help.
|
||||
// Local help may well not be installed.
|
||||
AddStuck( S, mbSyncLocked, "/GUI/SyncLockTracks",
|
||||
auto pProject = &mProject;
|
||||
AddStuck( S, mbSyncLocked,
|
||||
defaultAction( pProject, "/GUI/SyncLockTracks" ),
|
||||
XO("Clocks on the Tracks"), "Quick_Fix#sync_lock" );
|
||||
AddStuck( S, mbInSnapTo, "/SnapTo",
|
||||
AddStuck( S, mbInSnapTo,
|
||||
[pProject] {
|
||||
gPrefs->Write( "/SnapTo", 0 );
|
||||
gPrefs->Flush();
|
||||
// Sadly SnapTo has to be handled specially,
|
||||
// as it is not part of the standard
|
||||
// preference dialogs.
|
||||
ProjectSelectionManager::Get( *pProject ).AS_SetSnapTo( 0 );
|
||||
},
|
||||
XO("Can't select precisely"), "Quick_Fix#snap_to" );
|
||||
AddStuck( S, mbSoundActivated, "/AudioIO/SoundActivatedRecord",
|
||||
AddStuck( S, mbSoundActivated,
|
||||
defaultAction( pProject, "/AudioIO/SoundActivatedRecord" ),
|
||||
XO("Recording stops and starts"),
|
||||
"Quick_Fix#sound_activated_recording" );
|
||||
}
|
||||
@ -222,8 +255,9 @@ void QuickFixDialog::PopulateOrExchange(ShuttleGui & S)
|
||||
|
||||
wxButton * pBtn = (wxButton*)FindWindowById( wxID_HELP );
|
||||
if( pBtn )
|
||||
pBtn->SetClientObject( safenew wxStringClientData( "Quick_Fix#" ));
|
||||
|
||||
pBtn->Bind( wxEVT_BUTTON, [this]( const wxCommandEvent & ){
|
||||
OnHelp( "Quick_Fix#" );
|
||||
} );
|
||||
}
|
||||
|
||||
void QuickFixDialog::OnOk(wxCommandEvent &event)
|
||||
@ -238,55 +272,18 @@ void QuickFixDialog::OnCancel(wxCommandEvent &event)
|
||||
EndModal(wxID_CANCEL);
|
||||
}
|
||||
|
||||
wxString QuickFixDialog::StringFromEvent( wxCommandEvent &event )
|
||||
void QuickFixDialog::OnHelp(const wxString &Str)
|
||||
{
|
||||
wxButton * pBtn = (wxButton*)event.GetEventObject();
|
||||
if( !pBtn ){
|
||||
wxFAIL_MSG( "Event Object not found");
|
||||
return "";
|
||||
}
|
||||
wxStringClientData * pStrCd = (wxStringClientData*)(pBtn->GetClientObject());
|
||||
if( !pStrCd ){
|
||||
wxFAIL_MSG( "Client Data not found");
|
||||
return "";
|
||||
}
|
||||
wxString Str = pStrCd->GetData();
|
||||
if( Str.empty()){
|
||||
wxFAIL_MSG( "String data empty");
|
||||
return "";
|
||||
}
|
||||
return Str;
|
||||
HelpSystem::ShowHelp(this, Str, true);
|
||||
}
|
||||
|
||||
void QuickFixDialog::OnHelp(wxCommandEvent &event)
|
||||
void QuickFixDialog::OnFix(const PrefSetter &setter, wxWindowID id)
|
||||
{
|
||||
HelpSystem::ShowHelp(this, StringFromEvent( event ), true);
|
||||
}
|
||||
|
||||
void QuickFixDialog::OnFix(wxCommandEvent &event)
|
||||
{
|
||||
wxString Str = StringFromEvent( event );
|
||||
gPrefs->Write( Str, 0);
|
||||
gPrefs->Flush();
|
||||
|
||||
{
|
||||
// Sadly SnapTo has to be handled specially, as it is not part of the standard
|
||||
// preference dialogs.
|
||||
if( Str == "/SnapTo" )
|
||||
{
|
||||
ProjectSelectionManager::Get( mProject ).AS_SetSnapTo( 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is overkill (aka slow), as all preferences are reloaded and all
|
||||
// toolbars recreated.
|
||||
// Overkill probably doesn't matter, as this command is infrequently used.
|
||||
DoReloadPreferences( mProject );
|
||||
}
|
||||
}
|
||||
if ( setter )
|
||||
setter();
|
||||
|
||||
// Change the label after doing the fix, as the fix may take a second or two.
|
||||
wxButton * pBtn = (wxButton*)event.GetEventObject();
|
||||
auto pBtn = FindWindow(id);
|
||||
if( pBtn )
|
||||
pBtn->SetLabel( _("Fixed") );
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user