BsSelection.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsSelection.h"
  4. #include "BsGUISceneTreeView.h"
  5. #include "BsGUIResourceTreeView.h"
  6. #include "BsProjectLibrary.h"
  7. #include "BsProjectResourceMeta.h"
  8. #include "BsMessageHandler.h"
  9. namespace BansheeEngine
  10. {
  11. Selection::Selection()
  12. {
  13. mSceneSelectionChangedConn = MessageHandler::instance().listen(
  14. GUISceneTreeView::SELECTION_CHANGED_MSG, std::bind(&Selection::sceneSelectionChanged, this));
  15. mResourceSelectionChangedConn = MessageHandler::instance().listen(
  16. GUIResourceTreeView::SELECTION_CHANGED_MSG, std::bind(&Selection::resourceSelectionChanged, this));
  17. }
  18. Selection::~Selection()
  19. {
  20. mSceneSelectionChangedConn.disconnect();
  21. mResourceSelectionChangedConn.disconnect();
  22. }
  23. const Vector<HSceneObject>& Selection::getSceneObjects() const
  24. {
  25. return mSelectedSceneObjects;
  26. }
  27. void Selection::setSceneObjects(const Vector<HSceneObject>& sceneObjects)
  28. {
  29. mSelectedSceneObjects = sceneObjects;
  30. mSelectedResourcePaths.clear();
  31. updateTreeViews();
  32. onSelectionChanged(mSelectedSceneObjects, Vector<Path>());
  33. }
  34. const Vector<Path>& Selection::getResourcePaths() const
  35. {
  36. return mSelectedResourcePaths;
  37. }
  38. void Selection::setResourcePaths(const Vector<Path>& paths)
  39. {
  40. mSelectedResourcePaths = paths;
  41. mSelectedSceneObjects.clear();
  42. updateTreeViews();
  43. onSelectionChanged(Vector<HSceneObject>(), mSelectedResourcePaths);
  44. }
  45. Vector<String> Selection::getResourceUUIDs() const
  46. {
  47. Vector<String> UUIDs;
  48. for (auto& path : mSelectedResourcePaths)
  49. {
  50. ProjectLibrary::LibraryEntry* entry = gProjectLibrary().findEntry(path);
  51. if (entry != nullptr && entry->type == ProjectLibrary::LibraryEntryType::File)
  52. {
  53. ProjectLibrary::ResourceEntry* resEntry = static_cast<ProjectLibrary::ResourceEntry*>(entry);
  54. if (resEntry->meta != nullptr)
  55. UUIDs.push_back(resEntry->meta->getUUID());
  56. }
  57. }
  58. return UUIDs;
  59. }
  60. void Selection::setResourceUUIDs(const Vector<String>& UUIDs)
  61. {
  62. mSelectedResourcePaths.clear();
  63. for (auto& uuid : UUIDs)
  64. {
  65. Path path = gProjectLibrary().uuidToPath(uuid);
  66. if (path != Path::BLANK)
  67. mSelectedResourcePaths.push_back(path);
  68. }
  69. mSelectedSceneObjects.clear();
  70. updateTreeViews();
  71. onSelectionChanged(Vector<HSceneObject>(), mSelectedResourcePaths);
  72. }
  73. void Selection::clearSceneSelection()
  74. {
  75. setSceneObjects({});
  76. }
  77. void Selection::clearResourceSelection()
  78. {
  79. setResourceUUIDs({});
  80. }
  81. void Selection::ping(const HSceneObject& sceneObject)
  82. {
  83. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  84. if (sceneTreeView != nullptr)
  85. sceneTreeView->ping(sceneObject);
  86. onSceneObjectPing(sceneObject);
  87. }
  88. void Selection::ping(const Path& resourcePath)
  89. {
  90. onResourcePing(resourcePath);
  91. }
  92. void Selection::sceneSelectionChanged()
  93. {
  94. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  95. if (sceneTreeView != nullptr)
  96. {
  97. Vector<HSceneObject> newSelection = sceneTreeView->getSelection();
  98. bool isDirty = newSelection.size() != mSelectedSceneObjects.size();
  99. if (!isDirty)
  100. {
  101. UINT32 count = (UINT32)newSelection.size();
  102. for (UINT32 i = 0; i < count; i++)
  103. {
  104. if (newSelection[i] != mSelectedSceneObjects[i])
  105. {
  106. isDirty = true;
  107. break;
  108. }
  109. }
  110. }
  111. if (!isDirty)
  112. return;
  113. mSelectedSceneObjects = newSelection;
  114. mSelectedResourcePaths.clear();
  115. onSelectionChanged(mSelectedSceneObjects, Vector<Path>());
  116. }
  117. }
  118. void Selection::resourceSelectionChanged()
  119. {
  120. GUIResourceTreeView* resourceTreeView = ResourceTreeViewLocator::instance();
  121. if (resourceTreeView != nullptr)
  122. {
  123. Vector<Path> newSelection = resourceTreeView->getSelection();
  124. bool isDirty = newSelection.size() != mSelectedResourcePaths.size();
  125. if (!isDirty)
  126. {
  127. UINT32 count = (UINT32)newSelection.size();
  128. for (UINT32 i = 0; i < count; i++)
  129. {
  130. if (newSelection[i] != mSelectedResourcePaths[i])
  131. {
  132. isDirty = true;
  133. break;
  134. }
  135. }
  136. }
  137. if (!isDirty)
  138. return;
  139. mSelectedResourcePaths = newSelection;
  140. mSelectedSceneObjects.clear();
  141. onSelectionChanged(Vector<HSceneObject>(), mSelectedResourcePaths);
  142. }
  143. }
  144. void Selection::updateTreeViews()
  145. {
  146. GUIResourceTreeView* resourceTreeView = ResourceTreeViewLocator::instance();
  147. if (resourceTreeView != nullptr)
  148. {
  149. // Copy in case setSelection modifies the original.
  150. Vector<Path> copy = mSelectedResourcePaths;
  151. resourceTreeView->setSelection(copy);
  152. }
  153. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  154. if (sceneTreeView != nullptr)
  155. {
  156. // Copy in case setSelection modifies the original.
  157. Vector<HSceneObject> copy = mSelectedSceneObjects;
  158. sceneTreeView->setSelection(copy);
  159. }
  160. }
  161. }