diff --git a/LibGUI/GTreeView.cpp b/LibGUI/GTreeView.cpp index 10638ef8e6..9a1a56fc61 100644 --- a/LibGUI/GTreeView.cpp +++ b/LibGUI/GTreeView.cpp @@ -242,6 +242,7 @@ void GTreeView::did_update_selection() } if (opened_any) update_content_size(); + update(); } void GTreeView::update_content_size() @@ -255,3 +256,42 @@ void GTreeView::update_content_size() }); set_content_size({ width, height }); } + +void GTreeView::keydown_event(GKeyEvent& event) +{ + if (!model()) + return; + auto cursor_index = model()->selected_index(); + if (event.key() == KeyCode::Key_Up) { + GModelIndex previous_index; + GModelIndex found_index; + traverse_in_paint_order([&] (const GModelIndex& index, const Rect&, const Rect&, int) { + if (index == cursor_index) { + found_index = previous_index; + return IterationDecision::Abort; + } + previous_index = index; + return IterationDecision::Continue; + }); + if (found_index.is_valid()) { + model()->set_selected_index(found_index); + update(); + } + return; + } + if (event.key() == KeyCode::Key_Down) { + GModelIndex previous_index; + GModelIndex found_index; + traverse_in_paint_order([&] (const GModelIndex& index, const Rect&, const Rect&, int) { + if (previous_index == cursor_index) { + found_index = index; + return IterationDecision::Abort; + } + previous_index = index; + return IterationDecision::Continue; + }); + if (found_index.is_valid()) + model()->set_selected_index(found_index); + return; + } +} diff --git a/LibGUI/GTreeView.h b/LibGUI/GTreeView.h index 04462839f0..3cd62d8782 100644 --- a/LibGUI/GTreeView.h +++ b/LibGUI/GTreeView.h @@ -13,6 +13,7 @@ public: protected: virtual void paint_event(GPaintEvent&) override; virtual void mousedown_event(GMouseEvent&) override; + virtual void keydown_event(GKeyEvent&) override; virtual void did_update_selection() override; virtual void did_update_model() override;