looper/liblooperui/menus.hpp
Zachary Hall 51d4ed39ab
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
Add support for macOS
- 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
2025-02-09 10:13:46 -08:00

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);
}