Переглянути джерело

LibGUI+LibGfx: Collapse the '&' from Alt shortcuts in tooltip texts

Also resolve a FIXME about using GUI::Label auto-sizing since we're
changing this code and it simplifies what we're doing.

Fixes #6219.
Andreas Kling 4 роки тому
батько
коміт
a4992b5ece

+ 4 - 5
Userland/Libraries/LibGUI/Application.cpp

@@ -44,12 +44,10 @@ class Application::TooltipWindow final : public Window {
     C_OBJECT(TooltipWindow);
 
 public:
-    void set_tooltip(String tooltip)
+    void set_tooltip(const String& tooltip)
     {
-        // FIXME: Add some kind of GUI::Label auto-sizing feature.
-        int text_width = m_label->font().width(tooltip);
-        set_rect(rect().x(), rect().y(), text_width + 10, m_label->font().glyph_height() + 8);
-        m_label->set_text(move(tooltip));
+        m_label->set_text(Gfx::parse_ampersand_string(tooltip));
+        set_rect(rect().x(), rect().y(), m_label->min_width() + 10, m_label->font().glyph_height() + 8);
     }
 
 private:
@@ -63,6 +61,7 @@ private:
         m_label->set_frame_thickness(1);
         m_label->set_frame_shape(Gfx::FrameShape::Container);
         m_label->set_frame_shadow(Gfx::FrameShadow::Plain);
+        m_label->set_autosize(true);
     }
 
     RefPtr<Label> m_label;

+ 18 - 17
Userland/Libraries/LibGfx/Painter.cpp

@@ -1806,29 +1806,30 @@ void Painter::blit_tiled(const IntRect& dst_rect, const Gfx::Bitmap& bitmap, con
     }
 }
 
-void Gfx::Painter::draw_ui_text(const Gfx::IntRect& rect, const StringView& text, const Gfx::Font& font, Gfx::TextAlignment text_alignment, Gfx::Color color)
+String parse_ampersand_string(const StringView& raw_text, Optional<size_t>* underline_offset)
 {
-    auto parse_ampersand_string = [](const StringView& raw_text, Optional<size_t>& underline_offset) -> String {
-        if (raw_text.is_empty())
-            return String::empty();
+    if (raw_text.is_empty())
+        return String::empty();
 
-        StringBuilder builder;
+    StringBuilder builder;
 
-        for (size_t i = 0; i < raw_text.length(); ++i) {
-            if (raw_text[i] == '&') {
-                if (i != (raw_text.length() - 1) && raw_text[i + 1] == '&')
-                    builder.append(raw_text[i]);
-                else if (!underline_offset.has_value())
-                    underline_offset = i;
-                continue;
-            }
-            builder.append(raw_text[i]);
+    for (size_t i = 0; i < raw_text.length(); ++i) {
+        if (raw_text[i] == '&') {
+            if (i != (raw_text.length() - 1) && raw_text[i + 1] == '&')
+                builder.append(raw_text[i]);
+            else if (underline_offset && !(*underline_offset).has_value())
+                *underline_offset = i;
+            continue;
         }
-        return builder.to_string();
-    };
+        builder.append(raw_text[i]);
+    }
+    return builder.to_string();
+}
 
+void Gfx::Painter::draw_ui_text(const Gfx::IntRect& rect, const StringView& text, const Gfx::Font& font, Gfx::TextAlignment text_alignment, Gfx::Color color)
+{
     Optional<size_t> underline_offset;
-    auto name_to_draw = parse_ampersand_string(text, underline_offset);
+    auto name_to_draw = parse_ampersand_string(text, &underline_offset);
 
     Gfx::IntRect text_rect { 0, 0, font.width(name_to_draw), font.glyph_height() };
     text_rect.align_within(rect, text_alignment);

+ 2 - 0
Userland/Libraries/LibGfx/Painter.h

@@ -171,4 +171,6 @@ private:
     Painter& m_painter;
 };
 
+String parse_ampersand_string(const StringView&, Optional<size_t>* underline_offset = nullptr);
+
 }