X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fdrag-and-drop%2Ftizen-wayland%2Fdrag-and-drop-impl-ecore-wl2.cpp;h=49c45ffd89a6d43864acb54e4b2b1c89cc208940;hb=49ce2d56f1e766828970ffb950b1a0669d1a17c5;hp=e66dc6b7e277d464809c492cb2a89b13a99f08f1;hpb=dddca49199394154ea83624d13eab0eddbdc3573;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp index e66dc6b..49c45ff 100644 --- a/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp +++ b/dali/internal/drag-and-drop/tizen-wayland/drag-and-drop-impl-ecore-wl2.cpp @@ -21,9 +21,13 @@ // EXTERNAL INCLUDES #include #include -#include #include +// INTERNAL INCLUDES +#include +#include +#include + /////////////////////////////////////////////////////////////////////////////////////////////////// // DragAndDrop /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -257,6 +261,37 @@ bool DragAndDropEcoreWl::AddListener(Dali::Actor target, Dali::DragAndDrop::Drag return true; } +bool DragAndDropEcoreWl::AddListener(Dali::Window target, Dali::DragAndDrop::DragAndDropFunction callback) +{ + std::vector::iterator itr; + for(itr = mDropWindowTargets.begin(); itr < mDropWindowTargets.end(); itr++) + { + if((*itr).target == target) + { + return false; + } + } + + int windowId = INVALID_ECORE_WL2_WINDOW_ID; + + Ecore_Wl2_Window* window = AnyCast(target.GetNativeHandle()); + if(window == nullptr) + { + return false; + } + windowId = ecore_wl2_window_id_get(window); + + DropWindowTarget targetData; + targetData.target = target; + targetData.callback = callback; + targetData.inside = false; + targetData.windowId = windowId; + + mDropWindowTargets.push_back(targetData); + + return true; +} + bool DragAndDropEcoreWl::RemoveListener(Dali::Actor target) { std::vector::iterator itr; @@ -272,11 +307,30 @@ bool DragAndDropEcoreWl::RemoveListener(Dali::Actor target) return true; } +bool DragAndDropEcoreWl::RemoveListener(Dali::Window target) +{ + std::vector::iterator itr; + for(itr = mDropWindowTargets.begin(); itr < mDropWindowTargets.end(); itr++) + { + if((*itr).target == target) + { + mDropWindowTargets.erase(itr); + break; + } + } + + return true; +} + void DragAndDropEcoreWl::CallSourceEvent(Dali::DragAndDrop::SourceEventType type) { if(mSourceCallback) { mSourceCallback(type); + if(type != Dali::DragAndDrop::SourceEventType::START) + { + mDragWindow.Reset(); + } } } @@ -294,6 +348,19 @@ void DragAndDropEcoreWl::ResetDropTargets() } mDropTargets[i].inside = false; } + + for(std::size_t i = 0; i < mDropWindowTargets.size(); i++) + { + if(mDropWindowTargets[i].inside) + { + Dali::DragAndDrop::DragEvent dragEvent; + dragEvent.SetAction(Dali::DragAndDrop::DragType::LEAVE); + Dali::Vector2 position(DEFAULT_POSITION, DEFAULT_POSITION); + dragEvent.SetPosition(position); + mDropWindowTargets[i].callback(dragEvent); + } + mDropWindowTargets[i].inside = false; + } } void DragAndDropEcoreWl::SendData(void* event) @@ -347,9 +414,53 @@ void DragAndDropEcoreWl::ReceiveData(void* event) Dali::DragAndDrop::DragEvent dragEvent(Dali::DragAndDrop::DragType::DROP, mPosition, ev->mimetype, ev->data); mDropTargets[mTargetIndex].callback(dragEvent); mDropTargets[mTargetIndex].inside = false; - ecore_wl2_offer_finish(ev->offer); } mTargetIndex = -1; + + if(mWindowTargetIndex != -1) + { + Dali::DragAndDrop::DragEvent dragEvent(Dali::DragAndDrop::DragType::DROP, mWindowPosition, ev->mimetype, ev->data); + mDropWindowTargets[mWindowTargetIndex].callback(dragEvent); + mDropWindowTargets[mWindowTargetIndex].inside = false; + } + mWindowTargetIndex = -1; + +} + +Vector2 DragAndDropEcoreWl::RecalculatePositionByOrientation(int x, int y, Dali::Window window) +{ + int screenWidth, screenHeight; + Internal::Adaptor::WindowSystem::GetScreenSize(screenWidth, screenHeight); + int angle = DevelWindow::GetPhysicalOrientation(window); + + int newX, newY; + Dali::Vector2 newPosition; + + if(angle == 90) + { + newX = screenHeight - y; + newY = x; + } + else if(angle == 180) + { + newX = screenWidth - x; + newY = screenHeight - y; + } + else if(angle == 270) + { + newX = y; + newY = screenWidth - x; + } + else + { + newX = x; + newY = y; + } + + newPosition.x = newX; + newPosition.y = newY; + + return newPosition; } bool DragAndDropEcoreWl::CalculateDragEvent(void* event) @@ -368,7 +479,12 @@ bool DragAndDropEcoreWl::CalculateDragEvent(void* event) Vector2 position = mDropTargets[i].target.GetProperty(Dali::Actor::Property::SCREEN_POSITION); Vector2 size = mDropTargets[i].target.GetProperty(Dali::Actor::Property::SIZE); - bool currentInside = IsIntersection(ev->x, ev->y, position.x, position.y, size.width, size.height); + + // Recalculate Cursor by Orientation + Dali::Window window = Dali::DevelWindow::Get(mDropTargets[i].target); + Dali::Vector2 cursor = RecalculatePositionByOrientation(ev->x, ev->y, window); + + bool currentInside = IsIntersection(cursor.x, cursor.y, position.x, position.y, size.width, size.height); // Calculate Drag Enter, Leave, Move Event if(currentInside && !mDropTargets[i].inside) @@ -400,6 +516,50 @@ bool DragAndDropEcoreWl::CalculateDragEvent(void* event) } } + for(std::size_t i = 0; i < mDropWindowTargets.size(); i++) + { + if(ev->win != mDropWindowTargets[i].windowId) + { + continue; + } + + // Recalculate Cursor by Orientation + Dali::Window window = mDropWindowTargets[i].target; + Dali::Window::WindowPosition position = window.GetPosition(); + Dali::Window::WindowSize size = window.GetSize(); + + bool currentInside = IsIntersection(ev->x + position.GetX(), ev->y + position.GetY(), position.GetX(), position.GetY(), size.GetWidth(), size.GetHeight()); + + // Calculate Drag Enter, Leave, Move Event + if(currentInside && !mDropWindowTargets[i].inside) + { + mDropWindowTargets[i].inside = true; + // Call Enter Event + dragEvent.SetAction(Dali::DragAndDrop::DragType::ENTER); + dragEvent.SetPosition(curPosition); + mDropWindowTargets[i].callback(dragEvent); + // Accept Offer + ecore_wl2_offer_mimes_set(ev->offer, ecore_wl2_offer_mimes_get(ev->offer)); + } + else if(!currentInside && mDropWindowTargets[i].inside) + { + mDropWindowTargets[i].inside = false; + // Call Leave Event + dragEvent.SetAction(Dali::DragAndDrop::DragType::LEAVE); + dragEvent.SetPosition(curPosition); + mDropWindowTargets[i].callback(dragEvent); + // Reject Offer + ecore_wl2_offer_accept(ev->offer, NULL); + } + else if(currentInside && mDropWindowTargets[i].inside) + { + // Call Move Event + dragEvent.SetAction(Dali::DragAndDrop::DragType::MOVE); + dragEvent.SetPosition(curPosition); + mDropWindowTargets[i].callback(dragEvent); + } + } + return true; } @@ -409,6 +569,7 @@ bool DragAndDropEcoreWl::CalculateViewRegion(void* event) // Check the target object region mTargetIndex = -1; + mWindowTargetIndex = -1; for(std::size_t i = 0; i < mDropTargets.size(); i++) { @@ -419,8 +580,13 @@ bool DragAndDropEcoreWl::CalculateViewRegion(void* event) Vector2 position = mDropTargets[i].target.GetProperty(Dali::Actor::Property::SCREEN_POSITION); Vector2 size = mDropTargets[i].target.GetProperty(Dali::Actor::Property::SIZE); + + // Recalculate Cursor by Orientation + Dali::Window window = Dali::DevelWindow::Get(mDropTargets[i].target); + Dali::Vector2 cursor = RecalculatePositionByOrientation(ev->x, ev->y, window); + // If the drop position is in the target object region, request drop data to the source object - if(IsIntersection(ev->x, ev->y, position.x, position.y, size.width, size.height)) + if(IsIntersection(cursor.x, cursor.y, position.x, position.y, size.width, size.height)) { mTargetIndex = i; mPosition = position; @@ -438,6 +604,36 @@ bool DragAndDropEcoreWl::CalculateViewRegion(void* event) } } + for(std::size_t i = 0; i < mDropWindowTargets.size(); i++) + { + if(ev->win != mDropWindowTargets[i].windowId) + { + continue; + } + + // Recalculate Cursor by Orientation + Dali::Window window = mDropWindowTargets[i].target; + Dali::Window::WindowPosition position = window.GetPosition(); + Dali::Window::WindowSize size = window.GetSize(); + + // If the drop position is in the target object region, request drop data to the source object + if(IsIntersection(ev->x + position.GetX(), ev->y + position.GetY(), position.GetX(), position.GetY(), size.GetWidth(), size.GetHeight())) + { + mWindowTargetIndex = i; + mWindowPosition = Dali::Vector2(position.GetX(), position.GetY()); + + char* mimetype = (char*)eina_array_data_get(ecore_wl2_offer_mimes_get(ev->offer), 0); + if(mimetype) + { + ecore_wl2_offer_receive(ev->offer, mimetype); + Ecore_Wl2_Display* display = ecore_wl2_connected_display_get(NULL); + Ecore_Wl2_Input* input = ecore_wl2_input_default_input_get(display); + ecore_wl2_display_flush(ecore_wl2_input_display_get(input)); + } + return true; + } + } + return false; }