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