embedded-framework/middleware/GuiEngine/include/GuiEngine.h
2024-06-05 09:28:13 +08:00

118 lines
3.9 KiB
C++
Executable File

/*
* @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 <memory>
#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<Widget> NewImage(void) { return std::make_shared<Widget>(); }
virtual std::shared_ptr<Widget> NewLabel(void) { return std::make_shared<Widget>(); }
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> widget;
void (*eventCallback)(std::shared_ptr<Context> &ctx);
bool (*timerCallback)(void *);
// KeyCmd cmd;
void *ctx;
public:
virtual ~Context()
{
}
virtual int Type() { return 0; }
void WidgetReset(Widget *p)
{
widget.reset(p);
}
};
template <typename T>
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<GuiEngine> &log = GuiEngine::GetInstance();
* or std::shared_ptr<GuiEngine> log = GuiEngine::GetInstance();
* @param impl
* @return std::shared_ptr<GuiEngine>&
*/
static std::shared_ptr<GuiEngine> &GetInstance(std::shared_ptr<GuiEngine> *impl = nullptr)
{
static auto instance = std::make_shared<GuiEngine>();
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<Widget> NewWidget(void) { return std::make_shared<Widget>(); }
virtual std::shared_ptr<Widget> NewPage(void) { return std::make_shared<Widget>(); }
virtual std::shared_ptr<Widget> NewImage(const std::shared_ptr<Widget> &parent) { return std::make_shared<Widget>(); }
// virtual std::shared_ptr<Widget> PageOpen(const std::string &windowName) { return std::make_shared<Widget>(); }
// virtual SF_CODE_S PageColse(const std::shared_ptr<Widget> &page) { return CreateReturnCode(SF_CODE_OK); }
virtual void IdleQueue(const std::shared_ptr<Context> &ctx) {}
};
bool CreateGuiEngineImpl();
#endif