2
0
Эх сурвалжийг харах

Fix UI element drag outside window.
Enable console in the editor.

Lasse Öörni 15 жил өмнө
parent
commit
d04a135ce5

+ 19 - 0
Bin/CoreData/Scripts/EditorUI.as

@@ -19,9 +19,11 @@ void createUI()
     createSceneWindow();
     createComponentWindow();
     createCameraDialog();
+    createConsole();
     
     subscribeToEvent("ScreenMode", "resizeUI");
     subscribeToEvent("MenuSelected", "handleMenuSelected");
+	subscribeToEvent("KeyDown", "handleKeyDown");
 }
 
 void resizeUI()
@@ -139,6 +141,13 @@ void closeFileSelector()
     @uiFileSelector = null;
 }
 
+void createConsole()
+{
+    Console@ console = engine.createConsole();
+    console.setStyle(uiStyle);
+    console.setNumRows(16);
+}
+
 void centerDialog(UIElement@ element)
 {
     IntVector2 size = element.getSize();
@@ -229,3 +238,13 @@ void handleSaveSceneFile(StringHash eventType, VariantMap& eventData)
     string fileName = eventData["FileName"].getString();
     saveScene(fileName);
 }
+
+void handleKeyDown(StringHash eventType, VariantMap& eventData)
+{
+    // Check for toggling the console
+    if (eventData["Key"].getInt() == 220)
+    {
+        console.toggle();
+        input.suppressNextChar();
+    }
+}

+ 0 - 3
Engine/Input/Input.cpp

@@ -398,9 +398,6 @@ void Input::mouseButtonChange(int button, bool newState)
     if ((newState) && (!mActive))
         return;
     
-    // Check mouse move before sending the button up/down so that the click will be interpreted correctly
-    //checkMouseMove();
-    
     if (newState)
     {
         if (!(mMouseButtonDown & button))

+ 24 - 7
Engine/UI/UI.cpp

@@ -480,6 +480,8 @@ void UI::handleMouseMove(StringHash eventType, VariantMap& eventData)
     
     if (mCursor)
     {
+        const IntVector2& rootSize = mRootElement->getSize();
+        
         if (eventData[P_CLIPCURSOR].getBool())
         {
             // When in confined cursor mode, move cursor only when visible
@@ -488,7 +490,6 @@ void UI::handleMouseMove(StringHash eventType, VariantMap& eventData)
                 IntVector2 pos = mCursor->getPosition();
                 pos.mX += eventData[P_DX].getInt();
                 pos.mY += eventData[P_DY].getInt();
-                const IntVector2& rootSize = mRootElement->getSize();
                 pos.mX = clamp(pos.mX, 0, rootSize.mX - 1);
                 pos.mY = clamp(pos.mY, 0, rootSize.mY - 1);
                 mCursor->setPosition(pos);
@@ -497,11 +498,24 @@ void UI::handleMouseMove(StringHash eventType, VariantMap& eventData)
         else
         {
             // When in non-confined mode, move cursor always to ensure accurate position
-            // Do not clamp, but hide the cursor when not in the window's client area
-            int x = eventData[P_X].getInt();
-            int y = eventData[P_Y].getInt();
-            mCursor->setPosition(x, y);
-            mCursor->setVisible((x >= 0) && (y >= 0) && (x < mRenderer->getWidth()) && (y < mRenderer->getHeight()));
+            IntVector2 pos(eventData[P_X].getInt(), eventData[P_Y].getInt());
+            bool inside = (pos.mX >= 0) && (pos.mX < rootSize.mX) && (pos.mY >= 0) && (pos.mY < rootSize.mY);
+            
+            // Hide by moving completely outside if outside
+            // (do not use setVisible(), so that actual visibility remains under application control)
+            if (pos.mX < 0)
+                pos.mX = -mCursor->getWidth() * 2;
+            if (pos.mX >= rootSize.mX)
+                pos.mX = rootSize.mX + mCursor->getWidth() * 2;
+            if (pos.mY < 0)
+                pos.mY = -mCursor->getHeight() * 2;
+            if (pos.mY >= rootSize.mY)
+                pos.mY = rootSize.mY + mCursor->getHeight() * 2;
+            mCursor->setPosition(pos);
+            
+            // Do not drag when outside
+            if (!inside)
+                return;
         }
         
         if ((mMouseDragElement) && (mMouseButtons))
@@ -510,7 +524,10 @@ void UI::handleMouseMove(StringHash eventType, VariantMap& eventData)
             if ((mMouseDragElement->isEnabled()) && (mMouseDragElement->isVisible()))
                 mMouseDragElement->onDragMove(mMouseDragElement->screenToElement(pos), pos, mMouseButtons, mQualifiers, mCursor);
             else
+            {
+                mMouseDragElement->onDragEnd(mMouseDragElement->screenToElement(pos), pos, mCursor);
                 mMouseDragElement.reset();
+            }
         }
     }
 }
@@ -571,7 +588,7 @@ void UI::handleMouseButtonUp(StringHash eventType, VariantMap& eventData)
     mMouseButtons = eventData[P_BUTTONS].getInt();
     mQualifiers = eventData[P_QUALIFIERS].getInt();
     
-    if ((mCursor) && (mCursor->isVisible()))
+    if ((mCursor) && ((mCursor->isVisible()) || (mMouseDragElement)))
     {
         IntVector2 pos = mCursor->getPosition();