ladybird/Userland/Libraries/LibGUI/Label.cpp
thankyouverycool 4c9933bfb7 LibGUI: Remove Label icons and replace instances with ImageWidget
These icons are a relic of GLabel and were never implemented to
accomodate both image and text. This convenience can always be added
in the future, but no current instance assumes or needs it, so let's
replace them all with ImageWidget to show clearer intent.
2023-04-30 05:48:14 +02:00

121 lines
3.2 KiB
C++

/*
* Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Utf8View.h>
#include <LibGUI/Label.h>
#include <LibGUI/Painter.h>
#include <LibGfx/Bitmap.h>
#include <LibGfx/Palette.h>
#include <LibGfx/TextWrapping.h>
REGISTER_WIDGET(GUI, Label)
namespace GUI {
Label::Label(String text)
: m_text(move(text))
{
REGISTER_TEXT_ALIGNMENT_PROPERTY("text_alignment", text_alignment, set_text_alignment);
REGISTER_TEXT_WRAPPING_PROPERTY("text_wrapping", text_wrapping, set_text_wrapping);
set_preferred_size({ SpecialDimension::OpportunisticGrow });
set_min_size({ SpecialDimension::Shrink });
set_frame_thickness(0);
set_frame_shadow(Gfx::FrameShadow::Plain);
set_frame_shape(Gfx::FrameShape::NoFrame);
set_foreground_role(Gfx::ColorRole::WindowText);
REGISTER_STRING_PROPERTY("text", text, set_text);
REGISTER_BOOL_PROPERTY("autosize", is_autosize, set_autosize);
}
void Label::set_autosize(bool autosize, size_t padding)
{
if (m_autosize == autosize && m_autosize_padding == padding)
return;
m_autosize = autosize;
m_autosize_padding = padding;
if (m_autosize)
size_to_fit();
}
void Label::set_text(String text)
{
if (text == m_text)
return;
m_text = move(text);
if (m_autosize)
size_to_fit();
update();
did_change_text();
}
Gfx::IntRect Label::text_rect() const
{
return frame_inner_rect().shrunken(frame_thickness() > 0 ? font().glyph_width('x') : 0, 0);
}
void Label::paint_event(PaintEvent& event)
{
Frame::paint_event(event);
Painter painter(*this);
painter.add_clip_rect(event.rect());
if (text().is_empty())
return;
auto text_rect = this->text_rect();
if (is_enabled()) {
painter.draw_text(text_rect, text(), text_alignment(), palette().color(foreground_role()), Gfx::TextElision::Right, text_wrapping());
} else {
painter.draw_text(text_rect.translated(1, 1), text(), font(), text_alignment(), palette().disabled_text_back(), Gfx::TextElision::Right, text_wrapping());
painter.draw_text(text_rect, text(), font(), text_alignment(), palette().disabled_text_front(), Gfx::TextElision::Right, text_wrapping());
}
}
void Label::did_change_font()
{
if (m_autosize)
size_to_fit();
}
void Label::size_to_fit()
{
set_fixed_width(text_calculated_preferred_width());
set_fixed_height(text_calculated_preferred_height());
}
int Label::text_calculated_preferred_width() const
{
return font().width_rounded_up(m_text) + m_autosize_padding * 2;
}
int Label::text_calculated_preferred_height() const
{
return static_cast<int>(ceilf(font().preferred_line_height()) * (m_text.count("\n"sv) + 1));
}
Optional<UISize> Label::calculated_preferred_size() const
{
return GUI::UISize(text_calculated_preferred_width(), text_calculated_preferred_height());
}
Optional<UISize> Label::calculated_min_size() const
{
int frame = frame_thickness() * 2;
int width = font().width_rounded_up("..."sv) + frame;
int height = font().pixel_size_rounded_up() + frame;
height = max(height, 22);
return UISize(width, height);
}
}