Frame.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibGUI/Frame.h>
  8. #include <LibGUI/Painter.h>
  9. #include <LibGUI/Window.h>
  10. #include <LibGfx/Palette.h>
  11. #include <LibGfx/StylePainter.h>
  12. REGISTER_WIDGET(GUI, Frame)
  13. namespace GUI {
  14. Frame::Frame()
  15. {
  16. set_frame_style(Gfx::FrameStyle::SunkenContainer);
  17. REGISTER_ENUM_PROPERTY("style", frame_style, set_frame_style, Gfx::FrameStyle,
  18. { Gfx::FrameStyle::NoFrame, "NoFrame" },
  19. { Gfx::FrameStyle::Window, "Window" },
  20. { Gfx::FrameStyle::Plain, "Plain" },
  21. { Gfx::FrameStyle::RaisedBox, "RaisedBox" },
  22. { Gfx::FrameStyle::SunkenBox, "SunkenBox" },
  23. { Gfx::FrameStyle::RaisedContainer, "RaisedContainer" },
  24. { Gfx::FrameStyle::SunkenContainer, "SunkenContainer" },
  25. { Gfx::FrameStyle::RaisedPanel, "RaisedPanel" },
  26. { Gfx::FrameStyle::SunkenPanel, "SunkenPanel" });
  27. }
  28. void Frame::set_frame_style(Gfx::FrameStyle style)
  29. {
  30. if (m_style == style)
  31. return;
  32. m_style = style;
  33. set_grabbable_margins(frame_thickness());
  34. layout_relevant_change_occurred();
  35. }
  36. int Frame::frame_thickness() const
  37. {
  38. switch (m_style) {
  39. case Gfx::FrameStyle::NoFrame:
  40. return 0;
  41. case Gfx::FrameStyle::Plain:
  42. case Gfx::FrameStyle::RaisedPanel:
  43. case Gfx::FrameStyle::SunkenPanel:
  44. return 1;
  45. default:
  46. return 2;
  47. }
  48. }
  49. void Frame::paint_event(PaintEvent& event)
  50. {
  51. if (m_style == Gfx::FrameStyle::NoFrame)
  52. return;
  53. Painter painter(*this);
  54. painter.add_clip_rect(event.rect());
  55. bool skip_vertical_lines = window()->is_maximized() && spans_entire_window_horizontally();
  56. Gfx::StylePainter::paint_frame(painter, rect(), palette(), m_style, skip_vertical_lines);
  57. }
  58. Gfx::IntRect Frame::children_clip_rect() const
  59. {
  60. return frame_inner_rect();
  61. }
  62. }