Derive DIALOG_MULTI_OPTIONS from wxMultiChoiceDialog

This commit is contained in:
Maciej Suminski 2018-03-02 17:54:03 +01:00
parent be13bb0013
commit 3f1a3fe65b
3 changed files with 32 additions and 61 deletions

View File

@ -292,73 +292,47 @@ int SelectSingleOption( wxWindow* aParent, const wxString& aTitle, const wxStrin
}
class DIALOG_MULTI_OPTIONS : public wxDialog
class DIALOG_MULTI_OPTIONS : public wxMultiChoiceDialog
{
public:
DIALOG_MULTI_OPTIONS( wxWindow* aParent, const wxString& aTitle, const wxString& aMessage,
const wxArrayString& aOptions )
: wxDialog( aParent, wxID_ANY, aTitle )
: wxMultiChoiceDialog( aParent, aMessage, aTitle, aOptions ),
m_optionsCount( aOptions.GetCount() )
{
SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
if( !aMessage.IsEmpty() )
boxSizer->Add( new wxStaticText( this, wxID_ANY, aMessage ), 0, wxEXPAND | wxALL, 5 );
m_checklist = new wxCheckListBox( this, wxID_ANY );
for( const wxString& option : aOptions )
m_checklist->Append( option );
boxSizer->Add( m_checklist, 1, wxEXPAND | wxALL, 5 );
wxBoxSizer* btnSizer = new wxBoxSizer( wxHORIZONTAL );
wxButton* selectAll = new wxButton( this, wxID_ANY, _( "Select All" ) );
btnSizer->Add( selectAll, 1, wxEXPAND | wxALL, 5 );
wxButton* unselectAll = new wxButton( this, wxID_ANY, _( "Unselect All" ) );
btnSizer->Add( unselectAll, 1, wxEXPAND | wxALL, 5 );
boxSizer->Add( btnSizer, 0, wxEXPAND | wxALL, 5 );
auto sizer = GetSizer();
sizer->Insert( sizer->GetItemCount() - 1, btnSizer, 0, wxEXPAND | wxALL, 0 );
wxStdDialogButtonSizer* m_sdboxSizer = new wxStdDialogButtonSizer();
wxButton* btnOk = new wxButton( this, wxID_OK );
m_sdboxSizer->AddButton( btnOk );
m_sdboxSizer->AddButton( new wxButton( this, wxID_CANCEL ) );
m_sdboxSizer->Realize();
btnOk->SetDefault();
boxSizer->Add( m_sdboxSizer, 0, wxEXPAND | wxALL, 5 );
SetSizer( boxSizer );
Layout();
boxSizer->Fit( this );
boxSizer->SetSizeHints( this );
sizer->Fit( this );
sizer->SetSizeHints( this );
Centre( wxBOTH );
selectAll->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_MULTI_OPTIONS::selectAll, this );
unselectAll->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_MULTI_OPTIONS::unselectAll, this );
}
std::vector<int> GetSelection() const
{
std::vector<int> ret;
for( unsigned int i = 0; i < m_checklist->GetCount(); ++i )
{
if( m_checklist->IsChecked( i ) )
ret.push_back( i );
}
return ret;
}
void SetCheckboxes( bool aValue )
{
for( unsigned int i = 0; i < m_checklist->GetCount(); ++i )
m_checklist->Check( i, aValue );
wxArrayInt selIdxs;
if( aValue ) // select all indices
{
for( unsigned int i = 0; i < m_optionsCount; ++i )
selIdxs.Add( i );
}
SetSelections( selIdxs );
}
protected:
wxCheckListBox* m_checklist;
///> Number of displayed options
int m_optionsCount;
void selectAll( wxCommandEvent& aEvent )
{
@ -372,29 +346,24 @@ protected:
};
std::pair<bool, std::vector<int>> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
std::pair<bool, wxArrayInt> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
const wxString& aMessage, const wxArrayString& aOptions, bool aDefaultState )
{
std::vector<int> ret;
bool clickedOk;
DIALOG_MULTI_OPTIONS dlg( aParent, aTitle, aMessage, aOptions );
dlg.Layout();
dlg.SetCheckboxes( aDefaultState );
if( dlg.ShowModal() == wxID_OK )
{
ret = dlg.GetSelection();
clickedOk = true;
}
else
{
clickedOk = false;
}
wxArrayInt ret;
bool clickedOk = ( dlg.ShowModal() == wxID_OK );
if( clickedOk )
ret = dlg.GetSelections();
return std::make_pair( clickedOk, ret );
}
std::pair<bool, std::vector<int>> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
std::pair<bool, wxArrayInt> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
const wxString& aMessage, const std::vector<std::string>& aOptions, bool aDefaultState )
{
wxArrayString array;

View File

@ -614,7 +614,7 @@ bool LIB_EDIT_FRAME::saveAllLibraries( bool aClosing )
if( unsavedLibraries.IsEmpty() )
break;
std::vector<int> libIdxs;
wxArrayInt libIdxs;
// Show a list of unsaved libraries when:
// - library editor is closed

View File

@ -169,17 +169,19 @@ int SelectSingleOption( wxWindow* aParent, const wxString& aTitle, const wxStrin
/**
* Displays a dialog with checkboxes asking the user to select one or more options.
*
* @param aParent is the parent window.
* @param aTitle is the dialog title.
* @param aMessage is a text label displayed in the first row of the dialog.
* @param aOptions is a vector of possible options.
* @param aDefaultState is the default state for the checkboxes.
* @return Vector containing indices of the selected option.
* @return Pair containing a boolean value equal to true when the selection has been confirmed and
* an integer array containing indices of the selected options.
*/
std::pair<bool, std::vector<int>> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
std::pair<bool, wxArrayInt> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
const wxString& aMessage, const wxArrayString& aOptions, bool aDefaultState = false );
std::pair<bool, std::vector<int>> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
std::pair<bool, wxArrayInt> SelectMultipleOptions( wxWindow* aParent, const wxString& aTitle,
const wxString& aMessage, const std::vector<std::string>& aOptions, bool aDefaultState = false );
#endif /* __INCLUDE__CONFIRM_H__ */