ソースを参照

LibHTML: Add basic keyboard navigation (up/down/pgdn/pgup/home/end/etc)

Andreas Kling 5 年 前
コミット
775cbbb422
2 ファイル変更37 行追加0 行削除
  1. 34 0
      Libraries/LibHTML/HtmlView.cpp
  2. 3 0
      Libraries/LibHTML/HtmlView.h

+ 34 - 0
Libraries/LibHTML/HtmlView.cpp

@@ -183,6 +183,40 @@ void HtmlView::mousedown_event(GMouseEvent& event)
     event.accept();
 }
 
+void HtmlView::keydown_event(GKeyEvent& event)
+{
+    if (event.modifiers() == 0) {
+        switch (event.key()) {
+        case Key_Home:
+            vertical_scrollbar().set_value(0);
+            break;
+        case Key_End:
+            vertical_scrollbar().set_value(vertical_scrollbar().max());
+            break;
+        case Key_Down:
+            vertical_scrollbar().set_value(vertical_scrollbar().value() + vertical_scrollbar().step());
+            break;
+        case Key_Up:
+            vertical_scrollbar().set_value(vertical_scrollbar().value() - vertical_scrollbar().step());
+            break;
+        case Key_Left:
+            horizontal_scrollbar().set_value(horizontal_scrollbar().value() + horizontal_scrollbar().step());
+            break;
+        case Key_Right:
+            horizontal_scrollbar().set_value(horizontal_scrollbar().value() - horizontal_scrollbar().step());
+            break;
+        case Key_PageDown:
+            vertical_scrollbar().set_value(vertical_scrollbar().value() + frame_inner_rect().height());
+            break;
+        case Key_PageUp:
+            vertical_scrollbar().set_value(vertical_scrollbar().value() - frame_inner_rect().height());
+            break;
+        }
+    }
+
+    event.accept();
+}
+
 void HtmlView::reload()
 {
     load(main_frame().document()->url());

+ 3 - 0
Libraries/LibHTML/HtmlView.h

@@ -32,6 +32,8 @@ public:
     Function<void(const String&)> on_title_change;
     Function<void(const URL&)> on_load_start;
 
+    virtual bool accepts_focus() const override { return true; }
+
 protected:
     HtmlView(GWidget* parent = nullptr);
 
@@ -39,6 +41,7 @@ protected:
     virtual void paint_event(GPaintEvent&) override;
     virtual void mousemove_event(GMouseEvent&) override;
     virtual void mousedown_event(GMouseEvent&) override;
+    virtual void keydown_event(GKeyEvent&) override;
 
 private:
     void layout_and_sync_size();