LibGUI: Make GUI::Label auto-sizing declarative

You can now set the "autosize" property on a GUI::Label and it will
automatically update its width preference to fit the text.
This commit is contained in:
Andreas Kling 2020-12-20 12:35:10 +01:00
parent de08e7b8c9
commit 64ba41ea13
Notes: sideshowbarker 2024-07-19 00:43:52 +09:00
4 changed files with 18 additions and 5 deletions

View file

@ -13,8 +13,8 @@
visible: false
@GUI::Label {
name: "location_label"
text: "Location: "
autosize: true
}
@GUI::TextBox {

View file

@ -300,9 +300,6 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
auto& location_toolbar = (GUI::ToolBar&)*widget.find_descendant_by_name("location_toolbar");
location_toolbar.layout()->set_margins({ 6, 3, 6, 3 });
auto& location_label = (GUI::Label&)*widget.find_descendant_by_name("location_label");
location_label.size_to_fit();
auto& location_textbox = (GUI::TextBox&)*widget.find_descendant_by_name("location_textbox");
auto& breadcrumb_toolbar = (GUI::ToolBar&)*widget.find_descendant_by_name("breadcrumb_toolbar");

View file

@ -42,12 +42,22 @@ Label::Label(const StringView& text)
set_foreground_role(Gfx::ColorRole::WindowText);
REGISTER_STRING_PROPERTY("text", text, set_text);
REGISTER_BOOL_PROPERTY("autosize", is_autosize, set_autosize);
}
Label::~Label()
{
}
void Label::set_autosize(bool autosize)
{
if (m_autosize == autosize)
return;
m_autosize = autosize;
if (m_autosize)
size_to_fit();
}
void Label::set_icon(const Gfx::Bitmap* icon)
{
if (m_icon == icon)
@ -61,6 +71,8 @@ void Label::set_text(const StringView& text)
if (text == m_text)
return;
m_text = text;
if (m_autosize)
size_to_fit();
update();
}

View file

@ -49,7 +49,8 @@ public:
bool should_stretch_icon() const { return m_should_stretch_icon; }
void set_should_stretch_icon(bool b) { m_should_stretch_icon = b; }
void size_to_fit();
bool is_autosize() const { return m_autosize; }
void set_autosize(bool);
protected:
explicit Label(const StringView& text = {});
@ -57,10 +58,13 @@ protected:
virtual void paint_event(PaintEvent&) override;
private:
void size_to_fit();
String m_text;
RefPtr<Gfx::Bitmap> m_icon;
Gfx::TextAlignment m_text_alignment { Gfx::TextAlignment::Center };
bool m_should_stretch_icon { false };
bool m_autosize { false };
};
}