Serenity Operating System
at master 83 lines 2.7 kB view raw
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}