opuntiaOS - an operating system targeting x86 and ARMv7
at master 3.4 kB view raw
1/* 2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors. 3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com> 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9#include "MenuBar.h" 10#include "../../Managers/Compositor.h" 11#include <libg/ImageLoaders/PNGLoader.h> 12 13namespace WinServer { 14 15MenuBar* s_WinServer_MenuBar_the = nullptr; 16 17MenuBar::MenuBar() 18 : m_background_color(LG::Color::Opaque) 19 , m_bounds(0, 0, Screen::the().bounds().width(), height()) 20 , m_popup(Popup::the()) 21{ 22 s_WinServer_MenuBar_the = this; 23 LG::PNG::PNGLoader loader; 24} 25 26void MenuBar::invalidate_widget(BaseWidget* wg) 27{ 28 for (int i = 0; i < m_widgets.size(); i++) { 29 if (m_widgets[i] == wg) { 30 size_t widget_min_x = widget_start_offset(i); 31 Compositor::the().invalidate(LG::Rect(widget_min_x, 0, m_widgets[i]->width(), height())); 32 return; 33 } 34 } 35} 36 37MenuItemAnswer MenuBar::widget_recieve_mouse_status_change(const CursorManager& cursor_manager, size_t wind) 38{ 39 if (wind >= m_widgets.size()) { 40 return MenuItemAnswer::Bad; 41 } 42 43 MenuItemAnswer answer = MenuItemAnswer::Empty; 44 size_t widget_min_x = widget_start_offset(wind); 45 if (cursor_manager.pressed<CursorManager::Params::LeftButton>()) { 46 answer = m_widgets[wind]->mouse_down(cursor_manager.x() - widget_min_x, cursor_manager.y()); 47 } else { 48 answer = m_widgets[wind]->mouse_up(); 49 } 50 51 if (answer & MenuItemAnswer::Bad) { 52 return answer; 53 } 54 if (answer & MenuItemAnswer::InvalidateMe) { 55 Compositor::the().invalidate(LG::Rect(widget_min_x, 0, m_widgets[wind]->width(), height())); 56 } 57 58 return answer; 59} 60 61MenuItemAnswer MenuBar::panel_item_recieve_mouse_status_change(const CursorManager& cursor_manager, size_t ind) 62{ 63 if (!m_menubar_content) { 64 return MenuItemAnswer::Bad; 65 } 66 67 auto& content = *m_menubar_content; 68 if (ind >= content.size()) { 69 return MenuItemAnswer::Bad; 70 } 71 72 MenuItemAnswer answer = MenuItemAnswer::Empty; 73 size_t item_min_x = panel_item_start_offset(ind); 74 if (cursor_manager.pressed<CursorManager::Params::LeftButton>()) { 75 answer = content[ind].mouse_down(cursor_manager.x() - item_min_x, cursor_manager.y()); 76 } else { 77 answer = content[ind].mouse_up(); 78 } 79 80 if (answer & MenuItemAnswer::Bad) { 81 return answer; 82 } 83 if (answer & MenuItemAnswer::InvalidateMe) { 84 Compositor::the().invalidate(LG::Rect(item_min_x, 0, content[ind].width(), height())); 85 } 86 if (answer & MenuItemAnswer::PopupShow) { 87 popup_will_be_shown(ind); 88 } 89 if (answer & MenuItemAnswer::PopupClose) { 90 popup_will_be_closed(); 91 } 92 93 return answer; 94} 95 96void MenuBar::invalidate_menubar_panel(Compositor& compositor) 97{ 98 if (menubar_content()) { 99 size_t inv_len = menubar_panel_width(*m_menubar_content); 100 compositor.invalidate(menubar_panel_bounds()); 101 } 102} 103 104void MenuBar::invalidate_menubar_panel() 105{ 106 invalidate_menubar_panel(Compositor::the()); 107} 108 109void MenuBar::set_style(StatusBarStyle ts) 110{ 111 set_background_color(ts.color()); 112 113 if (ts.dark_text()) { 114 m_text_color = LG::Color::DarkSystemText; 115 } else { 116 m_text_color = LG::Color::LightSystemText; 117 } 118} 119 120} // namespace WinServer