1
#include "Precompiled.h"
2
#include "EditorWidgets.h"
4
#include "WidgetTypes.h"
5
#include "GroupMessage.h"
6
#include "BackwardCompatibilityManager.h"
7
#include "WidgetSelectorManager.h"
8
#include "SettingsManager.h"
10
template <> tools::EditorWidgets* MyGUI::Singleton<tools::EditorWidgets>::msInstance = nullptr;
11
template <> const char* MyGUI::Singleton<tools::EditorWidgets>::mClassTypeName("EditorWidgets");
15
const std::string LogSection = "LayoutEditor";
17
EditorWidgets::EditorWidgets() :
18
mWidgetsChanged(false)
22
EditorWidgets::~EditorWidgets()
27
void EditorWidgets::initialise()
29
mWidgetsChanged = true;
31
MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("IgnoreParameters") = MyGUI::newDelegate(this, &EditorWidgets::loadIgnoreParameters);
32
MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("SkinReplace") = MyGUI::newDelegate(this, &EditorWidgets::loadSkinReplace);
34
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &EditorWidgets::notifyFrameStarted);
35
MyGUI::WidgetManager::getInstance().registerUnlinker(this);
38
void EditorWidgets::shutdown()
40
MyGUI::WidgetManager::getInstance().unregisterUnlinker(this);
41
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &EditorWidgets::notifyFrameStarted);
47
void EditorWidgets::destroyAllWidgets()
49
for (std::vector<WidgetContainer*>::iterator iter = mWidgets.begin(); iter != mWidgets.end(); ++iter)
54
bool EditorWidgets::load(const MyGUI::UString& _fileName)
56
size_t index = _fileName.find("|");
57
if (index != MyGUI::UString::npos)
59
MyGUI::UString fileName = _fileName.substr(0, index);
60
MyGUI::UString itemIndex = _fileName.substr(index + 1);
62
return loadFromProject(fileName, MyGUI::utility::parseValue<size_t>(itemIndex));
65
mCurrentFileName = _fileName;
66
mCurrentItemName.clear();
68
MyGUI::xml::Document doc;
69
if (!doc.open(_fileName))
71
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
75
MyGUI::xml::ElementPtr root = doc.getRoot();
76
if ((nullptr == root) || (root->getName() != "MyGUI"))
78
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
82
if (root->findAttribute("type") == "Layout")
84
loadWidgetsFromXmlNode(root);
91
mWidgetsChanged = true;
95
bool EditorWidgets::loadFromProject(const MyGUI::UString& _fileName, size_t _index)
97
mCurrentFileName = _fileName;
99
MyGUI::xml::Document doc;
100
if (!doc.open(_fileName))
102
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
106
MyGUI::xml::ElementPtr root = doc.getRoot();
107
if ((nullptr == root) || (root->getName() != "MyGUI"))
109
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
113
if (root->findAttribute("type") == "Resource")
115
// берем детей и крутимся
116
MyGUI::xml::ElementEnumerator element = root->getElementEnumerator();
117
while (element.next("Resource"))
119
if (element->findAttribute("type") == "ResourceLayout")
123
mCurrentItemName = element->findAttribute("name");
125
loadWidgetsFromXmlNode(element.current());
141
mWidgetsChanged = true;
145
bool EditorWidgets::save(const MyGUI::UString& _fileName)
147
size_t index = _fileName.find("|");
148
if (index != MyGUI::UString::npos)
150
MyGUI::UString fileName = _fileName.substr(0, index);
151
MyGUI::UString itemIndex = _fileName.substr(index + 1);
153
return saveToProject(fileName, MyGUI::utility::parseValue<size_t>(itemIndex));
156
mCurrentFileName = _fileName;
157
mCurrentItemName.clear();
159
MyGUI::xml::Document doc;
160
doc.createDeclaration();
161
MyGUI::xml::ElementPtr root = doc.createRoot("MyGUI");
162
root->addAttribute("type", "Layout");
164
saveWidgetsToXmlNode(root, true);
166
if (!doc.save(_fileName))
168
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
175
bool EditorWidgets::saveToProject(const MyGUI::UString& _fileName, size_t _index)
177
mCurrentFileName = _fileName;
179
MyGUI::xml::Document doc;
180
if (!doc.open(_fileName))
182
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
186
MyGUI::xml::ElementPtr root = doc.getRoot();
187
if ((nullptr == root) || (root->getName() != "MyGUI"))
189
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
193
if (root->findAttribute("type") == "Resource")
195
// берем детей и крутимся
196
MyGUI::xml::ElementEnumerator element = root->getElementEnumerator();
197
while (element.next("Resource"))
199
if (element->findAttribute("type") == "ResourceLayout")
203
mCurrentItemName = element->findAttribute("name");
206
element->addAttribute("type", "ResourceLayout");
207
element->addAttribute("name", mCurrentItemName);
209
saveWidgetsToXmlNode(element.current(), true);
211
if (!doc.save(_fileName))
213
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
231
void EditorWidgets::loadxmlDocument(MyGUI::xml::Document* doc, bool _testMode)
233
MyGUI::xml::ElementPtr root = doc->getRoot();
236
if (root->findAttribute("type", type))
238
if (type == "Layout")
240
loadWidgetsFromXmlNode(root, _testMode);
243
mWidgetsChanged = true;
246
MyGUI::xml::Document* EditorWidgets::savexmlDocument()
248
MyGUI::xml::Document* doc = new MyGUI::xml::Document();
250
doc->createDeclaration();
251
MyGUI::xml::ElementPtr root = doc->createRoot("MyGUI");
252
root->addAttribute("type", "Layout");
254
saveWidgetsToXmlNode(root);
259
void EditorWidgets::add(WidgetContainer* _container)
261
if (nullptr == _container->getWidget()->getParent())
263
mWidgets.push_back(_container);
267
MyGUI::Widget* parent = _container->getWidget()->getParent();
268
WidgetContainer* containerParent = find(parent);
269
while (nullptr == containerParent)
271
parent = parent->getParent();
272
if (parent == nullptr)
274
containerParent = find(parent);
276
containerParent->childContainers.push_back(_container);
278
mWidgetsChanged = true;
281
void EditorWidgets::remove(MyGUI::Widget* _widget)
283
remove(find(_widget));
284
mWidgetsChanged = true;
287
void EditorWidgets::remove(WidgetContainer* _container)
289
if (nullptr != _container)
291
std::vector<WidgetContainer*>::reverse_iterator iter;
292
while (_container->childContainers.empty() == false)
294
iter = _container->childContainers.rbegin();
298
if (nullptr == _container->getWidget()->getParent())
300
mWidgets.erase(std::find(mWidgets.begin(), mWidgets.end(), _container));
304
MyGUI::Widget* parent = _container->getWidget()->getParent();
305
WidgetContainer* containerParent = find(parent);
306
while (nullptr == containerParent)
308
parent = parent->getParent();
309
if (parent == nullptr)
311
// такого не должно быть, или утечка памяти,
312
// так как удалять нельзя им пользуется код вызывающий данную функцию
315
containerParent = find(parent);
318
containerParent->childContainers.erase(std::find(containerParent->childContainers.begin(), containerParent->childContainers.end(), _container));
321
MyGUI::Gui::getInstance().destroyWidget(_container->getWidget());
326
mWidgetsChanged = true;
329
bool EditorWidgets::unbind(WidgetContainer* _container)
333
if (nullptr != _container)
335
std::vector<WidgetContainer*>::reverse_iterator iter;
336
while (_container->childContainers.empty() == false)
338
iter = _container->childContainers.rbegin();
343
if (nullptr == _container->getWidget()->getParent())
345
mWidgets.erase(std::find(mWidgets.begin(), mWidgets.end(), _container));
349
MyGUI::Widget* parent = _container->getWidget()->getParent();
350
WidgetContainer* containerParent = find(parent);
351
while (nullptr == containerParent)
353
parent = parent->getParent();
354
if (parent == nullptr)
356
// такого не должно быть, или утечка памяти,
357
// так как удалять нельзя им пользуется код вызывающий данную функцию
360
containerParent = find(parent);
363
containerParent->childContainers.erase(std::find(containerParent->childContainers.begin(), containerParent->childContainers.end(), _container));
370
mWidgetsChanged = true;
374
void EditorWidgets::clear()
376
mCurrentFileName.clear();
377
mCurrentItemName.clear();
379
while (!mWidgets.empty())
381
remove(mWidgets[mWidgets.size()-1]);
387
WidgetContainer* EditorWidgets::find(MyGUI::Widget* _widget)
389
return _find(_widget, "", mWidgets);
392
WidgetContainer* EditorWidgets::find(const std::string& _name)
394
return _find(nullptr, _name, mWidgets);
397
WidgetContainer* EditorWidgets::_find(MyGUI::Widget* _widget, const std::string& _name, std::vector<WidgetContainer*> _widgets)
399
for (std::vector<WidgetContainer*>::iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter)
401
if (((*iter)->getWidget() == _widget) || ((_name.empty() == false) && ((*iter)->getName() == _name)))
405
WidgetContainer* retContainer = _find(_widget, _name, (*iter)->childContainers);
412
void EditorWidgets::parseWidget(MyGUI::xml::ElementEnumerator& _widget, MyGUI::Widget* _parent, bool _testMode)
414
WidgetContainer* container = new WidgetContainer();
415
// парсим атрибуты виджета
416
MyGUI::IntCoord coord;
417
MyGUI::Align align = MyGUI::Align::Default;
418
MyGUI::WidgetStyle widgetStyle = MyGUI::WidgetStyle::Child;
419
std::string position;
421
container->setName(_widget->findAttribute("name"));
422
container->setType(_widget->findAttribute("type"));
423
container->setSkin(_widget->findAttribute("skin"));
424
container->setLayerName(_widget->findAttribute("layer"));
426
if (_widget->findAttribute("style", tmp))
428
container->setStyle(tmp);
429
widgetStyle = MyGUI::WidgetStyle::parse(tmp);
431
if (_widget->findAttribute("align", tmp))
433
container->setAlign(tmp);
434
align = MyGUI::Align::parse(tmp);
436
if (_widget->findAttribute("position", position))
437
coord = MyGUI::IntCoord::parse(position);
438
if (_widget->findAttribute("position_real", position))
440
container->setRelativeMode(true);
441
SettingsSector* sector = SettingsManager::getInstance().getSector("Workspace");
442
MyGUI::IntSize size = _testMode ? MyGUI::RenderManager::getInstance().getViewSize() : sector->getPropertyValue<MyGUI::IntSize>("TextureSize");
443
coord = MyGUI::CoordConverter::convertFromRelative(MyGUI::FloatCoord::parse(position), _parent == nullptr ? size : _parent->getClientCoord().size());
446
// проверяем скин на присутствие
447
std::string skin = container->getSkin();
448
bool exist = isSkinExist(container->getSkin());
449
if (!exist && !container->getSkin().empty())
451
skin = WidgetTypes::getInstance().findWidgetStyle(container->getType())->default_skin;
453
std::string skin_string;
455
skin_string = "empty skin";
457
skin_string = "'" + skin + "'";
459
// FIXME : not translated string
460
std::string mess = MyGUI::utility::toString("'", container->getSkin(), "' skin not found , temporary changed to ", skin_string);
461
GroupMessage::getInstance().addMessage(mess, MyGUI::LogLevel::Error);
465
skin = getSkinReplace(skin);
467
std::string layer = DEFAULT_EDITOR_LAYER;
470
// use widget's layer if possible
471
if (MyGUI::LayerManager::getInstance().isExist(container->getLayerName()))
472
layer = container->getLayerName();
474
layer = DEFAULT_TEST_MODE_LAYER;
476
std::string widgetType = MyGUI::FactoryManager::getInstance().isFactoryExist("Widget", container->getType()) ?
477
container->getType() : MyGUI::Widget::getClassTypeName();
479
if (nullptr == _parent)
481
container->setWidget(MyGUI::Gui::getInstance().createWidgetT(widgetType, skin, coord, align, layer));
485
container->setWidget(_parent->createWidgetT(widgetStyle, widgetType, skin, coord, align, layer));
490
// берем детей и крутимся
491
MyGUI::xml::ElementEnumerator widget = _widget->getElementEnumerator();
492
while (widget.next())
494
std::string key, value, type;
496
if (widget->getName() == "Widget")
498
parseWidget(widget, container->getWidget(), _testMode);
500
else if (widget->getName() == "Property")
503
if (!widget->findAttribute("key", key))
505
if (!widget->findAttribute("value", value))
508
// конвертим проперти в текущий вариант версии
509
key = MyGUI::BackwardCompatibility::getPropertyRename(key);
510
size_t indexSeparator = key.find('_');
511
if (indexSeparator != std::string::npos)
512
key = key.substr(indexSeparator + 1);
514
// и пытаемся парсить свойство
515
if (tryToApplyProperty(container->getWidget(), key, value, _testMode) == false)
518
container->setProperty(key, value, false);
520
else if (widget->getName() == "UserString")
523
if (!widget->findAttribute("key", key))
525
if (!widget->findAttribute("value", value))
527
//container->mUserString.insert(MyGUI::PairString(key, value));
528
container->setUserData(key, value);
530
else if (widget->getName() == "Controller")
533
if (!widget->findAttribute("type", type))
535
ControllerInfo* controllerInfo = new ControllerInfo();
536
controllerInfo->mType = type;
538
MyGUI::ControllerItem* item = nullptr;
541
item = MyGUI::ControllerManager::getInstance().createItem(type);
544
MyGUI::xml::ElementEnumerator prop = widget->getElementEnumerator();
545
while (prop.next("Property"))
547
if (!prop->findAttribute("key", key))
549
if (!prop->findAttribute("value", value))
552
controllerInfo->mProperty[key] = value;
555
item->setProperty(key, value);
560
MyGUI::ControllerManager::getInstance().addItem(container->getWidget(), item);
563
container->mController.push_back(controllerInfo);
568
bool EditorWidgets::tryToApplyProperty(MyGUI::Widget* _widget, const std::string& _key, const std::string& _value, bool _testMode)
570
WidgetContainer* container = EditorWidgets::getInstance().find(_widget);
571
if (container->existUserData("LE_TargetWidgetType"))
576
if (_key == "Image_Texture")
578
if (!MyGUI::DataManager::getInstance().isDataExist(_value))
580
GroupMessage::getInstance().addMessage("No such " + _key + ": '" + _value + "'. This value will be saved.", MyGUI::LogLevel::Warning);
585
if (_testMode || std::find(mIgnoreParameters.begin(), mIgnoreParameters.end(), _key) == mIgnoreParameters.end())
587
_widget->setProperty(_key, _value);
592
GroupMessage::getInstance().addMessage("Can't apply '" + _key + "'property.", MyGUI::LogLevel::Error);
598
void EditorWidgets::serialiseWidget(WidgetContainer* _container, MyGUI::xml::ElementPtr _node, bool _compatibility)
600
MyGUI::xml::ElementPtr node = _node->createChild("Widget");
602
node->addAttribute("type", _container->getType());
603
node->addAttribute("skin", _container->getSkin());
605
if (!_container->getRelativeMode())
606
node->addAttribute("position", _container->position());
608
node->addAttribute("position_real", _container->position(false));
610
if (!_container->getAlign().empty())
611
node->addAttribute("align", _container->getAlign());
613
if (!_container->getStyle().empty())
614
node->addAttribute("style", _container->getStyle());
616
if ("" != _container->getLayerName())
617
node->addAttribute("layer", _container->getLayerName());
619
if (!_container->getName().empty())
620
node->addAttribute("name", _container->getName());
622
WidgetContainer::PropertyEnumerator propertyItem = _container->getPropertyEnumerator();
623
while (propertyItem.next())
625
BackwardCompatibilityManager::getInstance().serialiseProperty(node, _container->getType(), propertyItem.current(), _compatibility);
628
WidgetContainer::UserDataEnumerator userData = _container->getUserDataEnumerator();
629
while (userData.next())
631
MyGUI::xml::ElementPtr nodeProp = node->createChild("UserString");
632
nodeProp->addAttribute("key", userData.current().first);
633
nodeProp->addAttribute("value", userData.current().second);
636
for (std::vector<ControllerInfo*>::iterator iter = _container->mController.begin(); iter != _container->mController.end(); ++iter)
638
MyGUI::xml::ElementPtr nodeController = node->createChild("Controller");
639
nodeController->addAttribute("type", (*iter)->mType);
640
for (MyGUI::MapString::iterator iterProp = (*iter)->mProperty.begin(); iterProp != (*iter)->mProperty.end(); ++iterProp)
642
MyGUI::xml::ElementPtr nodeProp = nodeController->createChild("Property");
643
nodeProp->addAttribute("key", iterProp->first);
644
nodeProp->addAttribute("value", iterProp->second);
648
for (std::vector<WidgetContainer*>::iterator iter = _container->childContainers.begin(); iter != _container->childContainers.end(); ++iter)
650
serialiseWidget(*iter, node, _compatibility);
654
void EditorWidgets::loadIgnoreParameters(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
656
MyGUI::xml::ElementEnumerator parameter = _node->getElementEnumerator();
657
while (parameter.next("Parameter"))
659
std::string name = parameter->findAttribute("key");
660
mIgnoreParameters.push_back(name);
664
void EditorWidgets::notifyFrameStarted(float _time)
668
mWidgetsChanged = false;
669
eventChangeWidgets();
673
void EditorWidgets::invalidateWidgets()
675
mWidgetsChanged = true;
678
void EditorWidgets::loadSector(MyGUI::xml::ElementPtr _sectorNode)
680
SettingsSector* sector = new SettingsSector();
681
sector->deserialization(_sectorNode, MyGUI::Version());
683
mSettings.push_back(sector);
686
void EditorWidgets::saveSectors(MyGUI::xml::ElementPtr _rootNode)
688
for (VectorSettingsSector::iterator item = mSettings.begin(); item != mSettings.end(); ++item)
689
(*item)->serialization(_rootNode, MyGUI::Version());
692
void EditorWidgets::destroyAllSectors()
694
for (VectorSettingsSector::iterator item = mSettings.begin(); item != mSettings.end(); ++item)
699
SettingsSector* EditorWidgets::getSector(const MyGUI::UString& _sectorName)
701
for (VectorSettingsSector::iterator item = mSettings.begin(); item != mSettings.end(); ++item)
703
if ((*item)->getName() == _sectorName)
707
SettingsSector* sector = new SettingsSector();
708
sector->setName(_sectorName);
710
mSettings.push_back(sector);
714
EnumeratorWidgetContainer EditorWidgets::getWidgets()
716
return EnumeratorWidgetContainer(mWidgets);
719
std::string EditorWidgets::getSkinReplace(const std::string& _skinName)
721
MapString::iterator item = mSkinReplaces.find(_skinName);
722
if (item != mSkinReplaces.end())
723
return (*item).second;
727
void EditorWidgets::loadSkinReplace(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
729
MyGUI::xml::ElementEnumerator node = _node->getElementEnumerator();
730
while (node.next("Skin"))
731
mSkinReplaces[node->findAttribute("key")] = node->getContent();
734
bool EditorWidgets::isSkinExist(const std::string& _skinName)
736
return _skinName == "Default" ||
737
MyGUI::SkinManager::getInstance().isExist(_skinName) ||
738
(MyGUI::LayoutManager::getInstance().isExist(_skinName) && checkTemplate(_skinName));
741
bool EditorWidgets::checkTemplate(const std::string& _skinName)
743
MyGUI::ResourceLayout* templateInfo = MyGUI::LayoutManager::getInstance().getByName(_skinName, false);
744
if (templateInfo != nullptr)
746
const MyGUI::VectorWidgetInfo& data = templateInfo->getLayoutData();
747
for (MyGUI::VectorWidgetInfo::const_iterator container = data.begin(); container != data.end(); ++container)
749
if (container->name == "Root")
757
const MyGUI::UString& EditorWidgets::getCurrentFileName() const
759
return mCurrentFileName;
762
const MyGUI::UString& EditorWidgets::getCurrentItemName() const
764
return mCurrentItemName;
767
void EditorWidgets::_unlinkWidget(MyGUI::Widget* _widget)
769
WidgetContainer* container = find(_widget);
770
if (container != nullptr)
772
bool result = unbind(container);
773
mWidgetsChanged = true;
776
WidgetSelectorManager::getInstance().setSelectedWidget(nullptr);
780
void EditorWidgets::loadWidgetsFromXmlNode(MyGUI::xml::ElementPtr _root, bool _testMode)
782
// берем детей и крутимся
783
MyGUI::xml::ElementEnumerator element = _root->getElementEnumerator();
784
while (element.next())
786
if (element->getName() == "Widget")
787
parseWidget(element, nullptr, _testMode);
789
loadSector(element.current());
793
void EditorWidgets::saveWidgetsToXmlNode(MyGUI::xml::ElementPtr _root, bool _compatibility)
795
_root->addAttribute("version", BackwardCompatibilityManager::getInstancePtr()->getCurrentVersion());
797
for (std::vector<WidgetContainer*>::iterator iter = mWidgets.begin(); iter != mWidgets.end(); ++iter)
799
// в корень только сирот
800
if (nullptr == (*iter)->getWidget()->getParent())
801
serialiseWidget(*iter, _root, _compatibility);
807
void EditorWidgets::onSetWidgetCoord(MyGUI::Widget* _widget, const MyGUI::IntCoord& _value, const std::string& _owner)
809
eventChangeWidgetCoord(_widget, _value, _owner);
1
#include "Precompiled.h"
2
#include "EditorWidgets.h"
4
#include "WidgetTypes.h"
5
#include "GroupMessage.h"
6
#include "BackwardCompatibilityManager.h"
7
#include "WidgetSelectorManager.h"
8
#include "SettingsManager.h"
10
template <> tools::EditorWidgets* MyGUI::Singleton<tools::EditorWidgets>::msInstance = nullptr;
11
template <> const char* MyGUI::Singleton<tools::EditorWidgets>::mClassTypeName = "EditorWidgets";
16
const std::string LogSection = "LayoutEditor";
17
const std::string CodeGeneratorSettingsNodeName = "CodeGeneratorSettings";
19
EditorWidgets::EditorWidgets() :
20
mWidgetsChanged(false)
24
EditorWidgets::~EditorWidgets()
28
void EditorWidgets::initialise()
30
mWidgetsChanged = true;
32
MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("IgnoreParameters") = MyGUI::newDelegate(this, &EditorWidgets::loadIgnoreParameters);
33
MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("SkinReplace") = MyGUI::newDelegate(this, &EditorWidgets::loadSkinReplace);
35
MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &EditorWidgets::notifyFrameStarted);
36
MyGUI::WidgetManager::getInstance().registerUnlinker(this);
39
void EditorWidgets::shutdown()
41
MyGUI::WidgetManager::getInstance().unregisterUnlinker(this);
42
MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &EditorWidgets::notifyFrameStarted);
46
mCodeGeneratorSettings.clear();
49
void EditorWidgets::destroyAllWidgets()
51
for (std::vector<WidgetContainer*>::iterator iter = mWidgets.begin(); iter != mWidgets.end(); ++iter)
56
bool EditorWidgets::load(const MyGUI::UString& _fileName)
58
size_t index = _fileName.find("|");
59
if (index != MyGUI::UString::npos)
61
MyGUI::UString fileName = _fileName.substr(0, index);
62
MyGUI::UString itemIndex = _fileName.substr(index + 1);
64
return loadFromProject(fileName, MyGUI::utility::parseValue<size_t>(itemIndex));
67
mCurrentFileName = _fileName;
68
mCurrentItemName.clear();
70
MyGUI::xml::Document doc;
71
if (!doc.open(_fileName))
73
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
77
MyGUI::xml::ElementPtr root = doc.getRoot();
78
if ((nullptr == root) || (root->getName() != "MyGUI"))
80
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
84
if (root->findAttribute("type") == "Layout")
86
loadWidgetsFromXmlNode(root);
93
mWidgetsChanged = true;
97
bool EditorWidgets::loadFromProject(const MyGUI::UString& _fileName, size_t _index)
99
mCurrentFileName = _fileName;
101
MyGUI::xml::Document doc;
102
if (!doc.open(_fileName))
104
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
108
MyGUI::xml::ElementPtr root = doc.getRoot();
109
if ((nullptr == root) || (root->getName() != "MyGUI"))
111
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
115
if (root->findAttribute("type") == "Resource")
117
// берем детей и крутимся
118
MyGUI::xml::ElementEnumerator element = root->getElementEnumerator();
119
while (element.next("Resource"))
121
if (element->findAttribute("type") == "ResourceLayout")
125
mCurrentItemName = element->findAttribute("name");
127
loadWidgetsFromXmlNode(element.current());
143
mWidgetsChanged = true;
147
bool EditorWidgets::save(const MyGUI::UString& _fileName)
149
size_t index = _fileName.find("|");
150
if (index != MyGUI::UString::npos)
152
MyGUI::UString fileName = _fileName.substr(0, index);
153
MyGUI::UString itemIndex = _fileName.substr(index + 1);
155
return saveToProject(fileName, MyGUI::utility::parseValue<size_t>(itemIndex));
158
mCurrentFileName = _fileName;
159
mCurrentItemName.clear();
161
MyGUI::xml::Document doc;
162
doc.createDeclaration();
163
MyGUI::xml::ElementPtr root = doc.createRoot("MyGUI");
164
root->addAttribute("type", "Layout");
166
saveWidgetsToXmlNode(root, true);
168
if (!doc.save(_fileName))
170
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
177
bool EditorWidgets::saveToProject(const MyGUI::UString& _fileName, size_t _index)
179
mCurrentFileName = _fileName;
181
MyGUI::xml::Document doc;
182
if (!doc.open(_fileName))
184
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
188
MyGUI::xml::ElementPtr root = doc.getRoot();
189
if ((nullptr == root) || (root->getName() != "MyGUI"))
191
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : '" << _fileName << "', tag 'MyGUI' not found");
195
if (root->findAttribute("type") == "Resource")
197
// берем детей и крутимся
198
MyGUI::xml::ElementEnumerator element = root->getElementEnumerator();
199
while (element.next("Resource"))
201
if (element->findAttribute("type") == "ResourceLayout")
205
mCurrentItemName = element->findAttribute("name");
208
element->addAttribute("type", "ResourceLayout");
209
element->addAttribute("name", mCurrentItemName);
211
saveWidgetsToXmlNode(element.current(), true);
213
if (!doc.save(_fileName))
215
MYGUI_LOGGING(LogSection, Error, getClassTypeName() << " : " << doc.getLastError());
233
void EditorWidgets::loadxmlDocument(MyGUI::xml::Document* doc, bool _testMode)
235
MyGUI::xml::ElementPtr root = doc->getRoot();
238
if (root->findAttribute("type", type))
240
if (type == "Layout")
242
loadWidgetsFromXmlNode(root, _testMode);
245
mWidgetsChanged = true;
248
MyGUI::xml::Document* EditorWidgets::savexmlDocument()
250
MyGUI::xml::Document* doc = new MyGUI::xml::Document();
252
doc->createDeclaration();
253
MyGUI::xml::ElementPtr root = doc->createRoot("MyGUI");
254
root->addAttribute("type", "Layout");
256
saveWidgetsToXmlNode(root);
261
void EditorWidgets::add(WidgetContainer* _container)
263
if (nullptr == _container->getWidget()->getParent())
265
mWidgets.push_back(_container);
269
MyGUI::Widget* parent = _container->getWidget()->getParent();
270
WidgetContainer* containerParent = find(parent);
271
while (nullptr == containerParent)
273
parent = parent->getParent();
274
if (parent == nullptr)
276
containerParent = find(parent);
278
containerParent->childContainers.push_back(_container);
280
mWidgetsChanged = true;
283
void EditorWidgets::remove(MyGUI::Widget* _widget)
285
remove(find(_widget));
286
mWidgetsChanged = true;
289
void EditorWidgets::remove(WidgetContainer* _container)
291
if (nullptr != _container)
293
std::vector<WidgetContainer*>::reverse_iterator iter;
294
while (_container->childContainers.empty() == false)
296
iter = _container->childContainers.rbegin();
300
if (nullptr == _container->getWidget()->getParent())
302
mWidgets.erase(std::find(mWidgets.begin(), mWidgets.end(), _container));
306
MyGUI::Widget* parent = _container->getWidget()->getParent();
307
WidgetContainer* containerParent = find(parent);
308
while (nullptr == containerParent)
310
parent = parent->getParent();
311
if (parent == nullptr)
313
// такого не должно быть, или утечка памяти,
314
// так как удалять нельзя им пользуется код вызывающий данную функцию
317
containerParent = find(parent);
320
containerParent->childContainers.erase(std::find(containerParent->childContainers.begin(), containerParent->childContainers.end(), _container));
323
MyGUI::Gui::getInstance().destroyWidget(_container->getWidget());
328
mWidgetsChanged = true;
331
bool EditorWidgets::unbind(WidgetContainer* _container)
335
if (nullptr != _container)
337
std::vector<WidgetContainer*>::reverse_iterator iter;
338
while (_container->childContainers.empty() == false)
340
iter = _container->childContainers.rbegin();
345
if (nullptr == _container->getWidget()->getParent())
347
mWidgets.erase(std::find(mWidgets.begin(), mWidgets.end(), _container));
351
MyGUI::Widget* parent = _container->getWidget()->getParent();
352
WidgetContainer* containerParent = find(parent);
353
while (nullptr == containerParent)
355
parent = parent->getParent();
356
if (parent == nullptr)
358
// такого не должно быть, или утечка памяти,
359
// так как удалять нельзя им пользуется код вызывающий данную функцию
362
containerParent = find(parent);
365
containerParent->childContainers.erase(std::find(containerParent->childContainers.begin(), containerParent->childContainers.end(), _container));
372
mWidgetsChanged = true;
376
void EditorWidgets::clear()
378
mCurrentFileName.clear();
379
mCurrentItemName.clear();
381
while (!mWidgets.empty())
383
remove(mWidgets[mWidgets.size()-1]);
386
mCodeGeneratorSettings.clear();
389
WidgetContainer* EditorWidgets::find(MyGUI::Widget* _widget)
391
return _find(_widget, "", mWidgets);
394
WidgetContainer* EditorWidgets::find(const std::string& _name)
396
return _find(nullptr, _name, mWidgets);
399
WidgetContainer* EditorWidgets::_find(MyGUI::Widget* _widget, const std::string& _name, std::vector<WidgetContainer*> _widgets)
401
for (std::vector<WidgetContainer*>::iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter)
403
if (((*iter)->getWidget() == _widget) || ((_name.empty() == false) && ((*iter)->getName() == _name)))
407
WidgetContainer* retContainer = _find(_widget, _name, (*iter)->childContainers);
414
void EditorWidgets::parseWidget(MyGUI::xml::ElementEnumerator& _widget, MyGUI::Widget* _parent, bool _testMode)
416
WidgetContainer* container = new WidgetContainer();
417
// парсим атрибуты виджета
418
MyGUI::IntCoord coord;
419
MyGUI::Align align = MyGUI::Align::Default;
420
MyGUI::WidgetStyle widgetStyle = MyGUI::WidgetStyle::Child;
421
std::string position;
423
container->setName(_widget->findAttribute("name"));
424
container->setType(_widget->findAttribute("type"));
425
container->setSkin(_widget->findAttribute("skin"));
426
container->setLayerName(_widget->findAttribute("layer"));
428
if (_widget->findAttribute("style", tmp))
430
container->setStyle(tmp);
431
widgetStyle = MyGUI::WidgetStyle::parse(tmp);
433
if (_widget->findAttribute("align", tmp))
435
container->setAlign(tmp);
436
align = MyGUI::Align::parse(tmp);
438
if (_widget->findAttribute("position", position))
439
coord = MyGUI::IntCoord::parse(position);
440
if (_widget->findAttribute("position_real", position))
442
container->setRelativeMode(true);
443
MyGUI::IntSize textureSize = SettingsManager::getInstance().getValue<MyGUI::IntSize>("Settings/WorkspaceTextureSize");
444
MyGUI::IntSize size = _testMode ? MyGUI::RenderManager::getInstance().getViewSize() : textureSize;
445
coord = MyGUI::CoordConverter::convertFromRelative(MyGUI::FloatCoord::parse(position), _parent == nullptr ? size : _parent->getClientCoord().size());
448
// проверяем скин на присутствие
449
std::string skin = container->getSkin();
450
bool exist = isSkinExist(container->getSkin());
451
if (!exist && !container->getSkin().empty())
453
skin = WidgetTypes::getInstance().findWidgetStyle(container->getType())->default_skin;
455
std::string skin_string;
457
skin_string = "empty skin";
459
skin_string = "'" + skin + "'";
461
// FIXME : not translated string
462
std::string mess = MyGUI::utility::toString("'", container->getSkin(), "' skin not found , temporary changed to ", skin_string);
463
GroupMessage::getInstance().addMessage(mess, MyGUI::LogLevel::Error);
467
skin = getSkinReplace(skin);
469
std::string layer = DEFAULT_EDITOR_LAYER;
472
// use widget's layer if possible
473
if (MyGUI::LayerManager::getInstance().isExist(container->getLayerName()))
474
layer = container->getLayerName();
476
layer = DEFAULT_TEST_MODE_LAYER;
478
std::string widgetType = MyGUI::FactoryManager::getInstance().isFactoryExist("Widget", container->getType()) ?
479
container->getType() : MyGUI::Widget::getClassTypeName();
481
if (nullptr == _parent)
483
container->setWidget(MyGUI::Gui::getInstance().createWidgetT(widgetType, skin, coord, align, layer));
487
container->setWidget(_parent->createWidgetT(widgetStyle, widgetType, skin, coord, align, layer));
492
// берем детей и крутимся
493
MyGUI::xml::ElementEnumerator widget = _widget->getElementEnumerator();
494
while (widget.next())
496
std::string key, value, type;
498
if (widget->getName() == "Widget")
500
parseWidget(widget, container->getWidget(), _testMode);
502
else if (widget->getName() == "Property")
505
if (!widget->findAttribute("key", key))
507
if (!widget->findAttribute("value", value))
510
// конвертим проперти в текущий вариант версии
511
key = MyGUI::BackwardCompatibility::getPropertyRename(key);
512
size_t indexSeparator = key.find('_');
513
if (indexSeparator != std::string::npos)
514
key = key.substr(indexSeparator + 1);
516
// и пытаемся парсить свойство
517
if (tryToApplyProperty(container->getWidget(), key, value, _testMode) == false)
520
container->setProperty(key, value, false);
522
else if (widget->getName() == "UserString")
525
if (!widget->findAttribute("key", key))
527
if (!widget->findAttribute("value", value))
529
//container->mUserString.insert(MyGUI::PairString(key, value));
530
container->setUserData(key, value);
532
else if (widget->getName() == "Controller")
535
if (!widget->findAttribute("type", type))
537
ControllerInfo* controllerInfo = new ControllerInfo();
538
controllerInfo->mType = type;
540
MyGUI::ControllerItem* item = nullptr;
543
item = MyGUI::ControllerManager::getInstance().createItem(type);
546
MyGUI::xml::ElementEnumerator prop = widget->getElementEnumerator();
547
while (prop.next("Property"))
549
if (!prop->findAttribute("key", key))
551
if (!prop->findAttribute("value", value))
554
controllerInfo->mProperty[key] = value;
557
item->setProperty(key, value);
562
MyGUI::ControllerManager::getInstance().addItem(container->getWidget(), item);
565
container->mController.push_back(controllerInfo);
570
bool EditorWidgets::tryToApplyProperty(MyGUI::Widget* _widget, const std::string& _key, const std::string& _value, bool _testMode)
572
WidgetContainer* container = EditorWidgets::getInstance().find(_widget);
573
if (container->existUserData("LE_TargetWidgetType"))
578
if (_key == "Image_Texture")
580
if (!MyGUI::DataManager::getInstance().isDataExist(_value))
582
GroupMessage::getInstance().addMessage("No such " + _key + ": '" + _value + "'. This value will be saved.", MyGUI::LogLevel::Warning);
587
if (_testMode || std::find(mIgnoreParameters.begin(), mIgnoreParameters.end(), _key) == mIgnoreParameters.end())
589
_widget->setProperty(_key, _value);
594
GroupMessage::getInstance().addMessage("Can't apply '" + _key + "'property.", MyGUI::LogLevel::Error);
600
void EditorWidgets::serialiseWidget(WidgetContainer* _container, MyGUI::xml::ElementPtr _node, bool _compatibility)
602
MyGUI::xml::ElementPtr node = _node->createChild("Widget");
604
node->addAttribute("type", _container->getType());
605
node->addAttribute("skin", _container->getSkin());
607
if (!_container->getRelativeMode())
608
node->addAttribute("position", _container->position());
610
node->addAttribute("position_real", _container->position(false));
612
if (!_container->getAlign().empty())
613
node->addAttribute("align", _container->getAlign());
615
if (!_container->getStyle().empty())
616
node->addAttribute("style", _container->getStyle());
618
if (!_container->getLayerName().empty())
619
node->addAttribute("layer", _container->getLayerName());
621
if (!_container->getName().empty())
622
node->addAttribute("name", _container->getName());
624
WidgetContainer::PropertyEnumerator propertyItem = _container->getPropertyEnumerator();
625
while (propertyItem.next())
627
BackwardCompatibilityManager::getInstance().serialiseProperty(node, _container->getType(), propertyItem.current(), _compatibility);
630
WidgetContainer::UserDataEnumerator userData = _container->getUserDataEnumerator();
631
while (userData.next())
633
MyGUI::xml::ElementPtr nodeProp = node->createChild("UserString");
634
nodeProp->addAttribute("key", userData.current().first);
635
nodeProp->addAttribute("value", userData.current().second);
638
for (std::vector<ControllerInfo*>::iterator iter = _container->mController.begin(); iter != _container->mController.end(); ++iter)
640
MyGUI::xml::ElementPtr nodeController = node->createChild("Controller");
641
nodeController->addAttribute("type", (*iter)->mType);
642
for (MyGUI::MapString::iterator iterProp = (*iter)->mProperty.begin(); iterProp != (*iter)->mProperty.end(); ++iterProp)
644
MyGUI::xml::ElementPtr nodeProp = nodeController->createChild("Property");
645
nodeProp->addAttribute("key", iterProp->first);
646
nodeProp->addAttribute("value", iterProp->second);
650
for (std::vector<WidgetContainer*>::iterator iter = _container->childContainers.begin(); iter != _container->childContainers.end(); ++iter)
652
serialiseWidget(*iter, node, _compatibility);
656
void EditorWidgets::loadIgnoreParameters(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
658
MyGUI::xml::ElementEnumerator parameter = _node->getElementEnumerator();
659
while (parameter.next("Parameter"))
661
std::string name = parameter->findAttribute("key");
662
mIgnoreParameters.push_back(name);
666
void EditorWidgets::notifyFrameStarted(float _time)
670
mWidgetsChanged = false;
671
eventChangeWidgets();
675
void EditorWidgets::invalidateWidgets()
677
mWidgetsChanged = true;
680
EnumeratorWidgetContainer EditorWidgets::getWidgets()
682
return EnumeratorWidgetContainer(mWidgets);
685
std::string EditorWidgets::getSkinReplace(const std::string& _skinName)
687
MyGUI::MapString::iterator item = mSkinReplaces.find(_skinName);
688
if (item != mSkinReplaces.end())
689
return (*item).second;
693
void EditorWidgets::loadSkinReplace(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
695
MyGUI::xml::ElementEnumerator node = _node->getElementEnumerator();
696
while (node.next("Skin"))
697
mSkinReplaces[node->findAttribute("key")] = node->getContent();
700
bool EditorWidgets::isSkinExist(const std::string& _skinName)
702
return _skinName == "Default" ||
703
MyGUI::SkinManager::getInstance().isExist(_skinName) ||
704
(MyGUI::LayoutManager::getInstance().isExist(_skinName) && checkTemplate(_skinName));
707
bool EditorWidgets::checkTemplate(const std::string& _skinName)
709
MyGUI::ResourceLayout* templateInfo = MyGUI::LayoutManager::getInstance().getByName(_skinName, false);
710
if (templateInfo != nullptr)
712
const MyGUI::VectorWidgetInfo& data = templateInfo->getLayoutData();
713
for (MyGUI::VectorWidgetInfo::const_iterator container = data.begin(); container != data.end(); ++container)
715
if (container->name == "Root")
723
const MyGUI::UString& EditorWidgets::getCurrentFileName() const
725
return mCurrentFileName;
728
const MyGUI::UString& EditorWidgets::getCurrentItemName() const
730
return mCurrentItemName;
733
void EditorWidgets::_unlinkWidget(MyGUI::Widget* _widget)
735
WidgetContainer* container = find(_widget);
736
if (container != nullptr)
738
bool result = unbind(container);
739
mWidgetsChanged = true;
742
WidgetSelectorManager::getInstance().setSelectedWidget(nullptr);
746
MyGUI::MapString& EditorWidgets::getCodeGeneratorSettings()
748
return mCodeGeneratorSettings;
751
void EditorWidgets::loadWidgetsFromXmlNode(MyGUI::xml::ElementPtr _root, bool _testMode)
753
// берем детей и крутимся
754
MyGUI::xml::ElementEnumerator element = _root->getElementEnumerator();
755
while (element.next())
757
if (element->getName() == "Widget")
758
parseWidget(element, nullptr, _testMode);
759
else if (element->getName() == CodeGeneratorSettingsNodeName)
760
loadCodeGeneratorSettings(element.current());
764
void EditorWidgets::saveWidgetsToXmlNode(MyGUI::xml::ElementPtr _root, bool _compatibility)
766
_root->addAttribute("version", BackwardCompatibilityManager::getInstancePtr()->getCurrentVersion());
768
for (std::vector<WidgetContainer*>::iterator iter = mWidgets.begin(); iter != mWidgets.end(); ++iter)
770
// в корень только сирот
771
if (nullptr == (*iter)->getWidget()->getParent())
772
serialiseWidget(*iter, _root, _compatibility);
775
saveCodeGeneratorSettings(_root);
778
void EditorWidgets::loadCodeGeneratorSettings(MyGUI::xml::ElementPtr _sectorNode)
780
MyGUI::xml::ElementEnumerator widget = _sectorNode->getElementEnumerator();
781
while (widget.next())
783
std::string key, value;
785
if (widget->getName() == "Property")
788
if (!widget->findAttribute("key", key))
790
if (!widget->findAttribute("value", value))
793
mCodeGeneratorSettings[key] = value;
798
void EditorWidgets::saveCodeGeneratorSettings(MyGUI::xml::ElementPtr _rootNode)
800
MyGUI::xml::ElementPtr node = _rootNode->createChild(CodeGeneratorSettingsNodeName);
802
for (MyGUI::MapString::const_iterator iter = mCodeGeneratorSettings.begin(); iter != mCodeGeneratorSettings.end(); ++iter)
804
MyGUI::xml::ElementPtr nodeProp = node->createChild("Property");
805
nodeProp->addAttribute("key", iter->first);
806
nodeProp->addAttribute("value", iter->second);
810
void EditorWidgets::onSetWidgetCoord(MyGUI::Widget* _widget, const MyGUI::IntCoord& _value, const std::string& _owner)
812
eventChangeWidgetCoord(_widget, _value, _owner);