From e1bda38529d496ff2d3faf45909004565c5acdb0 Mon Sep 17 00:00:00 2001 From: Ylva Selling Date: Thu, 12 May 2022 12:11:00 -0400 Subject: [PATCH] Make imGUI listen to OpenSpaceEngine properties for visibility for properties and for scene graph nodes --- include/openspace/engine/openspaceengine.h | 3 ++ modules/imgui/imguimodule.cpp | 12 ------- modules/imgui/imguimodule.h | 3 -- modules/imgui/include/guipropertycomponent.h | 5 --- modules/imgui/src/guiparallelcomponent.cpp | 1 - modules/imgui/src/guipropertycomponent.cpp | 35 +++++++++++--------- src/engine/openspaceengine.cpp | 8 +++++ 7 files changed, 30 insertions(+), 37 deletions(-) diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 661145da5c..285fee72ba 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -26,6 +26,7 @@ #define __OPENSPACE_CORE___OPENSPACEENGINE___H__ #include +#include #include #include #include @@ -103,6 +104,8 @@ public: std::vector encode(); void decode(std::vector data); + properties::Property::Visibility visibility() const; + bool showHiddenSceneGraphNodes() const; void toggleShutdownMode(); Mode currentMode() const; diff --git a/modules/imgui/imguimodule.cpp b/modules/imgui/imguimodule.cpp index a956d0261a..995ee390ed 100644 --- a/modules/imgui/imguimodule.cpp +++ b/modules/imgui/imguimodule.cpp @@ -554,18 +554,6 @@ void ImGUIModule::renderFrame(float deltaTime, const glm::vec2& windowSize, comp->setEnabled(enabled); } - // Render and Update property visibility - // Fragile! Keep this in sync with properties::Property::Visibility - using V = properties::Property::Visibility; - int t = static_cast>(_currentVisibility); - - // Array is sorted by importance - std::array items = { "User", "Developer", "Hidden", "All" }; - ImGui::Combo("PropertyVisibility", &t, items.data(), static_cast(items.size())); - - _currentVisibility = static_cast(t); - _property.setVisibility(_currentVisibility); - #ifdef SHOW_IMGUI_HELPERS ImGui::Checkbox("ImGUI Internals", &_showInternals); if (_showInternals) { diff --git a/modules/imgui/imguimodule.h b/modules/imgui/imguimodule.h index 8c94675f2e..89dfb427f7 100644 --- a/modules/imgui/imguimodule.h +++ b/modules/imgui/imguimodule.h @@ -124,9 +124,6 @@ private: UniformCache(tex, ortho) _uniformCache; std::unique_ptr _fontTexture; - properties::Property::Visibility _currentVisibility = - properties::Property::Visibility::Developer; - std::vector _contexts; std::vector _validTouchStates; diff --git a/modules/imgui/include/guipropertycomponent.h b/modules/imgui/include/guipropertycomponent.h index fcdc5a013f..506110b00f 100644 --- a/modules/imgui/include/guipropertycomponent.h +++ b/modules/imgui/include/guipropertycomponent.h @@ -52,22 +52,17 @@ public: void setPropertyOwnerFunction( std::function()> func); - void setVisibility(properties::Property::Visibility visibility); - void render() override; protected: void renderPropertyOwner(properties::PropertyOwner* owner); void renderProperty(properties::Property* prop, properties::PropertyOwner* owner); - properties::Property::Visibility _visibility = properties::Property::Visibility::User; - std::vector _propertyOwners; std::function()> _propertyOwnerFunction; properties::BoolProperty _useTreeLayout; properties::StringListProperty _treeOrdering; - properties::BoolProperty _ignoreHiddenHint; }; } // namespace openspace::gui diff --git a/modules/imgui/src/guiparallelcomponent.cpp b/modules/imgui/src/guiparallelcomponent.cpp index d4ba5098da..07389f3e2d 100644 --- a/modules/imgui/src/guiparallelcomponent.cpp +++ b/modules/imgui/src/guiparallelcomponent.cpp @@ -42,7 +42,6 @@ namespace openspace::gui { GuiParallelComponent::GuiParallelComponent() : GuiPropertyComponent("Parallel", "Parallel Connection") { - setVisibility(properties::Property::Visibility::Always); } void GuiParallelComponent::renderDisconnected() { diff --git a/modules/imgui/src/guipropertycomponent.cpp b/modules/imgui/src/guipropertycomponent.cpp index 7ccec97ed4..acc38646f0 100644 --- a/modules/imgui/src/guipropertycomponent.cpp +++ b/modules/imgui/src/guipropertycomponent.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include #include @@ -59,15 +61,17 @@ namespace { "the hidden hints are followed." }; - int nVisibleProperties(const std::vector& props, - openspace::properties::Property::Visibility visibility) + int nVisibleProperties(const std::vector& props) { + using Visibility = openspace::properties::Property::Visibility; + Visibility visibilityFilter = openspace::global::openSpaceEngine->visibility(); + return static_cast(std::count_if( props.begin(), props.end(), - [visibility](openspace::properties::Property* p) { + [visibilityFilter](openspace::properties::Property* p) { using V = openspace::properties::Property::Visibility; - return static_cast>(visibility) >= + return static_cast>(visibilityFilter) >= static_cast>(p->visibility()); } )); @@ -187,11 +191,9 @@ GuiPropertyComponent::GuiPropertyComponent(std::string identifier, std::string g : GuiComponent(std::move(identifier), std::move(guiName)) , _useTreeLayout(UseTreeInfo, useTree) , _treeOrdering(OrderingInfo) - , _ignoreHiddenHint(IgnoreHiddenInfo) { addProperty(_useTreeLayout); addProperty(_treeOrdering); - addProperty(_ignoreHiddenHint); } void GuiPropertyComponent::setPropertyOwners( @@ -206,10 +208,6 @@ void GuiPropertyComponent::setPropertyOwnerFunction( _propertyOwnerFunction = std::move(func); } -void GuiPropertyComponent::setVisibility(properties::Property::Visibility visibility) { - _visibility = visibility; -} - void GuiPropertyComponent::renderPropertyOwner(properties::PropertyOwner* owner) { using namespace properties; @@ -217,12 +215,12 @@ void GuiPropertyComponent::renderPropertyOwner(properties::PropertyOwner* owner) return; } - const int nThisProperty = nVisibleProperties(owner->properties(), _visibility); + const int nThisProperty = nVisibleProperties(owner->properties()); ImGui::PushID(owner->identifier().c_str()); const std::vector& subOwners = owner->propertySubOwners(); for (PropertyOwner* subOwner : subOwners) { const std::vector& properties = subOwner->propertiesRecursive(); - int count = nVisibleProperties(properties, _visibility); + int count = nVisibleProperties(properties); if (count == 0) { continue; } @@ -286,6 +284,7 @@ void GuiPropertyComponent::render() { ImGui::SetNextWindowBgAlpha(0.75f); ImGui::Begin(guiName().c_str(), &v); _isEnabled = v; + bool showHiddenNode = openspace::global::openSpaceEngine->showHiddenSceneGraphNodes(); _isCollapsed = ImGui::IsWindowCollapsed(); using namespace properties; @@ -373,12 +372,14 @@ void GuiPropertyComponent::render() { dynamic_cast(*owners.begin())->guiPath().empty()); auto renderProp = [&](properties::PropertyOwner* pOwner) { - const int count = nVisibleProperties(pOwner->propertiesRecursive(), _visibility); + const int count = nVisibleProperties(pOwner->propertiesRecursive()); if (count == 0) { return; } + + auto header = [&]() -> bool { if (owners.size() > 1) { // Create a header in case we have multiple owners @@ -402,7 +403,7 @@ void GuiPropertyComponent::render() { }; if (!_useTreeLayout || noGuiGroups) { - if (!_ignoreHiddenHint) { + if (!showHiddenNode) { // Remove all of the nodes that we want hidden first owners.erase( std::remove_if( @@ -424,7 +425,7 @@ void GuiPropertyComponent::render() { for (properties::PropertyOwner* pOwner : owners) { // We checked above that pOwner is a SceneGraphNode SceneGraphNode* nOwner = static_cast(pOwner); - if (!_ignoreHiddenHint && nOwner->hasGuiHintHidden()) { + if (!showHiddenNode && nOwner->hasGuiHintHidden()) { continue; } const std::string gui = nOwner->guiPath(); @@ -491,7 +492,9 @@ void GuiPropertyComponent::renderProperty(properties::Property* prop, // Check if the visibility of the property is high enough to be displayed using V = properties::Property::Visibility; - const auto v = static_cast>(_visibility); + using Visibility = openspace::properties::Property::Visibility; + Visibility visibilityFilter = openspace::global::openSpaceEngine->visibility(); + const auto v = static_cast>(visibilityFilter); const auto propV = static_cast>(prop->visibility()); if (v >= propV) { auto it = FunctionMapping.find(prop->className()); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index afe169c746..03fb652632 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1619,6 +1619,14 @@ void OpenSpaceEngine::decode(std::vector data) { global::syncEngine->decodeSyncables(std::move(data)); } +properties::Property::Visibility openspace::OpenSpaceEngine::visibility() const { + return static_cast(_visibility.value()); +} + +bool openspace::OpenSpaceEngine::showHiddenSceneGraphNodes() const { + return _showHiddenSceneGraphNodes; +} + void OpenSpaceEngine::toggleShutdownMode() { if (_shutdown.inShutdown) { // If we are already in shutdown mode, we want to disable it