1 #include "Precompiled.h"
2 #include "WorkspaceControl.h"
3 #include "SettingsManager.h"
4 #include "WidgetSelectorManager.h"
5 #include "WidgetCreatorManager.h"
6 #include "CommandManager.h"
7 #include "UndoManager.h"
8 #include "Localise.h"
9 #include "MyGUI_RTTLayer.h"
10 #include "GridManager.h"
11 
12 namespace tools
13 {
14 
WorkspaceControl(MyGUI::Widget * _parent)15 	WorkspaceControl::WorkspaceControl(MyGUI::Widget* _parent) :
16 		TextureToolControlLE(_parent),
17 		mAreaSelectorControl(nullptr),
18 		mCurrentWidget(nullptr),
19 		mMoveableWidget(false),
20 		mPositionSelectorCreatorControl(nullptr),
21 		mFreeChildMode(false)
22 	{
23 		MyGUI::IntSize size = SettingsManager::getInstance().getValue<MyGUI::IntSize>("Settings/WorkspaceTextureSize");
24 
25 		setRttLayerSize(size);
26 
27 		setTextureName(SettingsManager::getInstance().getValue("Workspace/TextureName"));
28 		setTextureRegion(MyGUI::IntCoord(0, 0, size.width, size.height));
29 
30 		addSelectorControl(mAreaSelectorControl);
31 		mAreaSelectorControl->eventChangePosition += MyGUI::newDelegate(this, &WorkspaceControl::notifyChangePosition);
32 
33 		addSelectorControl(mPositionSelectorCreatorControl);
34 		mPositionSelectorCreatorControl->setEnabled(false);
35 		mPositionSelectorCreatorControl->setVisible(false);
36 
37 		WidgetSelectorManager::getInstance().eventChangeSelectedWidget += MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeSelectedWidget);
38 		notifyChangeSelectedWidget(nullptr);
39 
40 		EditorWidgets::getInstance().eventChangeWidgetCoord += MyGUI::newDelegate(this, &WorkspaceControl::notifyPropertyChangeCoord);
41 
42 		CommandManager::getInstance().getEvent("Command_MoveLeft")->connect(this, &WorkspaceControl::Command_MoveLeft);
43 		CommandManager::getInstance().getEvent("Command_MoveRight")->connect(this, &WorkspaceControl::Command_MoveRight);
44 		CommandManager::getInstance().getEvent("Command_MoveTop")->connect(this, &WorkspaceControl::Command_MoveTop);
45 		CommandManager::getInstance().getEvent("Command_MoveBottom")->connect(this, &WorkspaceControl::Command_MoveBottom);
46 		CommandManager::getInstance().getEvent("Command_SizeLeft")->connect(this, &WorkspaceControl::Command_SizeLeft);
47 		CommandManager::getInstance().getEvent("Command_SizeRight")->connect(this, &WorkspaceControl::Command_SizeRight);
48 		CommandManager::getInstance().getEvent("Command_SizeTop")->connect(this, &WorkspaceControl::Command_SizeTop);
49 		CommandManager::getInstance().getEvent("Command_SizeBottom")->connect(this, &WorkspaceControl::Command_SizeBottom);
50 
51 		CommandManager::getInstance().getEvent("Command_GridMoveLeft")->connect(this, &WorkspaceControl::Command_GridMoveLeft);
52 		CommandManager::getInstance().getEvent("Command_GridMoveRight")->connect(this, &WorkspaceControl::Command_GridMoveRight);
53 		CommandManager::getInstance().getEvent("Command_GridMoveTop")->connect(this, &WorkspaceControl::Command_GridMoveTop);
54 		CommandManager::getInstance().getEvent("Command_GridMoveBottom")->connect(this, &WorkspaceControl::Command_GridMoveBottom);
55 		CommandManager::getInstance().getEvent("Command_GridSizeLeft")->connect(this, &WorkspaceControl::Command_GridSizeLeft);
56 		CommandManager::getInstance().getEvent("Command_GridSizeRight")->connect(this, &WorkspaceControl::Command_GridSizeRight);
57 		CommandManager::getInstance().getEvent("Command_GridSizeTop")->connect(this, &WorkspaceControl::Command_GridSizeTop);
58 		CommandManager::getInstance().getEvent("Command_GridSizeBottom")->connect(this, &WorkspaceControl::Command_GridSizeBottom);
59 
60 		CommandManager::getInstance().getEvent("Command_Delete")->connect(this, &WorkspaceControl::Command_Delete);
61 		CommandManager::getInstance().getEvent("Command_NextItem")->connect(this, &WorkspaceControl::Command_NextItem);
62 
63 		CommandManager::getInstance().getEvent("Command_FreeChildMode")->connect(this, &WorkspaceControl::Command_FreeChildMode);
64 
65 		WidgetCreatorManager::getInstance().eventChangeCreatorMode += MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeCreatorMode);
66 		WidgetCreatorManager::getInstance().eventChangeSelector += MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeSelectorCreator);
67 
68 		updateCaption();
69 
70 		MyGUI::Gui::getInstance().eventFrameStart += MyGUI::newDelegate(this, &WorkspaceControl::notifyFrameStart);
71 	}
72 
~WorkspaceControl()73 	WorkspaceControl::~WorkspaceControl()
74 	{
75 		MyGUI::Gui::getInstance().eventFrameStart -= MyGUI::newDelegate(this, &WorkspaceControl::notifyFrameStart);
76 
77 		WidgetCreatorManager::getInstance().eventChangeSelector -= MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeSelectorCreator);
78 		WidgetCreatorManager::getInstance().eventChangeCreatorMode -= MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeCreatorMode);
79 		EditorWidgets::getInstance().eventChangeWidgetCoord -= MyGUI::newDelegate(this, &WorkspaceControl::notifyPropertyChangeCoord);
80 		WidgetSelectorManager::getInstance().eventChangeSelectedWidget -= MyGUI::newDelegate(this, &WorkspaceControl::notifyChangeSelectedWidget);
81 
82 		mAreaSelectorControl->eventChangePosition -= MyGUI::newDelegate(this, &WorkspaceControl::notifyChangePosition);
83 	}
84 
notifyChangePosition()85 	void WorkspaceControl::notifyChangePosition()
86 	{
87 		if (!mMoveableWidget)
88 			return;
89 
90 		mCoordValue = mAreaSelectorControl->getCoord();
91 
92 		// конвертируем в локальные координаты
93 		if (mCurrentWidget != nullptr)
94 		{
95 			MyGUI::Widget* parent = mCurrentWidget->getParent();
96 			if (parent != nullptr && !mCurrentWidget->isRootWidget())
97 				mCoordValue = mCoordValue - parent->getAbsolutePosition();
98 		}
99 
100 		// снапим к гриду
101 		if (!MyGUI::InputManager::getInstance().isShiftPressed())
102 		{
103 			MyGUI::IntCoord coord = mCoordValue;
104 			MyGUI::IntCoord actionScale = mAreaSelectorControl->getActionScale();
105 
106 			if (actionScale.left != 0 && actionScale.width != 0)
107 			{
108 				int right = coord.right();
109 				coord.left = GridManager::getInstance().toGrid(coord.left);
110 				coord.width = right - coord.left;
111 			}
112 			else if (actionScale.width != 0)
113 			{
114 				int right = GridManager::getInstance().toGrid(coord.right());
115 				coord.width = right - coord.left;
116 			}
117 			else if (actionScale.left != 0)
118 			{
119 				coord.left = GridManager::getInstance().toGrid(coord.left);
120 			}
121 
122 			if (actionScale.top != 0 && actionScale.height != 0)
123 			{
124 				int bottom = coord.bottom();
125 				coord.top = GridManager::getInstance().toGrid(coord.top);
126 				coord.height = bottom - coord.top;
127 			}
128 			else if (actionScale.height != 0)
129 			{
130 				int bottom = GridManager::getInstance().toGrid(coord.bottom());
131 				coord.height = bottom - coord.top;
132 			}
133 			else if (actionScale.top != 0)
134 			{
135 				coord.top = GridManager::getInstance().toGrid(coord.top);
136 			}
137 
138 			if (coord != mCoordValue)
139 			{
140 				mCoordValue = coord;
141 				updateSelectionFromValue();
142 			}
143 		}
144 
145 		if (mCurrentWidget != nullptr)
146 			setWidgetCoord(mCurrentWidget, mCoordValue);
147 
148 		UndoManager::getInstance().addValue(PR_POSITION);
149 	}
150 
notifyChangeSelectedWidget(MyGUI::Widget * _currentWidget)151 	void WorkspaceControl::notifyChangeSelectedWidget(MyGUI::Widget* _currentWidget)
152 	{
153 		mCurrentWidget = _currentWidget;
154 
155 		if (mCurrentWidget != nullptr)
156 		{
157 			mAreaSelectorControl->setVisible(true);
158 			mCoordValue = mCurrentWidget->getCoord();
159 
160 			WidgetStyle* widgetType = WidgetTypes::getInstance().findWidgetStyle(mCurrentWidget->getTypeName());
161 			mMoveableWidget = widgetType->resizeable;
162 
163 			updateSelectorEnabled();
164 			updateSelectionFromValue();
165 
166 			// FIXME возвращаем себе кей фокус
167 			if (!mMainWidget->getRootKeyFocus())
168 				MyGUI::InputManager::getInstance().setKeyFocusWidget(mMainWidget);
169 		}
170 		else
171 		{
172 			mAreaSelectorControl->setVisible(false);
173 		}
174 	}
175 
notifyPropertyChangeCoord(MyGUI::Widget * _widget,const MyGUI::IntCoord & _coordValue,const std::string & _owner)176 	void WorkspaceControl::notifyPropertyChangeCoord(MyGUI::Widget* _widget, const MyGUI::IntCoord& _coordValue, const std::string& _owner)
177 	{
178 		if (_owner == "WorkspaceControl" || _widget != mCurrentWidget)
179 			return;
180 
181 		// тут приходит в абсолютных, конвертим в локальные
182 		mCoordValue = _coordValue;
183 		if (mCurrentWidget != nullptr)
184 		{
185 			MyGUI::Widget* parent = mCurrentWidget->getParent();
186 			if (parent != nullptr && !mCurrentWidget->isRootWidget())
187 				mCoordValue = mCoordValue - parent->getAbsolutePosition();
188 		}
189 
190 		updateSelectionFromValue();
191 	}
192 
Command_MoveLeft(const MyGUI::UString & _commandName,bool & _result)193 	void WorkspaceControl::Command_MoveLeft(const MyGUI::UString& _commandName, bool& _result)
194 	{
195 		if (!checkCommand())
196 			return;
197 
198 		if (!mMoveableWidget)
199 			return;
200 
201 		mCoordValue.left --;
202 		updateFromCoordValue();
203 
204 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
205 
206 		_result = true;
207 	}
208 
Command_MoveRight(const MyGUI::UString & _commandName,bool & _result)209 	void WorkspaceControl::Command_MoveRight(const MyGUI::UString& _commandName, bool& _result)
210 	{
211 		if (!checkCommand())
212 			return;
213 
214 		if (!mMoveableWidget)
215 			return;
216 
217 		mCoordValue.left ++;
218 		updateFromCoordValue();
219 
220 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
221 
222 		_result = true;
223 	}
224 
Command_MoveTop(const MyGUI::UString & _commandName,bool & _result)225 	void WorkspaceControl::Command_MoveTop(const MyGUI::UString& _commandName, bool& _result)
226 	{
227 		if (!checkCommand())
228 			return;
229 
230 		if (!mMoveableWidget)
231 			return;
232 
233 		mCoordValue.top --;
234 		updateFromCoordValue();
235 
236 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
237 
238 		_result = true;
239 	}
240 
Command_MoveBottom(const MyGUI::UString & _commandName,bool & _result)241 	void WorkspaceControl::Command_MoveBottom(const MyGUI::UString& _commandName, bool& _result)
242 	{
243 		if (!checkCommand())
244 			return;
245 
246 		if (!mMoveableWidget)
247 			return;
248 
249 		mCoordValue.top ++;
250 		updateFromCoordValue();
251 
252 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
253 
254 		_result = true;
255 	}
256 
Command_GridMoveLeft(const MyGUI::UString & _commandName,bool & _result)257 	void WorkspaceControl::Command_GridMoveLeft(const MyGUI::UString& _commandName, bool& _result)
258 	{
259 		if (!checkCommand())
260 			return;
261 
262 		if (!mMoveableWidget)
263 			return;
264 
265 		mCoordValue.left = GridManager::getInstance().toGrid(mCoordValue.left, GridManager::Previous);
266 		updateFromCoordValue();
267 
268 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
269 
270 		_result = true;
271 	}
272 
Command_GridMoveRight(const MyGUI::UString & _commandName,bool & _result)273 	void WorkspaceControl::Command_GridMoveRight(const MyGUI::UString& _commandName, bool& _result)
274 	{
275 		if (!checkCommand())
276 			return;
277 
278 		if (!mMoveableWidget)
279 			return;
280 
281 		mCoordValue.left = GridManager::getInstance().toGrid(mCoordValue.left, GridManager::Next);
282 		updateFromCoordValue();
283 
284 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
285 
286 		_result = true;
287 	}
288 
Command_GridMoveTop(const MyGUI::UString & _commandName,bool & _result)289 	void WorkspaceControl::Command_GridMoveTop(const MyGUI::UString& _commandName, bool& _result)
290 	{
291 		if (!checkCommand())
292 			return;
293 
294 		if (!mMoveableWidget)
295 			return;
296 
297 		mCoordValue.top = GridManager::getInstance().toGrid(mCoordValue.top, GridManager::Previous);
298 		updateFromCoordValue();
299 
300 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
301 
302 		_result = true;
303 	}
304 
Command_GridMoveBottom(const MyGUI::UString & _commandName,bool & _result)305 	void WorkspaceControl::Command_GridMoveBottom(const MyGUI::UString& _commandName, bool& _result)
306 	{
307 		if (!checkCommand())
308 			return;
309 
310 		if (!mMoveableWidget)
311 			return;
312 
313 		mCoordValue.top = GridManager::getInstance().toGrid(mCoordValue.top, GridManager::Next);
314 		updateFromCoordValue();
315 
316 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
317 
318 		_result = true;
319 	}
320 
Command_GridSizeLeft(const MyGUI::UString & _commandName,bool & _result)321 	void WorkspaceControl::Command_GridSizeLeft(const MyGUI::UString& _commandName, bool& _result)
322 	{
323 		if (!checkCommand())
324 			return;
325 
326 		if (!mMoveableWidget)
327 			return;
328 
329 		mCoordValue.width = GridManager::getInstance().toGrid(mCoordValue.right(), GridManager::Previous) - mCoordValue.left;
330 		updateFromCoordValue();
331 
332 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
333 
334 		_result = true;
335 	}
336 
Command_GridSizeRight(const MyGUI::UString & _commandName,bool & _result)337 	void WorkspaceControl::Command_GridSizeRight(const MyGUI::UString& _commandName, bool& _result)
338 	{
339 		if (!checkCommand())
340 			return;
341 
342 		if (!mMoveableWidget)
343 			return;
344 
345 		mCoordValue.width = GridManager::getInstance().toGrid(mCoordValue.right(), GridManager::Next) - mCoordValue.left;
346 		updateFromCoordValue();
347 
348 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
349 
350 		_result = true;
351 	}
352 
Command_GridSizeTop(const MyGUI::UString & _commandName,bool & _result)353 	void WorkspaceControl::Command_GridSizeTop(const MyGUI::UString& _commandName, bool& _result)
354 	{
355 		if (!checkCommand())
356 			return;
357 
358 		if (!mMoveableWidget)
359 			return;
360 
361 		mCoordValue.height = GridManager::getInstance().toGrid(mCoordValue.bottom(), GridManager::Previous) - mCoordValue.top;
362 		updateFromCoordValue();
363 
364 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
365 
366 		_result = true;
367 	}
368 
Command_GridSizeBottom(const MyGUI::UString & _commandName,bool & _result)369 	void WorkspaceControl::Command_GridSizeBottom(const MyGUI::UString& _commandName, bool& _result)
370 	{
371 		if (!checkCommand())
372 			return;
373 
374 		if (!mMoveableWidget)
375 			return;
376 
377 		mCoordValue.height = GridManager::getInstance().toGrid(mCoordValue.bottom(), GridManager::Next) - mCoordValue.top;
378 		updateFromCoordValue();
379 
380 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
381 
382 		_result = true;
383 	}
384 
Command_SizeLeft(const MyGUI::UString & _commandName,bool & _result)385 	void WorkspaceControl::Command_SizeLeft(const MyGUI::UString& _commandName, bool& _result)
386 	{
387 		if (!checkCommand())
388 			return;
389 
390 		if (!mMoveableWidget)
391 			return;
392 
393 		mCoordValue.width --;
394 		updateFromCoordValue();
395 
396 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
397 
398 		_result = true;
399 	}
400 
Command_SizeRight(const MyGUI::UString & _commandName,bool & _result)401 	void WorkspaceControl::Command_SizeRight(const MyGUI::UString& _commandName, bool& _result)
402 	{
403 		if (!checkCommand())
404 			return;
405 
406 		if (!mMoveableWidget)
407 			return;
408 
409 		mCoordValue.width ++;
410 		updateFromCoordValue();
411 
412 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
413 
414 		_result = true;
415 	}
416 
Command_SizeTop(const MyGUI::UString & _commandName,bool & _result)417 	void WorkspaceControl::Command_SizeTop(const MyGUI::UString& _commandName, bool& _result)
418 	{
419 		if (!checkCommand())
420 			return;
421 
422 		if (!mMoveableWidget)
423 			return;
424 
425 		mCoordValue.height --;
426 		updateFromCoordValue();
427 
428 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
429 
430 		_result = true;
431 	}
432 
Command_SizeBottom(const MyGUI::UString & _commandName,bool & _result)433 	void WorkspaceControl::Command_SizeBottom(const MyGUI::UString& _commandName, bool& _result)
434 	{
435 		if (!checkCommand())
436 			return;
437 
438 		if (!mMoveableWidget)
439 			return;
440 
441 		mCoordValue.height ++;
442 		updateFromCoordValue();
443 
444 		UndoManager::getInstance().addValue(PR_KEY_POSITION);
445 
446 		_result = true;
447 	}
448 
updateFromCoordValue()449 	void WorkspaceControl::updateFromCoordValue()
450 	{
451 		// тут работаем с локальными координатами
452 		if (mCurrentWidget != nullptr)
453 			setWidgetCoord(mCurrentWidget, mCoordValue);
454 
455 		updateSelectionFromValue();
456 	}
457 
updateSelectionFromValue()458 	void WorkspaceControl::updateSelectionFromValue()
459 	{
460 		// саму рамку отображаем в глобальных
461 		if (mCurrentWidget != nullptr)
462 		{
463 			MyGUI::Widget* parent = mCurrentWidget->getParent();
464 			if (parent != nullptr && !mCurrentWidget->isRootWidget())
465 				mAreaSelectorControl->setCoord(mCoordValue + parent->getAbsolutePosition());
466 			else
467 				mAreaSelectorControl->setCoord(mCoordValue);
468 		}
469 	}
470 
onMouseButtonClick(const MyGUI::IntPoint & _point)471 	void WorkspaceControl::onMouseButtonClick(const MyGUI::IntPoint& _point)
472 	{
473 		WidgetSelectorManager::getInstance().selectWidget(_point);
474 	}
475 
onMouseMove()476 	void WorkspaceControl::onMouseMove()
477 	{
478 		WidgetSelectorManager::getInstance().resetDepth();
479 	}
480 
Command_Delete(const MyGUI::UString & _commandName,bool & _result)481 	void WorkspaceControl::Command_Delete(const MyGUI::UString& _commandName, bool& _result)
482 	{
483 		if (!checkCommand())
484 			return;
485 
486 		if (mCurrentWidget == nullptr)
487 			return;
488 
489 		EditorWidgets::getInstance().remove(mCurrentWidget);
490 		WidgetSelectorManager::getInstance().setSelectedWidget(nullptr);
491 		UndoManager::getInstance().addValue();
492 
493 		_result = true;
494 	}
495 
Command_NextItem(const MyGUI::UString & _commandName,bool & _result)496 	void WorkspaceControl::Command_NextItem(const MyGUI::UString& _commandName, bool& _result)
497 	{
498 		if (!checkCommand())
499 			return;
500 
501 		MyGUI::TabControl* tab = nullptr;
502 
503 		if (mCurrentWidget != nullptr)
504 		{
505 			if (mCurrentWidget->isType<MyGUI::TabControl>())
506 				tab = mCurrentWidget->castType<MyGUI::TabControl>();
507 			else if (mCurrentWidget->getParent() != nullptr && mCurrentWidget->getParent()->isType<MyGUI::TabControl>())
508 				tab = mCurrentWidget->getParent()->castType<MyGUI::TabControl>();
509 		}
510 
511 		if (tab == nullptr)
512 			return;
513 
514 		if (tab->getItemCount() == 0)
515 			return;
516 
517 		size_t sheet = tab->getIndexSelected();
518 		sheet++;
519 		if (sheet >= tab->getItemCount())
520 			sheet = 0;
521 		if (tab->getItemCount())
522 			tab->setIndexSelected(sheet);
523 
524 		WidgetSelectorManager::getInstance().setSelectedWidget(tab->getItemSelected());
525 
526 		_result = true;
527 	}
528 
Command_FreeChildMode(const MyGUI::UString & _commandName,bool & _result)529 	void WorkspaceControl::Command_FreeChildMode(const MyGUI::UString& _commandName, bool& _result)
530 	{
531 		if (!checkCommand())
532 			return;
533 
534 		mFreeChildMode = !mFreeChildMode;
535 
536 		_result = true;
537 	}
538 
notifyChangeCreatorMode(bool _createMode)539 	void WorkspaceControl::notifyChangeCreatorMode(bool _createMode)
540 	{
541 		updateSelectorEnabled();
542 	}
543 
onMouseButtonPressed(const MyGUI::IntPoint & _point)544 	void WorkspaceControl::onMouseButtonPressed(const MyGUI::IntPoint& _point)
545 	{
546 		if (WidgetCreatorManager::getInstance().getCreateMode())
547 			WidgetCreatorManager::getInstance().createNewWidget(_point);
548 	}
549 
onMouseButtonReleased(const MyGUI::IntPoint & _point)550 	void WorkspaceControl::onMouseButtonReleased(const MyGUI::IntPoint& _point)
551 	{
552 		UndoManager::getInstance().dropLastProperty();
553 
554 		if (WidgetCreatorManager::getInstance().getCreateMode())
555 			WidgetCreatorManager::getInstance().finishNewWidget(_point);
556 	}
557 
onMouseDrag(const MyGUI::IntPoint & _point)558 	void WorkspaceControl::onMouseDrag(const MyGUI::IntPoint& _point)
559 	{
560 		if (WidgetCreatorManager::getInstance().getCreateMode())
561 			WidgetCreatorManager::getInstance().moveNewWidget(_point);
562 	}
563 
updateSelectorEnabled()564 	void WorkspaceControl::updateSelectorEnabled()
565 	{
566 		mAreaSelectorControl->setEnabled(!WidgetCreatorManager::getInstance().getCreateMode() && mMoveableWidget);
567 	}
568 
notifyChangeSelectorCreator(bool _visible,const MyGUI::IntCoord & _coord)569 	void WorkspaceControl::notifyChangeSelectorCreator(bool _visible, const MyGUI::IntCoord& _coord)
570 	{
571 		if (_visible)
572 		{
573 			mPositionSelectorCreatorControl->setVisible(true);
574 			mPositionSelectorCreatorControl->setCoord(_coord);
575 		}
576 		else
577 		{
578 			mPositionSelectorCreatorControl->setVisible(false);
579 		}
580 	}
581 
onChangeScale()582 	void WorkspaceControl::onChangeScale()
583 	{
584 		updateCaption();
585 		updateMenu();
586 	}
587 
updateCaption()588 	void WorkspaceControl::updateCaption()
589 	{
590 		if (getActivate())
591 		{
592 			int scale = (int)(getScale() * (double)100);
593 			addUserTag("CurrentScale", MyGUI::utility::toString(scale));
594 
595 			CommandManager::getInstance().executeCommand("Command_UpdateAppCaption");
596 		}
597 	}
598 
updateMenu()599 	void WorkspaceControl::updateMenu()
600 	{
601 		int scale = (int)(getScale() * (double)100);
602 		CommandManager::getInstance().executeCommand(MyGUI::utility::toString("Command_OnChangeScale.", scale));
603 	}
604 
notifyFrameStart(float _time)605 	void WorkspaceControl::notifyFrameStart(float _time)
606 	{
607 		if (getSelectorsCapture())
608 			return;
609 		if (mCurrentWidget == nullptr)
610 			return;
611 
612 		if (mAreaSelectorControl->getCoord() != mCurrentWidget->getAbsoluteCoord())
613 		{
614 			mCoordValue = mCurrentWidget->getCoord();
615 			updateSelectionFromValue();
616 		}
617 	}
618 
setWidgetCoord(MyGUI::Widget * _widget,const MyGUI::IntCoord & _coord)619 	void WorkspaceControl::setWidgetCoord(MyGUI::Widget* _widget, const MyGUI::IntCoord& _coord)
620 	{
621 		if (mFreeChildMode)
622 		{
623 			typedef std::pair<MyGUI::Widget*, MyGUI::IntCoord> PairWidgetCoord;
624 			typedef std::vector<PairWidgetCoord> VectorPairWidgetCoord;
625 			VectorPairWidgetCoord coords;
626 
627 			// запоминаем позиции детей
628 			for (size_t index = 0; index < _widget->getChildCount(); ++ index)
629 			{
630 				MyGUI::Widget* child = _widget->getChildAt(index);
631 				if (!child->isRootWidget())
632 					coords.push_back(PairWidgetCoord(child, child->getCoord()));
633 			}
634 
635 			// на сколько сдвинут виджет
636 			MyGUI::IntCoord coordDiff = _coord - _widget->getCoord();
637 			_widget->setCoord(_coord);
638 
639 			// восттанавливаем обсолютное положение детей
640 			for (VectorPairWidgetCoord::iterator item = coords.begin(); item != coords.end(); ++ item)
641 			{
642 				WidgetContainer* widgetContainer = EditorWidgets::getInstance().find((*item).first);
643 				if (widgetContainer != nullptr)
644 				{
645 					MyGUI::IntCoord coord = (*item).second;
646 					(*item).first->setCoord(coord.left - coordDiff.left, coord.top - coordDiff.top, coord.width, coord.height);
647 				}
648 			}
649 		}
650 		else
651 		{
652 			_widget->setCoord(_coord);
653 		}
654 
655 		EditorWidgets::getInstance().onSetWidgetCoord(_widget, _coord, "WorkspaceControl");
656 	}
657 
setRttLayerSize(const MyGUI::IntSize & _size)658 	void WorkspaceControl::setRttLayerSize(const MyGUI::IntSize& _size)
659 	{
660 		MyGUI::ILayer* layer = MyGUI::LayerManager::getInstance().getByName("LayoutEditor_Widgets", false);
661 		if (layer != nullptr)
662 		{
663 			MyGUI::RTTLayer* rttLayer = layer->castType<MyGUI::RTTLayer>();
664 			rttLayer->setTextureSize(_size);
665 		}
666 	}
667 
668 }
669