1 /*! 2 @file 3 @author Albert Semenov 4 @date 08/2010 5 */ 6 7 #include "Precompiled.h" 8 #include "MainMenuControl.h" 9 #include "SettingsManager.h" 10 #include "CommandManager.h" 11 #include "WidgetSelectorManager.h" 12 #include "WidgetContainer.h" 13 #include "EditorWidgets.h" 14 #include "Localise.h" 15 #include "RecentFilesManager.h" 16 17 namespace tools 18 { 19 MainMenuControlLE(MyGUI::Widget * _parent)20 MainMenuControlLE::MainMenuControlLE(MyGUI::Widget* _parent) : 21 wraps::BaseLayout("MainMenuControl.layout", _parent), 22 mBar(nullptr), 23 mPopupMenuWidgets(nullptr) 24 { 25 assignWidget(mBar, "Menu"); 26 27 createMainMenu(); 28 29 SettingsManager::getInstance().eventSettingsChanged.connect(this, &MainMenuControlLE::notifySettingsChanged); 30 EditorWidgets::getInstance().eventChangeWidgets += MyGUI::newDelegate(this, &MainMenuControlLE::notifyChangeWidgets); 31 32 CommandManager::getInstance().getEvent("Command_OnChangeScale")->connect(this, &MainMenuControlLE::CommandOnChangeScale); 33 34 updateMenuScale(100); 35 } 36 ~MainMenuControlLE()37 MainMenuControlLE::~MainMenuControlLE() 38 { 39 EditorWidgets::getInstance().eventChangeWidgets -= MyGUI::newDelegate(this, &MainMenuControlLE::notifyChangeWidgets); 40 SettingsManager::getInstance().eventSettingsChanged.disconnect(this); 41 } 42 createMainMenu()43 void MainMenuControlLE::createMainMenu() 44 { 45 updateRecentFilesMenu(); 46 updateRecentProjectsMenu(); 47 48 // меню для виджетов 49 mPopupMenuWidgets = mBar->findItemById("Widgets", true)->getItemChild(); 50 51 //FIXME 52 mPopupMenuWidgets->setPopupAccept(true); 53 mPopupMenuWidgets->eventMenuCtrlAccept += MyGUI::newDelegate(this, &MainMenuControlLE::notifyWidgetsSelect); 54 55 mBar->eventMenuCtrlAccept += newDelegate(this, &MainMenuControlLE::notifyPopupMenuAccept); 56 } 57 notifyPopupMenuAccept(MyGUI::MenuControl * _sender,MyGUI::MenuItem * _item)58 void MainMenuControlLE::notifyPopupMenuAccept(MyGUI::MenuControl* _sender, MyGUI::MenuItem* _item) 59 { 60 MyGUI::UString* data = _item->getItemData<MyGUI::UString>(false); 61 if (data != nullptr) 62 CommandManager::getInstance().setCommandData(*data); 63 64 const std::string& command = _item->getItemId(); 65 if (command.size() > 8 && command.substr(0, 8) == "Command_") 66 { 67 CommandManager::getInstance().executeCommand(command); 68 } 69 } 70 widgetsUpdate()71 void MainMenuControlLE::widgetsUpdate() 72 { 73 bool print_name = SettingsManager::getInstance().getValue<bool>("Settings/ShowName"); 74 bool print_type = SettingsManager::getInstance().getValue<bool>("Settings/ShowType"); 75 bool print_skin = SettingsManager::getInstance().getValue<bool>("Settings/ShowSkin"); 76 77 mPopupMenuWidgets->removeAllItems(); 78 79 EnumeratorWidgetContainer widget = EditorWidgets::getInstance().getWidgets(); 80 while (widget.next()) 81 createWidgetPopup(widget.current(), mPopupMenuWidgets, print_name, print_type, print_skin); 82 } 83 createWidgetPopup(WidgetContainer * _container,MyGUI::MenuControl * _parentPopup,bool _print_name,bool _print_type,bool _print_skin)84 void MainMenuControlLE::createWidgetPopup(WidgetContainer* _container, MyGUI::MenuControl* _parentPopup, bool _print_name, bool _print_type, bool _print_skin) 85 { 86 bool submenu = !_container->childContainers.empty(); 87 88 _parentPopup->addItem(getDescriptionString(_container->getWidget(), _print_name, _print_type, _print_skin), submenu ? MyGUI::MenuItemType::Popup : MyGUI::MenuItemType::Normal); 89 _parentPopup->setItemDataAt(_parentPopup->getItemCount() - 1, _container->getWidget()); 90 91 if (submenu) 92 { 93 MyGUI::MenuControl* child = _parentPopup->createItemChildAt(_parentPopup->getItemCount() - 1); 94 child->eventMenuCtrlAccept += MyGUI::newDelegate(this, &MainMenuControlLE::notifyWidgetsSelect); 95 child->setPopupAccept(true); 96 97 for (std::vector<WidgetContainer*>::iterator iter = _container->childContainers.begin(); iter != _container->childContainers.end(); ++iter ) 98 { 99 createWidgetPopup(*iter, child, _print_name, _print_type, _print_skin); 100 } 101 } 102 } 103 notifyWidgetsSelect(MyGUI::MenuControl * _sender,MyGUI::MenuItem * _item)104 void MainMenuControlLE::notifyWidgetsSelect(MyGUI::MenuControl* _sender, MyGUI::MenuItem* _item) 105 { 106 MyGUI::Widget* widget = *_item->getItemData<MyGUI::Widget*>(); 107 WidgetSelectorManager::getInstance().setSelectedWidget(widget); 108 } 109 getDescriptionString(MyGUI::Widget * _widget,bool _print_name,bool _print_type,bool _print_skin)110 std::string MainMenuControlLE::getDescriptionString(MyGUI::Widget* _widget, bool _print_name, bool _print_type, bool _print_skin) 111 { 112 WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(_widget); 113 114 addUserTag("WidgetName", _print_name ? widgetContainer->getName() : ""); 115 addUserTag("WidgetType", _print_type ? _widget->getTypeName() : ""); 116 addUserTag("WidgetSkin", _print_skin ? widgetContainer->getSkin() : ""); 117 118 addUserTag("FormatWidgetName", (_print_name && !widgetContainer->getName().empty()) ? "#{PatternWidgetName}" : ""); 119 addUserTag("FormatWidgetType", _print_type ? "#{PatternWidgetType}" : ""); 120 addUserTag("FormatWidgetSkin", _print_skin ? "#{PatternWidgetSkin}" : ""); 121 122 return replaceTags("MenuItemWidgetInfo"); 123 } 124 notifyChangeWidgets()125 void MainMenuControlLE::notifyChangeWidgets() 126 { 127 widgetsUpdate(); 128 } 129 notifySettingsChanged(const std::string & _path)130 void MainMenuControlLE::notifySettingsChanged(const std::string& _path) 131 { 132 if (_path == "Settings/ShowName" || 133 _path == "Settings/ShowType" || 134 _path == "Settings/ShowSkin") 135 widgetsUpdate(); 136 else if (_path == "Files/RecentFile.List") 137 updateRecentFilesMenu(); 138 else if (_path == "Files/RecentProject.List") 139 updateRecentProjectsMenu(); 140 } 141 updateRecentFilesMenu()142 void MainMenuControlLE::updateRecentFilesMenu() 143 { 144 MyGUI::MenuItem* recentFilesMenu = mBar->findItemById("RecentFiles", true); 145 if (recentFilesMenu != nullptr) 146 { 147 recentFilesMenu->getItemChild()->removeAllItems(); 148 // список последних открытых файлов 149 const RecentFilesManager::VectorUString& recentFiles = RecentFilesManager::getInstance().getRecentFiles(); 150 if (!recentFiles.empty()) 151 { 152 size_t index = 1; 153 for (RecentFilesManager::VectorUString::const_iterator iter = recentFiles.begin(); iter != recentFiles.end(); ++iter, ++index) 154 { 155 addUserTag("IndexRecentFile", MyGUI::utility::toString(index)); 156 addUserTag("RecentFile", *iter); 157 recentFilesMenu->getItemChild()->addItem(replaceTags("FormatRecentFile"), MyGUI::MenuItemType::Normal, "Command_OpenRecentFile", *iter); 158 } 159 } 160 } 161 } 162 updateRecentProjectsMenu()163 void MainMenuControlLE::updateRecentProjectsMenu() 164 { 165 MyGUI::MenuItem* recentProjectsMenu = mBar->findItemById("RecentProjects", true); 166 if (recentProjectsMenu != nullptr) 167 { 168 recentProjectsMenu->getItemChild()->removeAllItems(); 169 // список последних открытых проектов 170 const RecentFilesManager::VectorUString& recentProjects = RecentFilesManager::getInstance().getRecentProjects(); 171 if (!recentProjects.empty()) 172 { 173 size_t index = 1; 174 for (RecentFilesManager::VectorUString::const_iterator iter = recentProjects.begin(); iter != recentProjects.end(); ++iter, ++index) 175 { 176 addUserTag("IndexRecentProject", MyGUI::utility::toString(index)); 177 addUserTag("RecentProject", *iter); 178 recentProjectsMenu->getItemChild()->addItem(replaceTags("FormatRecentProject"), MyGUI::MenuItemType::Normal, "Command_OpenRecentProject", *iter); 179 } 180 } 181 } 182 } 183 setVisible(bool _value)184 void MainMenuControlLE::setVisible(bool _value) 185 { 186 mBar->setVisible(_value); 187 } 188 CommandOnChangeScale(const MyGUI::UString & _commandName,bool & _result)189 void MainMenuControlLE::CommandOnChangeScale(const MyGUI::UString& _commandName, bool& _result) 190 { 191 updateMenuScale(MyGUI::utility::parseValue<size_t>(CommandManager::getInstance().getCommandData())); 192 193 _result = true; 194 } 195 updateMenuScale(size_t _scale)196 void MainMenuControlLE::updateMenuScale(size_t _scale) 197 { 198 MyGUI::MenuItem* scaleMenu = mBar->findItemById("Scale", true); 199 if (scaleMenu != nullptr) 200 { 201 MyGUI::MenuControl* popup = scaleMenu->getItemChild(); 202 if (popup != nullptr) 203 { 204 std::string id = MyGUI::utility::toString("Command_ChangeScale.", (int)_scale); 205 for (size_t index = 0; index < popup->getItemCount(); index ++) 206 { 207 MyGUI::MenuItem* item = popup->getItemAt(index); 208 item->setItemChecked(item->getItemId() == id); 209 } 210 } 211 } 212 } 213 214 } 215