/* * @Descripttion: Api of gui in open source. * @Date: 2022-08-02 16:02:16 * @LastEditTime: 2022-08-09 15:21:07 */ #ifndef GUI_ENGINE_H #define GUI_ENGINE_H #include "ReturnCode.h" #include #define TR_TEXT(text) GuiEngine::GetInstance()->GetTranslateText(text) #if 0 #define GUI_SET_IMAGE_FILE_SYSTEM_SRC(widget, src) widget->ImageSetSrc(&src); // use image src pointer. #else // #define GUI_SET_IMAGE_FILE_SYSTEM_SRC(widget, src) widget->ImageSetSrc("A:./"#src); // use image file. #define GUI_SET_IMAGE_FILE_SYSTEM_SRC(widget, src) widget->ImageSetSrc(GUI_IMAGES_PATH#src); // use image file. #endif class Widget { public: Widget() = default; virtual ~Widget() {} // virtual bool IsValid() { return false; } // virtual std::string Name() { return "null"; } // virtual void SetWidget(Widget *p) {} // virtual int GetCoordX() { return 0; } // virtual int GetCoordY() { return 0; } virtual std::shared_ptr NewImage(void) { return std::make_shared(); } virtual std::shared_ptr NewLabel(void) { return std::make_shared(); } virtual void ImageSetSrc(const void *src) {} virtual void SetSize(const unsigned int &width, const unsigned int &height) {} virtual void Load(void) {} virtual void SetText(const char *text) {} virtual void Delete(void) {} }; class Context { public: Context() { eventCallback = nullptr; ctx = nullptr; // cmd = KeyCmd::KEY_CMD_DEFAULT; } std::unique_ptr widget; void (*eventCallback)(std::shared_ptr &ctx); bool (*timerCallback)(void *); // KeyCmd cmd; void *ctx; public: virtual ~Context() { } virtual int Type() { return 0; } void WidgetReset(Widget *p) { widget.reset(p); } }; template class ContextV2 : public Context { public: T data; public: ContextV2(T value) : data(value) { } virtual ~ContextV2() = default; }; class GuiEngine { public: GuiEngine() = default; virtual ~GuiEngine() = default; /** * @brief Get the Instance object * Return reference for runing faster. Usage : GuiEngine::GetInstance()->Init(); * Don't use GuiEngine like this: * std::shared_ptr &log = GuiEngine::GetInstance(); * or std::shared_ptr log = GuiEngine::GetInstance(); * @param impl * @return std::shared_ptr& */ static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr) { static auto instance = std::make_shared(); if (impl) { /** * @brief * The non-thread-safe changing is only for gtest. */ instance = *impl; } return instance; } /** * @brief * * @param width width of screen * @param height height of screen * @param appInit for app to init the first window */ virtual bool Init(const unsigned int &width, const unsigned int &height, void (*appInit)()) { return false; } virtual void UnInit() {} virtual const char *GetTranslateText(const char *trText) { return "nullptr"; } virtual std::shared_ptr NewWidget(void) { return std::make_shared(); } virtual std::shared_ptr NewPage(void) { return std::make_shared(); } virtual std::shared_ptr NewImage(const std::shared_ptr &parent) { return std::make_shared(); } // virtual std::shared_ptr PageOpen(const std::string &windowName) { return std::make_shared(); } // virtual SF_CODE_S PageColse(const std::shared_ptr &page) { return CreateReturnCode(SF_CODE_OK); } virtual void IdleQueue(const std::shared_ptr &ctx) {} }; bool CreateGuiEngineImpl(); #endif