void geGUIBase::DragDrop(int x, int y, MDropData* dropObject) { if(isPointInsideWindow(x, y) /*|| !isMouseBoundCheckEnabled()*/) { if(m_uGUIID==GEGUI_LAYOUT && getActiveWindowPtrOnlyForLayout()) //layout hack { getActiveWindowPtrOnlyForLayout()->DragDrop(x-getPos().x, y-getPos().y-getTopMarginOffsetHeight(), dropObject); } else { for(std::vector<geGUIBase*>::iterator it = m_vControls.begin(); it != m_vControls.end(); ++it) { geGUIBase* obj = *it; obj->DragDrop(x-getPos().x, y-getPos().y-getTopMarginOffsetHeight(), dropObject); } } if(isPointInsideClientArea(x-getPos().x, y-getPos().y-getTopMarginOffsetHeight())/* || !isMouseBoundCheckEnabled()*/) //if(isPointInsideWindow(x, y)/* || !isMouseBoundCheckEnabled()*/) { onDragDrop(x-getPos().x, y-getPos().y-getTopMarginOffsetHeight(), dropObject); onMouseLButtonUp(x-getPos().x, y-getPos().y-getTopMarginOffsetHeight(), -1); //event from a drag drop } } }
FavoriteDirsPage::FavoriteDirsPage(dwt::Widget* parent) : PropPage(parent) { createDialog(IDD_FAVORITE_DIRSPAGE); setHelpId(IDH_FAVORITE_DIRSPAGE); WinUtil::setHelpIds(this, helpItems); PropPage::translate(handle(), texts); attachChild(directories, IDC_FAVORITE_DIRECTORIES); directories->setTableStyle(LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT); TStringList columns; columns.push_back(T_("Favorite name")); columns.push_back(T_("Directory")); directories->createColumns(columns); directories->setColumnWidth(0, 100); directories->setColumnWidth(1, directories->getSize().x - 120); StringPairList dirs = FavoriteManager::getInstance()->getFavoriteDirs(); for(StringPairIter j = dirs.begin(); j != dirs.end(); j++) { TStringList row; row.push_back(Text::toT(j->second)); row.push_back(Text::toT(j->first)); directories->insert(row); } directories->onDblClicked(std::tr1::bind(&FavoriteDirsPage::handleDoubleClick, this)); directories->onKeyDown(std::tr1::bind(&FavoriteDirsPage::handleKeyDown, this, _1)); directories->onRaw(std::tr1::bind(&FavoriteDirsPage::handleItemChanged, this, _1, _2), dwt::Message(WM_NOTIFY, LVN_ITEMCHANGED)); onDragDrop(std::tr1::bind(&FavoriteDirsPage::handleDragDrop, this, _1)); attachChild<Button>(IDC_RENAME)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleRenameClicked, this)); attachChild<Button>(IDC_REMOVE)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleRemoveClicked, this)); attachChild<Button>(IDC_ADD)->onClicked(std::tr1::bind(&FavoriteDirsPage::handleAddClicked, this)); }
/// Redirect drag and drop listener void Window::handleInternalDragDrop(int x, int y, const StringList& fileNames) { onDragDrop(x, y, fileNames); }
void UIComponentDraggable::onEvent(Event event, Widget* view) { if(event.isPointerPressed()) { vec2i mouse_position = event.getPointerPosition(); if(view->isHit(vec2(mouse_position.x, mouse_position.y))) { previousMousePosition = mouse_position; dragging = true; // drag started, create the clone element Widget* temp_view = new Widget(); // temp_view->addController(new UIDebugWidget(Color::Yellow)); temp_view->setSize(100.f, 100.f); temp_view->setPosition(view->getWorldPosition().xy()); view->getCore()->dragElement = temp_view; view->getCore()->dragElementOwner = this; Log("Drag-Clone Start"); } } else if(event.isPointerMoved()) { if(dragging) { vec2i mouse_position = event.getPointerPosition(); vec2i offset = mouse_position - previousMousePosition; vec2 axisCancellation(0.f, 0.f); if(mAxis == Both || mAxis == HorizontalOnly) axisCancellation.x = 1.f; if(mAxis == Both || mAxis == VerticalOnly) axisCancellation.y = 1.f; if (view->getCore()->dragElement && view->getCore()->dragElementOwner == this) { //view->getCore()->dragElement->setPosition(view->getCore()->dragElement->getPosition() + vec2(offset.x, offset.y) * axisCancellation); view->getCore()->dragElement->setPosition(event.getPointerPosition().x, event.getPointerPosition().y); } // can't trespass parent /* if(view->getParent() && view->getPosition().x < view->getParent()->getPosition().x) { view->setPosition(view->getParent()->getPosition().x, view->getPosition().y); } if(view->getParent() && view->getPosition().x + view->getSize().x > view->getParent()->getPosition().x + view->getParent()->getSize().x) { view->setPosition(view->getParent()->getPosition().x + view->getParent()->getSize().x - view->getSize().x, view->getPosition().y); }*/ previousMousePosition = mouse_position; } } else if(event.isPointerReleased()) { dragging = false; if (view->getCore()->dragElement && view->getCore()->dragElementOwner == this) { Log("Drag-Clone Drop"); UIDragEvent drag; drag.dropPosition = event.getPointerPosition(); drag.dragSource = view; drag.dragElement = view->getCore()->dragElement; onDragDrop(drag); //Log("Emitted on %d", onDragDrop.size()); delete view->getCore()->dragElement; view->getCore()->dragElement = nullptr; view->getCore()->dragElementOwner = nullptr; } } }