Browse Source

Added missing distance check to the end of ProcessClickBegin. Seperate private function for dispaching double click events and added position of beggining click to double click events.

2gitcans 8 năm trước cách đây
mục cha
commit
00b103b5d6
3 tập tin đã thay đổi với 44 bổ sung13 xóa
  1. 28 5
      Source/Urho3D/UI/UI.cpp
  2. 6 2
      Source/Urho3D/UI/UI.h
  3. 10 6
      Source/Urho3D/UI/UIEvents.h

+ 28 - 5
Source/Urho3D/UI/UI.cpp

@@ -1392,7 +1392,7 @@ void UI::ProcessClickBegin(const IntVector2& windowCursorPos, int button, int bu
             {
                 element->OnDoubleClick(element->ScreenToElement(cursorPos), cursorPos, button, buttons, qualifiers, cursor);
                 doubleClickElement_.Reset();
-                SendClickEvent(E_UIMOUSEDOUBLECLICK, nullptr, element, cursorPos, button, buttons, qualifiers);
+				SendDoubleClickEvent(E_UIMOUSEDOUBLECLICK, nullptr, element, doubleClickFirstPos_, cursorPos, button, buttons, qualifiers);
             }
             else
             {
@@ -1433,8 +1433,8 @@ void UI::ProcessClickBegin(const IntVector2& windowCursorPos, int button, int bu
                 SetFocusElement(nullptr);
             SendClickEvent(E_UIMOUSECLICK, nullptr, element, cursorPos, button, buttons, qualifiers);
 
-            if (clickTimer_.GetMSec(true) < (unsigned)(doubleClickInterval_ * 1000) && lastMouseButtons_ == buttons)
-                SendClickEvent(E_UIMOUSEDOUBLECLICK, nullptr, element, cursorPos, button, buttons, qualifiers);
+            if (clickTimer_.GetMSec(true) < (unsigned)(doubleClickInterval_ * 1000) && lastMouseButtons_ == buttons && (windowCursorPos - doubleClickFirstPos_).Length() < maxDoubleClickDist_)
+                SendDoubleClickEvent(E_UIMOUSEDOUBLECLICK, nullptr, element, doubleClickFirstPos_, cursorPos, button, buttons, qualifiers);
         }
 
         lastMouseButtons_ = buttons;
@@ -1642,14 +1642,37 @@ void UI::SendClickEvent(StringHash eventType, UIElement* beginElement, UIElement
             endElement->SendEvent(E_CLICK, eventData);
         else if (eventType == E_UIMOUSECLICKEND)
             endElement->SendEvent(E_CLICKEND, eventData);
-        else if (eventType == E_UIMOUSEDOUBLECLICK)
-            endElement->SendEvent(E_DOUBLECLICK, eventData);
     }
 
     // Send the global event from the UI subsystem last
     SendEvent(eventType, eventData);
 }
 
+void UI::SendDoubleClickEvent(StringHash eventType, UIElement* beginElement, UIElement* endElement, const IntVector2& firstPos, const IntVector2& secondPos, int button,
+	int buttons, int qualifiers)
+{
+	VariantMap& eventData = GetEventDataMap();
+	eventData[UIMouseDoubleClick::P_ELEMENT] = endElement;
+	eventData[UIMouseDoubleClick::P_X] = secondPos.x_;
+	eventData[UIMouseDoubleClick::P_Y] = secondPos.y_;
+	eventData[UIMouseDoubleClick::P_XBegin] = firstPos.x_;
+	eventData[UIMouseDoubleClick::P_YBegin] = firstPos.y_;
+	eventData[UIMouseDoubleClick::P_BUTTON] = button;
+	eventData[UIMouseDoubleClick::P_BUTTONS] = buttons;
+	eventData[UIMouseDoubleClick::P_QUALIFIERS] = qualifiers;
+
+
+	if (endElement)
+	{
+		// Send also element version of the event
+		endElement->SendEvent(E_DOUBLECLICK, eventData);
+	}
+
+	// Send the global event from the UI subsystem last
+	SendEvent(eventType, eventData);
+}
+
+
 void UI::HandleScreenMode(StringHash eventType, VariantMap& eventData)
 {
     using namespace ScreenMode;

+ 6 - 2
Source/Urho3D/UI/UI.h

@@ -294,11 +294,15 @@ private:
     /// Send a UI element drag or hover begin event.
     void SendDragOrHoverEvent
         (StringHash eventType, UIElement* element, const IntVector2& screenPos, const IntVector2& deltaPos, UI::DragData* dragData);
-    /// Send a UI click or double click event.
+    /// Send a UI click event.
     void SendClickEvent
         (StringHash eventType, UIElement* beginElement, UIElement* endElement, const IntVector2& pos, int button, int buttons,
             int qualifiers);
-    /// Handle screen mode event.
+
+	/// Send a UI double click event
+	void SendDoubleClickEvent(StringHash eventType, UIElement* beginElement, UIElement* endElement, const IntVector2& firstPos, const IntVector2& secondPos, int button, int buttons, int qualifiers);
+	
+	/// Handle screen mode event.
     void HandleScreenMode(StringHash eventType, VariantMap& eventData);
     /// Handle mouse button down event.
     void HandleMouseButtonDown(StringHash eventType, VariantMap& eventData);

+ 10 - 6
Source/Urho3D/UI/UIEvents.h

@@ -56,6 +56,8 @@ URHO3D_EVENT(E_UIMOUSEDOUBLECLICK, UIMouseDoubleClick)
     URHO3D_PARAM(P_ELEMENT, Element);              // UIElement pointer
     URHO3D_PARAM(P_X, X);                          // int
     URHO3D_PARAM(P_Y, Y);                          // int
+	URHO3D_PARAM(P_XBegin, XBegin);                // int
+	URHO3D_PARAM(P_YBegin, YBegin);                // int
     URHO3D_PARAM(P_BUTTON, Button);                // int
     URHO3D_PARAM(P_BUTTONS, Buttons);              // int
     URHO3D_PARAM(P_QUALIFIERS, Qualifiers);        // int
@@ -87,12 +89,14 @@ URHO3D_EVENT(E_CLICKEND, ClickEnd)
 /// Mouse double click on a UI element. Parameters are same as in UIMouseDoubleClick event, but is sent by the element.
 URHO3D_EVENT(E_DOUBLECLICK, DoubleClick)
 {
-    URHO3D_PARAM(P_ELEMENT, Element);              // UIElement pointer
-    URHO3D_PARAM(P_X, X);                          // int
-    URHO3D_PARAM(P_Y, Y);                          // int
-    URHO3D_PARAM(P_BUTTON, Button);                // int
-    URHO3D_PARAM(P_BUTTONS, Buttons);              // int
-    URHO3D_PARAM(P_QUALIFIERS, Qualifiers);        // int
+	URHO3D_PARAM(P_ELEMENT, Element);              // UIElement pointer
+	URHO3D_PARAM(P_X, X);                          // int
+	URHO3D_PARAM(P_Y, Y);                          // int
+	URHO3D_PARAM(P_XBegin, XBegin);                // int
+	URHO3D_PARAM(P_YBegin, YBegin);                // int
+	URHO3D_PARAM(P_BUTTON, Button);                // int
+	URHO3D_PARAM(P_BUTTONS, Buttons);              // int
+	URHO3D_PARAM(P_QUALIFIERS, Qualifiers);        // int
 }
 
 /// Drag and drop test.