Button.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <LibGUI/AbstractButton.h>
  9. #include <LibGUI/Action.h>
  10. #include <LibGfx/Bitmap.h>
  11. #include <LibGfx/StylePainter.h>
  12. #include <LibGfx/TextAlignment.h>
  13. namespace GUI {
  14. class Button : public AbstractButton {
  15. C_OBJECT(Button);
  16. public:
  17. enum MenuPosition {
  18. TopLeft,
  19. TopRight,
  20. BottomLeft,
  21. BottomRight
  22. };
  23. virtual ~Button() override;
  24. void set_icon(RefPtr<Gfx::Bitmap>);
  25. void set_icon_from_path(String const&);
  26. Gfx::Bitmap const* icon() const { return m_icon.ptr(); }
  27. Gfx::Bitmap* icon() { return m_icon.ptr(); }
  28. void set_text_alignment(Gfx::TextAlignment text_alignment) { m_text_alignment = text_alignment; }
  29. Gfx::TextAlignment text_alignment() const { return m_text_alignment; }
  30. Function<void(unsigned modifiers)> on_click;
  31. Function<void(unsigned modifiers)> on_middle_mouse_click;
  32. Function<void(ContextMenuEvent&)> on_context_menu_request;
  33. void set_button_style(Gfx::ButtonStyle style) { m_button_style = style; }
  34. Gfx::ButtonStyle button_style() const { return m_button_style; }
  35. virtual void click(unsigned modifiers = 0) override;
  36. virtual void middle_mouse_click(unsigned modifiers = 0) override;
  37. virtual void context_menu_event(ContextMenuEvent&) override;
  38. Action* action() { return m_action; }
  39. Action const* action() const { return m_action; }
  40. void set_action(Action&);
  41. virtual bool is_uncheckable() const override;
  42. int icon_spacing() const { return m_icon_spacing; }
  43. void set_icon_spacing(int spacing) { m_icon_spacing = spacing; }
  44. void set_menu(RefPtr<GUI::Menu>);
  45. bool is_default() const;
  46. void set_default(bool);
  47. bool another_button_has_focus() const { return m_another_button_has_focus; }
  48. void set_mimic_pressed(bool mimic_pressed);
  49. bool is_mimic_pressed() const { return m_mimic_pressed; };
  50. virtual Optional<UISize> calculated_min_size() const override;
  51. protected:
  52. explicit Button(String text = {});
  53. virtual void mousedown_event(MouseEvent&) override;
  54. virtual void mousemove_event(MouseEvent&) override;
  55. virtual void paint_event(PaintEvent&) override;
  56. private:
  57. virtual void timer_event(Core::TimerEvent&) override;
  58. RefPtr<Gfx::Bitmap> m_icon;
  59. RefPtr<GUI::Menu> m_menu;
  60. Gfx::ButtonStyle m_button_style { Gfx::ButtonStyle::Normal };
  61. Gfx::TextAlignment m_text_alignment { Gfx::TextAlignment::Center };
  62. WeakPtr<Action> m_action;
  63. int m_icon_spacing { 4 };
  64. bool m_another_button_has_focus { false };
  65. bool m_mimic_pressed { false };
  66. };
  67. class DialogButton final : public Button {
  68. C_OBJECT(DialogButton);
  69. public:
  70. virtual ~DialogButton() override {};
  71. explicit DialogButton(String text = {})
  72. : Button(move(text))
  73. {
  74. set_fixed_width(80);
  75. }
  76. };
  77. }