UIHierarchyFrame.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  2. // Please see LICENSE.md in repository root for license information
  3. // https://github.com/AtomicGameEngine/AtomicGameEngine
  4. #include "AtomicEditor.h"
  5. #include <TurboBadger/tb_select.h>
  6. #include <Atomic/Core/Context.h>
  7. #include <Atomic/IO/Log.h>
  8. #include <Atomic/IO/FileSystem.h>
  9. #include <Atomic/Resource/ResourceEvents.h>
  10. #include <Atomic/UI/UI.h>
  11. #include "AEEditor.h"
  12. #include "AEEvents.h"
  13. #include "UIListView.h"
  14. #include "UIHierarchyFrame.h"
  15. #include "UI/Modal/UIModalOps.h"
  16. using namespace tb;
  17. namespace AtomicEditor
  18. {
  19. HierarchyFrame::HierarchyFrame(Context* context) :
  20. AEWidget(context)
  21. {
  22. UI* tbui = GetSubsystem<UI>();
  23. tbui->LoadResourceFile(delegate_, "AtomicEditor/editor/ui/hierarchyframe.tb.txt");
  24. delegate_->SetID(TBIDC("projectframe_delegate"));
  25. delegate_->SetGravity(WIDGET_GRAVITY_TOP_BOTTOM);
  26. // folders
  27. TBLayout* hierarchycontainer = delegate_->GetWidgetByIDAndType<TBLayout>(TBIDC("hierarchycontainer"));
  28. assert(hierarchycontainer);
  29. hierarchyList_ = new ListView(context_, "hierarchyList_");
  30. hierarchyList_->GetRootList()->SetGravity(WIDGET_GRAVITY_ALL);
  31. TBWidgetDelegate* hierarchyListWD = hierarchyList_->GetWidgetDelegate();
  32. hierarchyListWD->SetID(TBIDC("hierarchyList_delegate"));
  33. hierarchyListWD->SetGravity(WIDGET_GRAVITY_ALL);
  34. hierarchycontainer->AddChild(hierarchyListWD);
  35. SubscribeToEvent(E_EDITORACTIVESCENECHANGE, HANDLER(HierarchyFrame, HandleEditorActiveSceneChange));
  36. }
  37. HierarchyFrame::~HierarchyFrame()
  38. {
  39. }
  40. void HierarchyFrame::RecursiveAddNode(ListViewItem* parent, Node* node)
  41. {
  42. String name = node->GetName();
  43. if (!name.Length())
  44. name = "(Anonymous)";
  45. ListViewItem* child = parent->AddChild(name.CString(), "Folder.icon", TBID(uint32(node->GetID())));
  46. for (unsigned i = 0; i < node->GetNumChildren(); i++)
  47. RecursiveAddNode(child, node->GetChild(i));
  48. }
  49. void HierarchyFrame::RefreshHierarchyList()
  50. {
  51. hierarchyList_->DeleteAllItems();
  52. if (scene_.Null())
  53. return;
  54. ListViewItem* parent = hierarchyList_->AddItem("Scene", "Folder.icon", TBID(uint32(scene_->GetID())));
  55. for (unsigned i = 0; i < scene_->GetNumChildren(); i++)
  56. RecursiveAddNode(parent, scene_->GetChild(i));
  57. hierarchyList_->GetRootList()->SetValue(0);
  58. hierarchyList_->GetItem(0)->SetExpanded(true);
  59. }
  60. bool HierarchyFrame::OnEvent(const TBWidgetEvent &ev)
  61. {
  62. Editor* editor = GetSubsystem<Editor>();
  63. if (ev.type == EVENT_TYPE_CLICK)
  64. {
  65. if (ev.target->GetID() == TBIDC("menu create"))
  66. {
  67. editor->PostModalInfo("Early Access - Not Implemented", "Node creation not implemented in this Early Access build");
  68. }
  69. if (scene_.NotNull())
  70. {
  71. if (ev.target->GetID() == TBIDC("hierarchyList_"))
  72. {
  73. unsigned id = ev.ref_id;
  74. Node* node = scene_->GetNode(id);
  75. if (node)
  76. {
  77. VariantMap neventData;
  78. neventData[EditorActiveNodeChange::P_NODE] = node;
  79. SendEvent(E_EDITORACTIVENODECHANGE, neventData);
  80. }
  81. }
  82. }
  83. }
  84. return false;
  85. }
  86. void HierarchyFrame::HandleEditorActiveSceneChange(StringHash eventType, VariantMap& eventData)
  87. {
  88. Scene* scene = (Scene*) (eventData[EditorActiveSceneChange::P_SCENE].GetPtr());
  89. scene_ = scene;
  90. if (scene_)
  91. {
  92. RefreshHierarchyList();
  93. }
  94. VariantMap neventData;
  95. neventData[EditorActiveNodeChange::P_NODE] = scene_;
  96. SendEvent(E_EDITORACTIVENODECHANGE, neventData);
  97. }
  98. }