GRadioButton.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <LibDraw/GraphicsBitmap.h>
  2. #include <LibDraw/StylePainter.h>
  3. #include <LibGUI/GPainter.h>
  4. #include <LibGUI/GRadioButton.h>
  5. GRadioButton::GRadioButton(GWidget* parent)
  6. : GRadioButton({}, parent)
  7. {
  8. }
  9. GRadioButton::GRadioButton(const StringView& text, GWidget* parent)
  10. : GAbstractButton(text, parent)
  11. {
  12. }
  13. GRadioButton::~GRadioButton()
  14. {
  15. }
  16. Size GRadioButton::circle_size()
  17. {
  18. return { 12, 12 };
  19. }
  20. void GRadioButton::paint_event(GPaintEvent& event)
  21. {
  22. GPainter painter(*this);
  23. painter.add_clip_rect(event.rect());
  24. Rect circle_rect { { 2, 0 }, circle_size() };
  25. circle_rect.center_vertically_within(rect());
  26. StylePainter::paint_radio_button(painter, circle_rect, palette(), is_checked(), is_being_pressed());
  27. Rect text_rect { circle_rect.right() + 4, 0, font().width(text()), font().glyph_height() };
  28. text_rect.center_vertically_within(rect());
  29. paint_text(painter, text_rect, font(), TextAlignment::TopLeft);
  30. }
  31. template<typename Callback>
  32. void GRadioButton::for_each_in_group(Callback callback)
  33. {
  34. if (!parent())
  35. return;
  36. parent()->for_each_child_of_type<GRadioButton>([&](auto& child) {
  37. return callback(static_cast<GRadioButton&>(child));
  38. });
  39. }
  40. void GRadioButton::click()
  41. {
  42. if (!is_enabled())
  43. return;
  44. for_each_in_group([this](auto& button) {
  45. if (&button != this)
  46. button.set_checked(false);
  47. return IterationDecision::Continue;
  48. });
  49. set_checked(true);
  50. }