Browse Source

Added camera settings dialog.
Respect fixed size when updating layout.

Lasse Öörni 15 years ago
parent
commit
a7b269d79f

+ 74 - 0
Bin/CoreData/Scripts/EditorCamera.as

@@ -1,6 +1,7 @@
 // Urho3D editor camera functions
 
 Camera@ camera;
+Window@ cameraDialog;
 
 float cameraBaseSpeed = 10.0;
 float cameraBaseRotationSpeed = 0.2;
@@ -50,3 +51,76 @@ void moveCamera(float timeStep)
         }
     }
 }
+
+void createCameraDialog()
+{
+    if (!(cameraDialog is null))
+        return;
+    
+    @cameraDialog = ui.loadLayout(cache.getResource("XMLFile", "UI/CameraDialog.xml"), uiStyle);
+    uiRoot.addChild(cameraDialog);
+    centerDialog(cameraDialog);
+
+    // Fill the current values and subscribe to changes
+    LineEdit@ nearClipEdit = cameraDialog.getChild("NearClipEdit", true);
+    nearClipEdit.setText(toString(camera.getNearClip()));
+    subscribeToEvent(nearClipEdit, "TextFinished", "handleCameraDialogNearClip");
+
+    LineEdit@ farClipEdit = cameraDialog.getChild("FarClipEdit", true);
+    farClipEdit.setText(toString(camera.getFarClip()));
+    subscribeToEvent(farClipEdit, "TextFinished", "handleCameraDialogFarClip");
+
+    LineEdit@ fovEdit = cameraDialog.getChild("FOVEdit", true);
+    fovEdit.setText(toString(camera.getFov()));
+    subscribeToEvent(fovEdit, "TextFinished", "handleCameraDialogFOV");
+
+    LineEdit@ speedEdit = cameraDialog.getChild("SpeedEdit", true);
+    speedEdit.setText(toString(cameraBaseSpeed));
+    subscribeToEvent(speedEdit, "TextFinished", "handleCameraDialogSpeed");
+
+    subscribeToEvent(cameraDialog.getChild("CloseButton", true), "Pressed", "handleCameraDialogClose");
+}
+
+void closeCameraDialog()
+{
+    if (cameraDialog is null)
+        return;
+    uiRoot.removeChild(cameraDialog);
+    @cameraDialog = null;
+}
+
+void handleCameraDialogClose(StringHash eventType, VariantMap& eventData)
+{
+    closeCameraDialog();
+}
+
+void handleCameraDialogNearClip(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].getUIElement();
+    // Set to camera and then back to lineedit
+    camera.setNearClip(edit.getText().toFloat());
+    edit.setText(toString(camera.getNearClip()));
+}
+
+void handleCameraDialogFarClip(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].getUIElement();
+    // Set to camera and then back to lineedit; watch for ridiculously low values
+    camera.setFarClip(max(edit.getText().toFloat(), 10));
+    edit.setText(toString(camera.getFarClip()));
+}
+
+void handleCameraDialogFOV(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].getUIElement();
+    // Set to camera and then back to lineedit
+    camera.setFov(edit.getText().toFloat());
+    edit.setText(toString(camera.getFov()));
+}
+
+void handleCameraDialogSpeed(StringHash eventType, VariantMap& eventData)
+{
+    LineEdit@ edit = eventData["Element"].getUIElement();
+    cameraBaseSpeed = max(edit.getText().toFloat(), 1);
+    edit.setText(toString(cameraBaseSpeed));
+}

+ 22 - 5
Bin/CoreData/Scripts/EditorUI.as

@@ -47,6 +47,13 @@ void createMenuBar(XMLFile@ uiStyle)
         uiMenuBar.addChild(fileMenu);
     }
 
+    {
+        Menu@ fileMenu = createMenu(uiStyle, "Settings");
+        Window@ filePopup = fileMenu.getPopup();
+        filePopup.addChild(createMenuItem(uiStyle, "Editor camera", 0, 0));
+        uiMenuBar.addChild(fileMenu);
+    }
+
     UIElement@ spacer = UIElement("MenuBarSpacer");
     uiMenuBar.addChild(spacer);
 
