You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Kernel/FITKCore/FITKAbstractDataObject.h

263 lines
7.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
*
* @file FITKAbstractDataObject.h
* @brief 数据类基类声明
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*
*/
#ifndef _FITKABSTRACTDATAOBJECT_H__
#define _FITKABSTRACTDATAOBJECT_H__
#include "FITKCoreAPI.h"
#include "FITKCoreMacros.h"
#include "FITKAbstractObject.hpp"
#include <QObject>
#include <QHash>
#include <QVariant>
namespace Core
{
class FITKDataRepo;
class FITKAbstractDataIDAlter;
/**
* @brief 数据类基类声明,全部的数据类都必须是该类的派生类,抽象类
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
enum FITKUserData
{
FITKUserRole = 1,
FITKUserRoleEnd = 1000000,
};
class FITKCoreAPI FITKAbstractDataObject : public QObject , public FITKAbstractObject
{
friend FITKAbstractDataIDAlter;
friend FITKDataRepo;
Q_OBJECT;
//FITKSafeDownCastA(FITKAbstractDataObject, FITKAbstractObject)
public:
/**
* @brief Construct a new FITKAbstractDataObject object
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
explicit FITKAbstractDataObject(const int parentDataID = -1 );
/**
* @brief Destroy the FITKAbstractDataObject object
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
virtual ~FITKAbstractDataObject() = 0;
/**
* @brief 获取数据对象的ID
* @return int 数据ID
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
int getDataObjectID() const;
/**
* @brief 设置父数据对象id
* @param[i] id 父数据对象
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
virtual void setParentDataID(const int id);
/**
* @brief 获取父数据对象id
* @return int
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
int getParentDataID() const;
/**
* @brief 获取用户数据对象
* @param[i] userData 标记
* @return QVariant
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
QVariant getUserData(int userData);
/**
* @brief 记录用户数据对象ud重复则覆盖
* @param[i] ud 标记
* @param[i] va 数据对象
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
virtual void setUserData(int ud, QVariant va);
/**
* @brief 获取全部的数据对象标记
* @return QList<int>
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
QList<int> getUserDataKeys();
template <typename T>
/**
* @brief 获取用户数据,并进行强制类型转换
* @param[i] ud 标记
* @return T
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
T getUserDataT(int ud)
{
QVariant v = this->getUserData(ud);
return v.value<T>();
}
/**
* @brief 复制数据对象,深拷贝数据id不拷贝
* @param[i] obj 被拷贝的对象
* @return true
* @return false
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-03-27
*/
virtual bool copy(FITKAbstractDataObject* obj);
/**
* @brief 获取父数据对象
* @return FITKAbstractDataObject*
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-05-14
*/
FITKAbstractDataObject* getParentObject();
template <typename T>
/***
* @brief 获取父数据对象,并强制类型转换
* @return T*
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-05-14
*/
T* getParentObjectT()
{
FITKAbstractDataObject* tempObj = this;
while (tempObj)
{
//类型转换成功,返回数据对象
T* obj = dynamic_cast<T*>(tempObj);
if (obj) return obj;
tempObj = tempObj->getParentObject();
}
return nullptr;
}
/**
* @brief 禁止相似名称的函数调用,避免错误
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
QString objectName() = delete;
/**
* @brief 禁止相似名称的函数调用,避免错误
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
void setObjectName(const QString &name) = delete;
private:
/**
* @brief 修改最大ID
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-18
*/
static void ResetMaxID(const int maxid =0);
/**
* @brief 获取最大ID
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-18
*/
static int GetMaxID();
signals:
/**
* @brief 实例对象被销毁信号
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
void dataObjectDestoried(FITKAbstractDataObject*);
protected:
/***
* @brief 设置数据对象ID需谨慎使用
* @param ID 数据对象id
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-05-14
*/
virtual void setAbsDataID(const int id);
private:
/**
* @brief 数据对象ID全局数据唯一
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-02-22
*/
int _absDataID{ 0 };
/**
* @brief 父对象数据ID
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
int _parentDataID{ -1 };
/**
* @brief 用户数据
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-04-07
*/
QHash<int, QVariant> _userData{};
};
/**
* @brief 定义接口用于修改数据ID
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-03
*/
class FITKCoreAPI FITKAbstractDataIDAlter
{
public:
/**
* @brief Construct a new FITKAbstractDataIDAlter object
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-03
*/
explicit FITKAbstractDataIDAlter() = default;
/**
* @brief Destroy the FITKAbstractDataIDAlter object
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-03
*/
virtual ~FITKAbstractDataIDAlter() = default;
/**
* @brief 修改数据对象ID
* @param[i] d 数据指针
* @param[i] id 数据ID
* @return true 修改成功
* @return false 修改失败
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-03
*/
bool modifyDataID(FITKAbstractDataObject* d, const int id);
/**
* @brief 获取一个可用的ID没有被占用的ID
* @return int
* @author LiBaojun (libaojunqd@foxmail.com)
* @date 2024-06-03
*/
static int GetAValidDataID();
};
}
#endif