GButton.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "GButton.h"
  2. #include <LibGUI/GPainter.h>
  3. #include <SharedGraphics/StylePainter.h>
  4. //#define GBUTTON_DEBUG
  5. GButton::GButton(GWidget* parent)
  6. : GWidget(parent)
  7. {
  8. }
  9. GButton::~GButton()
  10. {
  11. }
  12. void GButton::set_caption(const String& caption)
  13. {
  14. if (caption == m_caption)
  15. return;
  16. m_caption = caption;
  17. update();
  18. }
  19. void GButton::set_checked(bool checked)
  20. {
  21. if (m_checked == checked)
  22. return;
  23. m_checked = checked;
  24. update();
  25. }
  26. void GButton::paint_event(GPaintEvent& event)
  27. {
  28. GPainter painter(*this);
  29. painter.add_clip_rect(event.rect());
  30. StylePainter::paint_button(painter, rect(), m_button_style, m_being_pressed, m_hovered, m_checkable && m_checked);
  31. if (!caption().is_empty() || m_icon) {
  32. auto content_rect = rect().shrunken(10, 2);
  33. auto icon_location = m_icon ? content_rect.center().translated(-(m_icon->width() / 2), -(m_icon->height() / 2)) : Point();
  34. if (m_being_pressed) {
  35. content_rect.move_by(1, 1);
  36. icon_location.move_by(1, 1);
  37. }
  38. if (m_icon)
  39. painter.blit(icon_location, *m_icon, m_icon->rect());
  40. auto& font = (m_checkable && m_checked) ? Font::default_bold_font() : this->font();
  41. painter.draw_text(content_rect, caption(), font, text_alignment(), Color::Black);
  42. }
  43. }
  44. void GButton::mousemove_event(GMouseEvent& event)
  45. {
  46. if (event.buttons() == GMouseButton::Left) {
  47. bool being_pressed = rect().contains(event.position());
  48. if (being_pressed != m_being_pressed) {
  49. m_being_pressed = being_pressed;
  50. update();
  51. }
  52. }
  53. GWidget::mousemove_event(event);
  54. }
  55. void GButton::mousedown_event(GMouseEvent& event)
  56. {
  57. #ifdef GBUTTON_DEBUG
  58. dbgprintf("GButton::mouse_down_event: x=%d, y=%d, button=%u\n", event.x(), event.y(), (unsigned)event.button());
  59. #endif
  60. if (event.button() == GMouseButton::Left) {
  61. m_being_pressed = true;
  62. update();
  63. }
  64. GWidget::mousedown_event(event);
  65. }
  66. void GButton::click()
  67. {
  68. if (on_click)
  69. on_click(*this);
  70. }
  71. void GButton::mouseup_event(GMouseEvent& event)
  72. {
  73. #ifdef GBUTTON_DEBUG
  74. dbgprintf("GButton::mouse_up_event: x=%d, y=%d, button=%u\n", event.x(), event.y(), (unsigned)event.button());
  75. #endif
  76. if (event.button() == GMouseButton::Left) {
  77. bool was_being_pressed = m_being_pressed;
  78. m_being_pressed = false;
  79. update();
  80. if (was_being_pressed)
  81. click();
  82. }
  83. GWidget::mouseup_event(event);
  84. }
  85. void GButton::enter_event(GEvent&)
  86. {
  87. m_hovered = true;
  88. update();
  89. }
  90. void GButton::leave_event(GEvent&)
  91. {
  92. m_hovered = false;
  93. update();
  94. }