#include <QMetaObject>
#include <QMimeData>
#include "QtTreeModelBase.h"
#include "ObjectBase.h"
const QString MimeType
= "cObjectBase.xml";
QTreeModelBase
::QTreeModelBase(QString columnName, cObjectBase
*root,
QObject *parent
) : {
mColumnName = columnName;
mpRootItem = root;
}
void QTreeModelBase::ResetRoot(cObjectBase* root)
{
mpRootItem = root;
}
Qt
::ItemFlags QTreeModelBase
::flags(const QModelIndex &index
) const{
return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable;
}
{
if( !index.isValid() )
cObjectBase* pItem = GetBaseObject(index);
if(!pItem)
{
}
if( role == Qt::DisplayRole )
{
switch( index.column() )
{
case 0:
{
QString name
= pItem
->objectName
();
return name;
}
break;
default:
break;
}
}
}
QVariant QTreeModelBase
::headerData(int section, Qt
::Orientation orientation,
int role
) const {
if( role != Qt::DisplayRole || orientation != Qt::Horizontal )
switch( section )
{
case 0:
return mColumnName;
default:
}
}
int QTreeModelBase
::rowCount(const QModelIndex &parent
) const {
if (parent.isValid() && parent.column() != 0)
return 0;
cObjectBase* pParentItem = GetBaseObject(parent);
return pParentItem ? pParentItem->ChildCount(false) : 0;
}
int QTreeModelBase
::columnCount(const QModelIndex &parent
) const {
return 1; //parent.isValid() ? 1 : 0;
}
{
if (!mpRootItem || row < 0 || column < 0 || column >= 1 || (parent.isValid() && parent.column() != 0))
cObjectBase* pParentItem = GetBaseObject(parent);
Q_ASSERT(pParentItem);
cObjectBase* pItem = pParentItem->ChildAt(row);
if(pItem)
{
return index;
}
}
{
if( !index.isValid() )
cObjectBase* pChildItem = GetBaseObject(index);
if(pChildItem)
{
cObjectBase* pParentItem = static_cast<cObjectBase*>(pChildItem->GetParent());
if(pParentItem)
{
if(pParentItem == mpRootItem)
{
}
cObjectBase* pGrandParentItem = static_cast<cObjectBase*>(pParentItem->GetParent());
if(pGrandParentItem)
{
int row = pGrandParentItem->RowOfChild(pParentItem);
return createIndex(row, 0, pParentItem);
}
}
}
}
cObjectBase* QTreeModelBase::GetBaseObject(const QModelIndex& index ) const
{
if( !index.isValid() )
{
return mpRootItem;
}
return static_cast<cObjectBase*>( index.internalPointer() );
}
bool QTreeModelBase
::removeRows(int row,
int count,
const QModelIndex &parent
) {
if(!mpRootItem)
{
return false;
}
cObjectBase* pItem = parent.isValid() ? GetBaseObject(parent) : mpRootItem;
beginRemoveRows(parent, row, row + count - 1);
for (int i = 0; i < count; ++i)
{
/*delete */pItem->TakeChild(row);
}
endRemoveRows();
layoutChanged();
return true;
}
QModelIndex QTreeModelBase
::GetObjectIndex(cObjectBase
* pObjectBase,
const QModelIndex
& parent
) {
int myRowCount = rowCount(parent);
for(int row = 0; row < myRowCount; ++row)
{
if(i.isValid())
{
cObjectBase* pObject = GetBaseObject(i);
if(pObject == pObjectBase)
{
return i;
}
if(r.isValid())
{
cObjectBase* pObj = GetBaseObject(i);
if(pObj == pObjectBase)
{
return r;
}
}
}
}
}
QModelIndex QTreeModelBase
::GetObjectIndex(cObjectBase
* pObjectBase
) {
cObjectBase* pParentObject = pObjectBase->GetParent();
QList<cObjectBase*> parentsList;
while(pParentObject && pParentObject != mpRootItem)
{
parentsList.push_front(pParentObject);
pParentObject = pParentObject->GetParent();
}
if(!parentsList.isEmpty())
{
cObjectBase* pCurrentItem = (*parentsList.begin());
parentsList.pop_front();
parentIndex = GetObjectIndex(pCurrentItem, parentIndex);
while(pCurrentItem && !parentsList.isEmpty())
{
pCurrentItem = (*parentsList.begin());
parentsList.pop_front();
parentIndex = GetObjectIndex(pCurrentItem, parentIndex);
}
}
return returnIndex;
}
void QTreeModelBase::Reset(cObjectBase* pObjectBase)
{
beginResetModel();
ResetRoot(pObjectBase);
endResetModel();
}
{
}
QMimeData* QTreeModelBase
::mimeData(const QModelIndexList
&indexes
) const {
Q_ASSERT(indexes.count());
if (indexes.count() != 1)
{
return NULL;
}
cObjectBase* pItem = GetBaseObject(indexes.at(0));
if(pItem)
{
QXmlStreamWriter writer(&xmlData);
WriteObjectAndChildren(&writer, pItem);
static const int MaxCompression = 9;
pMimeData->setData(MimeType, qCompress(xmlData, MaxCompression));
return pMimeData;
}
return NULL;
}
bool QTreeModelBase
::dropMimeData(const QMimeData *mimeData, Qt
::DropAction action,
int row,
int column,
const QModelIndex &parent
) {
if (action == Qt::IgnoreAction)
return true;
if (action != Qt::MoveAction || column > 0 || !mimeData || !mimeData->hasFormat(MimeType))
return false;
cObjectBase* pItem = GetBaseObject(parent);
if(pItem)
{
QByteArray xmlData
= qUncompress
(mimeData
->data
(MimeType
));
QXmlStreamReader reader(xmlData);
if (row == -1)
{
row = parent.isValid() ? parent.row() : mpRootItem->ChildCount(true);
}
beginInsertRows(parent, row, row);
bool bDropped = ReadObjects(&reader, pItem);
endInsertRows();
return bDropped;
}
return false;
}
void QTreeModelBase::WriteObjectAndChildren(QXmlStreamWriter* pWriter, cObjectBase* pItem) const
{
if(pItem != mpRootItem)
{
pItem->WriteToXML(pWriter, false, true);
}
}
bool QTreeModelBase::ReadObjects(QXmlStreamReader* pReader, cObjectBase* pItem)
{
while(!pReader->atEnd())
{
pReader->readNext();
if(pReader->isStartElement())
{
if(pReader->name() == cObjectBase::ObjectTag)
{
cObjectBase* pNewObject = new cObjectBase(NULL);
pNewObject->ReadAttributesFromXML(pReader, true);
pItem->AddChild(pNewObject);
pItem = pNewObject;
}
}
else if(pReader->isEndElement())
{
if(pReader->name() == cObjectBase::ObjectTag)
{
Q_ASSERT(pItem);
pItem = pItem->GetParent();
Q_ASSERT(pItem);
}
}
}
return true;
}