Browse Source

More (and more) editor work

Josh Engebretson 10 năm trước cách đây
mục cha
commit
8bd492fded

+ 1 - 1
Data/AtomicEditor/Resources/EditorData/AtomicEditor/editor/ui/inspectorframe.tb.txt

@@ -1,4 +1,4 @@
 TBContainer: skin: AEContainer, gravity: all, id: mainframecontainer
-	lp: min-width: 340
+	lp: min-width: 310
 	TBScrollContainer: scroll-mode: auto, id: inspectorcontainerscroll, gravity: all
 		TBLayout: distribution: gravity, id: inspectorcontainer, gravity: all

+ 1 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/tsconfig.json

@@ -19,6 +19,7 @@
         "./ui/HierarchyFrame.ts",
         "./ui/MainFrame.ts",
         "./ui/MainFrameMenu.ts",
+        "./ui/MainToolbar.ts",
         "./ui/ProjectFrame.ts",
         "./ui/ProjectFrameOld.ts",
         "./ui/ResourceFrame.ts",

+ 6 - 1
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/MainFrame.ts

@@ -3,6 +3,7 @@ import ProjectFrame = require("./ProjectFrame");
 import ResourceFrame = require("./ResourceFrame");
 import InspectorFrame = require("./inspector/InspectorFrame");
 import HierarchyFrame = require("./HierarchyFrame");
+import MainToolbar = require("./MainToolbar");
 
 import MessageModal = require("./modal/MessageModal");
 import UIEvents = require("./UIEvents");
