| #pragma once |
| |
| #ifndef TNZ_ACTION_INCLUDED |
| #define TNZ_ACTION_INCLUDED |
| |
| #include "tw/tw.h" |
| |
| #undef DVAPI |
| #undef DVVAR |
| #ifdef TWIN_EXPORTS |
| #define DVAPI DV_EXPORT_API |
| #define DVVAR DV_EXPORT_VAR |
| #else |
| #define DVAPI DV_IMPORT_API |
| #define DVVAR DV_IMPORT_VAR |
| #endif |
| |
| class TButton; |
| |
| |
| |
| class DVAPI TGenericCommandAction { |
| public: |
| TGenericCommandAction() {} |
| virtual ~TGenericCommandAction() {} |
| |
| virtual void sendCommand() = 0; |
| virtual TGenericCommandAction *clone() const = 0; |
| }; |
| |
| |
| |
| template <class T> |
| class TCommandAction : public TGenericCommandAction { |
| public: |
| typedef void (T::*CommandMethod)(); |
| |
| T *m_target; |
| CommandMethod m_method; |
| |
| TCommandAction<T>(T *target, CommandMethod method) |
| : m_target(target), m_method(method){}; |
| void sendCommand() { (m_target->*m_method)(); }; |
| |
| TGenericCommandAction *clone() const { |
| return new TCommandAction<T>(m_target, m_method); |
| } |
| }; |
| |
| |
| |
| template <class T, class Arg> |
| class TCommandAction1 : public TGenericCommandAction { |
| public: |
| typedef void (T::*CommandMethod)(Arg arg); |
| |
| T *m_target; |
| CommandMethod m_method; |
| Arg m_arg; |
| |
| TCommandAction1<T, Arg>(T *target, CommandMethod method, Arg arg) |
| : m_target(target), m_method(method), m_arg(arg){}; |
| void sendCommand() { (m_target->*m_method)(m_arg); }; |
| |
| TGenericCommandAction *clone() const { |
| return new TCommandAction1<T, Arg>(m_target, m_method, m_arg); |
| } |
| }; |
| |
| |
| |
| class DVAPI TCommandSource { |
| vector<TGenericCommandAction *> *m_actions; |
| |
| public: |
| TCommandSource(); |
| virtual ~TCommandSource(); |
| |
| void addAction(TGenericCommandAction *action); |
| void sendCommand(); |
| |
| private: |
| |
| TCommandSource(const TCommandSource &); |
| TCommandSource &operator=(const TCommandSource &); |
| }; |
| |
| |
| |
| template <class T> |
| inline void tconnect(TCommandSource &src, T *target, void (T::*method)()) { |
| src.addAction(new TCommandAction<T>(target, method)); |
| } |
| |
| |
| |
| template <class T, class Arg> |
| inline void tconnect(TCommandSource &src, T *target, void (T::*method)(Arg arg), |
| Arg arg) { |
| src.addAction(new TCommandAction1<T, Arg>(target, method, arg)); |
| } |
| |
| |
| |
| class DVAPI TGuiCommand { |
| class Imp; |
| Imp *m_imp; |
| |
| public: |
| TGuiCommand(string cmdName = "none"); |
| virtual ~TGuiCommand(); |
| TGuiCommand(const TGuiCommand &); |
| TGuiCommand &operator=(const TGuiCommand &); |
| |
| |
| |
| |
| |
| |
| |
| bool isToggle() const; |
| void setIsToggle(bool on); |
| void setStatus(bool on); |
| bool getStatus() const; |
| |
| void enable(); |
| void disable(); |
| |
| void add(TButton *button); |
| void setAction(TGenericCommandAction *action); |
| |
| |
| void sendCommand(); |
| |
| static void execute(string cmdName); |
| static void getNames(std::vector<string> &cmdNames); |
| |
| private: |
| }; |
| |
| |
| |
| class DVAPI TGuiCommandExecutor : public TGuiCommand { |
| public: |
| TGuiCommandExecutor(string cmdName) : TGuiCommand(cmdName) { |
| setAction(new TCommandAction<TGuiCommandExecutor>( |
| this, &TGuiCommandExecutor::onCommand)); |
| } |
| |
| virtual ~TGuiCommandExecutor() {} |
| |
| virtual void onCommand() = 0; |
| }; |
| |
| |
| |
| class TGuiCommandGenericTarget { |
| protected: |
| TGuiCommand m_command; |
| |
| public: |
| TGuiCommandGenericTarget(string cmdName) : m_command(cmdName) {} |
| virtual ~TGuiCommandGenericTarget() {} |
| virtual void activate() = 0; |
| virtual void deactivate() { m_command.setAction(0); } |
| }; |
| |
| |
| |
| template <class T> |
| class TGuiCommandTarget : public TGuiCommandGenericTarget { |
| public: |
| typedef void (T::*Method)(); |
| T *m_target; |
| Method m_method; |
| |
| public: |
| TGuiCommandTarget(string cmdName, T *target, Method method) |
| : TGuiCommandGenericTarget(cmdName), m_target(target), m_method(method) {} |
| |
| void activate() { |
| m_command.setAction(new TCommandAction<T>(m_target, m_method)); |
| } |
| }; |
| |
| #endif |