Fix bug with m_current causing EVT_LIST_KEY_DOWN events not to fire in virtual mode, also added handler for navigation keys and tweaked the virtual code for setting selection.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45569 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
b8e3f1cfb7
commit
6ff68ce9ad
@ -654,12 +654,43 @@ void wxListCtrl::FireMouseEvent(wxEventType eventType, wxPoint position)
|
||||
|
||||
void wxListCtrl::OnChar(wxKeyEvent& event)
|
||||
{
|
||||
|
||||
|
||||
if (m_dbImpl)
|
||||
{
|
||||
wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetId() );
|
||||
le.SetEventObject(this);
|
||||
le.m_code = event.GetKeyCode();
|
||||
le.m_itemIndex = -1;
|
||||
|
||||
if (m_current == -1)
|
||||
{
|
||||
// if m_current isn't set, check if there's been a selection
|
||||
// made before continuing
|
||||
m_current = GetNextItem(-1, wxLIST_NEXT_BELOW, wxLIST_STATE_SELECTED);
|
||||
}
|
||||
|
||||
// We need to determine m_current ourselves when navigation keys
|
||||
// are used. Note that PAGEUP and PAGEDOWN do not alter the current
|
||||
// item on native Mac ListCtrl, so we only handle up and down keys.
|
||||
switch ( event.GetKeyCode() )
|
||||
{
|
||||
case WXK_UP:
|
||||
if ( m_current > 0 )
|
||||
m_current -= 1;
|
||||
else
|
||||
m_current = 0;
|
||||
|
||||
break;
|
||||
|
||||
case WXK_DOWN:
|
||||
if ( m_current < GetItemCount() - 1 )
|
||||
m_current += 1;
|
||||
else
|
||||
m_current = GetItemCount() - 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_current != -1)
|
||||
{
|
||||
@ -1174,7 +1205,7 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask)
|
||||
if (m_dbImpl)
|
||||
{
|
||||
DataBrowserSetOption option = kDataBrowserItemsAdd;
|
||||
if ( stateMask == wxLIST_STATE_SELECTED && state == 0 )
|
||||
if ( (stateMask & wxLIST_STATE_SELECTED) && state == 0 )
|
||||
option = kDataBrowserItemsRemove;
|
||||
|
||||
if (item == -1)
|
||||
@ -1202,8 +1233,15 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask)
|
||||
if ( HasFlag(wxLC_VIRTUAL) )
|
||||
{
|
||||
long itemID = item+1;
|
||||
bool isSelected = IsDataBrowserItemSelected(m_dbImpl->GetControlRef(), (DataBrowserItemID)itemID );
|
||||
bool isSelectedState = (state == wxLIST_STATE_SELECTED);
|
||||
|
||||
// toggle the selection state if wxListInfo state and actual state don't match.
|
||||
if ( (stateMask & wxLIST_STATE_SELECTED) && isSelected != isSelectedState )
|
||||
{
|
||||
SetDataBrowserSelectedItems(m_dbImpl->GetControlRef(), 1, (DataBrowserItemID*)&itemID, option);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
wxListItem info;
|
||||
@ -1579,7 +1617,7 @@ long wxListCtrl::GetNextItem(long item, int geom, int state) const
|
||||
}
|
||||
}
|
||||
|
||||
if ( geom == wxLIST_NEXT_ALL || geom == wxLIST_NEXT_ABOVE )
|
||||
if ( geom == wxLIST_NEXT_ABOVE )
|
||||
{
|
||||
int item2 = item;
|
||||
if ( item2 == -1 )
|
||||
|
Loading…
Reference in New Issue
Block a user