Browse Source

added UI::SetMaxDoubleClickDist and UI::GetMaxDoubpleClickDist

2gitcans 8 years ago
parent
commit
e78e3ab165
2 changed files with 20 additions and 4 deletions
  1. 9 2
      Source/Urho3D/UI/UI.cpp
  2. 11 2
      Source/Urho3D/UI/UI.h

+ 9 - 2
Source/Urho3D/UI/UI.cpp

@@ -95,6 +95,7 @@ UI::UI(Context* context) :
     dragBeginDistance_(DEFAULT_DRAGBEGIN_DISTANCE),
     mouseButtons_(0),
     lastMouseButtons_(0),
+	maxDoubleClickDist_(FLT_MAX),	
     qualifiers_(0),
     maxFontTextureSize_(DEFAULT_FONT_TEXTURE_MAX_SIZE),
     initialized_(false),
@@ -634,6 +635,11 @@ void UI::SetDoubleClickInterval(float interval)
     doubleClickInterval_ = Max(interval, 0.0f);
 }
 
+void UI::SetMaxDoubleClickDistance(float distPixels)
+{
+	maxDoubleClickDist_ = distPixels;
+}
+
 void UI::SetDragBeginInterval(float interval)
 {
     dragBeginInterval_ = Max(interval, 0.0f);
@@ -1380,9 +1386,9 @@ void UI::ProcessClickBegin(const IntVector2& windowCursorPos, int button, int bu
             element->OnClickBegin(element->ScreenToElement(cursorPos), cursorPos, button, buttons, qualifiers, cursor);
             SendClickEvent(E_UIMOUSECLICK, nullptr, element, cursorPos, button, buttons, qualifiers);
 
-            // Fire double click event if element matches and is in time
+            // Fire double click event if element matches and is in time and is within max distance from the original click
             if (doubleClickElement_ && element == doubleClickElement_ &&
-                clickTimer_.GetMSec(true) < (unsigned)(doubleClickInterval_ * 1000) && lastMouseButtons_ == buttons)
+                (clickTimer_.GetMSec(true) < (unsigned)(doubleClickInterval_ * 1000)) && lastMouseButtons_ == buttons && (windowCursorPos - doubleClickFirstPos_).Length() < maxDoubleClickDist_)
             {
                 element->OnDoubleClick(element->ScreenToElement(cursorPos), cursorPos, button, buttons, qualifiers, cursor);
                 doubleClickElement_.Reset();
@@ -1391,6 +1397,7 @@ void UI::ProcessClickBegin(const IntVector2& windowCursorPos, int button, int bu
             else
             {
                 doubleClickElement_ = element;
+				doubleClickFirstPos_ = windowCursorPos;
                 clickTimer_.Reset();
             }
 

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

@@ -92,6 +92,8 @@ public:
     void SetClipboardText(const String& text);
     /// Set UI element double click interval in seconds.
     void SetDoubleClickInterval(float interval);
+    /// Set max screen distance in pixels for double clicks to register.  default is FLT_MAX.
+    void SetMaxDoubleClickDistance(float pixels);
     /// Set UI drag event start interval in seconds.
     void SetDragBeginInterval(float interval);
     /// Set UI drag event start distance threshold in pixels.
@@ -163,8 +165,11 @@ public:
 
     /// Return UI element double click interval in seconds.
     float GetDoubleClickInterval() const { return doubleClickInterval_; }
-
-    /// Return UI drag start event interval in seconds.
+	
+	/// Get max screen distance for double clicks to register.  default is FLT_MAX.
+    float GetMaxDoubleClickDistance() const { return maxDoubleClickDist_;}
+    
+	/// Return UI drag start event interval in seconds.
     float GetDragBeginInterval() const { return dragBeginInterval_; }
 
     /// Return UI drag start event distance threshold in pixels.
@@ -402,6 +407,10 @@ private:
     Timer clickTimer_;
     /// UI element last clicked for tracking double clicks.
     WeakPtr<UIElement> doubleClickElement_;
+	/// Screen position of first mouse click for double click distance checking.
+	IntVector2 doubleClickFirstPos_;
+	/// Max screen distance the first click in a double click can be from the second click in a double click.
+	float maxDoubleClickDist_;
     /// Currently hovered elements.
     HashMap<WeakPtr<UIElement>, bool> hoveredElements_;
     /// Currently dragged elements.