Clean up some stuff in menu.cpp
This commit is contained in:
parent
0931194b4f
commit
e5e3bff7f8
1 changed files with 21 additions and 42 deletions
63
src/menu.cpp
63
src/menu.cpp
|
@ -49,9 +49,6 @@ namespace {
|
||||||
/// Window ID of first menu item
|
/// Window ID of first menu item
|
||||||
static const int MENU_ID_BASE = 10000;
|
static const int MENU_ID_BASE = 10000;
|
||||||
|
|
||||||
using std::placeholders::_1;
|
|
||||||
using std::bind;
|
|
||||||
|
|
||||||
class MruMenu final : public wxMenu {
|
class MruMenu final : public wxMenu {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::vector<wxMenuItem *> items;
|
std::vector<wxMenuItem *> items;
|
||||||
|
@ -84,7 +81,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update() {
|
void Update() {
|
||||||
const agi::MRUManager::MRUListMap *mru = config::mru->Get(type);
|
const auto mru = config::mru->Get(type);
|
||||||
|
|
||||||
Resize(mru->size());
|
Resize(mru->size());
|
||||||
|
|
||||||
|
@ -108,14 +105,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct menu_item_cmp {
|
|
||||||
wxMenuItem *item;
|
|
||||||
menu_item_cmp(wxMenuItem *item) : item(item) { }
|
|
||||||
bool operator()(std::pair<std::string, wxMenuItem*> const& o) const {
|
|
||||||
return o.second == item;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @class CommandManager
|
/// @class CommandManager
|
||||||
/// @brief Event dispatcher to update menus on open and handle click events
|
/// @brief Event dispatcher to update menus on open and handle click events
|
||||||
///
|
///
|
||||||
|
@ -207,10 +196,14 @@ public:
|
||||||
|
|
||||||
/// Unregister a dynamic menu item
|
/// Unregister a dynamic menu item
|
||||||
void Remove(wxMenuItem *item) {
|
void Remove(wxMenuItem *item) {
|
||||||
auto it = find_if(dynamic_items.begin(), dynamic_items.end(), menu_item_cmp(item));
|
auto pred = [=](std::pair<std::string, wxMenuItem*> const& o) {
|
||||||
|
return o.second == item;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto it = find_if(dynamic_items.begin(), dynamic_items.end(), pred);
|
||||||
if (it != dynamic_items.end())
|
if (it != dynamic_items.end())
|
||||||
dynamic_items.erase(it);
|
dynamic_items.erase(it);
|
||||||
it = find_if(static_items.begin(), static_items.end(), menu_item_cmp(item));
|
it = find_if(static_items.begin(), static_items.end(), pred);
|
||||||
if (it != static_items.end())
|
if (it != static_items.end())
|
||||||
static_items.erase(it);
|
static_items.erase(it);
|
||||||
}
|
}
|
||||||
|
@ -224,8 +217,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnMenuOpen(wxMenuEvent &) {
|
void OnMenuOpen(wxMenuEvent &) {
|
||||||
for_each(dynamic_items.begin(), dynamic_items.end(), bind(&CommandManager::UpdateItem, this, _1));
|
for (auto const& item : dynamic_items) UpdateItem(item);
|
||||||
for_each(mru.begin(), mru.end(), std::mem_fun(&MruMenu::Update));
|
for (auto item : mru) item->Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnMenuClick(wxCommandEvent &evt) {
|
void OnMenuClick(wxCommandEvent &evt) {
|
||||||
|
@ -256,8 +249,8 @@ public:
|
||||||
|
|
||||||
/// Update the hotkeys for all menu items
|
/// Update the hotkeys for all menu items
|
||||||
void OnHotkeysChanged() {
|
void OnHotkeysChanged() {
|
||||||
for_each(dynamic_items.begin(), dynamic_items.end(), bind(&CommandManager::UpdateItemName, this, _1));
|
for (auto const& item : dynamic_items) UpdateItemName(item);
|
||||||
for_each(static_items.begin(), static_items.end(), bind(&CommandManager::UpdateItemName, this, _1));
|
for (auto const& item : static_items) UpdateItemName(item);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -285,12 +278,9 @@ bool read_entry(json::Object const& obj, const char *name, std::string *value) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef json::Array menu_items;
|
|
||||||
typedef json::Object menu_map;
|
|
||||||
|
|
||||||
/// Get the root object of the menu configuration
|
/// Get the root object of the menu configuration
|
||||||
menu_map const& get_menus_root() {
|
json::Object const& get_menus_root() {
|
||||||
static menu_map root;
|
static json::Object root;
|
||||||
if (!root.empty()) return root;
|
if (!root.empty()) return root;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -310,8 +300,8 @@ menu_map const& get_menus_root() {
|
||||||
/// Get the menu with the specified name
|
/// Get the menu with the specified name
|
||||||
/// @param name Name of menu to get
|
/// @param name Name of menu to get
|
||||||
/// @return Array of menu items
|
/// @return Array of menu items
|
||||||
menu_items const& get_menu(std::string const& name) {
|
json::Array const& get_menu(std::string const& name) {
|
||||||
menu_map const& root = get_menus_root();
|
auto const& root = get_menus_root();
|
||||||
|
|
||||||
auto it = root.find(name);
|
auto it = root.find(name);
|
||||||
if (it == root.end()) throw menu::UnknownMenu("Menu named " + name + " not found");
|
if (it == root.end()) throw menu::UnknownMenu("Menu named " + name + " not found");
|
||||||
|
@ -381,21 +371,12 @@ void process_menu_item(wxMenu *parent, agi::Context *c, json::Object const& ele,
|
||||||
/// @param name Name of the menu
|
/// @param name Name of the menu
|
||||||
/// @param c Project context to bind the menu to
|
/// @param c Project context to bind the menu to
|
||||||
wxMenu *build_menu(std::string const& name, agi::Context *c, CommandManager *cm, wxMenu *menu) {
|
wxMenu *build_menu(std::string const& name, agi::Context *c, CommandManager *cm, wxMenu *menu) {
|
||||||
menu_items const& items = get_menu(name);
|
|
||||||
|
|
||||||
if (!menu) menu = new wxMenu;
|
if (!menu) menu = new wxMenu;
|
||||||
for_each(items.begin(), items.end(), bind(process_menu_item, menu, c, _1, cm));
|
for (auto const& item : get_menu(name))
|
||||||
|
process_menu_item(menu, c, item, cm);
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct comp_str_menu {
|
|
||||||
agi::Context *c;
|
|
||||||
comp_str_menu(agi::Context *c) : c(c) { }
|
|
||||||
bool operator()(const cmd::Command *lft, const cmd::Command *rgt) const {
|
|
||||||
return lft->StrMenu(c) < rgt->StrMenu(c);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class AutomationMenu final : public wxMenu {
|
class AutomationMenu final : public wxMenu {
|
||||||
agi::Context *c;
|
agi::Context *c;
|
||||||
CommandManager *cm;
|
CommandManager *cm;
|
||||||
|
@ -436,10 +417,8 @@ public:
|
||||||
|
|
||||||
namespace menu {
|
namespace menu {
|
||||||
void GetMenuBar(std::string const& name, wxFrame *window, agi::Context *c) {
|
void GetMenuBar(std::string const& name, wxFrame *window, agi::Context *c) {
|
||||||
menu_items const& items = get_menu(name);
|
|
||||||
|
|
||||||
auto menu = agi::util::make_unique<CommandMenuBar>(c);
|
auto menu = agi::util::make_unique<CommandMenuBar>(c);
|
||||||
for (auto const& item : items) {
|
for (auto const& item : get_menu(name)) {
|
||||||
std::string submenu, disp;
|
std::string submenu, disp;
|
||||||
read_entry(item, "submenu", &submenu);
|
read_entry(item, "submenu", &submenu);
|
||||||
read_entry(item, "text", &disp);
|
read_entry(item, "text", &disp);
|
||||||
|
@ -461,11 +440,11 @@ namespace menu {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<wxMenu> GetMenu(std::string const& name, agi::Context *c) {
|
std::unique_ptr<wxMenu> GetMenu(std::string const& name, agi::Context *c) {
|
||||||
auto menu = new CommandMenu(c);
|
auto menu = agi::util::make_unique<CommandMenu>(c);
|
||||||
build_menu(name, c, &menu->cm, menu);
|
build_menu(name, c, &menu->cm, menu.get());
|
||||||
menu->Bind(wxEVT_MENU_OPEN, &CommandManager::OnMenuOpen, &menu->cm);
|
menu->Bind(wxEVT_MENU_OPEN, &CommandManager::OnMenuOpen, &menu->cm);
|
||||||
menu->Bind(wxEVT_MENU, &CommandManager::OnMenuClick, &menu->cm);
|
menu->Bind(wxEVT_MENU, &CommandManager::OnMenuClick, &menu->cm);
|
||||||
return std::unique_ptr<wxMenu>(menu);
|
return std::unique_ptr<wxMenu>(menu.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenPopupMenu(wxMenu *menu, wxWindow *parent_window) {
|
void OpenPopupMenu(wxMenu *menu, wxWindow *parent_window) {
|
||||||
|
|
Loading…
Reference in a new issue