// 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 #include #include #include #include #include #include #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(UI_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(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* 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 > 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* 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); } }