diff --git a/src/common/treebase.cpp b/src/common/treebase.cpp index d1493de28d..f3b11d3b11 100644 --- a/src/common/treebase.cpp +++ b/src/common/treebase.cpp @@ -357,6 +357,7 @@ void wxTreeCtrlBase::OnCharHook(wxKeyEvent& event) wxFALLTHROUGH; case WXK_RETURN: + case WXK_NUMPAD_ENTER: EndEditLabel(GetFocusedItem(), discardChanges); // Do not call Skip() below. diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 112894060e..383140a210 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -3081,8 +3081,8 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) // ' ' | return : activate // up : go up (not last children!) // down : go down - // left : go to parent - // right : open if parent and go next + // left : collapse or go to parent + // right : expand or go to first child // home : go to root // end : go to last item without opening parents // alnum : start or continue searching for the item with this prefix @@ -3210,28 +3210,57 @@ void wxGenericTreeCtrl::OnChar( wxKeyEvent &event ) } break; - // left arrow goes to the parent + // left arrow collapses or goes to the parent if it's not expanded case WXK_LEFT: { - wxTreeItemId prev = GetItemParent( m_current ); - if ((prev == GetRootItem()) && HasFlag(wxTR_HIDE_ROOT)) + if (m_current == GetRootItem().m_pItem && HasFlag(wxTR_HIDE_ROOT)) { - // don't go to root if it is hidden - prev = GetPrevSibling( m_current ); + // don't try to collapse hidden root item + // (which can be the current one when the tree is empty) + break; } - if (prev) + if (IsExpanded(m_current)) { - DoSelectItem( prev, unselect_others, extended_select ); + Collapse(m_current); + } + else + { + // select parent unless it's the hidden root + wxTreeItemId parent = GetItemParent(m_current); + if (parent && (parent != GetRootItem() || !HasFlag(wxTR_HIDE_ROOT))) + { + DoSelectItem(parent, unselect_others, extended_select); + } } } break; + // right arrow expands or goes to first child if it's already expanded case WXK_RIGHT: - // right arrow just expand the item will be fine - if (m_current != GetRootItem().m_pItem || !HasFlag(wxTR_HIDE_ROOT)) - Expand(m_current); - //else: don't try to expand hidden root item (which can be the - // current one when the tree is empty) + { + if (m_current == GetRootItem().m_pItem && HasFlag(wxTR_HIDE_ROOT)) + { + // don't try to expand hidden root item + // (which can be the current one when the tree is empty) + break; + } + if (HasChildren(m_current)) + { + if (IsExpanded(m_current)) + { + wxTreeItemIdValue cookie; + wxTreeItemId child = GetFirstChild(m_current, cookie); + if (child) + { + DoSelectItem(child, unselect_others, extended_select); + } + } + else + { + Expand(m_current); + } + } + } break; case WXK_DOWN: @@ -3789,18 +3818,19 @@ void wxGenericTreeCtrl::OnMouse( wxMouseEvent &event ) GetEventHandler()->ProcessEvent(nevent); } - // this facilitates multiple-item drag-and-drop - - if ( /* item && */ HasFlag(wxTR_MULTIPLE)) + // Don't deselect anything if we're just collapsing or expanding + // the item. + if ( !(flags & wxTREE_HITTEST_ONITEMBUTTON) ) { - wxArrayTreeItemIds selections; - size_t count = GetSelections(selections); - - if (count > 1 && - !event.CmdDown() && - !event.ShiftDown()) + // this facilitates multiple-item drag-and-drop + if ( HasFlag(wxTR_MULTIPLE) && + !(event.CmdDown() || event.ShiftDown()) ) { - DoSelectItem(item, true, false); + wxArrayTreeItemIds selections; + if ( GetSelections(selections) > 1 ) + { + DoSelectItem(item, true, false); + } } }