MyGUI  3.0.1
MyGUI_LayerManager.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_LayerManager.h"
25 #include "MyGUI_LayerItem.h"
26 #include "MyGUI_WidgetManager.h"
27 #include "MyGUI_RenderManager.h"
28 #include "MyGUI_Widget.h"
29 #include "MyGUI_FactoryManager.h"
30 
31 #include "MyGUI_SharedLayer.h"
32 #include "MyGUI_OverlappedLayer.h"
33 
34 namespace MyGUI
35 {
36 
37  const std::string XML_TYPE("Layer");
38 
39  MYGUI_INSTANCE_IMPLEMENT( LayerManager )
40 
41  void LayerManager::initialise()
42  {
43  MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
44  MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
45 
48 
51 
52  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
53  mIsInitialise = true;
54  }
55 
57  {
58  if (!mIsInitialise) return;
59  MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME);
60 
61  FactoryManager::getInstance().unregisterFactory<SharedLayer>(XML_TYPE);
63 
64  // удаляем все хранители слоев
65  clear();
66 
67  WidgetManager::getInstance().unregisterUnlinker(this);
68  ResourceManager::getInstance().unregisterLoadXmlDelegate(XML_TYPE);
69 
70  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
71  mIsInitialise = false;
72  }
73 
74  void LayerManager::clear()
75  {
76  for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
77  {
78  destroy(*iter);
79  }
80  mLayerNodes.clear();
81  }
82 
83  bool LayerManager::load(const std::string& _file)
84  {
85  return ResourceManager::getInstance()._loadImplement(_file, true, XML_TYPE, INSTANCE_TYPE_NAME);
86  }
87 
88  void LayerManager::_load(xml::ElementPtr _node, const std::string& _file, Version _version)
89  {
90  VectorLayer layers;
91  // берем детей и крутимся, основной цикл
93  while (layer.next(XML_TYPE))
94  {
95 
96  std::string name;
97 
98  if ( !layer->findAttribute("name", name))
99  {
100  MYGUI_LOG(Warning, "Attribute 'name' not found (file : " << _file << ")");
101  continue;
102  }
103 
104  for (VectorLayer::iterator iter=layers.begin(); iter!=layers.end(); ++iter)
105  {
106  MYGUI_ASSERT((*iter)->getName() != name, "Layer '" << name << "' already exist (file : " << _file << ")");
107  }
108 
109  std::string type = layer->findAttribute("type");
110  if (type.empty() && _version <= Version(1, 0))
111  {
112  bool overlapped = utility::parseBool(layer->findAttribute("overlapped"));
113  type = overlapped ? "OverlappedLayer" : "SharedLayer";
114  }
115 
116  IObject* object = FactoryManager::getInstance().createObject(XML_TYPE, type);
117  MYGUI_ASSERT(object != nullptr, "factory is '" << type << "' not found");
118 
119  ILayer* item = object->castType<ILayer>();
120  item->deserialization(layer.current(), _version);
121 
122  layers.push_back(item);
123  }
124 
125  // теперь мержим новые и старые слои
126  merge(layers);
127  }
128 
129  void LayerManager::_unlinkWidget(Widget* _widget)
130  {
131  detachFromLayer(_widget);
132  }
133 
134  // поправить на виджет и проверять на рутовость
135  void LayerManager::attachToLayerNode(const std::string& _name, Widget* _item)
136  {
137  MYGUI_ASSERT(nullptr != _item, "pointer must be valid");
138  MYGUI_ASSERT(_item->isRootWidget(), "attached widget must be root");
139 
140  // сначала отсоединяем
141  _item->detachFromLayer();
142 
143  // а теперь аттачим
144  for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
145  {
146  if (_name == (*iter)->getName())
147  {
148  ILayerNode* node = (*iter)->createChildItemNode();
149  node->attachLayerItem(_item);
150 
151  return;
152  }
153  }
154  MYGUI_LOG(Error, "Layer '" << _name << "' is not found");
155  //MYGUI_EXCEPT("Layer '" << _name << "' is not found");
156  }
157 
159  {
160  MYGUI_ASSERT(nullptr != _item, "pointer must be valid");
161  _item->detachFromLayer();
162  }
163 
165  {
166  MYGUI_ASSERT(nullptr != _item, "pointer must be valid");
167  _item->upLayerItem();
168  }
169 
170  bool LayerManager::isExist(const std::string& _name) const
171  {
172  return getByName(_name, false) != nullptr;
173  }
174 
175  void LayerManager::merge(VectorLayer& _layers)
176  {
177  for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
178  {
179  if ((*iter) == nullptr) continue;
180  bool find = false;
181  std::string name = (*iter)->getName();
182  for (VectorLayer::iterator iter2=_layers.begin(); iter2!=_layers.end(); ++iter2)
183  {
184  if (name == (*iter2)->getName())
185  {
186  // заменяем новый слой, на уже существующий
187  delete (*iter2);
188  (*iter2) = (*iter);
189  (*iter) = nullptr;
190  find = true;
191  break;
192  }
193  }
194  if (!find)
195  {
196  destroy(*iter);
197  (*iter) = nullptr;
198  }
199  }
200 
201  // теперь в основной
202  mLayerNodes = _layers;
203  }
204 
205  void LayerManager::destroy(ILayer* _layer)
206  {
207  MYGUI_LOG(Info, "destroy layer '" << _layer->getName() << "'");
208  delete _layer;
209  }
211  {
212  VectorLayer::reverse_iterator iter = mLayerNodes.rbegin();
213  while (iter != mLayerNodes.rend())
214  {
215  ILayerItem * item = (*iter)->getLayerItemByPoint(_left, _top);
216  if (item != nullptr) return static_cast<Widget*>(item);
217  ++iter;
218  }
219  return nullptr;
220  }
221 
222  void LayerManager::renderToTarget(IRenderTarget* _target, bool _update)
223  {
224  for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
225  {
226  (*iter)->renderToTarget(_target, _update);
227  }
228  }
229 
230  ILayer* LayerManager::getByName(const std::string& _name, bool _throw) const
231  {
232  for (VectorLayer::const_iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
233  {
234  if (_name == (*iter)->getName())
235  return (*iter);
236  }
237  MYGUI_ASSERT(!_throw, "Layer '" << _name << "' not found");
238  return nullptr;
239  }
240 
242  {
243  static const char* spacer = " ";
244  MYGUI_LOG(Info, spacer);
245  MYGUI_LOG(Info, "---------- Statistic for layers start ----------" << spacer);
246  for (VectorLayer::iterator iter=mLayerNodes.begin(); iter!=mLayerNodes.end(); ++iter)
247  {
248  (*iter)->dumpStatisticToLog();
249  }
250  MYGUI_LOG(Info, spacer);
251  MYGUI_LOG(Info, "---------- Statistic for layers end ----------" << spacer);
252  MYGUI_LOG(Info, spacer);
253  }
254 
255 } // namespace MyGUI