Merge branch 'mac-lbox-sel-events'

Fix Mac wxListBox selection behaviour and events.

See https://github.com/wxWidgets/wxWidgets/pull/847
This commit is contained in:
Vadim Zeitlin
2018-07-03 18:31:37 +02:00
3 changed files with 43 additions and 19 deletions

View File

@@ -122,9 +122,11 @@ public:
wxListWidgetImpl* GetListPeer() const;
bool MacGetBlockEvents() const { return m_blockEvents; }
virtual void HandleLineEvent( unsigned int n, bool doubleClick );
// This is called by wxNSTableView
void MacHandleSelectionChange(int row);
protected:
// callback for derived classes which may have to insert additional data
// at a certain line - which cannot be predetermined for sorted list data

View File

@@ -297,24 +297,12 @@ protected:
int row = [self selectedRow];
if (row == -1)
{
// no row selected
}
else
{
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
wxListBox *list = static_cast<wxListBox*> ( impl->GetWXPeer());
wxCHECK_RET( list != NULL , wxT("Listbox expected"));
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
wxListBox* const list = wxDynamicCast(impl->GetWXPeer(), wxListBox);
wxCHECK_RET( list != NULL , "Associated control should be a wxListBox" );
if ((row < 0) || (row > (int) list->GetCount())) // OS X can select an item below the last item
return;
if ( !list->MacGetBlockEvents() )
list->HandleLineEvent( row, false );
}
}
list->MacHandleSelectionChange(row);
}
- (void)setFont:(NSFont *)aFont
{

View File

@@ -420,6 +420,40 @@ void wxListBox::HandleLineEvent( unsigned int n, bool doubleClick )
HandleWindowEvent(event);
}
void wxListBox::MacHandleSelectionChange(int row)
{
if ( m_blockEvents )
return;
// Correct notification events for multiselection list.
if ( HasMultipleSelection() )
{
CalcAndSendEvent();
return;
}
// OS X can select an item below the last item. In that case keep the old
// selection because in wxWidgets API there is no notification event for
// removing the selection from a single-selection list box.
//
// Otherwise call DoChangeSingleSelection so GetOldSelection() will return
// the correct value if row < 0 later.
const int count = static_cast<int>(GetCount());
if ( row < 0 || row >= count )
{
if ( !m_oldSelections.empty() )
{
const int oldsel = m_oldSelections[0];
if ( oldsel >= 0 && oldsel < count )
SetSelection(oldsel);
}
}
else if ( DoChangeSingleSelection(row) )
{
HandleLineEvent( row, false );
}
}
//
// common list cell value operations
//