Some checks failed
Build / build-gentoo (push) Failing after 14s
Build / download-system-deps (push) Successful in 3m28s
Build / get-source-code (push) Successful in 9m18s
Build / build-deb (push) Failing after 3m41s
Build / build-appimage (push) Successful in 4m12s
Build / build-android (push) Failing after 2m47s
Build / build-windows (push) Failing after 7m10s
- Remove unused OpenMP from playback backend - Fix update_assets on macOS - Add support for Objective C++ on macOS - Add macOS-specific code into the Dear ImGui backend - Add macOS .app packaging - Add support for global menus, and include support for macOS global menu into the Dear ImGui backend
106 lines
No EOL
4 KiB
C++
106 lines
No EOL
4 KiB
C++
#pragma once
|
|
#include <string>
|
|
#include <vector>
|
|
#include <map>
|
|
#include <functional>
|
|
namespace LooperUI {
|
|
enum MenuType {
|
|
MenuType_Default,
|
|
MenuType_Item,
|
|
MenuType_Separator,
|
|
MenuType_Application,
|
|
MenuType_Window,
|
|
MenuType_Help,
|
|
MenuType_Services,
|
|
};
|
|
bool MenuTypeValidForSystem(MenuType type);
|
|
class Menu;
|
|
enum class OSOptions {
|
|
AnyOS,
|
|
OnlyMac,
|
|
ExcludeMac
|
|
};
|
|
class MenuItemBase {
|
|
friend class Menu;
|
|
Menu *parent;
|
|
public:
|
|
std::string id;
|
|
MenuType type;
|
|
OSOptions os_options;
|
|
virtual bool IsSubmenu();
|
|
Menu *GetParent();
|
|
bool HasParent();
|
|
bool visible;
|
|
bool enabled;
|
|
std::string title;
|
|
MenuItemBase(std::string title);
|
|
MenuItemBase(MenuType type = MenuType_Separator);
|
|
};
|
|
class MenuItem : public MenuItemBase {
|
|
public:
|
|
void *userdata;
|
|
std::string keybindString;
|
|
std::function<void(MenuItem*, void*)> callback;
|
|
virtual void RunAction() {
|
|
callback(this, userdata);
|
|
}
|
|
MenuItem(std::string title, std::string keybindString, std::function<void(MenuItem*, void*)> callback, void *userdata = nullptr);
|
|
};
|
|
class Menu : public MenuItemBase {
|
|
using container = std::vector<MenuItemBase*>;
|
|
using iterator = container::iterator;
|
|
using const_iterator = container::const_iterator;
|
|
using reverse_iterator = container::reverse_iterator;
|
|
using const_reverse_iterator = container::const_reverse_iterator;
|
|
container children;
|
|
friend class MenuIterator;
|
|
public:
|
|
bool IsSubmenu() override;
|
|
void Append(MenuItemBase *menu);
|
|
iterator begin();
|
|
iterator end();
|
|
const_iterator cbegin() const;
|
|
const_iterator cend() const;
|
|
reverse_iterator rbegin();
|
|
reverse_iterator rend();
|
|
const_reverse_iterator crbegin() const;
|
|
const_reverse_iterator crend() const;
|
|
MenuItemBase *operator [](size_t index);
|
|
void Prepend(MenuItemBase *menu);
|
|
void Insert(MenuItemBase *menu, size_t index);
|
|
Menu(std::string title, MenuType type = MenuType_Default);
|
|
};
|
|
class Menubar {
|
|
|
|
};
|
|
class MenuBuilder {
|
|
private:
|
|
Menu *root;
|
|
Menu *current_menu;
|
|
bool built;
|
|
void throwIfBuilt();
|
|
public:
|
|
MenuBuilder &BeginSubmenu(std::string title, MenuType type = MenuType_Default, OSOptions allowedOS = OSOptions::AnyOS);
|
|
MenuBuilder &EndSubmenu();
|
|
MenuBuilder &AddSeparator(OSOptions allowedOS = OSOptions::AnyOS);
|
|
MenuBuilder &AddEmptySubmenu(std::string title, MenuType type = MenuType_Default, OSOptions allowedOS = OSOptions::AnyOS);
|
|
MenuBuilder &AddItem(std::string title, std::string keybindString, std::function<void(MenuItem*, void*)> callback, void *userdata = nullptr, OSOptions allowedOS = OSOptions::AnyOS);
|
|
MenuBuilder &AddItemNoUserdata(std::string title, std::string keybindString, std::function<void(MenuItem*)> callback_no_userdata, OSOptions allowedOS = OSOptions::AnyOS);
|
|
MenuBuilder &AddItemSimple(std::string title, std::string keybindString, std::function<void()> callback_simple, OSOptions allowedOS = OSOptions::AnyOS);
|
|
Menu *Build();
|
|
MenuBuilder(std::string rootTitle = "<root>");
|
|
};
|
|
// TODO: For DBusmenu
|
|
struct PlatformData;
|
|
struct MenuIteratorCallbacks {
|
|
inline virtual void Init(Menu *root) { }
|
|
inline virtual void Finalize() { }
|
|
inline virtual void AddNormalItem(MenuItem* item) { }
|
|
inline virtual void BeginSubmenu(Menu *menu) { }
|
|
inline virtual void EndSubmenu() { }
|
|
inline virtual void AddSeparator() { }
|
|
};
|
|
MenuItemBase *FindMenu(Menu *menu, std::string title);
|
|
void IterateMenu(Menu *menu, MenuIteratorCallbacks &callbacks);
|
|
bool PublishMenu(Menu *menu, PlatformData *platform_data = nullptr);
|
|
} |