Serenity Operating System
1/*
2 * Copyright (c) 2020, Hüseyin Aslıtürk <asliturk@hotmail.com>
3 * Copyright (c) 2021, Rasmus Nylander <RasmusNylander.SerenityOS@gmail.com>
4 * Copyright (c) 2022, the SerenityOS developers.
5 *
6 * SPDX-License-Identifier: BSD-2-Clause
7 */
8
9#include "KeyButton.h"
10#include <LibGUI/Painter.h>
11#include <LibGUI/Window.h>
12#include <LibGfx/Font/Font.h>
13#include <LibGfx/Palette.h>
14
15void KeyButton::paint_event(GUI::PaintEvent& event)
16{
17 GUI::Painter painter(*this);
18 painter.add_clip_rect(event.rect());
19
20 auto cont_rect = rect();
21 auto& font = this->font();
22
23 Color face_color;
24 if (m_pressed) {
25 face_color = Color::Cyan;
26 } else if (!is_enabled()) {
27 face_color = Color::LightGray;
28 } else {
29 face_color = Color::White;
30 }
31
32 Gfx::IntRect key_cap_side_rect = { cont_rect.x() + 1, cont_rect.y() + 1, cont_rect.width() - 2, cont_rect.height() - 2 };
33 Gfx::IntRect key_cap_face_border_rect = { cont_rect.x() + 6, cont_rect.y() + 3, cont_rect.width() - 12, cont_rect.height() - 12 };
34 Gfx::IntRect key_cap_face_rect = { cont_rect.x() + 7, cont_rect.y() + 4, cont_rect.width() - 14, cont_rect.height() - 14 };
35
36 painter.draw_rect(cont_rect, Color::Black); // Key cap border
37 painter.fill_rect(key_cap_side_rect, Color::from_rgb(0x999999));
38 painter.draw_rect(key_cap_face_border_rect, Color::from_rgb(0x8C7272), false);
39 painter.fill_rect(key_cap_face_rect, face_color);
40
41 if (text().is_empty() || text().bytes_as_string_view().starts_with('\0'))
42 return;
43
44 Gfx::IntRect text_rect { 0, 0, static_cast<int>(ceilf(font.width(text()))), font.pixel_size_rounded_up() };
45 text_rect.align_within(key_cap_face_rect, Gfx::TextAlignment::Center);
46
47 painter.draw_text(text_rect, text(), font, Gfx::TextAlignment::Center, Color::Black, Gfx::TextElision::Right);
48 if (is_focused())
49 painter.draw_rect(text_rect.inflated(6, 4), palette().focus_outline());
50}
51
52void KeyButton::click(unsigned)
53{
54 if (on_click && m_face_hovered)
55 on_click();
56}
57
58void KeyButton::mousemove_event(GUI::MouseEvent& event)
59{
60 if (!is_enabled())
61 return;
62
63 Gfx::IntRect key_cap_face_rect = { rect().x() + 7, rect().y() + 4, rect().width() - 14, rect().height() - 14 };
64
65 set_face_hovered(key_cap_face_rect.contains(event.position()));
66
67 AbstractButton::mousemove_event(event);
68}
69
70void KeyButton::leave_event(Core::Event& event)
71{
72 set_face_hovered(false);
73 AbstractButton::leave_event(event);
74}
75
76void KeyButton::set_face_hovered(bool value)
77{
78 m_face_hovered = value;
79 if (m_face_hovered)
80 set_override_cursor(Gfx::StandardCursor::Hand);
81 else
82 set_override_cursor(Gfx::StandardCursor::None);
83}