|
@@ -0,0 +1,319 @@
|
|
|
|
|
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
|
|
|
|
|
+// Please see LICENSE.md in repository root for license information
|
|
|
|
|
+// https://github.com/AtomicGameEngine/AtomicGameEngine
|
|
|
|
|
+
|
|
|
|
|
+#include "AtomicEditor.h"
|
|
|
|
|
+
|
|
|
|
|
+#include <TurboBadger/tb_editfield.h>
|
|
|
|
|
+#include <Atomic/Core/Context.h>
|
|
|
|
|
+#include <Atomic/IO/Log.h>
|
|
|
|
|
+#include <Atomic/IO/FileSystem.h>
|
|
|
|
|
+#include <Atomic/Resource/ResourceEvents.h>
|
|
|
|
|
+
|
|
|
|
|
+#include <Atomic/Scene/Component.h>
|
|
|
|
|
+
|
|
|
|
|
+#include <Atomic/UI/UI.h>
|
|
|
|
|
+
|
|
|
|
|
+#include "AEEditor.h"
|
|
|
|
|
+#include "AEEvents.h"
|
|
|
|
|
+
|
|
|
|
|
+#include "UIInspectorDataBinding.h"
|
|
|
|
|
+#include "UIInspectorFrame.h"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#include "UI/Modal/UIModalOps.h"
|
|
|
|
|
+
|
|
|
|
|
+using namespace tb;
|
|
|
|
|
+
|
|
|
|
|
+namespace AtomicEditor
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+InspectorFrame::InspectorFrame(Context* context) :
|
|
|
|
|
+ UIWidget(context, true)
|
|
|
|
|
+{
|
|
|
|
|
+ SetGravity(WIDGET_GRAVITY_TOP_BOTTOM);
|
|
|
|
|
+
|
|
|
|
|
+ InitializeSources();
|
|
|
|
|
+
|
|
|
|
|
+ SubscribeToEvent(E_EDITORACTIVENODECHANGE, HANDLER(InspectorFrame, HandleEditorActiveNodeChange));
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+InspectorFrame::~InspectorFrame()
|
|
|
|
|
+{
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void InspectorFrame::InitializeSources()
|
|
|
|
|
+{
|
|
|
|
|
+ /*
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Audio", &audioCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Geometry", &geometryCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Logic", &logicCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Navigation", &navigationCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Network", &networkCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Physics", &physicsCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Scene", &sceneCreateSource));
|
|
|
|
|
+ componentCreateSource.AddItem(new MenubarItem("Subsystem", &subsystemCreateSource));
|
|
|
|
|
+
|
|
|
|
|
+ audioCreateSource.AddItem(new MenubarItem("SoundListener", TBIDC("create component")));
|
|
|
|
|
+ audioCreateSource.AddItem(new MenubarItem("SoundSource", TBIDC("create component")));
|
|
|
|
|
+ audioCreateSource.AddItem(new MenubarItem("SoundSource3D", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("AnimatedModel", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("BillboardSet", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("CustomGeometry", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("ParticleEmitter", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("Skybox", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("StaticModel", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("StaticModelGroup", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("Terrain", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("Text3D", TBIDC("create component")));
|
|
|
|
|
+ geometryCreateSource.AddItem(new MenubarItem("Water", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ logicCreateSource.AddItem(new MenubarItem("AnimationController", TBIDC("create component")));
|
|
|
|
|
+ logicCreateSource.AddItem(new MenubarItem("Javascript Component", TBIDC("create component")));
|
|
|
|
|
+ logicCreateSource.AddItem(new MenubarItem("SplinePath", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ navigationCreateSource.AddItem(new MenubarItem("Navigable", TBIDC("create component")));
|
|
|
|
|
+ navigationCreateSource.AddItem(new MenubarItem("NavigationMesh", TBIDC("create component")));
|
|
|
|
|
+ navigationCreateSource.AddItem(new MenubarItem("OffMeshConnection", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ networkCreateSource.AddItem(new MenubarItem("Network Priority", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ physicsCreateSource.AddItem(new MenubarItem("CollisionShape", TBIDC("create component")));
|
|
|
|
|
+ physicsCreateSource.AddItem(new MenubarItem("Constraint", TBIDC("create component")));
|
|
|
|
|
+ physicsCreateSource.AddItem(new MenubarItem("RigidBody", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ sceneCreateSource.AddItem(new MenubarItem("Camera", TBIDC("create component")));
|
|
|
|
|
+ sceneCreateSource.AddItem(new MenubarItem("Light", TBIDC("create component")));
|
|
|
|
|
+ sceneCreateSource.AddItem(new MenubarItem("Zone", TBIDC("create component")));
|
|
|
|
|
+
|
|
|
|
|
+ subsystemCreateSource.AddItem(new MenubarItem("DebugRenderer", TBIDC("create component")));
|
|
|
|
|
+ subsystemCreateSource.AddItem(new MenubarItem("Octree", TBIDC("create component")));
|
|
|
|
|
+ subsystemCreateSource.AddItem(new MenubarItem("PhysicsWorld", TBIDC("create component")));
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool InspectorFrame::OnEvent(const TBWidgetEvent &ev)
|
|
|
|
|
+{
|
|
|
|
|
+ for (unsigned i = 0; i < dataBindings_.Size(); i++)
|
|
|
|
|
+ dataBindings_[i]->OnEvent(ev);
|
|
|
|
|
+
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+void InspectorFrame::InspectNode(Node* node)
|
|
|
|
|
+{
|
|
|
|
|
+ if (node_ == node)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ node_ = node;
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* inspectorContainer = GetInternalWidget()->GetWidgetByIDAndType<TBLayout>(TBIDC("inspectorcontainer"));
|
|
|
|
|
+ assert(inspectorContainer);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ inspectorContainer->DeleteAllChildren();
|
|
|
|
|
+
|
|
|
|
|
+ for (unsigned i = 0; i < dataBindings_.Size(); i++)
|
|
|
|
|
+ delete dataBindings_[i];
|
|
|
|
|
+
|
|
|
|
|
+ dataBindings_.Clear();
|
|
|
|
|
+
|
|
|
|
|
+ if (!node_)
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ TBFontDescription fd;
|
|
|
|
|
+ fd.SetID(TBIDC("Vera"));
|
|
|
|
|
+ fd.SetSize(11);
|
|
|
|
|
+
|
|
|
|
|
+ LayoutParams nlp;
|
|
|
|
|
+ nlp.SetWidth(304);
|
|
|
|
|
+ TBLayout* nodeLayout = new TBLayout(AXIS_Y);
|
|
|
|
|
+ nodeLayout->SetSpacing(4);
|
|
|
|
|
+
|
|
|
|
|
+ nodeLayout->SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
|
|
|
|
|
+ nodeLayout->SetLayoutPosition(LAYOUT_POSITION_LEFT_TOP);
|
|
|
|
|
+ nodeLayout->SetLayoutParams(nlp);
|
|
|
|
|
+
|
|
|
|
|
+ TBContainer* nodeContainer = new TBContainer();
|
|
|
|
|
+ nodeContainer->SetGravity(WIDGET_GRAVITY_ALL);
|
|
|
|
|
+
|
|
|
|
|
+ nodeContainer->SetSkinBg("InspectorTopLayout");
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* attrsVerticalLayout = new TBLayout(AXIS_Y);
|
|
|
|
|
+ attrsVerticalLayout->SetGravity(WIDGET_GRAVITY_ALL);
|
|
|
|
|
+ attrsVerticalLayout->SetLayoutPosition(LAYOUT_POSITION_LEFT_TOP);
|
|
|
|
|
+ nodeContainer->AddChild(attrsVerticalLayout);
|
|
|
|
|
+
|
|
|
|
|
+ TBTextField* nodeLabel = new TBTextField();
|
|
|
|
|
+ nodeLabel->SetTextAlign(TB_TEXT_ALIGN_LEFT);
|
|
|
|
|
+ nodeLabel->SetText("Node");
|
|
|
|
|
+ nodeLabel->SetSkinBg(TBIDC("InspectorTextLabel"));
|
|
|
|
|
+ attrsVerticalLayout->AddChild(nodeLabel);
|
|
|
|
|
+
|
|
|
|
|
+ const Vector<AttributeInfo>* attrs = node->GetAttributes();
|
|
|
|
|
+
|
|
|
|
|
+ for (unsigned i = 0; i < attrs->Size(); i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ const AttributeInfo* attr = &attrs->At(i);
|
|
|
|
|
+
|
|
|
|
|
+ InspectorDataBinding* binding = InspectorDataBinding::Create(node, attr);
|
|
|
|
|
+
|
|
|
|
|
+ if (binding)
|
|
|
|
|
+ {
|
|
|
|
|
+ dataBindings_.Push(binding);
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* attrLayout = new TBLayout();
|
|
|
|
|
+
|
|
|
|
|
+ if (attr->type_ == VAR_VECTOR3 || attr->type_ == VAR_COLOR || attr->type_ == VAR_QUATERNION)
|
|
|
|
|
+ {
|
|
|
|
|
+ attrLayout->SetAxis(AXIS_Y);
|
|
|
|
|
+ attrLayout->SetLayoutPosition(LAYOUT_POSITION_LEFT_TOP);
|
|
|
|
|
+ attrLayout->SetSkinBg("InspectorVectorAttrLayout");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ attrLayout->SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
|
|
|
|
|
+
|
|
|
|
|
+ TBTextField* name = new TBTextField();
|
|
|
|
|
+ name->SetTextAlign(TB_TEXT_ALIGN_LEFT);
|
|
|
|
|
+ name->SetSkinBg(TBIDC("InspectorTextAttrName"));
|
|
|
|
|
+
|
|
|
|
|
+ String bname = attr->name_;
|
|
|
|
|
+ if (bname == "Is Enabled")
|
|
|
|
|
+ bname = "Enabled";
|
|
|
|
|
+
|
|
|
|
|
+ name->SetText(bname.CString());
|
|
|
|
|
+ name->SetFontDescription(fd);
|
|
|
|
|
+
|
|
|
|
|
+ attrLayout->AddChild(name);
|
|
|
|
|
+ TBWidget* bwidget = binding->GetWidget();
|
|
|
|
|
+ attrLayout->AddChild(bwidget);
|
|
|
|
|
+
|
|
|
|
|
+ attrsVerticalLayout->AddChild(attrLayout);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ nodeLayout->AddChild(nodeContainer);
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* componentsLayout = new TBLayout();
|
|
|
|
|
+
|
|
|
|
|
+ TBTextField* componentsLabel = new TBTextField();
|
|
|
|
|
+ componentsLabel->SetText("Components");
|
|
|
|
|
+ componentsLabel->SetSkinBg(TBIDC("InspectorTextLabel"));
|
|
|
|
|
+ componentsLabel->SetTextAlign(TB_TEXT_ALIGN_LEFT);
|
|
|
|
|
+ componentsLayout->AddChild(componentsLabel);
|
|
|
|
|
+
|
|
|
|
|
+ TBButton* create = new TBButton();
|
|
|
|
|
+ LayoutParams createLP;
|
|
|
|
|
+ createLP.SetHeight(20);
|
|
|
|
|
+ create->SetLayoutParams(createLP);
|
|
|
|
|
+ create->SetFontDescription(fd);
|
|
|
|
|
+ create->SetText("Create");
|
|
|
|
|
+ create->SetID(TBIDC("create button"));
|
|
|
|
|
+ componentsLayout->AddChild(create);
|
|
|
|
|
+
|
|
|
|
|
+ nodeLayout->AddChild(componentsLayout);
|
|
|
|
|
+
|
|
|
|
|
+ const Vector<SharedPtr<Component> > components = node->GetComponents();
|
|
|
|
|
+ for (unsigned i = 0; i < components.Size(); i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ Component* c = components[i];
|
|
|
|
|
+
|
|
|
|
|
+ TBContainer* componentContainer = new TBContainer();
|
|
|
|
|
+
|
|
|
|
|
+ componentContainer->SetSkinBg("InspectorTopLayout");
|
|
|
|
|
+
|
|
|
|
|
+ componentContainer->SetGravity(WIDGET_GRAVITY_ALL);
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* attrsVerticalLayout = new TBLayout(AXIS_Y);
|
|
|
|
|
+ attrsVerticalLayout->SetGravity(WIDGET_GRAVITY_ALL);
|
|
|
|
|
+ attrsVerticalLayout->SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
|
|
|
|
|
+ attrsVerticalLayout->SetLayoutPosition(LAYOUT_POSITION_LEFT_TOP);
|
|
|
|
|
+
|
|
|
|
|
+ TBTextField* cnameField = new TBTextField();
|
|
|
|
|
+ cnameField->SetText(c->GetTypeName().CString());
|
|
|
|
|
+ cnameField->SetSkinBg(TBIDC("InspectorTextLabel"));
|
|
|
|
|
+ cnameField->SetTextAlign(TB_TEXT_ALIGN_LEFT);
|
|
|
|
|
+ cnameField->SetFontDescription(fd);
|
|
|
|
|
+ attrsVerticalLayout->AddChild(cnameField);
|
|
|
|
|
+
|
|
|
|
|
+ componentContainer->AddChild(attrsVerticalLayout);
|
|
|
|
|
+
|
|
|
|
|
+ const Vector<AttributeInfo>* attrs = c->GetAttributes();
|
|
|
|
|
+
|
|
|
|
|
+ if (attrs)
|
|
|
|
|
+ for (unsigned i = 0; i < attrs->Size(); i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ const AttributeInfo* attr = &attrs->At(i);
|
|
|
|
|
+
|
|
|
|
|
+ InspectorDataBinding* binding = InspectorDataBinding::Create(c, attr);
|
|
|
|
|
+
|
|
|
|
|
+ if (binding)
|
|
|
|
|
+ {
|
|
|
|
|
+ dataBindings_.Push(binding);
|
|
|
|
|
+
|
|
|
|
|
+ TBLayout* attrLayout = new TBLayout();
|
|
|
|
|
+
|
|
|
|
|
+ attrLayout->SetLayoutDistribution(LAYOUT_DISTRIBUTION_GRAVITY);
|
|
|
|
|
+
|
|
|
|
|
+ if (attr->type_ == VAR_VECTOR3 || attr->type_ == VAR_COLOR || attr->type_ == VAR_QUATERNION)
|
|
|
|
|
+ {
|
|
|
|
|
+ attrLayout->SetAxis(AXIS_Y);
|
|
|
|
|
+ attrLayout->SetLayoutPosition(LAYOUT_POSITION_LEFT_TOP);
|
|
|
|
|
+ attrLayout->SetSkinBg("InspectorVectorAttrLayout");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ TBTextField* name = new TBTextField();
|
|
|
|
|
+ String bname = attr->name_;
|
|
|
|
|
+ if (bname == "Is Enabled")
|
|
|
|
|
+ bname = "Enabled";
|
|
|
|
|
+
|
|
|
|
|
+ name->SetTextAlign(TB_TEXT_ALIGN_LEFT);
|
|
|
|
|
+ name->SetText(bname.CString());
|
|
|
|
|
+ name->SetFontDescription(fd);
|
|
|
|
|
+
|
|
|
|
|
+ name->SetSkinBg(TBIDC("InspectorTextAttrName"));
|
|
|
|
|
+
|
|
|
|
|
+ LayoutParams lp;
|
|
|
|
|
+ lp.SetWidth(140);
|
|
|
|
|
+ name->SetLayoutParams(lp);
|
|
|
|
|
+
|
|
|
|
|
+ attrLayout->AddChild(name);
|
|
|
|
|
+
|
|
|
|
|
+ TBWidget* bwidget = binding->GetWidget();
|
|
|
|
|
+
|
|
|
|
|
+ attrLayout->AddChild(bwidget);
|
|
|
|
|
+
|
|
|
|
|
+ attrsVerticalLayout->AddChild(attrLayout);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ nodeLayout->AddChild(componentContainer);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ inspectorContainer->AddChild(nodeLayout);
|
|
|
|
|
+
|
|
|
|
|
+ for (unsigned i = 0; i < dataBindings_.Size(); i++)
|
|
|
|
|
+ dataBindings_[i]->SetWidgetValueFromObject();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void InspectorFrame::HandleEditorActiveNodeChange(StringHash eventType, VariantMap& eventData)
|
|
|
|
|
+{
|
|
|
|
|
+ Node* node = (Node*) (eventData[EditorActiveNodeChange::P_NODE].GetPtr());
|
|
|
|
|
+
|
|
|
|
|
+ InspectNode(node);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+}
|