Bladeren bron

LibGUI: Make the LinkLabel widget keyboard-friendly

Make it tab-focusable and activate it with the return key. :^)
Andreas Kling 4 jaren geleden
bovenliggende
commit
bdff88d8d5
4 gewijzigde bestanden met toevoegingen van 29 en 8 verwijderingen
  1. 12 6
      Libraries/LibGUI/Label.cpp
  2. 2 0
      Libraries/LibGUI/Label.h
  3. 14 2
      Libraries/LibGUI/LinkLabel.cpp
  4. 1 0
      Libraries/LibGUI/LinkLabel.h

+ 12 - 6
Libraries/LibGUI/Label.cpp

@@ -77,6 +77,17 @@ void Label::set_text(String text)
     did_change_text();
 }
 
+Gfx::IntRect Label::text_rect() const
+{
+    int indent = 0;
+    if (frame_thickness() > 0)
+        indent = font().glyph_width('x') / 2;
+    auto rect = frame_inner_rect();
+    rect.move_by(indent, 0);
+    rect.set_width(rect.width() - indent * 2);
+    return rect;
+}
+
 void Label::paint_event(PaintEvent& event)
 {
     Frame::paint_event(event);
@@ -94,12 +105,7 @@ void Label::paint_event(PaintEvent& event)
     }
     if (text().is_empty())
         return;
-    int indent = 0;
-    if (frame_thickness() > 0)
-        indent = font().glyph_width('x') / 2;
-    auto text_rect = frame_inner_rect();
-    text_rect.move_by(indent, 0);
-    text_rect.set_width(text_rect.width() - indent * 2);
+    auto text_rect = this->text_rect();
 
     if (is_enabled()) {
         painter.draw_text(text_rect, text(), m_text_alignment, palette().color(foreground_role()), Gfx::TextElision::Right);

+ 2 - 0
Libraries/LibGUI/Label.h

@@ -53,6 +53,8 @@ public:
     bool is_autosize() const { return m_autosize; }
     void set_autosize(bool);
 
+    Gfx::IntRect text_rect() const;
+
 protected:
     explicit Label(String text = {});
 

+ 14 - 2
Libraries/LibGUI/LinkLabel.cpp

@@ -37,6 +37,7 @@ LinkLabel::LinkLabel(String text)
     : Label(move(text))
 {
     set_foreground_role(Gfx::ColorRole::Link);
+    set_focus_policy(FocusPolicy::TabFocus);
 }
 
 void LinkLabel::mousedown_event(MouseEvent& event)
@@ -47,14 +48,25 @@ void LinkLabel::mousedown_event(MouseEvent& event)
     }
 }
 
+void LinkLabel::keydown_event(KeyEvent& event)
+{
+    Label::keydown_event(event);
+    if (event.key() == KeyCode::Key_Return || event.key() == KeyCode::Key_Space) {
+        if (on_click)
+            on_click();
+    }
+}
+
 void LinkLabel::paint_event(PaintEvent& event)
 {
     Label::paint_event(event);
     GUI::Painter painter(*this);
 
     if (m_hovered)
-        painter.draw_line({ 0, rect().bottom() }, { font().width(text()), rect().bottom() },
-            Widget::palette().link());
+        painter.draw_line({ 0, rect().bottom() }, { font().width(text()), rect().bottom() }, palette().link());
+
+    if (is_focused())
+        painter.draw_focus_rect(text_rect(), palette().focus_outline());
 }
 
 void LinkLabel::enter_event(Core::Event& event)

+ 1 - 0
Libraries/LibGUI/LinkLabel.h

@@ -44,6 +44,7 @@ private:
     virtual void resize_event(ResizeEvent&) override;
     virtual void enter_event(Core::Event&) override;
     virtual void leave_event(Core::Event&) override;
+    virtual void keydown_event(KeyEvent&) override;
 
     virtual void did_change_text() override;