BsSelection.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. ProjectResourceMetaPtr meta = gProjectLibrary().findResourceMeta(path);
  51. if (meta != nullptr)
  52. UUIDs.push_back(meta->getUUID());
  53. }
  54. return UUIDs;
  55. }
  56. void Selection::setResourceUUIDs(const Vector<String>& UUIDs)
  57. {
  58. mSelectedResourcePaths.clear();
  59. for (auto& uuid : UUIDs)
  60. {
  61. Path path = gProjectLibrary().uuidToPath(uuid);
  62. if (path != Path::BLANK)
  63. mSelectedResourcePaths.push_back(path);
  64. }
  65. mSelectedSceneObjects.clear();
  66. updateTreeViews();
  67. onSelectionChanged(Vector<HSceneObject>(), mSelectedResourcePaths);
  68. }
  69. void Selection::clearSceneSelection()
  70. {
  71. setSceneObjects({});
  72. }
  73. void Selection::clearResourceSelection()
  74. {
  75. setResourceUUIDs({});
  76. }
  77. void Selection::ping(const HSceneObject& sceneObject)
  78. {
  79. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  80. if (sceneTreeView != nullptr)
  81. sceneTreeView->ping(sceneObject);
  82. onSceneObjectPing(sceneObject);
  83. }
  84. void Selection::ping(const Path& resourcePath)
  85. {
  86. onResourcePing(resourcePath);
  87. }
  88. void Selection::sceneSelectionChanged()
  89. {
  90. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  91. if (sceneTreeView != nullptr)
  92. {
  93. Vector<HSceneObject> newSelection = sceneTreeView->getSelection();
  94. bool isDirty = newSelection.size() != mSelectedSceneObjects.size();
  95. if (!isDirty)
  96. {
  97. UINT32 count = (UINT32)newSelection.size();
  98. for (UINT32 i = 0; i < count; i++)
  99. {
  100. if (newSelection[i] != mSelectedSceneObjects[i])
  101. {
  102. isDirty = true;
  103. break;
  104. }
  105. }
  106. }
  107. if (!isDirty)
  108. return;
  109. mSelectedSceneObjects = newSelection;
  110. mSelectedResourcePaths.clear();
  111. onSelectionChanged(mSelectedSceneObjects, Vector<Path>());
  112. }
  113. }
  114. void Selection::resourceSelectionChanged()
  115. {
  116. GUIResourceTreeView* resourceTreeView = ResourceTreeViewLocator::instance();
  117. if (resourceTreeView != nullptr)
  118. {
  119. Vector<Path> newSelection = resourceTreeView->getSelection();
  120. bool isDirty = newSelection.size() != mSelectedResourcePaths.size();
  121. if (!isDirty)
  122. {
  123. UINT32 count = (UINT32)newSelection.size();
  124. for (UINT32 i = 0; i < count; i++)
  125. {
  126. if (newSelection[i] != mSelectedResourcePaths[i])
  127. {
  128. isDirty = true;
  129. break;
  130. }
  131. }
  132. }
  133. if (!isDirty)
  134. return;
  135. mSelectedResourcePaths = newSelection;
  136. mSelectedSceneObjects.clear();
  137. onSelectionChanged(Vector<HSceneObject>(), mSelectedResourcePaths);
  138. }
  139. }
  140. void Selection::updateTreeViews()
  141. {
  142. GUIResourceTreeView* resourceTreeView = ResourceTreeViewLocator::instance();
  143. if (resourceTreeView != nullptr)
  144. {
  145. // Copy in case setSelection modifies the original.
  146. Vector<Path> copy = mSelectedResourcePaths;
  147. resourceTreeView->setSelection(copy);
  148. }
  149. GUISceneTreeView* sceneTreeView = SceneTreeViewLocator::instance();
  150. if (sceneTreeView != nullptr)
  151. {
  152. // Copy in case setSelection modifies the original.
  153. Vector<HSceneObject> copy = mSelectedSceneObjects;
  154. sceneTreeView->setSelection(copy);
  155. }
  156. }
  157. }