瀏覽代碼

GTreeView: Support navigating the tree with the up/down keys.

Andreas Kling 6 年之前
父節點
當前提交
b797458962
共有 2 個文件被更改,包括 41 次插入0 次删除
  1. 40 0
      LibGUI/GTreeView.cpp
  2. 1 0
      LibGUI/GTreeView.h

+ 40 - 0
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;
+    }
+}

+ 1 - 0
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;