Browse Source

Let go of drag UI elements when mouse button is released, even if the cursor is hidden. Closes #1010.

Lasse Öörni 10 years ago
parent
commit
898f730d9b
1 changed files with 42 additions and 43 deletions
  1. 42 43
      Source/Urho3D/UI/UI.cpp

+ 42 - 43
Source/Urho3D/UI/UI.cpp

@@ -1168,67 +1168,66 @@ void UI::ProcessClickBegin(const IntVector2& cursorPos, int button, int buttons,
 
 void UI::ProcessClickEnd(const IntVector2& cursorPos, int button, int buttons, int qualifiers, Cursor* cursor, bool cursorVisible)
 {
+    WeakPtr<UIElement> element;
     if (cursorVisible)
+        element = GetElementAt(cursorPos);
+
+    // Handle end of drag
+    for (HashMap<WeakPtr<UIElement>, UI::DragData*>::Iterator i = dragElements_.Begin(); i != dragElements_.End();)
     {
-        WeakPtr<UIElement> element(GetElementAt(cursorPos));
+        WeakPtr<UIElement> dragElement = i->first_;
+        UI::DragData* dragData = i->second_;
 
-        // Handle end of drag
-        for (HashMap<WeakPtr<UIElement>, UI::DragData*>::Iterator i = dragElements_.Begin(); i != dragElements_.End();)
+        if (!dragElement || !cursorVisible)
         {
-            WeakPtr<UIElement> dragElement = i->first_;
-            UI::DragData* dragData = i->second_;
+            i = DragElementErase(i);
+            continue;
+        }
 
-            if (!dragElement)
-            {
-                i = DragElementErase(i);
-                continue;
-            }
+        if (dragData->dragButtons & button)
+        {
+            // Handle end of click
+            if (element)
+                element->OnClickEnd(element->ScreenToElement(cursorPos), cursorPos, button, buttons, qualifiers, cursor,
+                    dragElement);
 
-            if (dragData->dragButtons & button)
-            {
-                // Handle end of click
-                if (element)
-                    element->OnClickEnd(element->ScreenToElement(cursorPos), cursorPos, button, buttons, qualifiers, cursor,
-                        dragElement);
+            SendClickEvent(E_UIMOUSECLICKEND, dragElement, element, cursorPos, button, buttons, qualifiers);
 
-                SendClickEvent(E_UIMOUSECLICKEND, dragElement, element, cursorPos, button, buttons, qualifiers);
+            if (dragElement && dragElement->IsEnabled() && dragElement->IsVisible() && !dragData->dragBeginPending)
+            {
+                dragElement->OnDragEnd(dragElement->ScreenToElement(cursorPos), cursorPos, dragData->dragButtons, buttons,
+                    cursor);
+                SendDragOrHoverEvent(E_DRAGEND, dragElement, cursorPos, IntVector2::ZERO, dragData);
 
-                if (dragElement && dragElement->IsEnabled() && dragElement->IsVisible() && !dragData->dragBeginPending)
+                bool dragSource = dragElement && (dragElement->GetDragDropMode() & DD_SOURCE) != 0;
+                if (dragSource)
                 {
-                    dragElement->OnDragEnd(dragElement->ScreenToElement(cursorPos), cursorPos, dragData->dragButtons, buttons,
-                        cursor);
-                    SendDragOrHoverEvent(E_DRAGEND, dragElement, cursorPos, IntVector2::ZERO, dragData);
+                    bool dragTarget = element && (element->GetDragDropMode() & DD_TARGET) != 0;
+                    bool dragDropFinish = dragSource && dragTarget && element != dragElement;
 
-                    bool dragSource = dragElement && (dragElement->GetDragDropMode() & DD_SOURCE) != 0;
-                    if (dragSource)
+                    if (dragDropFinish)
                     {
-                        bool dragTarget = element && (element->GetDragDropMode() & DD_TARGET) != 0;
-                        bool dragDropFinish = dragSource && dragTarget && element != dragElement;
+                        bool accept = element->OnDragDropFinish(dragElement);
 
-                        if (dragDropFinish)
+                        // OnDragDropFinish() may have caused destruction of the elements, so check the pointers again
+                        if (accept && dragElement && element)
                         {
-                            bool accept = element->OnDragDropFinish(dragElement);
-
-                            // OnDragDropFinish() may have caused destruction of the elements, so check the pointers again
-                            if (accept && dragElement && element)
-                            {
-                                using namespace DragDropFinish;
-
-                                VariantMap& eventData = GetEventDataMap();
-                                eventData[P_SOURCE] = dragElement.Get();
-                                eventData[P_TARGET] = element.Get();
-                                eventData[P_ACCEPT] = accept;
-                                SendEvent(E_DRAGDROPFINISH, eventData);
-                            }
+                            using namespace DragDropFinish;
+
+                            VariantMap& eventData = GetEventDataMap();
+                            eventData[P_SOURCE] = dragElement.Get();
+                            eventData[P_TARGET] = element.Get();
+                            eventData[P_ACCEPT] = accept;
+                            SendEvent(E_DRAGDROPFINISH, eventData);
                         }
                     }
                 }
-
-                i = DragElementErase(i);
             }
-            else
-                ++i;
+
+            i = DragElementErase(i);
         }
+        else
+            ++i;
     }
 }