DPS/DataPlatform/DataManager.cpp

208 lines
4.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma execution_character_set("utf-8")
#include "DataManager.h"
#include "M_ProjectDAO.h"
#include "ProjectData.h"
#include "global.h"
#include "DictItem.h"
#include "DictData.h"
DataManager& GetDataRoot()
{
static DataManager dataMgr;
return dataMgr;
}
DataManager::DataManager()
{
// pTheDBPlatform = new DBPlatformSpace::DBPlatformNew();
platformData.insert(DataType::project, mapProject);
platformData.insert(DataType::dataModel, mapDataModel);
platformData.insert(DataType::dataPack, mapDataPack);
platformData.insert(DataType::dataClass, mapDataClass);
platformData.insert(DataType::dataAttribute, mapDataAttribute);
}
DataManager::~DataManager()
{
if (pTheDBPlatform)
{
delete pTheDBPlatform;
pTheDBPlatform = nullptr;
}
// //清空最近打开项目
// while (!lastProject.isEmpty())
// {
// DPData* pdata = lastProject.back();
// delete pdata;
// pdata = nullptr;
// }
}
//添加一个下层数据对象
bool DataManager::addChild(DPData* pNewData)
{
//数据存入数据库
if (pNewData->saveSelf())
{
pNewData->_id = pNewData->_pDBDAO->_ID;
//保存成功
//添加数据到内存数据模型
_childrenMap.insert(pNewData->_id, pNewData);
//加入数据map
insertDataMap(DataType::project, pNewData->_id, pNewData);
return true;
}
else {
//保存失败
return false;
}
}
/*删除一个项目*/
bool DataManager::deleteChild(unsigned int id)
{
if (_childrenMap.remove(id))
{
return true;
}
return false;
}
/*获取所有下层数据对象*/
void DataManager::getAllChildren(DPData*, bool)
{
const int MINCOUNT = 2; //最多显示两个项目
using namespace DBPlatformSpace;
//获取所有的项目
std::list<M_ProjectDAO*> projectList;
ResultMsg rm = M_ProjectDAO::FindAll(projectList);
if (rm.rCode != 0)
{
LOG(INFO) << CommonHelper::utf8ToStdString("M_ProjectDAO::FindAll failed");
LOG(INFO) << rm.rMsg;
return;
}
LOG(INFO) << CommonHelper::utf8ToStdString("M_ProjectDAO::FindAll success");
//最近打开项目最多两个,如果只有一个显示一个
int listSize = static_cast<int>(projectList.size());
int lastCount = listSize> MINCOUNT ? MINCOUNT : listSize;
int addLastlist = 0;
lastProject.clear();
for (list<M_ProjectDAO*>::iterator it = projectList.begin(); it != projectList.end(); ++it)
{
ProjectData* pNew;
bool addto = false;
if (_childrenMap.contains((*it)->_ID))
{
pNew = qobject_cast<ProjectData*>(_childrenMap.value((*it)->_ID));
}
else
{
pNew = new ProjectData();
addto = true;
}
pNew->loadData(*it);
pNew->_parent = this;
if (addto)
{
_childrenMap.insert(pNew->_id, pNew);
insertDataMap(DataType::project, pNew->_id, pNew);
}
if (addLastlist < lastCount)
{
lastProject.append(pNew);
addLastlist++;
}
}
}
void DataManager::insertDataMap(DataType type, unsigned int id, DPData* pData)
{
platformData[type].insert(id, pData);
}
void DataManager::deleteInDataMap(DataType type, unsigned int id)
{
platformData[type].remove(id);
}
DPData* DataManager::findObjectById(DataType type, int id)
{
QMap<unsigned int, DPData*> map = platformData.value(type);
if (map.contains(id))
{
return platformData.value(type).value(id);
}
else
{
return nullptr;
}
}
//转换类型
DataManager::DataType DataManager::transformType(int type)
{
if (type == g_TYPE_DATAPACK)
{
return DataManager::DataType::dataPack;
}
else if (type == g_TYPE_DATACLASS)
{
return DataManager::DataType::dataClass;
}
else if (type == g_TYPE_DATAATTRUBUTE)
{
return DataManager::DataType::dataAttribute;
}
else if (type == g_TYPE_SCENEINFO)
{
return DataManager::DataType::scene;
}
}
//指定数据模型下查找数据type的指定属性名称或名称标识值的数据
//返回同名数据
DPData* DataManager::findobjectByNameInDatamodel(int type, QString propertyName, QString name, int dataModelId)
{
//目标类型数据map
QMap<unsigned int, DPData*> dstDataMap = platformData.value(transformType(type));
QMap<unsigned int, DPData*>::iterator it = dstDataMap.begin();
while (it != dstDataMap.end())
{
QString vName = (*it)->property(CommonHelper::qstringToString(propertyName)).toString();
if (vName == name)
{
DPData* pData = *it;
//看是否是同一数据模型
if (pData->getDataModelOwner()->_id == dataModelId )
{
return (*it);
}
}
it++;
}
return nullptr;
}
void DataManager::getDataMap(DataType type, QMap<unsigned int, DPData*>& map)
{
map = platformData.value(type);
}
void DataManager::clearAllProject()
{
qDeleteAll(_childrenMap);
_childrenMap.clear();
}