Serenity Operating System
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
8#include <LibGUI/Frame.h>
9#include <LibGUI/Painter.h>
10#include <LibGfx/Palette.h>
11#include <LibGfx/StylePainter.h>
12
13REGISTER_WIDGET(GUI, Frame)
14
15namespace GUI {
16
17Frame::Frame()
18{
19 set_frame_thickness(2);
20 set_frame_shape(Gfx::FrameShape::Container);
21 set_frame_shadow(Gfx::FrameShadow::Sunken);
22
23 REGISTER_INT_PROPERTY("thickness", frame_thickness, set_frame_thickness);
24 REGISTER_ENUM_PROPERTY("shadow", frame_shadow, set_frame_shadow, Gfx::FrameShadow,
25 { Gfx::FrameShadow::Plain, "Plain" },
26 { Gfx::FrameShadow::Raised, "Raised" },
27 { Gfx::FrameShadow::Sunken, "Sunken" });
28 REGISTER_ENUM_PROPERTY("shape", frame_shape, set_frame_shape, Gfx::FrameShape,
29 { Gfx::FrameShape::NoFrame, "NoFrame" },
30 { Gfx::FrameShape::Box, "Box" },
31 { Gfx::FrameShape::Container, "Container" },
32 { Gfx::FrameShape::Panel, "Panel" },
33 { Gfx::FrameShape::Window, "Window" });
34}
35
36void Frame::set_frame_thickness(int thickness)
37{
38 if (m_thickness == thickness)
39 return;
40 m_thickness = thickness;
41 set_grabbable_margins(thickness);
42 layout_relevant_change_occurred();
43}
44
45void Frame::paint_event(PaintEvent& event)
46{
47 if (m_shape == Gfx::FrameShape::NoFrame)
48 return;
49
50 Painter painter(*this);
51 painter.add_clip_rect(event.rect());
52 Gfx::StylePainter::paint_frame(painter, rect(), palette(), m_shape, m_shadow, m_thickness, spans_entire_window_horizontally());
53}
54
55Gfx::IntRect Frame::children_clip_rect() const
56{
57 return frame_inner_rect();
58}
59
60}