瀏覽代碼

LibGUI: Make "Return" after tab return to original column in TableView

Max Trussell 4 年之前
父節點
當前提交
b4da228ea5
共有 2 個文件被更改,包括 32 次插入4 次删除
  1. 30 4
      Userland/Libraries/LibGUI/AbstractTableView.cpp
  2. 2 0
      Userland/Libraries/LibGUI/AbstractTableView.h

+ 30 - 4
Userland/Libraries/LibGUI/AbstractTableView.cpp

@@ -194,6 +194,7 @@ void AbstractTableView::set_column_header_alignment(int column, Gfx::TextAlignme
 
 void AbstractTableView::mousedown_event(MouseEvent& event)
 {
+    m_tab_moves = 0;
     if (!model())
         return AbstractView::mousedown_event(event);
 
@@ -403,13 +404,20 @@ void AbstractTableView::layout_headers()
 void AbstractTableView::keydown_event(KeyEvent& event)
 {
     if (is_tab_key_navigation_enabled()) {
-        if (event.modifiers() == KeyModifier::Mod_Shift && event.key() == KeyCode::Key_Tab) {
-            move_cursor(CursorMovement::Left, SelectionUpdate::Set);
+        if (!event.modifiers() && event.key() == KeyCode::Key_Tab) {
+            move_cursor(CursorMovement::Right, SelectionUpdate::Set);
             event.accept();
+            ++m_tab_moves;
             return;
+        } else if (is_navigation(event)) {
+            if (event.key() == KeyCode::Key_Return) {
+                move_cursor_relative(0, -m_tab_moves, SelectionUpdate::Set);
+            }
+            m_tab_moves = 0;
         }
-        if (!event.modifiers() && event.key() == KeyCode::Key_Tab) {
-            move_cursor(CursorMovement::Right, SelectionUpdate::Set);
+
+        if (event.modifiers() == KeyModifier::Mod_Shift && event.key() == KeyCode::Key_Tab) {
+            move_cursor(CursorMovement::Left, SelectionUpdate::Set);
             event.accept();
             return;
         }
@@ -418,4 +426,22 @@ void AbstractTableView::keydown_event(KeyEvent& event)
     AbstractView::keydown_event(event);
 }
 
+bool AbstractTableView::is_navigation(GUI::KeyEvent& event)
+{
+    switch (event.key()) {
+    case KeyCode::Key_Tab:
+    case KeyCode::Key_Left:
+    case KeyCode::Key_Right:
+    case KeyCode::Key_Up:
+    case KeyCode::Key_Down:
+    case KeyCode::Key_Return:
+    case KeyCode::Key_Home:
+    case KeyCode::Key_End:
+    case KeyCode::Key_PageUp:
+    case KeyCode::Key_PageDown:
+        return true;
+    default:
+        return false;
+    }
+}
 }

+ 2 - 0
Userland/Libraries/LibGUI/AbstractTableView.h

@@ -98,6 +98,7 @@ protected:
 
 private:
     void layout_headers();
+    bool is_navigation(GUI::KeyEvent&);
 
     RefPtr<HeaderView> m_column_header;
     RefPtr<HeaderView> m_row_header;
@@ -110,6 +111,7 @@ private:
 
     int m_vertical_padding { 8 };
     int m_horizontal_padding { font().glyph_height() / 2 };
+    int m_tab_moves { 0 };
 };
 
 }