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
15SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {
16 _viewState = viewState;
17}
18
19//
20// START HANDLING ENTITIES
21//
22render::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}
36bool 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}
43bool 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//
57render::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}
68bool 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}
75bool 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//
89bool 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}
101bool 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
122bool SelectionScriptingInterface::removeListFromMap(const render::Selection::Name& listName) {
123 if (_selectedItemsListMap.remove(listName)) {
124 return true;
125 } else {
126 return false;
127 }
128}
129
130void 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}