This repository has been archived on 2023-08-11. You can view files and clone it, but cannot push or open issues or pull requests.
verticallite/treeloodsmanmodel.cpp

554 lines
18 KiB
C++
Raw Permalink 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.

#include "treeloodsmanmodel.h"
#include "loodsmansystem.h"
#include "converttype.h"
#include <QMessageBox>
#include <QDebug>
#include <QStandardItemModel>
#include <QDateTime>
TreeLoodsmanModel::TreeLoodsmanModel(TreeItem *parent) :
QAbstractItemModel(parent)
{
m_root = new TreeItem(0);
dataSet = new MidasData();
}
TreeLoodsmanModel::~TreeLoodsmanModel()
{
delete dataSet;
}
int TreeLoodsmanModel::columnCount(const QModelIndex& parent) const
{
Q_UNUSED(parent);
return m_fieldNames.count();
}
TreeItem *TreeLoodsmanModel::getItem(const QModelIndex & index) const
{
if (index.isValid())
return static_cast<TreeItem*>(index.internalPointer());
else
return m_root;
}
QVariant TreeLoodsmanModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid() || role != Qt::DisplayRole)
return QVariant();
if(role == Qt::DisplayRole){
TreeItem *item = getItem(index);
if (item)
return m_data[item->id]->at(index.column());
}
return QVariant();
}
bool TreeLoodsmanModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
Q_UNUSED(value);
Q_UNUSED(index);
if (role != Qt::EditRole)
return false;
return 0;
}
Qt::ItemFlags TreeLoodsmanModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;
Qt::ItemFlags fl = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
/*if ( d->isEditable( index.internalId(), index.column() ) )
fl |= Qt::ItemIsEditable;*/
return fl;
}
QVariant TreeLoodsmanModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if ( orientation == Qt::Horizontal && role == Qt::DisplayRole) {
return m_fieldNames.at(section);
}
return QVariant();
}
bool TreeLoodsmanModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
{
Q_UNUSED(value);
Q_UNUSED(section);
if (role != Qt::EditRole || orientation != Qt::Horizontal)
return false;
return false;
}
QModelIndex TreeLoodsmanModel::index(int row, int column, const QModelIndex &parent) const
{
if(!hasIndex(row, column, parent))
return QModelIndex();
const TreeItem* parentItem = getItem(parent);
if (!parentItem)
return QModelIndex();
TreeItem* childItem = parentItem->childAt(row);
if (childItem)
return createIndex(row, column, (void*)childItem);
else
return QModelIndex();
}
QModelIndex TreeLoodsmanModel::parent(const QModelIndex &index) const
{
if(!index.isValid())
return QModelIndex();
const TreeItem *childItem = getItem(index);
TreeItem *parentItem = childItem->parent();
if (!parentItem || parentItem == m_root)
return QModelIndex();
TreeItem *grandparent = parentItem->parent();
if (!grandparent)
return QModelIndex();
for (int i = 0; i < grandparent->childCount(); i++)
if (grandparent->childAt(i) == parentItem)
return createIndex(i, 0, (void*) parentItem);
return QModelIndex();
}
int TreeLoodsmanModel::rowCount(const QModelIndex &parent) const
{
if(parent.column() > 0)
return 0;
/*if(getItem(parent)->canFetchMore()){
TreeItem* item = parent.isValid()? static_cast<TreeItem*>(parent.internalPointer()) : m_root;
if(item)
item->populateChildren();
}*/
return getItem(parent)->childCount();
}
bool TreeLoodsmanModel::hasChildren(const QModelIndex & parent) const
{
Q_UNUSED(parent);
//bool result = getItem(parent)->hasChildren();
return getItem(parent)->hasChildren();
}
bool TreeLoodsmanModel::canFetchMore(const QModelIndex &parent) const
{
return getItem(parent)->canFetchMore();
}
void TreeLoodsmanModel::fetchMore(const QModelIndex &parent)
{
LoodsmanSystem* loodsman = LoodsmanSystem::instance();
VARIANT inErrorCode;
VARIANT stErrorMessage;
TreeItem *item;
if(parent.isValid()){
item = getItem(parent);
if(!item)
return;
_variant_t data = loodsman->main->GetTree2(item->id,
to_bstr_t(m_linkType),
0,
&inErrorCode, &stErrorMessage);
dataSet->setData((unsigned char *)data.parray->pvData);
}else{
item = m_root;
_variant_t data = loodsman->main->GetProjectList2(item->id,&inErrorCode, &stErrorMessage);
dataSet->setData((unsigned char *)data.parray->pvData);
}
if (inErrorCode.lVal!=0)
QMessageBox::warning(NULL, tr("Ошибка соединения"), from_bstr_t(stErrorMessage.bstrVal));
for (int i=0;i<dataSet->recordCount();i++){
if (i==0)
dataSet->first();
else
dataSet->next();
int childId = dataSet->fieldValue(QString("_ID_VERSION")).toInt();
TreeItem *childItem = new TreeItem(childId,item);
QList<QVariant>* listData = new QList<QVariant>;
// Запись данных
if (m_data[childId] == NULL){
if (item->id == 0)
for ( int j=0; j < m_prjFieldNames.count(); j++ ){
listData->append(dataSet->fieldValue(m_prjFieldNames[j]));
}
else
for ( int j=0; j < m_fieldNames.count(); j++ ){
listData->append(dataSet->fieldValue(m_fieldNames[j]));
}
m_data[childId] = listData;
}
item->append(childItem);
}
dataSet->clear();
item->setFectMore(true);
// Обновление
if (item->id == 0)
beginInsertRows(QModelIndex(), 0, item->childCount());
else
beginInsertRows(parent, 0, item->childCount());
endInsertRows();
}
void TreeLoodsmanModel::fetchMoreAttr(const QModelIndex &parent)
{
TreeItem *item;
if(parent.isValid()){
item = getItem(parent);
if(!item)
return;
}
long objId = item->id;
if (m_attrVal.contains(objId))
return;
LoodsmanSystem* loodsman = LoodsmanSystem::instance();
VARIANT inErrorCode;
VARIANT stErrorMessage;
/* ЗАГРУЖАЕТ ВСЕ АТРИБУТЫ ВЫБРАННОГО ТИПА БЕЗ ЗНАЧЕНИЙ */
AttrMap attrMap;
long typeId = data(parent.sibling(parent.row(),fieldIndex("_ID_TYPE"))).toInt();
if (typeId >0){
QList<long> listIdAttr = m_typeModel->listAttr(typeId);
for (int i=0;i<listIdAttr.count();i++){
long idAttr = listIdAttr.value(i);
QList<QVariant> listData;
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_NAME")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ID")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ATTRTYPE")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_DEFAULT")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_LIST")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ACCESSLEVEL")));
// isAttrLink
listData.append(false);
attrMap.insert(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_NAME")).toString(),
listData);
}
}
long parentTypeId = data(parent.parent().sibling(parent.parent().row(),fieldIndex("_ID_TYPE"))).toInt();
long linkId = data(parent.sibling(parent.row(),fieldIndex("_ID_LINKTYPE"))).toInt();
if (typeId >0 && parentTypeId>0 && linkId>0){
QString objLink = m_linkModel->data(linkId,m_linkModel->fieldIndex("_NAME")).toString();
QList<long> listIdAttr = m_typeModel->listAttrLink(typeId,parentTypeId,objLink);
for (int i=0;i<listIdAttr.count();i++){
long idAttr = listIdAttr.value(i);
QList<QVariant> listData;
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_NAME")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ID")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ATTRTYPE")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_DEFAULT")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_LIST")));
listData.append(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_ACCESSLEVEL")));
// isAttrLink
listData.append(true);
attrMap.insert(m_attrModel->data(idAttr,m_attrModel->fieldIndex("_NAME")).toString(),
listData);
}
}
/* ЗАГРУЖАЕТ ЗНАЧЕНИЕ АТРИБУТОВ
0 - строковое значение;
1 - целочисленное значение;
2 - действительное число;
3 - дата и время;
5 - текст;
6 - изображение);
0 - BSTR
1 - int
2 - double
3 - DateTime
5 - массив байт (Значение представляет собой одномерный вариантный массив (тип VT_UI1 (VC++), varByte(Delphi)))
6 - массив байт (Значение представляет собой одномерный вариантный массив (тип VT_UI1 (VC++), varByte(Delphi)))
*/
long objLinkId = data(parent.sibling(parent.row(),fieldIndex("_ID_LINK"))).toInt();
_variant_t testData = loodsman->main->GetAttributesValues2(
to_bstr_t(QString("%1").arg(objId)),
"",&inErrorCode, &stErrorMessage);
unsigned char *p = (unsigned char *)testData.parray->pvData;
MidasData* mData = new MidasData();
mData->setData(p);
if (mData->first()){
do{
QString name = mData->fieldValue("_NAME").toString();
QList<QVariant> listData = attrMap.value(name);
QStringList list;
QDateTime dt;
switch (listData.at(2).toInt()) {
case 0:
listData.append(mData->fieldValue("_VALUE").toString());
break;
case 1:
listData.append(mData->fieldValue("_VALUE").toInt());
break;
case 2:
listData.append(mData->fieldValue("_VALUE").toDouble());
break;
case 3:
list = mData->fieldValue("_VALUE").toString().split(QRegExp("\\s+"));
if (list.count()>0)
dt.setDate(QDate::fromString(list.at(0),"dd.MM.yyyy"));
if (list.count()>1)
dt.setTime(QTime::fromString(list.at(1),"HH:mm"));
listData.append(dt);
break;
default:
listData.append(mData->fieldValue("_VALUE"));
}
listData.append(mData->fieldValue("_ID_UNIT"));
listData.append(mData->fieldValue("_UNIT"));
attrMap[name] = listData;
}while (mData->next());
}
if (objLinkId > 0)
{
testData = loodsman->main->GetLinkAttributes(
objLinkId,
&inErrorCode, &stErrorMessage);
p = (unsigned char *)testData.parray->pvData;
mData->clear();
mData->setData(p);
if (mData->first()){
do{
QString name = mData->fieldValue("_NAME").toString();
QList<QVariant> listData = attrMap.value(name);
QStringList list;
QDateTime dt;
switch (listData.at(2).toInt()) {
case 0:
listData.append(mData->fieldValue("_VALUE").toString());
break;
case 1:
listData.append(mData->fieldValue("_VALUE").toInt());
break;
case 2:
listData.append(mData->fieldValue("_VALUE").toDouble());
break;
case 3:
list = mData->fieldValue("_VALUE").toString().split(QRegExp("\\s+"));
if (list.count()>0)
dt.setDate(QDate::fromString(list.at(0),"dd.MM.yyyy"));
if (list.count()>1)
dt.setTime(QTime::fromString(list.at(1),"HH:mm"));
listData.append(dt);
break;
default:
listData.append(mData->fieldValue("_VALUE"));
}
listData.append(mData->fieldValue("_ID_UNIT"));
listData.append(mData->fieldValue("_UNIT"));
attrMap[name] = listData;
}while (mData->next());
}
}
m_attrVal.insert(objId,attrMap);
}
QStringList TreeLoodsmanModel::fields(bool isProject)
{
return (isProject)?m_prjFieldNames:m_fieldNames;
}
void TreeLoodsmanModel::setFields(const QStringList &dataFields, bool isProject)
{
if (isProject)
m_prjFieldNames = dataFields;
else
m_fieldNames = dataFields;
}
void TreeLoodsmanModel::setLinkType(const QStringList &linkType)
{
foreach(QString linkName,linkType){
if (m_linkType.isEmpty())
m_linkType = linkName;
else
m_linkType = m_linkType + QString(char(1)) + linkName;
}
}
QAbstractItemModel* TreeLoodsmanModel::getAttrModel(const QModelIndex &parent)
{
fetchMoreAttr(parent);
TreeItem *item;
if(parent.isValid()){
item = getItem(parent);
if(!item)
return 0;
}
QStandardItemModel* attrModel = new QStandardItemModel(0,10);
attrModel->setHeaderData(0, Qt::Horizontal, tr("_NAME"));
attrModel->setHeaderData(1, Qt::Horizontal, tr("_ID"));
attrModel->setHeaderData(2, Qt::Horizontal, tr("_ATTRTYPE"));
attrModel->setHeaderData(3, Qt::Horizontal, tr("_DEFAULT"));
attrModel->setHeaderData(4, Qt::Horizontal, tr("_LIST"));
attrModel->setHeaderData(5, Qt::Horizontal, tr("_ACCESSLEVEL"));
attrModel->setHeaderData(6, Qt::Horizontal, tr("_ISATTRLINK"));
attrModel->setHeaderData(7, Qt::Horizontal, tr("_VALUE"));
attrModel->setHeaderData(8, Qt::Horizontal, tr("_ID_UNIT"));
attrModel->setHeaderData(9, Qt::Horizontal, tr("_UNIT"));
QStandardItem *parentItem = attrModel->invisibleRootItem();
QStandardItem *oitem = new QStandardItem(tr("Атрибуты объекта"));
parentItem->appendRow(oitem);
QStandardItem *litem = new QStandardItem(tr("Атрибуты связи"));
parentItem->appendRow(litem);
long objId = item->id;
foreach (QList<QVariant> value, m_attrVal.value(objId)){
QList<QStandardItem *> listoitem;
for (int i=0;i<10;i++){
QStandardItem *item = new QStandardItem();
if (i<value.count())
item->setData(value.at(i), Qt::EditRole);
else
if (i==7)
switch (value.at(2).toInt()) {
case 0:
item->setData(QVariant::String, Qt::EditRole);
break;
case 1:
item->setData(QVariant::Int, Qt::EditRole);
break;
case 2:
item->setData(QVariant::Double, Qt::EditRole);
break;
case 3:
item->setData(QVariant::DateTime, Qt::EditRole);
break;
default:
item->setData(QVariant::String, Qt::EditRole);
}
else
item->setData(QVariant::String, Qt::EditRole);
listoitem << item;
}
if (value.at(6)==true)
litem->appendRow(listoitem);
else
oitem->appendRow(listoitem);
}
attrModel->submit();
/*QStandardItemModel* model = new QStandardItemModel();
QStandardItem *parentItem = model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
parentItem->appendRow(item);
parentItem = item;
}
return model;*/
return attrModel;
}
AttrMap TreeLoodsmanModel::attrMap(const QModelIndex &parent)
{
fetchMoreAttr(parent);
TreeItem *item;
if(parent.isValid()){
item = getItem(parent);
if(!item)
return AttrMap();
}
long objId = item->id;
return m_attrVal.value(objId);
}
long TreeLoodsmanModel::fieldIndex(const QString &fieldName, bool isProject)
{
if (isProject){
for (long i = 0;i<m_prjFieldNames.count();i++)
if (m_prjFieldNames.at(i)==fieldName)
return i;
}else{
for (long i = 0;i<m_fieldNames.count();i++)
if (m_fieldNames.at(i)==fieldName)
return i;
}
return -1;
}
void TreeLoodsmanModel::setTypeModel(TypeLoodsmanModel *model)
{
m_typeModel = model;
}
void TreeLoodsmanModel::setLinkModel(LinkLoodsmanModel *model)
{
m_linkModel = model;
}
void TreeLoodsmanModel::setStatModel(StatLoodsmanModel *model)
{
m_statModel = model;
}
void TreeLoodsmanModel::setAttrModel(AttrLoodsmanModel *model)
{
m_attrModel = model;
}
void TreeLoodsmanModel::select()
{
QStringList prjFields;
prjFields << "_ID_VERSION" << "_PRODUCT" << "_ID_TYPE" << "_ID_STATE"
<< "_HAS_LINK" << "_ID_LOCK" << "_VERSION" << "_ACCESSLEVEL"
<< "_REVISION" << "_ID_LINKTYPE";
setFields(prjFields,true);
QStringList fields;
fields << "_ID_VERSION" << "_PRODUCT" << "_ID_TYPE" <<"_ID_STATE"
<< "_HAS_LINK" << "_ID_LOCK" << "_VERSION" << "_ACCESSLEVEL"
<< "_ID_LINK" << "_ID_LINKTYPE";
setFields(fields,false);
QStringList linkList;
m_linkModel->fetchMore(QModelIndex());
for (int row = 0; row < m_linkModel->rowCount(); row++){
QModelIndex indexName = m_linkModel->index(row, m_linkModel->fieldIndex("_NAME"));
QModelIndex indexType = m_linkModel->index(row, m_linkModel->fieldIndex("_TYPE"));
if (m_linkModel->data(indexType)==0)
linkList << m_linkModel->data(indexName).toString();
}
setLinkType(linkList);
}