#pragma once
#include "Common.h"
#include "WindowAppUiView.h"
// 为了处理 ValueControl 和 dll数值之间输入输出的单向同步关系增加的数据结构
//// 存储控件链接的数值信息
//typedef struct _tagLinkValue
//{
// INF_DIRECTION direction; // 数值的输入输出方向
//
// VALUE value; // 数值内容
//
//} LINK_VALUE;
///
/// 管理所有UI设计页面以及对应控件的数据结构类
/// 为了接收Event消息,从QObject集成
///
class WindowAppUiView;
class VControlObject;
class UiManager : public QObject
{
Q_OBJECT
public:
UiManager();
// 注册新的UI页面
void registerNewUi(WindowAppUiView* pView);
// 删除指定页面(此处需要检查是否删除的是主页)
bool deleteUi(const QString& strName, bool bForce = false);
// 注册新的控件
void regiterNewControl(VControlObject* pNewControl, WindowAppUiView* pView);
// 删除一个控件
void deleteControl(QWidget* pDelControl);
// 获取所有的Ui名称
QStringList getAllUiNames();
// 获取指定名字的页面
WindowAppUiView* getPageByName(const QString& strName);
// 检查各个页面中携带的属性是否正确有效
bool checkAll();
// 发布所有页面到Runtime执行
bool publishAll();
// 设定主页
bool setMainPage(const QString& strName);
// 获取主页
WindowAppUiView* getMainPage();
//// 获取所有页面列表(序列化时使用)
//const QHash& getAllPages() const;
// 序列化所有的WindowAppUiViewW*
bool serialized(QDataStream& out);
//// 反序列化所有的WindowAppUiViewW*
//bool deserialized(QDataStream& in);
// 重置所有UI页面以及数据结构(用于反序列化使用)
void reset();
// 2022-2-12 根据控件指针查找对应的WindowAppUiView指针
WindowAppUiView* getViewByControl(VControlObject* pUiControl);
// 刷新指定控件的选中效果(用于适配geometry的实时更新)
void refreshControlDrawPoint(VControlObject* pUiControl);
//===============================================================
// 同步相关代码
// 绑定dll中的控件与UI控件用于同步
void bindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl);
// 2022-9-13,解除dll中的控件与UI控件的绑定
void unbindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl);
// 绑定UI控件与Runtime控件用于同步
void bindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl);
// 2022-9-13,解除UI控件与Runtime控件的绑定
void unbindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl);
// 绑定数值变量与UI控件用于同步
void bindValueWithUiControl(VARIABLE* val, QWidget* pUiControl);
// 2022-9-13,解绑数值变量与UI控件(在控件变更了主索引绑定变量时,需要做解绑动作)
void unbindValueWithUiControl(VARIABLE* val, QWidget* pUiControl);
// 绑定DataLink中的信息用于后续同步(仅 UI->Dll)
bool bindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl);
// 2022-9-13,解绑DataLine信息(在控件变更了主索引绑定变量时,需要做解绑动作)
bool unbindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl);
// 绑定dll中的控件信息用于后续同步(控件类型)
bool bindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
// 2022-9-13 解绑dll中的控件信息(控件类型)
bool unbindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
// 绑定dll中的信息用于后续同步(数值类型)
bool bindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
// 2022-9-13 解绑dll中的信息(数值类型)
bool unbindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
// 绑定dll中的信息用于后续同步(复杂类型,暂未绑定,仅引用计数 + 1)
bool bindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf);
// 2022-9-13 解绑dll中的信息(复杂类型,暂未绑定,仅引用计数 - 1)
bool unbindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf);
// 还原反序列化中控件的DataLink关系(简单控件)
bool restoreDataLinks(const CONTROL_PROPERTY& prop, VControlObject* pUiControl);
// 还原反序列化中控件的DataLink关系(复杂控件)
bool restoreDataLinks(const CONTROL_PROPERTY_EX& propex, VControlObject* pUiControl);
// 用于Dll中的控件事件触发回调(dll中的控件向UI界面同步)
void syncFromDll(QWidget* pWidget, UI_SYNC_MSG msg);
// 用于UI界面向Dll中的控件同步
void syncToDll(QWidget* pControl, UI_SYNC_MSG msg);
// 用于Runtime界面向UI中的控件同步
void syncFromRuntime(QWidget* pControl, UI_SYNC_MSG msg);
// 用于UI向Runtime界面中的控件同步
void syncToRuntime(QWidget* pControl, UI_SYNC_MSG msg, bool bFirst = false);
//// 用于数值变更触发回调(只有ValueControl可以关联数值)
//void syncFromValue(void* pValue, VALUE_TYPE type);
// 用于数值变更触发回调(只有ValueControl可以关联数值)
void syncFromValue(VARIABLE* pInf);
// 用于UI变更向数值单向同步
void syncToValue(QWidget* pControl);
// 刚绑定时,从dll向UI做一次同步
void syncFromDllFirst(QWidget* pDllControl, VControlObject* pUiControl);
//// 刚绑定时,从value向UI做一次同步
//void syncFromValueFirst(VALUE& value);
// 2022-2-10 从DataLink中解析Tool信息
void parsePouToolFromDataLink(
const DataLink& dataLink,
POU*& pPou,
TOOL*& pTool,
_INTERFACE*& pDllInf
);
// 2022-2-10 从DataLink中解析Interface信息
void parseToolInfFromDataLink(
const DataLink& dataLink,
_INTERFACE*& pDllInf
);
protected:
// 同步的模式(用于方便记录日志使用)
enum class SYNC_MODE : short
{
FROM_DLL,
TO_DLL,
FROM_RUNTIME,
TO_RUNTIME,
FROM_VALUE,
TO_VALUE
};
// 同步Edit控件
bool syncEditControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode, bool bFirst = false);
// 同步Combo控件
bool syncComboControl(QComboBox* pSrc, QComboBox* pDst, SYNC_MODE mode, bool bFirst = false);
// 同步list控件
bool syncListControl(QListWidget* pSrc, QListWidget* pDst, SYNC_MODE mode, bool bFirst = false);
// 同步radio控件
// 同步check控件
// 同步Value Control(控件)
bool syncValueControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode);
// 同步Value Control(数值)
bool syncValueControl(QWidget* pValueControl, QString strNewValue, VALUE_TYPE type, SYNC_MODE mode);
//// 删除所有UI
//void deleteAllUIs();
protected slots:
// 接收来自其他控件和变量的同步Event
virtual void customEvent(QEvent* event) override;
protected:
// 存储 页面名称 - 页面指针 对应关系
QMap m_pAllPages;
// 设置别名
using UI_PAGES = QHash;
// 主页
WindowAppUiView* m_pMainPage;
// 所有控件与对应的UI界面指针对应关系
QHash m_AllControls;
//===============================================================
// 同步相关代码
// Dll中的控件 - UI中的控件对应关系
QHash m_DllToUiControls;
// UI中的控件 - Dll中的控件的对应关系
QHash m_UiToDllControls;
// UI中的控件 - Runtime中的控件对应关系
QHash m_UiToRtControls;
// Runtime中的控件 - UI中的控件对应关系
QHash m_RtToUiControls;
// Value数值 - UI中的控件对应关系(一对多)
QMultiHash m_ValueToUiControls;
// UI中的控件 - Value数值对应关系
QHash m_UiControlToValues;
// 硬件Value - UI中的控件对应关系(一对多)
};