/* * Copyright 2008 Ben Boeckel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Header include #include "SigmodTreeModel.h" // Model includes #include "models/RootModel.h" // Sigmod includes #include "../sigmod/Sigmod.h" // Qt includes #include #include #include Sigmodr::SigmodTreeModel::SigmodTreeModel(QObject* parent) : QAbstractItemModel(parent), m_root(new RootModel) { connect(m_root, SIGNAL(rowsChanged(QList)), this, SLOT(rowsChanged(QList))); } Sigmodr::SigmodTreeModel::~SigmodTreeModel() { delete m_root; } QVariant Sigmodr::SigmodTreeModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); BaseModel* object = static_cast(index.internalPointer()); return object->data(role); } QVariant Sigmodr::SigmodTreeModel::headerData(int /*section*/, Qt::Orientation /*orientation*/, int /*role = Qt::DisplayRole*/) const { return QVariant(); } QModelIndex Sigmodr::SigmodTreeModel::index(int row, int column, const QModelIndex& parent) const { if ((row < -1) || (column < -1)) return QModelIndex(); if (row == -1) return createIndex(row, 0, m_root); BaseModel* model = getItem(parent); if ((model->rowCount() <= row) || (1 <= column)) return QModelIndex(); BaseModel* object = model->childItem(row); return createIndex(row, 0, object); } QModelIndex Sigmodr::SigmodTreeModel::parent(const QModelIndex& index) const { if (!index.isValid()) return QModelIndex(); BaseModel* parent = static_cast(index.internalPointer())->parent(); if (!parent || (parent == m_root)) return QModelIndex(); return createIndex(parent->indexNumber(), 0, parent); } int Sigmodr::SigmodTreeModel::rowCount(const QModelIndex& parent) const { BaseModel* object = getItem(parent); return object->rowCount(); } int Sigmodr::SigmodTreeModel::columnCount(const QModelIndex& /*parent*/) const { return 1; } Qt::ItemFlags Sigmodr::SigmodTreeModel::flags(const QModelIndex& index) const { if (!index.isValid()) return 0; BaseModel* object = static_cast(index.internalPointer()); return object->flags(); } bool Sigmodr::SigmodTreeModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (!index.isValid()) return false; BaseModel* object = static_cast(index.internalPointer()); emit(layoutAboutToBeChanged()); bool success = object->setData(value, role); emit(layoutChanged()); if (success) { emit(dataChanged(index, index)); emit(dirty(findSigmod(index), true)); } return success; } Sigmodr::BaseModel* Sigmodr::SigmodTreeModel::getItem(const QModelIndex& index) const { if (index.isValid()) { BaseModel* object = static_cast(index.internalPointer()); if (object) return object; } return m_root; } QStringList Sigmodr::SigmodTreeModel::mimeTypes() const { return QStringList() << "application/x-sigmod+xml"; } QMimeData* Sigmodr::SigmodTreeModel::mimeData(const QModelIndexList& indexes) const { QMimeData *mimeData = new QMimeData(); if ((indexes.size() == 1) && indexes[0].isValid()) { QDomDocument xml; xml.setContent(data(indexes[0], Sigmodr::BaseModel::XmlRole).toString()); mimeData->setData("application/x-sigmod+xml", xml.toByteArray()); } return mimeData; } bool Sigmodr::SigmodTreeModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int /*row*/, int /*column*/, const QModelIndex& parent) { if (action == Qt::IgnoreAction) return true; if (!data->hasFormat("application/x-sigmod+xml")) return false; if (parent.isValid()) return setData(parent, data->data("application/x-sigmod+xml"), Sigmodr::BaseModel::XmlRole); emit(layoutAboutToBeChanged()); bool success = m_root->setData(data->data("application/x-sigmod+xml"), Sigmodr::BaseModel::XmlRole); emit(layoutChanged()); if (success) emit(dirty(findSigmod(parent), true)); return success; } void Sigmodr::SigmodTreeModel::addSigmod(Sigmod::Sigmod* sigmod) { m_root->addSigmod(sigmod); reset(); } void Sigmodr::SigmodTreeModel::deleteSigmod(const Sigmod::Sigmod* sigmod) { m_root->deleteSigmod(sigmod); reset(); } const Sigmod::Sigmod* Sigmodr::SigmodTreeModel::findSigmod(const QModelIndex& index) const { QModelIndex curIndex = index; QModelIndex parIndex = parent(curIndex); while (parIndex.isValid()) { curIndex = parIndex; parIndex = parent(curIndex); } return qobject_cast(getItem(curIndex)->object()); } void Sigmodr::SigmodTreeModel::rowsChanged(const QList& rows) { QModelIndex curIndex; foreach (int row, rows) curIndex = index(row, 0, curIndex); if (curIndex.isValid()) { emit(dataChanged(curIndex, curIndex)); emit(dirty(findSigmod(curIndex), true)); } else reset(); }