@@ -17,8 +18,8 @@ class MainFrame extends ScriptWidget {
     resourceframe: ResourceFrame;
     inspectorframe: InspectorFrame;
     hierarchyFrame: HierarchyFrame;
-
     inspectorlayout: Atomic.UILayout;
+    mainToolbar: MainToolbar;
 
     private messagemodal: MessageModal.MessageModal = new MessageModal.MessageModal();
 
@@ -30,6 +31,8 @@ class MainFrame extends ScriptWidget {
 
         this.inspectorlayout = <Atomic.UILayout> this.getWidget("inspectorlayout");
 
+        this.getWidget("consolecontainer").visibility = Atomic.UI_WIDGET_VISIBILITY_GONE;
+
         this.inspectorframe = new InspectorFrame();
         this.inspectorlayout.addChild(this.inspectorframe);
 
@@ -38,6 +41,8 @@ class MainFrame extends ScriptWidget {
 
         this.resourceframe = new ResourceFrame(this);
 
+        this.mainToolbar = new MainToolbar(this.getWidget("maintoolbarcontainer"));
+
         this.showInspectorFrame(true);
 
         this.subscribeToEvent(UIEvents.ResourceEditorChanged, (data) => this.handleResourceEditorChanged(data));

+ 40 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/MainToolbar.ts

@@ -0,0 +1,40 @@
+
+
+class MainToolbar extends Atomic.UIWidget {
+
+
+    constructor(parent: Atomic.UIWidget) {
+
+        super();
+
+        this.load("AtomicEditor/editor/ui/maintoolbar.tb.txt");
+
+        parent.addChild(this);
+
+        this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
+    }
+
+    handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
+
+        if (ev.type == Atomic.UI_EVENT_TYPE_CLICK && ev.target) {
+
+            if (ev.target.id == "3d_translate" || ev.target.id == "3d_rotate" || ev.target.id == "3d_scale") {
+
+                return true;
+
+            } else if (ev.target.id == "maintoolbar_play") {
+
+              new ToolCore.PlayCmd().run();
+              return true;
+
+            }
+
+        }
+
+    }
+
+}
+
+
+
+export = MainToolbar;

+ 2 - 1
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/inspector/ComponentInspector.ts

@@ -35,7 +35,8 @@ class ComponentInspector extends Atomic.UISection {
     inspect(component: Atomic.Component) {
 
         this.text = component.getTypeName();
-        this.value = 1;
+        // don't example by default
+        this.value = 0;
 
         var fd = new Atomic.UIFontDescription();
         fd.id = "Vera";

+ 13 - 2
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/inspector/CreateComponentButton.ts

@@ -1,4 +1,6 @@
 
+import ComponentInspector = require("./ComponentInspector");
+
 
 var audioCreateSource = new Atomic.UIMenuItemSource();
 
@@ -22,7 +24,7 @@ geometryCreateSource.addItem(new Atomic.UIMenuItem("Water", "create component"))
 var logicCreateSource = new Atomic.UIMenuItemSource();
 
 logicCreateSource.addItem(new Atomic.UIMenuItem("AnimationController", "create component"));
-logicCreateSource.addItem(new Atomic.UIMenuItem("Javascript Component", "create component"));
+logicCreateSource.addItem(new Atomic.UIMenuItem("Javascript Component", "JSComponent"));
 logicCreateSource.addItem(new Atomic.UIMenuItem("SplinePath", "create component"));
 
 var navigationCreateSource = new Atomic.UIMenuItemSource();
@@ -107,7 +109,16 @@ class CreateComponentButton extends Atomic.UIButton {
 
         if (ev.target && ev.target.id == "create component popup") {
 
-            this.node.createComponent(ev.refid);
+            var c = this.node.createComponent(ev.refid);
+
+            if (c) {
+
+              var ci = new ComponentInspector();
+              ci.inspect(c);
+
+              this.parent.addChildRelative(ci, Atomic.UI_WIDGET_Z_REL_BEFORE, this);
+
+            }
 
             return true;
 

+ 39 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/inspector/DataBinding.ts

@@ -16,6 +16,8 @@ class DataBinding {
         fd.id = "Vera";
         fd.size = 11;
 
+        var enumSource = null;
+
         if (attrInfo.type == Atomic.VAR_BOOL) {
 
             var box = new Atomic.UICheckBox();
@@ -26,6 +28,14 @@ class DataBinding {
 
             if (attrInfo.enumNames.length) {
 
+                enumSource = new Atomic.UISelectItemSource();
+
+                for (var i in attrInfo.enumNames) {
+
+                    enumSource.addItem(new Atomic.UISelectItem(attrInfo.enumNames[i], (Number(i) + 1).toString()));
+
+                }
+
                 var button = new Atomic.UIButton();
                 button.fontDescription = fd;
                 button.text = "Enum Value!";
@@ -105,6 +115,7 @@ class DataBinding {
             lp.width = 70;
 
             for (var i = 0; i < 4; i++) {
+
                 var select = new Atomic.UIInlineSelect();
                 select.id = String(i + 1);
                 select.fontDescription = fd;
@@ -118,6 +129,7 @@ class DataBinding {
         if (widget) {
 
             var binding = new DataBinding(object, attrInfo, widget);
+            binding.enumSource = enumSource;
             return binding;
 
         }
@@ -280,6 +292,32 @@ class DataBinding {
         if (this.objectLocked)
             return false;
 
+        if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
+
+            var id = this.attrInfo.name + " enum popup";
+
+            if (ev.target.id == id) {
+
+                this.object.setAttribute(this.attrInfo.name, Number(ev.refid) - 1);
+                this.setWidgetValueFromObject();
+
+            }
+
+            else if (this.widget == ev.target && this.attrInfo.enumNames.length) {
+
+
+                if (this.enumSource) {
+                    var menu = new Atomic.UIMenuWindow(ev.target, id);
+                    menu.show(this.enumSource);
+                }
+
+                return true;
+
+            }
+
+
+        }
+
         if (ev.type == Atomic.UI_EVENT_TYPE_CHANGED) {
             if (this.widget == ev.target || this.widget.isAncestorOf(ev.target)) {
                 this.setObjectValueFromWidget(ev.target);
@@ -296,6 +334,7 @@ class DataBinding {
     widgetLocked: boolean = false;
     attrInfo: Atomic.AttributeInfo;
     widget: Atomic.UIWidget;
+    enumSource: Atomic.UISelectItemSource;
 
 }
 

+ 2 - 2
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/inspector/InspectorWidget.ts

@@ -11,7 +11,7 @@ class InspectorWidget extends ScriptWidget {
         fd.size = 11;
 
         var nlp = new Atomic.UILayoutParams();
-        nlp.width = 320;
+        nlp.width = 310;
 
         var layout = this.rootLayout = new Atomic.UILayout();
         layout.spacing = 4;
@@ -117,7 +117,7 @@ class InspectorWidget extends ScriptWidget {
       edit.skinBg = "TBAttrEditorField";
       edit.fontDescription = this.attrFontDesc;
       var lp = new Atomic.UILayoutParams();
-      lp.width = 180;
+      lp.width = 140;
       edit.layoutParams = lp;
 
       attrLayout.addChild(edit);

+ 3 - 3
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/inspector/MaterialInspector.ts

@@ -161,7 +161,7 @@ class MaterialInspector extends ScriptWidget {
         button.fontDescription = this.fd;
 
         var lp = new Atomic.UILayoutParams();
-        lp.width = 180;
+        lp.width = 140;
         button.layoutParams = lp;
 
         button.onClick = function() {
@@ -261,7 +261,7 @@ class MaterialInspector extends ScriptWidget {
         this.material = material;
 
         var mlp = new Atomic.UILayoutParams();
-        mlp.width = 340;
+        mlp.width = 310;
 
         var materialLayout = new Atomic.UILayout();
         materialLayout.spacing = 4;
@@ -302,7 +302,7 @@ class MaterialInspector extends ScriptWidget {
         field.skinBg = "TBAttrEditorField";;
         field.fontDescription = this.fd;
         var lp = new Atomic.UILayoutParams();
-        lp.width = 180;
+        lp.width = 140;
         field.layoutParams = lp;
 
         field.text = material.getTexture(Atomic.TU_DIFFUSE).name;

+ 10 - 1
Source/Atomic/UI/UIWidget.cpp

@@ -133,12 +133,21 @@ void UIWidget::OnDelete()
 
 void UIWidget::AddChild(UIWidget* child)
 {
-    if (!widget_ || !child->widget_)
+    if (!widget_ || !child || !child->widget_)
         return;
 
     widget_->AddChild(child->widget_);
 }
 
+void UIWidget::AddChildRelative(UIWidget* child, UI_WIDGET_Z_REL z, UIWidget* reference)
+{
+    if (!widget_ || !child || !child->widget_ || !reference || !reference->widget_)
+        return;
+
+    widget_->AddChildRelative(child->widget_, (WIDGET_Z_REL) z, reference->widget_);
+
+}
+
 String UIWidget::GetText()
 {
     if (!widget_)

+ 14 - 4
Source/Atomic/UI/UIWidget.h

@@ -95,6 +95,11 @@ enum UI_EVENT_TYPE {
     UI_EVENT_TYPE_CUSTOM = tb::EVENT_TYPE_CUSTOM
 };
 
+/** Defines widget z level relative to another widget, used with TBWidget::AddChildRelative. */
+enum UI_WIDGET_Z_REL {
+    UI_WIDGET_Z_REL_BEFORE = tb::WIDGET_Z_REL_BEFORE,		///< Before the reference widget (visually behind reference).
+    UI_WIDGET_Z_REL_AFTER = tb::WIDGET_Z_REL_AFTER			///< After the reference widget (visually above reference).
+};
 
 class UIView;
 class UILayoutParams;
@@ -107,9 +112,9 @@ class UIWidget : public Object, public tb::TBWidgetDelegate
 
     OBJECT(UIWidget)
 
-public:
+    public:
 
-    UIWidget(Context* context, bool createWidget = true);
+        UIWidget(Context* context, bool createWidget = true);
     virtual ~UIWidget();
 
     bool Load(const String& filename);
@@ -123,7 +128,7 @@ public:
     UIPreferredSize* GetPreferredSize();
     String GetText();
 
-    void SetRect(IntRect r);    
+    void SetRect(IntRect r);
     void SetSize(int width, int height);
     void SetPosition(int x, int y);
     void SetText(const String& text);
@@ -135,7 +140,7 @@ public:
 
     void DeleteAllChildren();
 
-    // String ID    
+    // String ID
     virtual void SetId(const String& id);
 
     void Center();
@@ -175,6 +180,11 @@ public:
 
     virtual void AddChild(UIWidget* child);
 
+    /// Add the child to this widget. See AddChild for adding a child to the top or bottom.
+    /// This takes a relative Z and insert the child before or after the given reference widget.*/
+    void AddChildRelative(UIWidget* child, UI_WIDGET_Z_REL z, UIWidget* reference);
+
+
     tb::TBWidget* GetInternalWidget() { return widget_; }
 
 protected:

+ 2 - 2
Source/AtomicEditorWork/Application/AEPlayerApp.cpp

@@ -155,8 +155,8 @@ void AEPlayerApplication::Setup()
                 // This works for a local dev build, --editor-resource-paths command below is for
                 // launching from AtomicEditor (IPC)
 
-                String resourcePaths = ToString("%s/Data/AtomicPlayer/Resources/CoreData;%s/Data/AtomicPlayer/Resources/PlayerData;%s/;%s/Resources",
-                         ATOMIC_ROOT_SOURCE_DIR, ATOMIC_ROOT_SOURCE_DIR, value.CString(), value.CString());
+                String resourcePaths = ToString("%s/Data/AtomicPlayer/Resources/CoreData;%s/Data/AtomicPlayer/Resources/PlayerData;%s/;%s/Resources;%s;%sCache",
+                         ATOMIC_ROOT_SOURCE_DIR, ATOMIC_ROOT_SOURCE_DIR, value.CString(), value.CString(), value.CString(), value.CString());
 
                 LOGINFOF("Adding ResourcePaths: %s", resourcePaths.CString());
 

+ 3 - 3
Source/AtomicEditorWork/Editors/SceneEditor3D/SceneView3D.cpp

@@ -254,7 +254,7 @@ void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& event
     // Visualize the currently selected nodes
     if (selectedNode_.NotNull())
     {
-        //DrawNodeDebug(selectedNode_, debugRenderer_);
+        DrawNodeDebug(selectedNode_, debugRenderer_);
 
     }
 
@@ -318,8 +318,8 @@ void SceneView3D::HandlePostRenderUpdate(StringHash eventType, VariantMap& event
 
             if (r.drawable_)
             {
-                //debugRenderer_->AddNode(r.drawable_->GetNode(), 1.0, false);
-                //r.drawable_->DrawDebugGeometry(debugRenderer_, false);
+                debugRenderer_->AddNode(r.drawable_->GetNode(), 1.0, false);
+                r.drawable_->DrawDebugGeometry(debugRenderer_, false);
             }
 
         }

+ 18 - 9
Source/AtomicJS/Javascript/JSComponent.cpp

@@ -69,9 +69,9 @@ void JSComponent::OnNodeSet(Node *node)
 {
     Component::OnNodeSet(node);
 
-    if (node)
+    if (node && node->JSGetHeapPtr())
     {
-        assert(node->JSGetHeapPtr());
+        //assert(node->JSGetHeapPtr());
 
         duk_context* ctx = vm_->GetJSContext();
         int top = duk_get_top(ctx);
@@ -91,14 +91,17 @@ void JSComponent::OnNodeSet(Node *node)
 void JSComponent::RegisterObject(Context* context)
 {
     context->RegisterFactory<JSComponent>(LOGIC_CATEGORY);
+    ACCESSOR_ATTRIBUTE("Is Enabled", IsEnabled, SetEnabled, bool, true, AM_DEFAULT);
+    ACCESSOR_ATTRIBUTE("Component Name", GetClassNameProperty, SetClassNameProperty, String, String::EMPTY, AM_DEFAULT);
+}
+
+void JSComponent::ApplyAttributes()
+{
+    Component::ApplyAttributes();
 
-    //ACCESSOR_ATTRIBUTE(JSComponent, VAR_BOOL, "Is Enabled", IsEnabled, SetEnabled, bool, true, AM_DEFAULT);
-    //REF_ACCESSOR_ATTRIBUTE(JSComponent, VAR_STRING, "Class Name", GetClassName, SetClassName, String, String::EMPTY, AM_DEFAULT);
+    if (classNameProperty_.Length())
+        SetClassName(classNameProperty_);
 
-    //ACCESSOR_ATTRIBUTE(JSComponent, VAR_RESOURCEREF, "Script File", GetScriptFileAttr, SetScriptFileAttr, ResourceRef, ResourceRef(JSFile::GetTypeStatic()), AM_DEFAULT);
-    //ACCESSOR_ATTRIBUTE(JSComponent, VAR_BUFFER, "Delayed Method Calls", GetDelayedCallsAttr, SetDelayedCallsAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_FILE | AM_NOEDIT);
-    //ACCESSOR_ATTRIBUTE(JSComponent, VAR_BUFFER, "Script Data", GetScriptDataAttr, SetScriptDataAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_FILE | AM_NOEDIT);
-    //ACCESSOR_ATTRIBUTE(JSComponent, VAR_BUFFER, "Script Network Data", GetScriptNetworkDataAttr, SetScriptNetworkDataAttr, PODVector<unsigned char>, Variant::emptyBuffer, AM_NET | AM_NOEDIT);
 }
 
 void JSComponent::ClearScriptMethods()
@@ -198,7 +201,13 @@ void JSComponent::CreateObject()
     duk_push_global_stash(ctx);
     duk_get_prop_index(ctx, -1, JS_GLOBALSTASH_INDEX_COMPONENTS);
     duk_get_prop_string(ctx, -1, className_.CString());
-    assert(duk_is_function(ctx, -1));
+
+    // FIXME: This is happening in editor
+    if (!duk_is_function(ctx, -1))
+    {
+        duk_pop_n(ctx, 3);
+        return;
+    }
 
     js_push_class_object_instance(ctx, this);
 

+ 7 - 0
Source/AtomicJS/Javascript/JSComponent.h

@@ -52,6 +52,9 @@ public:
     void SetScriptFileAttr(ResourceRef value);
     void SetClassName(const String& className);
 
+    const String& GetClassNameProperty() const { return classNameProperty_; }
+    void SetClassNameProperty(const String& className) { classNameProperty_ = className; }
+
     /// Handle enabled/disabled state change.
     virtual void OnSetEnabled();
     void OnNodeSet(Node *node);
@@ -66,6 +69,8 @@ public:
 
     void ListenToEvent(Object* sender, StringHash eventType, JS_HEAP_PTR __duk_function);
 
+    void ApplyAttributes();
+
 private:
 
     /// (Re)create the script object and check for supported methods if successfully created.
@@ -93,6 +98,8 @@ private:
     /// Class name.
     String className_;
 
+    String classNameProperty_;
+
     /// Script subsystem.
     SharedPtr<Javascript> script_;
 

+ 3 - 0
Source/ToolCore/Command/PlayCmd.cpp

@@ -78,7 +78,10 @@ void PlayCmd::Run()
     paths.Push(env->GetCoreDataDir());
     paths.Push(env->GetPlayerDataDir());
     paths.Push(project->GetResourcePath());
+
+    // fixme: this is for loading from cache
     paths.Push(project->GetProjectPath());
+    paths.Push(project->GetProjectPath() + "Cache");
 
     String resourcePaths;
     resourcePaths.Join(paths, "!");