diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 6fb3c91d04..d0f568cae4 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace openspace { class ScreenSpaceSkyTarget; @@ -29,8 +30,10 @@ namespace openspace { ScreenSpaceSkyTarget* getSkyTarget(); bool hasLoadedCollections(); void setHasLoadedCollections(bool isLoaded); - void addImage(ImageData& image); properties::FloatProperty& getOpacity(); + std::deque& selectedImages(); + void addSelectedImage(ImageData& image, int i); + void removeSelectedImage(ImageData& image, int i); // Translation //void translate(glm::vec2 translation); @@ -64,6 +67,7 @@ namespace openspace { std::chrono::system_clock::time_point _lastUpdateTime; int _imageId{ 0 }; bool _hasLoadedCollections{ false }; + std::deque _selectedImages; }; } diff --git a/modules/skybrowser/include/utility.h b/modules/skybrowser/include/utility.h index 3490aba153..e76564f1ad 100644 --- a/modules/skybrowser/include/utility.h +++ b/modules/skybrowser/include/utility.h @@ -45,7 +45,7 @@ namespace openspace { ghoul::Dictionary loadCollection(const std::string& url); ghoul::Dictionary setForeground(const std::string& name); ghoul::Dictionary createImageLayer(ImageData& image, int id = 0); - ghoul::Dictionary removeImageLayer(const std::string& id); + ghoul::Dictionary removeImageLayer(ImageData& image); ghoul::Dictionary setLayerOpacity(const ImageData& image, double opacity); ghoul::Dictionary setForegroundOpacity(double val); diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 1addcc882b..f089378cbe 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -105,6 +105,14 @@ namespace openspace { "string or list of strings", "Add one or multiple exoplanet systems to the scene, as specified by the " "input. An input string should be the name of the system host star" + }, + { + "removeSelectedImageInBrowser", + &skybrowser::luascriptfunctions::removeSelectedImageInBrowser, + {}, + "string or list of strings", + "Add one or multiple exoplanet systems to the scene, as specified by the " + "input. An input string should be the name of the system host star" }, { "adjustCamera", diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 29db05a9bc..2376dcbdf5 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -46,7 +46,7 @@ namespace openspace::skybrowser::luascriptfunctions { // Load image, if the image has not been loaded yet if (resultImage.id == ImageData::NO_ID) { LINFO("Loading image " + resultImage.name); - selectedBrowser->addImage(resultImage); + selectedBrowser->addSelectedImage(resultImage, i); } ScreenSpaceSkyTarget* selectedTarget = selectedBrowser->getSkyTarget(); @@ -224,6 +224,7 @@ namespace openspace::skybrowser::luascriptfunctions { glm::dvec2 sphericalJ2000 = skybrowser::cartesianToSpherical(cartesianJ2000); // Convert to vector so ghoul can read it std::vector viewDirCelestVec = { cartesianJ2000.x, cartesianJ2000.y, cartesianJ2000.z }; + // Calculate the smallest FOV of vertical and horizontal @@ -253,6 +254,12 @@ namespace openspace::skybrowser::luascriptfunctions { for (std::pair pair : browsers) { ScreenSpaceSkyBrowser* browser = pair.second; std::string id = pair.first; + // Convert deque to vector so ghoul can read it + std::vector selectedImagesVector; + std::deque selectedImages = browser->selectedImages(); + std::for_each(selectedImages.begin(), selectedImages.end(), [&](int index) { + selectedImagesVector.push_back(index); + }); // Only add browsers that have an initialized target ScreenSpaceSkyTarget* target = browser->getSkyTarget(); if (target) { @@ -272,6 +279,8 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); ghoul::lua::push(L, "FOV", browser->fieldOfView()); lua_settable(L, -3); + ghoul::lua::push(L, "selectedImages", selectedImagesVector); + lua_settable(L, -3); ghoul::lua::push(L, "cartesianDirection", celestialCartVec); lua_settable(L, -3); ghoul::lua::push(L, "ra", celestialSpherical.x); @@ -280,7 +289,7 @@ namespace openspace::skybrowser::luascriptfunctions { lua_settable(L, -3); ghoul::lua::push(L, "color", colorVec); lua_settable(L, -3); - + // Set table for the current target lua_settable(L, -3); } @@ -371,6 +380,21 @@ namespace openspace::skybrowser::luascriptfunctions { return 0; } + + int removeSelectedImageInBrowser(lua_State* L) { + ghoul::lua::checkArgumentsAndThrow(L, 2, "lua::removeSelectedImageInBrowser"); + // Image index + const int i = ghoul::lua::value(L, 1); + const std::string browserId = ghoul::lua::value(L, 2); + // Get browser + SkyBrowserModule* module = global::moduleEngine->module(); + ScreenSpaceSkyBrowser* browser = module->getSkyBrowsers()[browserId]; + ImageData& resultImage = module->getWWTDataHandler()->getLoadedImages()[i]; + // Remove image + browser->removeSelectedImage(resultImage, i); + + return 0; + } } diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index 8d2ec66c37..84dbe36ae7 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -325,13 +325,32 @@ namespace openspace { return _browserDimensions.value(); } - void ScreenSpaceSkyBrowser::addImage(ImageData& image) { - sendMessageToWWT(wwtmessage::createImageLayer(image, _imageId)); - sendMessageToWWT(wwtmessage::setLayerOpacity(image, 1.0)); - _imageId++; - } - properties::FloatProperty& ScreenSpaceSkyBrowser::getOpacity() { return _opacity; } + + std::deque& ScreenSpaceSkyBrowser::selectedImages() { + return _selectedImages; + } + + void ScreenSpaceSkyBrowser::addSelectedImage(ImageData& image, int i) { + sendMessageToWWT(wwtmessage::createImageLayer(image, _imageId)); + sendMessageToWWT(wwtmessage::setLayerOpacity(image, 1.0)); + _imageId++; + // Ensure there are no duplicates + auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); + if (it == std::end(_selectedImages)) { + // Push newly selected image to front + _selectedImages.push_front(i); + } + } + + void ScreenSpaceSkyBrowser::removeSelectedImage(ImageData& image, int i) { + sendMessageToWWT(wwtmessage::removeImageLayer(image)); + // Remove from selected list + auto it = std::find(std::begin(_selectedImages), std::end(_selectedImages), i); + if (it != std::end(_selectedImages)) { + _selectedImages.erase(it); + } + } } diff --git a/modules/skybrowser/src/utility.cpp b/modules/skybrowser/src/utility.cpp index 2cd298d0ee..fa3fd27a34 100644 --- a/modules/skybrowser/src/utility.cpp +++ b/modules/skybrowser/src/utility.cpp @@ -152,11 +152,12 @@ namespace openspace::wwtmessage { return msg; } - ghoul::Dictionary removeImageLayer(const std::string& id) { + ghoul::Dictionary removeImageLayer(ImageData& image) { using namespace std::string_literals; ghoul::Dictionary msg; msg.setValue("event", "image_layer_remove"s); - msg.setValue("id", id); + msg.setValue("id", std::to_string(image.id)); + image.id = ImageData::NO_ID; return msg; }