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