diff --git a/modules/skybrowser/include/wwtdatahandler.h b/modules/skybrowser/include/wwtdatahandler.h index 922f19fa0a..175f5cb514 100644 --- a/modules/skybrowser/include/wwtdatahandler.h +++ b/modules/skybrowser/include/wwtdatahandler.h @@ -35,9 +35,9 @@ namespace openspace { namespace documentation { struct Documentation; } struct ImageData { - std::string name = ""; + std::string name; std::string thumbnailUrl; - std::string imageUrl = ""; + std::string imageUrl; std::string credits; std::string creditsUrl; std::string collection; @@ -52,7 +52,7 @@ class WwtDataHandler { public: void loadImages(const std::string& root, const std::filesystem::path& directory); int nLoadedImages() const; - const ImageData& image(const std::string& imageUrl) const; + std::optional image(const std::string& imageUrl) const; const std::map& images() const; private: diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 9e8175f97c..5a718950ee 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -319,8 +319,11 @@ void SkyBrowserModule::setHoverCircle(SceneGraphNode* circle) { } void SkyBrowserModule::moveHoverCircle(const std::string& imageUrl, bool useScript) { - const ImageData& image = _dataHandler.image(imageUrl); - + std::optional found = _dataHandler.image(imageUrl); + if (!found.has_value()) { + return; + } + const ImageData image = found.value(); // Only move and show circle if the image has coordinates if (!(_hoverCircle && image.hasCelestialCoords && _isCameraInSolarSystem)) { return; diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 4ffd73c4b7..e4d3f3836c 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -83,14 +83,17 @@ namespace { if (module->isCameraInSolarSystem()) { TargetBrowserPair* selected = module->pair(module->selectedBrowserId()); if (selected) { - const ImageData& image = module->wwtDataHandler().image(imageUrl); - if (image.name == "") { + std::optional found = module->wwtDataHandler().image( + imageUrl + ); + if (!found.has_value()) { LINFO(fmt::format( "No image with identifier {} was found in the collection.", imageUrl )); return; } // Load image into browser + const ImageData& image = found.value(); std::string str = image.name; // Check if character is ASCII - if it isn't, remove str.erase( @@ -303,8 +306,6 @@ namespace { // Create Lua table to send to the GUI ghoul::Dictionary list; for (auto const& [id, img] : module->wwtDataHandler().images()) { - const ImageData& img = module->wwtDataHandler().image(id); - // Push ("Key", value) ghoul::Dictionary image; image.setValue("name", img.name); @@ -775,7 +776,7 @@ namespace { std::for_each( images.rbegin(), images.rend(), [&](std::string imageUrl) { - const ImageData& image = module->wwtDataHandler().image(imageUrl); + const ImageData& image = module->wwtDataHandler().image(imageUrl).value(); // Index of image is used as layer ID as it's unique in the image data set pair->browser()->addImageLayerToWwt(image.imageUrl); } diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index ba1eeac821..8421964f1c 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -163,7 +163,7 @@ ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { for (const std::string& imageUrl : selectedImages()) { selectedImagesIndices.push_back( - module->wwtDataHandler().image(imageUrl).identifier + module->wwtDataHandler().image(imageUrl).value().identifier ); } diff --git a/modules/skybrowser/src/wwtdatahandler.cpp b/modules/skybrowser/src/wwtdatahandler.cpp index 4198530e51..eaba94a547 100644 --- a/modules/skybrowser/src/wwtdatahandler.cpp +++ b/modules/skybrowser/src/wwtdatahandler.cpp @@ -338,10 +338,10 @@ int WwtDataHandler::nLoadedImages() const { return static_cast(_images.size()); } -const ImageData& WwtDataHandler::image(const std::string& imageUrl) const { +std::optional WwtDataHandler::image(const std::string& imageUrl) const { auto it = _images.find(imageUrl); if (it == _images.end()) { - return ImageData(); + return std::nullopt; } return it->second; }