@@ -57,7 +64,7 @@ Menu@ createMenuItem(XMLFile@ uiStyle, string title, int accelKey, int accelQual
 {
     Menu@ menu = Menu(title);
     menu.setStyleAuto(uiStyle);
-    menu.setLayout(LM_HORIZONTAL, 0, IntRect(uiSpacing, 0, uiSpacing, 0));
+    menu.setLayout(LM_HORIZONTAL, 0, IntRect(4, 0, 4, 0));
     if (accelKey != 0)
         menu.setAccelerator(accelKey, accelQual);
 
@@ -114,8 +121,7 @@ void createFileSelector(string title, string ok, string cancel, string initialPa
     uiFileSelector.setFilters(filters, initialFilter);
     
     Window@ window = uiFileSelector.getWindow();
-    IntVector2 size = window.getSize();
-    window.setPosition((renderer.getWidth() - size.x) / 2, (renderer.getHeight() - size.y) / 2);
+    centerDialog(window);
 }
 
 void closeFileSelector()
@@ -123,6 +129,12 @@ void closeFileSelector()
     @uiFileSelector = null;
 }
 
+void centerDialog(UIElement@ element)
+{
+    IntVector2 size = element.getSize();
+    element.setPosition((renderer.getWidth() - size.x) / 2, (renderer.getHeight() - size.y) / 2);
+}
+
 void resizeUI()
 {
     uiMenuBar.setFixedWidth(renderer.getWidth());
@@ -154,8 +166,8 @@ void handleMenuSelected(StringHash eventType, VariantMap& eventData)
 
         if (action == "Save scene")
         {
-            saveScene(sceneFileName);
             ui.setFocusElement(null); // Close the menu
+            saveScene(sceneFileName);
         }
 
         if (action == "Save scene as")
@@ -165,7 +177,12 @@ void handleMenuSelected(StringHash eventType, VariantMap& eventData)
             subscribeToEvent(uiFileSelector, "FileSelected", "handleSaveSceneFile");
         }
     }
-
+    
+    if (action == "Editor camera")
+    {
+        ui.setFocusElement(null); // Close the menu
+        createCameraDialog();
+    }
     if (menu.getName() == "Exit")
         engine.exit();
 }

+ 2 - 3
Bin/CoreData/UI/DefaultStyle.xml

@@ -336,14 +336,13 @@
     </element>
     <element type="FileSelector">
         <size value="400 300" />
-        <minsize value="400 300" />
         <movable enable="true" />
         <resizable enable="true" />
         <resizeborder value="6 6 6 6" />
-        <layout spacing="4" border="6 6 6 6" />
+        <layout mode="vertical" spacing="4" border="6 6 6 6" />
     </element>
     <element type="FileSelectorButton">
-        <fixedsize value="96 24" />
+        <fixedsize value="80 22" />
     </element>
     <element type="FileSelectorButtonText">
         <font name="Cour.ttf" size="10" />

+ 13 - 8
Engine/UI/UIElement.cpp

@@ -646,10 +646,13 @@ void UIElement::updateLayout()
         int width = calculateLayoutParentSize(sizes, mLayoutBorder.mLeft, mLayoutBorder.mRight, mLayoutSpacing);
         int height = max(getHeight(), minChildHeight + mLayoutBorder.mTop + mLayoutBorder.mBottom);
         // Make sure the minimum size we are going to set is not higher than current maximum size
-        int minWidth = min(calculateLayoutParentSize(minSizes, mLayoutBorder.mLeft, mLayoutBorder.mRight, mLayoutSpacing), mMaxSize.mX);
-        int minHeight = min(minChildHeight + mLayoutBorder.mTop + mLayoutBorder.mBottom, mMaxSize.mY);
-        
-        setMinSize(minWidth, minHeight);
+        // If we already have a fixed size, respect that
+        if (mMinSize != mMaxSize)
+        {
+            int minWidth = min(calculateLayoutParentSize(minSizes, mLayoutBorder.mLeft, mLayoutBorder.mRight, mLayoutSpacing), mMaxSize.mX);
+            int minHeight = min(minChildHeight + mLayoutBorder.mTop + mLayoutBorder.mBottom, mMaxSize.mY);
+            setMinSize(minWidth, minHeight);
+        }
         setSize(width, height);
         // Validate the size before resizing child elements, in case of min/max limits
         width = mSize.mX;
@@ -688,10 +691,12 @@ void UIElement::updateLayout()
         
         int height = calculateLayoutParentSize(sizes, mLayoutBorder.mTop, mLayoutBorder.mBottom, mLayoutSpacing);
         int width = max(getWidth(), minChildWidth + mLayoutBorder.mLeft + mLayoutBorder.mRight);
-        int minHeight = min(calculateLayoutParentSize(minSizes, mLayoutBorder.mTop, mLayoutBorder.mBottom, mLayoutSpacing), mMaxSize.mY);
-        int minWidth = min(minChildWidth + mLayoutBorder.mLeft + mLayoutBorder.mRight, mMaxSize.mX);
-        
-        setMinSize(minWidth, minHeight);
+        if (mMinSize != mMaxSize)
+        {
+            int minHeight = min(calculateLayoutParentSize(minSizes, mLayoutBorder.mTop, mLayoutBorder.mBottom, mLayoutSpacing), mMaxSize.mY);
+            int minWidth = min(minChildWidth + mLayoutBorder.mLeft + mLayoutBorder.mRight, mMaxSize.mX);
+            setMinSize(minWidth, minHeight);
+        }
         setSize(width, height);
         width = mSize.mX;
         height = mSize.mY;