History

Initial progress

Zach Fox committed 9 years ago

Commit 69364f21 parent edb64b08 files · +202 −175Browse files

Showing the changes to interface/src/scripting/SelectionScriptingInterface.cpp (1 of 8 files). Show all

Unified · Split

interface/src/scripting/SelectionScriptingInterface.cpp+146−0
@@ -0,0 +1,146 @@
1+//
2+// SelectionScriptingInterface.cpp
3+// interface/src/scripting
4+//
5+// Created by Zach Fox on 2017-08-22.
6+// Copyright 2017 High Fidelity, Inc.
7+//
8+// Distributed under the Apache License, Version 2.0.
9+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10+//
11+
12+#include "SelectionScriptingInterface.h"
13+#include "Application.h"
14+
15+SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {
16+ _viewState = viewState;
17+}
18+
19+//
20+// START HANDLING ENTITIES
21+//
22+render::ItemID getItemIDFromEntityID(const EntityItemID& entityID) {
23+ auto entityTree = qApp->getEntities()->getTree();
24+ entityTree->withReadLock([&] {
25+ auto entityItem = entityTree->findEntityByEntityItemID(entityID);
26+ if (entityItem != NULL) {
27+ auto renderableInterface = entityItem->getRenderableInterface();
28+ if (renderableInterface != NULL) {
29+ return renderableInterface->getMetaRenderItemID();
30+ }
31+ }
32+ return render::Item::INVALID_ITEM_ID;
33+ });
34+ return render::Item::INVALID_ITEM_ID;
35+}
36+bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
37+ render::ItemID itemID = getItemIDFromEntityID(entityID);
38+ if (itemID != render::Item::INVALID_ITEM_ID) {
39+ return addToSelectedItemsList(listName, itemID);
40+ }
41+ return false;
42+}
43+bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
44+ render::ItemID itemID = getItemIDFromEntityID(entityID);
45+ if (itemID != render::Item::INVALID_ITEM_ID) {
46+ return removeFromSelectedItemsList(listName, itemID);
47+ }
48+ return false;
49+}
50+//
51+// END HANDLING ENTITIES
52+//
53+
54+//
55+// START HANDLING OVERLAYS
56+//
57+render::ItemID getItemIDFromOverlayID(const OverlayID& overlayID) {
58+ auto& overlays = qApp->getOverlays();
59+ auto overlay = overlays.getOverlay(overlayID);
60+ if (overlay != NULL) {
61+ auto itemID = overlay->getRenderItemID();
62+ if (itemID != render::Item::INVALID_ITEM_ID) {
63+ return overlay->getRenderItemID();
64+ }
65+ }
66+ return render::Item::INVALID_ITEM_ID;
67+}
68+bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
69+ render::ItemID itemID = getItemIDFromOverlayID(overlayID);
70+ if (itemID != render::Item::INVALID_ITEM_ID) {
71+ return addToSelectedItemsList(listName, itemID);
72+ }
73+ return false;
74+}
75+bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
76+ render::ItemID itemID = getItemIDFromOverlayID(overlayID);
77+ if (itemID != render::Item::INVALID_ITEM_ID) {
78+ return removeFromSelectedItemsList(listName, itemID);
79+ }
80+ return false;
81+}
82+//
83+// END HANDLING OVERLAYS
84+//
85+
86+//
87+// START HANDLING GENERIC ITEMS
88+//
89+bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToAdd) {
90+ if (_selectedItemsListMap.contains(listName)) {
91+ auto currentList = _selectedItemsListMap.take(listName);
92+ currentList.push_back(idToAdd); // TODO: Ensure thread safety
93+ _selectedItemsListMap.insert(listName, currentList);
94+ updateRendererSelectedList(listName);
95+ return true;
96+ } else {
97+ _selectedItemsListMap.insert(listName, render::ItemIDs());
98+ return addToSelectedItemsList(listName, idToAdd);
99+ }
100+}
101+bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToRemove) {
102+ auto hashItr = _selectedItemsListMap.find(listName);
103+ if (hashItr != _selectedItemsListMap.end()) {
104+ auto currentList = _selectedItemsListMap.take(listName);
105+ auto listItr = std::find(currentList.begin(), currentList.end(), idToRemove); // TODO: Ensure thread safety
106+ if (listItr == currentList.end()) {
107+ return false;
108+ } else {
109+ currentList.erase(listItr);
110+ _selectedItemsListMap.insert(listName, currentList);
111+ updateRendererSelectedList(listName);
112+ return true;
113+ }
114+ } else {
115+ return false;
116+ }
117+}
118+//
119+// END HANDLING GENERIC ITEMS
120+//
121+
122+bool SelectionScriptingInterface::removeListFromMap(const render::Selection::Name& listName) {
123+ if (_selectedItemsListMap.remove(listName)) {
124+ return true;
125+ } else {
126+ return false;
127+ }
128+}
129+
130+void SelectionScriptingInterface::updateRendererSelectedList(const render::Selection::Name& listName) {
131+ auto scene = _viewState->getMain3DScene();
132+ if (scene) {
133+ render::Transaction transaction;
134+
135+ if (_selectedItemsListMap.contains(listName)) {
136+ render::Selection selection(listName, _selectedItemsListMap.value(listName));
137+ transaction.resetSelection(selection);
138+
139+ scene->enqueueTransaction(transaction);
140+ } else {
141+ qWarning() << "List of ItemIDs doesn't exist in _selectedItemsListMap";
142+ }
143+ } else {
144+ qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown";
145+ }
146+}