瀏覽代碼

UI event order consistency on mouse click. Fix the order to click, double click, drag, first handled by the elements themselves and then sent as an event.
Bring material editor window to front when opened.

Lasse Öörni 12 年之前
父節點
當前提交
58add4d8e0
共有 3 個文件被更改,包括 33 次插入40 次删除
  1. 2 1
      Bin/Data/Scripts/Editor/EditorMaterial.as
  2. 29 39
      Engine/UI/UI.cpp
  3. 2 0
      Engine/UI/UI.h

+ 2 - 1
Bin/Data/Scripts/Editor/EditorMaterial.as

@@ -31,7 +31,8 @@ void CreateMaterialEditor()
 
 bool ShowMaterialEditor()
 {
-    materialWindow.visible = true;
+    materialWindow.visible = true;       
+    materialWindow.BringToFront();
     return true;
 }
 

+ 29 - 39
Engine/UI/UI.cpp

@@ -812,6 +812,19 @@ void UI::SendDragEvent(StringHash eventType, UIElement* element, const IntVector
     element->SendEvent(eventType, eventData);
 }
 
+void UI::SendClickEvent(StringHash eventType, UIElement* element, const IntVector2& pos, int button, int buttons, int qualifiers)
+{
+    VariantMap eventData;
+    eventData[UIMouseClick::P_ELEMENT] = (void*)element;
+    eventData[UIMouseClick::P_X] = pos.x_;
+    eventData[UIMouseClick::P_Y] = pos.y_;
+    eventData[UIMouseClick::P_BUTTON] = button;
+    eventData[UIMouseClick::P_BUTTONS] = buttons;
+    eventData[UIMouseClick::P_QUALIFIERS] = qualifiers;
+    
+    SendEvent(eventType, eventData);
+}
+
 void UI::HandleScreenMode(StringHash eventType, VariantMap& eventData)
 {
     using namespace ScreenMode;
@@ -852,14 +865,7 @@ void UI::HandleMouseButtonDown(StringHash eventType, VariantMap& eventData)
 
             // Handle click
             element->OnClick(element->ScreenToElement(cursorPos), cursorPos, mouseButtons_, qualifiers_, cursor_);
-
-            // Handle start of drag. OnClick() may have caused destruction of the element, so check the pointer again
-            if (element && !dragElement_ && mouseButtons_ == MOUSEB_LEFT)
-            {
-                dragElement_ = element;
-                element->OnDragBegin(element->ScreenToElement(cursorPos), cursorPos, mouseButtons_, qualifiers_, cursor_);
-                SendDragEvent(E_DRAGBEGIN, element, cursorPos);
-            }
+            SendClickEvent(E_UIMOUSECLICK, element, cursorPos, button, mouseButtons_, qualifiers_);
 
             // Fire double click event if element matches and is in time
             if (doubleClickElement_ && element == doubleClickElement_ && clickTimer_->GetMSec(true) <
@@ -867,38 +873,29 @@ void UI::HandleMouseButtonDown(StringHash eventType, VariantMap& eventData)
             {
                 element->OnDoubleClick(element->ScreenToElement(cursorPos), cursorPos, mouseButtons_, qualifiers_, cursor_);
                 doubleClickElement_.Reset();
-
-                using namespace UIMouseDoubleClick;
-
-                VariantMap eventData;
-                eventData[P_ELEMENT] = (void*)element.Get();
-                eventData[P_X] = cursorPos.x_;
-                eventData[P_Y] = cursorPos.y_;
-                eventData[P_BUTTON] = button;
-                eventData[P_BUTTONS] = mouseButtons_;
-                eventData[P_QUALIFIERS] = qualifiers_;
-                element->SendEvent(E_UIMOUSEDOUBLECLICK, eventData);
+                SendClickEvent(E_UIMOUSEDOUBLECLICK, element, cursorPos, button, mouseButtons_, qualifiers_);
             }
             else
             {
                 doubleClickElement_ = element;
                 clickTimer_->Reset();
             }
+            
+            // Handle start of drag. Click handling may have caused destruction of the element, so check the pointer again
+            if (element && !dragElement_ && mouseButtons_ == MOUSEB_LEFT)
+            {
+                dragElement_ = element;
+                element->OnDragBegin(element->ScreenToElement(cursorPos), cursorPos, mouseButtons_, qualifiers_, cursor_);
+                SendDragEvent(E_DRAGBEGIN, element, cursorPos);
+            }
         }
         else
         {
             // If clicked over no element, or a disabled element, lose focus
             SetFocusElement(0);
+            SendClickEvent(E_UIMOUSECLICK, element, cursorPos, button, mouseButtons_, qualifiers_);
         }
-
-        VariantMap eventData;
-        eventData[UIMouseClick::P_ELEMENT] = (void*)element.Get();
-        eventData[UIMouseClick::P_X] = cursorPos.x_;
-        eventData[UIMouseClick::P_Y] = cursorPos.y_;
-        eventData[UIMouseClick::P_BUTTON] = button;
-        eventData[UIMouseClick::P_BUTTONS] = mouseButtons_;
-        eventData[UIMouseClick::P_QUALIFIERS] = qualifiers_;
-        SendEvent(E_UIMOUSECLICK, eventData);
+        
         lastMouseButtons_ = mouseButtons_;
     }
 }
@@ -1068,8 +1065,9 @@ void UI::HandleTouchBegin(StringHash eventType, VariantMap& eventData)
 
         // Handle click
         element->OnClick(element->ScreenToElement(pos), pos, MOUSEB_LEFT, 0, 0);
-
-        // Handle start of drag. OnClick() may have caused destruction of the element, so check the pointer again
+        SendClickEvent(E_UIMOUSECLICK, element, pos, MOUSEB_LEFT, MOUSEB_LEFT, 0);
+        
+        // Handle start of drag. Click handling may have caused destruction of the element, so check the pointer again
         if (element && !dragElement_ )
         {
             dragElement_ = element;
@@ -1081,16 +1079,8 @@ void UI::HandleTouchBegin(StringHash eventType, VariantMap& eventData)
     {
         // If clicked over no element, or a disabled element, lose focus
         SetFocusElement(0);
+        SendClickEvent(E_UIMOUSECLICK, element, pos, MOUSEB_LEFT, MOUSEB_LEFT, 0);
     }
-
-    VariantMap clickEventData;
-    clickEventData[UIMouseClick::P_ELEMENT] = (void*)element.Get();
-    clickEventData[UIMouseClick::P_X] = pos.x_;
-    clickEventData[UIMouseClick::P_Y] = pos.y_;
-    clickEventData[UIMouseClick::P_BUTTON] = MOUSEB_LEFT;
-    clickEventData[UIMouseClick::P_BUTTONS] = MOUSEB_LEFT;
-    clickEventData[UIMouseClick::P_QUALIFIERS] = 0;
-    SendEvent(E_UIMOUSECLICK, clickEventData);
 }
 
 void UI::HandleTouchEnd(StringHash eventType, VariantMap& eventData)

+ 2 - 0
Engine/UI/UI.h

@@ -127,6 +127,8 @@ private:
     void SetCursorShape(CursorShape shape);
     /// Send a UI element drag event.
     void SendDragEvent(StringHash eventType, UIElement* element, const IntVector2& screenPos);
+    /// Send a UI click or double click event.
+    void SendClickEvent(StringHash eventType, UIElement* element, const IntVector2& pos, int button, int buttons, int qualifiers);
     /// Handle screen mode event.
     void HandleScreenMode(StringHash eventType, VariantMap& eventData);
     /// Handle mouse button down event.