From 969c147be2948ab6eb9ccc5f23149ddab407e1c3 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 23 Apr 2025 14:12:19 +0200 Subject: [PATCH] Gui: Refactor navigation styles Simplify type erasure --- src/Gui/Navigation/NavigationStateChart.cpp | 4 +- src/Gui/Navigation/NavigationStateChart.h | 86 ++++++++++----------- src/Gui/Navigation/SiemensNXStyle.cpp | 2 +- 3 files changed, 42 insertions(+), 50 deletions(-) diff --git a/src/Gui/Navigation/NavigationStateChart.cpp b/src/Gui/Navigation/NavigationStateChart.cpp index c146fbb9a6..70a12f8f67 100644 --- a/src/Gui/Navigation/NavigationStateChart.cpp +++ b/src/Gui/Navigation/NavigationStateChart.cpp @@ -145,9 +145,7 @@ bool NS::Event::isDownAlt() const TYPESYSTEM_SOURCE_ABSTRACT(Gui::NavigationStateChart, Gui::UserNavigationStyle) NavigationStateChart::NavigationStateChart() - : naviMachine(new NS::StateMachine()) -{ -} +{} NavigationStateChart::~NavigationStateChart() { diff --git a/src/Gui/Navigation/NavigationStateChart.h b/src/Gui/Navigation/NavigationStateChart.h index f7e7a50008..9e60708d1a 100644 --- a/src/Gui/Navigation/NavigationStateChart.h +++ b/src/Gui/Navigation/NavigationStateChart.h @@ -32,6 +32,8 @@ namespace Gui { +class NaviStateMachine; + class GuiExport NavigationStateChart : public UserNavigationStyle { using inherited = UserNavigationStyle; @@ -89,57 +91,49 @@ public: std::shared_ptr flags; }; - class StateMachine - { - public: - template - void make_object(T* obj) - { - object = std::make_shared>(obj); - } - - void process_event(const Event& ev) - { - if (object) { - object->process_event(ev); - } - } - - struct Concept - { - virtual ~Concept() = default; - virtual void process_event(const Event&) = 0; - }; - - template< typename T > - struct Model : Concept - { - explicit Model(T* t) : object(t) - { - object->initiate(); - } - ~Model() override - { - object.reset(); - } - void process_event(const Event& ev) override - { - object->process_event(ev); - } - - private: - std::shared_ptr object; - }; - - std::shared_ptr object; - }; - NavigationStateChart(); ~NavigationStateChart() override; protected: SbBool processSoEvent(const SoEvent * const ev) override; - std::unique_ptr naviMachine; // NOLINT + std::unique_ptr naviMachine; // NOLINT +}; + +class GuiExport NaviStateMachine +{ +public: + NaviStateMachine(const NaviStateMachine&) = delete; + NaviStateMachine(NaviStateMachine&&) = delete; + NaviStateMachine& operator= (const NaviStateMachine&) = delete; + NaviStateMachine& operator= (NaviStateMachine&&) = delete; + + NaviStateMachine() = default; + virtual ~NaviStateMachine() = default; + + virtual void process_event(const NavigationStateChart::Event&) = 0; +}; + +template< typename T > +class NaviStateMachineT : public NaviStateMachine +{ +public: + explicit NaviStateMachineT(T* t) : object(t) + { + object->initiate(); + } + + ~NaviStateMachineT() override + { + object.reset(); + } + + void process_event(const NavigationStateChart::Event& ev) override + { + object->process_event(ev); + } + +private: + std::unique_ptr object; }; } // namespace Gui diff --git a/src/Gui/Navigation/SiemensNXStyle.cpp b/src/Gui/Navigation/SiemensNXStyle.cpp index 98721dee98..044e5f545c 100644 --- a/src/Gui/Navigation/SiemensNXStyle.cpp +++ b/src/Gui/Navigation/SiemensNXStyle.cpp @@ -402,7 +402,7 @@ TYPESYSTEM_SOURCE(Gui::SiemensNXStyle, Gui::UserNavigationStyle) SiemensNXStyle::SiemensNXStyle() { - naviMachine->make_object(new NS::NaviMachine(*this)); + naviMachine.reset(new NaviStateMachineT(new NaviMachine(*this))); } SiemensNXStyle::~SiemensNXStyle()