ladybird/Userland/Libraries/LibGUI/RadioButton.cpp
Karol Kosek fca29eae09 LibGUI: Store text using the new String class in the AbstractButton
This change also adds non-deprecated text() and set_text() functions and
helper constructors for Button, CheckBox, and RadioButton to call the
strings directly.

The whole codebase at this point is still using the deprecated string
functions, which the class will quietly convert to a new String.
2023-02-13 00:45:09 +00:00

78 lines
2.1 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibGUI/Painter.h>
#include <LibGUI/RadioButton.h>
#include <LibGfx/Bitmap.h>
#include <LibGfx/Font/Font.h>
#include <LibGfx/Palette.h>
#include <LibGfx/StylePainter.h>
REGISTER_WIDGET(GUI, RadioButton)
namespace GUI {
RadioButton::RadioButton(DeprecatedString text)
: RadioButton(String::from_deprecated_string(text).release_value_but_fixme_should_propagate_errors())
{
}
RadioButton::RadioButton(String text)
: AbstractButton(move(text))
{
set_exclusive(true);
set_checkable(true);
set_min_size({ 22, 22 });
set_preferred_size({ SpecialDimension::OpportunisticGrow, 22 });
}
Gfx::IntSize RadioButton::circle_size()
{
return { 12, 12 };
}
void RadioButton::paint_event(PaintEvent& event)
{
Painter painter(*this);
painter.add_clip_rect(event.rect());
if (fill_with_background_color())
painter.fill_rect(rect(), palette().window());
if (is_enabled() && is_hovered())
painter.fill_rect(rect(), palette().hover_highlight());
Gfx::IntRect circle_rect { { 2, 0 }, circle_size() };
circle_rect.center_vertically_within(rect());
Gfx::StylePainter::paint_radio_button(painter, circle_rect, palette(), is_checked(), is_being_pressed());
Gfx::IntRect text_rect { circle_rect.right() + 7, 0, static_cast<int>(ceilf(font().width(text_deprecated()))), font().glyph_height() };
text_rect.center_vertically_within(rect());
paint_text(painter, text_rect, font(), Gfx::TextAlignment::TopLeft);
if (is_focused())
painter.draw_focus_rect(text_rect.inflated(6, 6), palette().focus_outline());
}
void RadioButton::click(unsigned)
{
if (!is_enabled())
return;
set_checked(true);
}
Optional<UISize> RadioButton::calculated_min_size() const
{
int horizontal = 2 + 7, vertical = 0;
auto& font = this->font();
vertical = max(font.glyph_height(), circle_size().height());
horizontal += font.width(text_deprecated());
return UISize(horizontal, vertical);
}
}