//// SelectionScriptingInterface.cpp// interface/src/scripting//// Created by Zach Fox on 2017-08-22.// Copyright 2017 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "SelectionScriptingInterface.h"#include "Application.h" SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) { _viewState = viewState;} //// START HANDLING ENTITIES//render::ItemID getItemIDFromEntityID(const EntityItemID& entityID) { auto entityTree = qApp->getEntities()->getTree(); entityTree->withReadLock([&] { auto entityItem = entityTree->findEntityByEntityItemID(entityID); if (entityItem != NULL) { auto renderableInterface = entityItem->getRenderableInterface(); if (renderableInterface != NULL) { return renderableInterface->getMetaRenderItemID(); } } return render::Item::INVALID_ITEM_ID; }); return render::Item::INVALID_ITEM_ID;}bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) { render::ItemID itemID = getItemIDFromEntityID(entityID); if (itemID != render::Item::INVALID_ITEM_ID) { return addToSelectedItemsList(listName, itemID); } return false;}bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) { render::ItemID itemID = getItemIDFromEntityID(entityID); if (itemID != render::Item::INVALID_ITEM_ID) { return removeFromSelectedItemsList(listName, itemID); } return false;}//// END HANDLING ENTITIES// //// START HANDLING OVERLAYS//render::ItemID getItemIDFromOverlayID(const OverlayID& overlayID) { auto& overlays = qApp->getOverlays(); auto overlay = overlays.getOverlay(overlayID); if (overlay != NULL) { auto itemID = overlay->getRenderItemID(); if (itemID != render::Item::INVALID_ITEM_ID) { return overlay->getRenderItemID(); } } return render::Item::INVALID_ITEM_ID;}bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) { render::ItemID itemID = getItemIDFromOverlayID(overlayID); if (itemID != render::Item::INVALID_ITEM_ID) { return addToSelectedItemsList(listName, itemID); } return false;}bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) { render::ItemID itemID = getItemIDFromOverlayID(overlayID); if (itemID != render::Item::INVALID_ITEM_ID) { return removeFromSelectedItemsList(listName, itemID); } return false;}//// END HANDLING OVERLAYS// //// START HANDLING GENERIC ITEMS//bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToAdd) { if (_selectedItemsListMap.contains(listName)) { auto currentList = _selectedItemsListMap.take(listName); currentList.push_back(idToAdd); // TODO: Ensure thread safety _selectedItemsListMap.insert(listName, currentList); updateRendererSelectedList(listName); return true; } else { _selectedItemsListMap.insert(listName, render::ItemIDs()); return addToSelectedItemsList(listName, idToAdd); }}bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToRemove) { auto hashItr = _selectedItemsListMap.find(listName); if (hashItr != _selectedItemsListMap.end()) { auto currentList = _selectedItemsListMap.take(listName); auto listItr = std::find(currentList.begin(), currentList.end(), idToRemove); // TODO: Ensure thread safety if (listItr == currentList.end()) { return false; } else { currentList.erase(listItr); _selectedItemsListMap.insert(listName, currentList); updateRendererSelectedList(listName); return true; } } else { return false; }}//// END HANDLING GENERIC ITEMS// bool SelectionScriptingInterface::removeListFromMap(const render::Selection::Name& listName) { if (_selectedItemsListMap.remove(listName)) { return true; } else { return false; }} void SelectionScriptingInterface::updateRendererSelectedList(const render::Selection::Name& listName) { auto scene = _viewState->getMain3DScene(); if (scene) { render::Transaction transaction; if (_selectedItemsListMap.contains(listName)) { render::Selection selection(listName, _selectedItemsListMap.value(listName)); transaction.resetSelection(selection); scene->enqueueTransaction(transaction); } else { qWarning() << "List of ItemIDs doesn't exist in _selectedItemsListMap"; } } else { qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown"; }}
//
// SelectionScriptingInterface.cpp
// interface/src/scripting
//
// Created by Zach Fox on 2017-08-22.
// Copyright 2017 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "SelectionScriptingInterface.h"
#include "Application.h"
SelectionScriptingInterface::SelectionScriptingInterface(AbstractViewStateInterface* viewState) {
_viewState = viewState;
}
//
// START HANDLING ENTITIES
//
render::ItemID getItemIDFromEntityID(const EntityItemID& entityID) {
auto entityTree = qApp->getEntities()->getTree();
entityTree->withReadLock([&] {
auto entityItem = entityTree->findEntityByEntityItemID(entityID);
if (entityItem != NULL) {
auto renderableInterface = entityItem->getRenderableInterface();
if (renderableInterface != NULL) {
return renderableInterface->getMetaRenderItemID();
}
}
return render::Item::INVALID_ITEM_ID;
});
return render::Item::INVALID_ITEM_ID;
}
bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
render::ItemID itemID = getItemIDFromEntityID(entityID);
if (itemID != render::Item::INVALID_ITEM_ID) {
return addToSelectedItemsList(listName, itemID);
}
return false;
}
bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const EntityItemID& entityID) {
render::ItemID itemID = getItemIDFromEntityID(entityID);
if (itemID != render::Item::INVALID_ITEM_ID) {
return removeFromSelectedItemsList(listName, itemID);
}
return false;
}
//
// END HANDLING ENTITIES
//
//
// START HANDLING OVERLAYS
//
render::ItemID getItemIDFromOverlayID(const OverlayID& overlayID) {
auto& overlays = qApp->getOverlays();
auto overlay = overlays.getOverlay(overlayID);
if (overlay != NULL) {
auto itemID = overlay->getRenderItemID();
if (itemID != render::Item::INVALID_ITEM_ID) {
return overlay->getRenderItemID();
}
}
return render::Item::INVALID_ITEM_ID;
}
bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
render::ItemID itemID = getItemIDFromOverlayID(overlayID);
if (itemID != render::Item::INVALID_ITEM_ID) {
return addToSelectedItemsList(listName, itemID);
}
return false;
}
bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, const OverlayID& overlayID) {
render::ItemID itemID = getItemIDFromOverlayID(overlayID);
if (itemID != render::Item::INVALID_ITEM_ID) {
return removeFromSelectedItemsList(listName, itemID);
}
return false;
}
//
// END HANDLING OVERLAYS
//
//
// START HANDLING GENERIC ITEMS
//
bool SelectionScriptingInterface::addToSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToAdd) {
if (_selectedItemsListMap.contains(listName)) {
auto currentList = _selectedItemsListMap.take(listName);
currentList.push_back(idToAdd); // TODO: Ensure thread safety
_selectedItemsListMap.insert(listName, currentList);
updateRendererSelectedList(listName);
return true;
} else {
_selectedItemsListMap.insert(listName, render::ItemIDs());
return addToSelectedItemsList(listName, idToAdd);
}
}
bool SelectionScriptingInterface::removeFromSelectedItemsList(const render::Selection::Name& listName, render::ItemID idToRemove) {
auto hashItr = _selectedItemsListMap.find(listName);
if (hashItr != _selectedItemsListMap.end()) {
auto currentList = _selectedItemsListMap.take(listName);
auto listItr = std::find(currentList.begin(), currentList.end(), idToRemove); // TODO: Ensure thread safety
if (listItr == currentList.end()) {
return false;
} else {
currentList.erase(listItr);
_selectedItemsListMap.insert(listName, currentList);
updateRendererSelectedList(listName);
return true;
}
} else {
return false;
}
}
//
// END HANDLING GENERIC ITEMS
//
bool SelectionScriptingInterface::removeListFromMap(const render::Selection::Name& listName) {
if (_selectedItemsListMap.remove(listName)) {
return true;
} else {
return false;
}
}
void SelectionScriptingInterface::updateRendererSelectedList(const render::Selection::Name& listName) {
auto scene = _viewState->getMain3DScene();
if (scene) {
render::Transaction transaction;
if (_selectedItemsListMap.contains(listName)) {
render::Selection selection(listName, _selectedItemsListMap.value(listName));
transaction.resetSelection(selection);
scene->enqueueTransaction(transaction);
} else {
qWarning() << "List of ItemIDs doesn't exist in _selectedItemsListMap";
}
} else {
qWarning() << "SelectionScriptingInterface::updateRendererSelectedList(), Unexpected null scene, possibly during application shutdown";
}
}