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/FITKAbstractDataManagerHelp...

245 lines
7.2 KiB
C++

#include "FITKAbstractDataManagerHelper.h"
#include "FITKAbstractDataObject.h"
#include "FITKAbstractNDataObject.h"
#include <QRegExp>
namespace Core
{
FITKAbstractDataManagerHelper::FITKAbstractDataManagerHelper(QList<FITKAbstractDataObject*>& l)
:_dataList(l) //引用数据管理中的链表
{
}
void FITKAbstractDataManagerHelper::appendData(FITKAbstractDataObject* item)
{
if (item == nullptr) return;
//存在的就直接delete
if ( isContains(item))
{
delete item;
return;
}
_dataList.append(item);
//将父对象id设置到item
item->setParentDataID(_parentDataID);
this->connectHelper(item);
}
void FITKAbstractDataManagerHelper::appendData(const QList<FITKAbstractDataObject*>& objs)
{
_dataList.append(objs);
for (auto item : objs)
{
//将父对象id设置到item
item->setParentDataID(_parentDataID);
this->connectHelper(item);
}
}
int FITKAbstractDataManagerHelper::getDataCount() const
{
return _dataList.size();
}
bool FITKAbstractDataManagerHelper::isContains(FITKAbstractDataObject* obj) const
{
return _dataList.contains(obj);
}
void FITKAbstractDataManagerHelper::clear()
{
//清空内存
while (!_dataList.isEmpty())
{
auto obj = _dataList.first();
if (obj) delete obj;
// _dataList.removeFirst();
}
// auto dataList = _dataList;
// for (auto obj : dataList)
// delete obj;
// _dataList.clear();
}
void FITKAbstractDataManagerHelper::insertDataObj(int index, FITKAbstractDataObject* item)
{
if(item == nullptr) return;
// 索引越界,追加
if (index >= _dataList.size())
{
this->appendData(item);
return;
}
if (index < 0) index = 0;
// 索引小于0在最前面插入
_dataList.insert(index, item);
item->setParentDataID(_parentDataID);
this->connectHelper(item);
}
FITKAbstractDataObject* FITKAbstractDataManagerHelper::getDataByIndex(const int index)
{
//错误判断
if (index < 0 || index >= getDataCount()) return nullptr;
return _dataList.at(index);
}
FITKAbstractDataObject* FITKAbstractDataManagerHelper::getDataByID(const int id)
{
//遍历获取数据
for (auto obj : _dataList)
{
if(obj == nullptr) continue;
if (id == obj->getDataObjectID()) return obj;
}
return nullptr;
}
FITKAbstractDataObject* FITKAbstractDataManagerHelper::getDataByName(const QString& name, bool sens)
{
for (auto obj : _dataList)
{
//如果不是FITKAbstractNDataObject派生类对象不做判断
auto nobj = dynamic_cast<FITKAbstractNDataObject*>(obj);
if (nobj == nullptr) continue;
//大小写不敏感,全部转换为小写
if (!sens)
{
if (name.toLower() == nobj->getDataObjectName().toLower())
return obj;
}
else if (name == nobj->getDataObjectName() )
return obj;
}
return nullptr;
}
int FITKAbstractDataManagerHelper::getDataIndex(FITKAbstractDataObject* obj)
{
if (_dataList.contains(obj))
return _dataList.indexOf(obj);
//错误值-1
return -1;
}
void FITKAbstractDataManagerHelper::removeDataObj(FITKAbstractDataObject* obj)
{
//不在链表的对象不操作
if (obj && _dataList.contains(obj))
delete obj;
}
void FITKAbstractDataManagerHelper::removeDataObjWithoutRelease(FITKAbstractDataObject* obj)
{
if (obj && _dataList.contains(obj))
_dataList.removeOne(obj);
//解除信号关联
this->connectHelper(obj, false);
}
void FITKAbstractDataManagerHelper::removeDataByIndex(int index)
{
auto d = this->getDataByIndex(index);
this->removeDataObj(d);
}
void FITKAbstractDataManagerHelper::removeDataByID(int id)
{
auto d = this->getDataByID(id);
this->removeDataObj(d);
}
void FITKAbstractDataManagerHelper::removeDataByName(const QString &name, bool senes)
{
auto d = this->getDataByName(name, senes);
this->removeDataObj(d);
}
void FITKAbstractDataManagerHelper::setParentDataID(const int & id)
{
_parentDataID = id;
//修改已有成员ID
for (FITKAbstractDataObject* objc : _dataList)
{
if(objc == nullptr) continue;
objc->setParentDataID(id);
}
}
int FITKAbstractDataManagerHelper::getParentDataID() const
{
return _parentDataID;
}
void FITKAbstractDataManagerHelper::connectHelper(FITKAbstractDataObject* obj, bool con)
{
if (con) //关联信号obj对象释放的时候会触发.direct关联直接在发送进程执行
connect(obj, &FITKAbstractDataObject::dataObjectDestoried,
this, &FITKAbstractDataManagerHelper::dataObjectDestoried,Qt::DirectConnection);
else //解除关联
disconnect(obj, &FITKAbstractDataObject::dataObjectDestoried,
this, &FITKAbstractDataManagerHelper::dataObjectDestoried);
}
void FITKAbstractDataManagerHelper::dataObjectDestoried(FITKAbstractDataObject* obj)
{
//槽函数,处理对象被释放事件
this->connectHelper(obj, false);
while (_dataList.contains(obj))
_dataList.removeOne(obj);
}
QString FITKAbstractDataManagerHelper::checkName(const QString& cname)
{
QString name = cname.simplified();
QString preffix;
if (name.endsWith("-")) preffix = name.mid(0, name.size() - 1);
//处理原始名称,获取前缀
QRegExp regex(".+\\-\\d+");
int pos = regex.lastIndexIn(name);
if (pos > 0)
preffix = name.mid(0, pos + 1);
else if (name.endsWith("-"))
preffix = preffix.remove("-");
else
preffix = name;
//重置正则表达,遍历匹配
regex = QRegExp(preffix.toLower() + "-\\d+");
bool match = false;
int maxid = 0;
for (auto a : _dataList)
{
//如果不是FITKAbstractNDataObject派生类对象不做判断
auto nobj = dynamic_cast<FITKAbstractNDataObject*>(a);
if (nobj == nullptr) continue;
QString objname = nobj->getDataObjectName();
if (name == objname)
{
match = true;
}
pos = regex.lastIndexIn(objname.toLower());
if (pos != 0) continue;
match = true;
//获取到最大id
QString ds = objname.mid(pos + preffix.size() + 1, name.size() - 1);
int d = ds.toInt();
maxid = d > maxid ? d : maxid;
}
//匹配到
if (match)
{
if (preffix.isEmpty())preffix = name;
return QString("%1-%2").arg(preffix).arg(maxid + 1);
}
return name;
}
}