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