Gui: Refactor navigation styles

Simplify type erasure
This commit is contained in:
wmayer
2025-04-23 14:12:19 +02:00
committed by Max Wilfinger
parent 00e05045df
commit 969c147be2
3 changed files with 42 additions and 50 deletions

View File

@@ -145,9 +145,7 @@ bool NS::Event::isDownAlt() const
TYPESYSTEM_SOURCE_ABSTRACT(Gui::NavigationStateChart, Gui::UserNavigationStyle)
NavigationStateChart::NavigationStateChart()
: naviMachine(new NS::StateMachine())
{
}
{}
NavigationStateChart::~NavigationStateChart()
{

View File

@@ -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> flags;
};
class StateMachine
{
public:
template <typename T>
void make_object(T* obj)
{
object = std::make_shared<Model<T>>(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<T> object;
};
std::shared_ptr<Concept> object;
};
NavigationStateChart();
~NavigationStateChart() override;
protected:
SbBool processSoEvent(const SoEvent * const ev) override;
std::unique_ptr<StateMachine> naviMachine; // NOLINT
std::unique_ptr<NaviStateMachine> 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<T> object;
};
} // namespace Gui

View File

@@ -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()