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#pragma once
10#include "../Helpers/TextDrawer.h"
11#include "../Popup/Popup.h"
12#include "MenuItemAnswer.h"
13#include <libfoundation/Logger.h>
14#include <libg/Context.h>
15#include <libg/Font.h>
16#include <string>
17#include <vector>
18
19namespace WinServer {
20
21class MenuDir {
22public:
23 MenuDir(const std::string& title, int id)
24 : m_title(title)
25 , m_id(id)
26 {
27 }
28
29 ~MenuDir() = default;
30
31 inline void set_font(LG::Font& f) { m_font = f; }
32 inline void add_item(PopupItem&& item) { m_items.push_back(std::move(item)); }
33 inline void add_item(const PopupItem& item) { m_items.push_back(item); }
34
35 inline int id() const { return m_id; }
36 inline void set_title(const std::string& title) { m_title = title; }
37 inline void set_title(std::string&& title) { m_title = std::move(title); }
38 inline const std::string& title() const { return m_title; }
39 inline const PopupData& items() const { return m_items; }
40 inline PopupData& items() { return m_items; }
41
42 inline size_t width() const { return Helpers::text_width(m_title, m_font); }
43
44 [[gnu::always_inline]] inline void draw(LG::Context& ctx)
45 {
46 ctx.set_fill_color(LG::Color::Black);
47 Helpers::draw_text(ctx, { 0, 6 }, m_title, m_font);
48 }
49
50 inline MenuItemAnswer mouse_down(int x, int y)
51 {
52 m_active = true;
53 return MenuItemAnswer(MenuItemAnswer::InvalidateMe | MenuItemAnswer::PopupShow);
54 }
55
56 inline MenuItemAnswer mouse_up()
57 {
58 return MenuItemAnswer::InvalidateMe;
59 }
60
61private:
62 int m_id { -1 };
63 bool m_active { false };
64 std::string m_title;
65 LG::Font& m_font { LG::Font::system_font() };
66 PopupData m_items;
67};
68
69} // namespace WinServer