diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c61195d229..c975aee0f03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ - Fix CMake configuration summary incorrectly reporting `no` for system BLAS. (PR #7230) - Add error handling for insufficient correspondences in AdvancedMatching (PR #7234) - Exposed `get_plotly_fig` and modified `draw_plotly` to return the `Figure` it creates. (PR #7258) +- Add `GetMenu` for MenuBase for easy menu item/submenu control. (PR #7295) ## 0.13 diff --git a/cpp/open3d/visualization/gui/Menu.cpp b/cpp/open3d/visualization/gui/Menu.cpp index 1c340bdc178..2207212b817 100644 --- a/cpp/open3d/visualization/gui/Menu.cpp +++ b/cpp/open3d/visualization/gui/Menu.cpp @@ -69,6 +69,14 @@ void Menu::InsertSeparator(int index) { impl_->menu->InsertSeparator(index); } int Menu::GetNumberOfItems() const { return impl_->menu->GetNumberOfItems(); } +std::shared_ptr Menu::GetMenu(const char* name) { + return impl_->menu->GetMenu(name); +} + +std::shared_ptr Menu::GetMenu(ItemId item_id) { + return impl_->menu->GetMenu(item_id); +} + bool Menu::IsEnabled(ItemId item_id) const { return impl_->menu->IsEnabled(item_id); } diff --git a/cpp/open3d/visualization/gui/Menu.h b/cpp/open3d/visualization/gui/Menu.h index 80381e99387..292eca4eaf9 100644 --- a/cpp/open3d/visualization/gui/Menu.h +++ b/cpp/open3d/visualization/gui/Menu.h @@ -45,6 +45,12 @@ class Menu : public MenuBase { int GetNumberOfItems() const override; + /// Get the Menu by name. Returns nullptr if not found. + std::shared_ptr GetMenu(const char* name) override; + + /// Get the Menu by ItemId. Returns nullptr if not found. + std::shared_ptr GetMenu(ItemId item_id) override; + /// Searches the menu hierarchy down from this menu to find the item /// and returns true if the item is enabled. bool IsEnabled(ItemId item_id) const override; diff --git a/cpp/open3d/visualization/gui/MenuBase.h b/cpp/open3d/visualization/gui/MenuBase.h index 29c2f5a9776..7eb17a8bf33 100644 --- a/cpp/open3d/visualization/gui/MenuBase.h +++ b/cpp/open3d/visualization/gui/MenuBase.h @@ -49,6 +49,12 @@ class MenuBase { virtual int GetNumberOfItems() const = 0; + /// Get the Menu by name. Returns nullptr if not found. + virtual std::shared_ptr GetMenu(const char* name) = 0; + + /// Get the Menu by ItemId. Returns nullptr if not found. + virtual std::shared_ptr GetMenu(ItemId item_id) = 0; + /// Searches the menu hierarchy down from this menu to find the item /// and returns true if the item is enabled. virtual bool IsEnabled(ItemId item_id) const = 0; diff --git a/cpp/open3d/visualization/gui/MenuImgui.cpp b/cpp/open3d/visualization/gui/MenuImgui.cpp index 430aedbd1db..c65a69586d9 100644 --- a/cpp/open3d/visualization/gui/MenuImgui.cpp +++ b/cpp/open3d/visualization/gui/MenuImgui.cpp @@ -135,6 +135,23 @@ void MenuImgui::InsertSeparator(int index) { int MenuImgui::GetNumberOfItems() const { return int(impl_->items_.size()); } +std::shared_ptr MenuImgui::GetMenu(const char *name) { + for (auto &item : impl_->items_) { + if (item.name_.compare(name) == 0) { + return item.submenu_; + } + } + return nullptr; +} + +std::shared_ptr MenuImgui::GetMenu(ItemId item_id) { + auto item = impl_->FindMenuItem(item_id); + if (item) { + return item->submenu_; + } + return nullptr; +} + bool MenuImgui::IsEnabled(ItemId item_id) const { auto *item = impl_->FindMenuItem(item_id); if (item) { diff --git a/cpp/open3d/visualization/gui/MenuImgui.h b/cpp/open3d/visualization/gui/MenuImgui.h index b3d9e410941..630468627dd 100644 --- a/cpp/open3d/visualization/gui/MenuImgui.h +++ b/cpp/open3d/visualization/gui/MenuImgui.h @@ -35,6 +35,9 @@ class MenuImgui : public MenuBase { int GetNumberOfItems() const override; + std::shared_ptr GetMenu(const char* name) override; + std::shared_ptr GetMenu(ItemId item_id) override; + bool IsEnabled(ItemId item_id) const override; void SetEnabled(ItemId item_id, bool enabled) override; diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp index f5c125a1681..e29ab6652ff 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.cpp @@ -1400,6 +1400,10 @@ Ctrl-alt-click to polygon select)"; scene_->ForceRedraw(); } + std::shared_ptr GetMenubar() { + return Application::GetInstance().GetMenubar(); + } + void ShowSettings(bool show, bool cancel_auto_show = true) { if (cancel_auto_show) { can_auto_show_settings_ = false; @@ -2427,6 +2431,10 @@ void O3DVisualizer::ModifyGeometryMaterial( impl_->ModifyGeometryMaterial(name, material); } +std::shared_ptr O3DVisualizer::GetMenubar() { + return impl_->GetMenubar(); +} + void O3DVisualizer::ShowSettings(bool show) { impl_->ShowSettings(show); } void O3DVisualizer::ShowSkybox(bool show) { impl_->ShowSkybox(show); } diff --git a/cpp/open3d/visualization/visualizer/O3DVisualizer.h b/cpp/open3d/visualization/visualizer/O3DVisualizer.h index dcd97e770a9..81c4112e666 100644 --- a/cpp/open3d/visualization/visualizer/O3DVisualizer.h +++ b/cpp/open3d/visualization/visualizer/O3DVisualizer.h @@ -161,6 +161,10 @@ class O3DVisualizer : public gui::Window { void ResetCameraToDefault(); + /// Get menubar from window system. The window came from + /// `Application::GetInstance()` + std::shared_ptr GetMenubar(); + void ShowSettings(bool show); void ShowSkybox(bool show); void SetIBL(const std::string& path);