void UIComponentDraggable::onEvent(Event event, UIView* view) { if(event.isPointerPressed()) { vec2i mouse_position = event.getPointerPosition(); if(view->getBounds().contains(mouse_position.x, mouse_position.y)) { previousMousePosition = mouse_position; dragging = true; } } 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; view->setPosition(view->getPosition() + vec2(offset.x, offset.y) * axisCancellation); // 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; } }
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; } } }