void WidgetSelectorManager::selectWidget(const MyGUI::IntPoint& _mousePosition) { if (mLastClickPoint != _mousePosition) { mSelectDepth = 0; mLastClickPoint = _mousePosition; } // здесь кликать вглубь MyGUI::Widget* item = getTopWidget(_mousePosition); if (nullptr != item) { // find widget registered as container while ((nullptr == EditorWidgets::getInstance().find(item)) && (nullptr != item)) item = item->getParent(); MyGUI::Widget* oldItem = item; // try to selectin depth size_t depth = mSelectDepth; while (depth && (nullptr != item)) { item = item->getParent(); while ((nullptr == EditorWidgets::getInstance().find(item)) && (nullptr != item)) item = item->getParent(); MYGUI_ASSERT(depth != 0, "depth != 0"); depth--; } if (nullptr == item) { item = oldItem; mSelectDepth = 0; } // found widget if (nullptr != item) { depth = mSelectDepth; WidgetSelectorManager::getInstance().setSelectedWidget(item); mSelectDepth = depth + 1; } else { WidgetSelectorManager::getInstance().setSelectedWidget(nullptr); } } else { WidgetSelectorManager::getInstance().setSelectedWidget(nullptr); } }
void NoDrop::onFrame(float dt) { if (!mWidget) return; MyGUI::IntPoint mousePos = MyGUI::InputManager::getInstance().getMousePosition(); if (mDrag->mIsOnDragAndDrop) { MyGUI::Widget* focus = MyGUI::InputManager::getInstance().getMouseFocusWidget(); while (focus && focus != mWidget) focus = focus->getParent(); if (focus == mWidget) mTransparent = true; } if (!mWidget->getAbsoluteCoord().inside(mousePos)) mTransparent = false; if (mTransparent) { mWidget->setNeedMouseFocus(false); // Allow click-through setAlpha(std::max(0.13f, mWidget->getAlpha() - dt*5)); } else { mWidget->setNeedMouseFocus(true); setAlpha(std::min(1.0f, mWidget->getAlpha() + dt*5)); } }
void WidgetCreatorManager::moveNewWidget(const MyGUI::IntPoint& _point) { if (mNewWidget == nullptr) { // тип виджета может отсутсвовать if (!MyGUI::WidgetManager::getInstance().isFactoryExist(mWidgetType)) return; // выделяем верний виджет if (!mPopupMode) WidgetSelectorManager::getInstance().selectWidget(mStartPoint); MyGUI::Widget* parent = WidgetSelectorManager::getInstance().getSelectedWidget(); // пока не найдем ближайшего над нами способного быть родителем while (parent != nullptr && !WidgetTypes::getInstance().findWidgetStyle(parent->getTypeName())->parent) parent = parent->getParent(); if (!WidgetTypes::getInstance().findWidgetStyle(mWidgetType)->child) parent = nullptr; if (parent != nullptr) mNewWidget = parent->createWidgetT( mPopupMode ? MyGUI::WidgetStyle::Popup : MyGUI::WidgetStyle::Child, mWidgetType, EditorWidgets::getInstance().getSkinReplace(mWidgetSkin), MyGUI::IntCoord(), MyGUI::Align::Default, DEFAULT_EDITOR_LAYER); else mNewWidget = MyGUI::Gui::getInstance().createWidgetT( mWidgetType, EditorWidgets::getInstance().getSkinReplace(mWidgetSkin), MyGUI::IntCoord(), MyGUI::Align::Default, DEFAULT_EDITOR_LAYER); // переводим старт поинт в координаты отца if (parent != nullptr && !mNewWidget->isRootWidget()) { if (parent->getClientWidget()) mStartPoint -= parent->getClientWidget()->getAbsolutePosition(); else mStartPoint -= parent->getAbsolutePosition(); } if (!MyGUI::InputManager::getInstance().isShiftPressed()) { mStartPoint.left = Grid::getInstance().toGrid(mStartPoint.left); mStartPoint.top = Grid::getInstance().toGrid(mStartPoint.top); } } MyGUI::IntCoord coord = getCoordNewWidget(_point); mNewWidget->setCoord(coord); eventChangeSelector(true, mNewWidget->getAbsoluteCoord()); }
void step_attach_widget() { MyGUI::Widget* widget1 = get_random(all_widgets); MyGUI::Widget* widget2 = get_random(all_widgets); if (!widget1 || !widget2) return; MyGUI::Widget* test = widget1; do { if (test == widget2) return; test = test->getParent(); } while (test); widget2->attachToWidget(widget1, get_type(), get_layer()); test_widgets(); }
void WindowBase::setVisible(bool visible) { bool wasVisible = mMainWidget->getVisible(); mMainWidget->setVisible(visible); if (visible) onOpen(); else if (wasVisible) onClose(); // This is needed as invisible widgets can retain key focus. // Remove for MyGUI 3.2.2 if (!visible) { MyGUI::Widget* keyFocus = MyGUI::InputManager::getInstance().getKeyFocusWidget(); while (keyFocus != mMainWidget && keyFocus != nullptr) keyFocus = keyFocus->getParent(); if (keyFocus == mMainWidget) MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(nullptr); } }
//=================================================================================== void EditorState::injectMousePress(int _absx, int _absy, MyGUI::MouseButton _id) { if (testMode) { return base::BaseManager::injectMousePress(_absx, _absy, _id); } if (MyGUI::InputManager::getInstance().isModalAny()) { // if we have modal widgets we can't select any widget base::BaseManager::injectMousePress(_absx, _absy, _id); return; } // align to grid if shift not pressed int x1, y1; if (MyGUI::InputManager::getInstance().isShiftPressed() == false) { x1 = toGrid(_absx); y1 = toGrid(_absy); } else { x1 = _absx; y1 = _absy; } // юбилейный комит =) mWidgetsWindow->startNewWidget(x1, y1, _id); // это чтобы можно было двигать пр¤моугольник у невидимых виджето (или виджетов за границами) //MyGUI::LayerItemInfoPtr rootItem = nullptr; //MyGUI::Widget* itemWithRect = static_cast<MyGUI::Widget*>(MyGUI::LayerManager::getInstance().findWidgetItem(_absx, _absy, rootItem)); // не стал это доделывать, т.к. неоднозначность выбора виджета получаетс¤, если кто скажет как выбирать - сделаю MyGUI::Widget* item = MyGUI::LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); // не убираем пр¤моугольник если нажали на его раст¤гивалку if (item && (item->getParent() != mPropertiesPanelView->getWidgetRectangle())) { // чтобы пр¤моугольник не мешалс¤ mPropertiesPanelView->getWidgetRectangle()->setVisible(false); item = MyGUI::LayerManager::getInstance().getWidgetFromPoint(_absx, _absy); } if (nullptr != item) { // find widget registered as container while ((nullptr == ew->find(item)) && (nullptr != item)) item = item->getParent(); MyGUI::Widget* oldItem = item; // try to selectin depth int depth = selectDepth; while (depth && (nullptr != item)) { item = item->getParent(); while ((nullptr == ew->find(item)) && (nullptr != item)) item = item->getParent(); depth--; } if (nullptr == item) { item = oldItem; selectDepth = 0; } // found widget if (nullptr != item) { notifySelectWidget(item); if (mWidgetsWindow->getCreatingStatus() != 1) { //FIXME getGUI()->injectMouseMove(_absx, _absy, 0);// это чтобы сразу можно было тащить } } //FIXME getGUI()->injectMousePress(_absx, _absy, _id); } else { //FIXME getGUI()->injectMousePress(_absx, _absy, _id); notifySelectWidget(nullptr); } // вернем пр¤моугольник if (current_widget && mWidgetsWindow->getCreatingStatus() == 0) { mPropertiesPanelView->getWidgetRectangle()->setVisible(true); } else if (mWidgetsWindow->getCreatingStatus()) { mPropertiesPanelView->getWidgetRectangle()->setVisible(false); } //base::BaseManager::injectMousePress(_absx, _absy, _id); }