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++

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.

#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;
}
}