diff --git a/include/wx/qt/choice.h b/include/wx/qt/choice.h index 06602b9b68..5b4e51129a 100644 --- a/include/wx/qt/choice.h +++ b/include/wx/qt/choice.h @@ -71,6 +71,8 @@ protected: virtual void DoClear(); virtual void DoDeleteOneItem(unsigned int pos); + virtual void InitialiseSort(QComboBox *combo); + QComboBox *m_qtComboBox; private: diff --git a/src/qt/choice.cpp b/src/qt/choice.cpp index 8c49d5e933..cc1587825e 100644 --- a/src/qt/choice.cpp +++ b/src/qt/choice.cpp @@ -10,11 +10,39 @@ #include "wx/choice.h" #include "wx/qt/private/winevent.h" + #include +#include namespace { +class LexicalSortProxyModel : public QSortFilterProxyModel +{ +public: + bool lessThan( const QModelIndex &left, const QModelIndex &right ) const wxOVERRIDE + { + const QVariant leftData = sourceModel()->data( left ); + const QVariant rightData = sourceModel()->data( right ); + + if ( leftData.type() != QVariant::String ) + return false; + + int insensitiveResult = QString::compare( + leftData.value(), + rightData.value(), + Qt::CaseInsensitive ); + + if ( insensitiveResult == 0 ) + { + return QString::compare( leftData.value(), + rightData.value() ) < 0; + } + + return insensitiveResult < 0; + } +}; + class wxQtChoice : public wxQtEventSignalHandler< QComboBox, wxChoice > { public: @@ -47,6 +75,14 @@ wxChoice::wxChoice() : { } +void wxChoice::InitialiseSort(QComboBox *combo) +{ + QSortFilterProxyModel *proxyModel = new LexicalSortProxyModel(); + proxyModel->setSourceModel(combo->model()); + combo->model()->setParent(proxyModel); + combo->setModel(proxyModel); +} + wxChoice::wxChoice( wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -95,6 +131,8 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id, { m_qtComboBox = new wxQtChoice( parent, this ); + InitialiseSort(m_qtComboBox); + while ( n-- > 0 ) m_qtComboBox->addItem( wxQtConvertString( *choices++ )); diff --git a/src/qt/combobox.cpp b/src/qt/combobox.cpp index 4ca376f23d..36efe13300 100644 --- a/src/qt/combobox.cpp +++ b/src/qt/combobox.cpp @@ -128,6 +128,8 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id, const wxString& name ) { m_qtComboBox = new wxQtComboBox( parent, this ); + InitialiseSort(m_qtComboBox); + while ( n-- > 0 ) m_qtComboBox->addItem( wxQtConvertString( *choices++ )); m_qtComboBox->setEditText( wxQtConvertString( value )); @@ -140,7 +142,10 @@ void wxComboBox::SetValue(const wxString& value) if ( HasFlag(wxCB_READONLY) ) SetStringSelection(value); else + { wxTextEntry::SetValue(value); + m_qtComboBox->setEditText( wxQtConvertString(value) ); + } } wxString wxComboBox::DoGetValue() const