/* * 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 "PokemodTreeModel.h" // Model includes #include "models/RootModel.h" // Qt includes #include #include #include PokemodTreeModel::PokemodTreeModel(QObject* parent) : QAbstractItemModel(parent), m_root(new RootModel) { } PokemodTreeModel::~PokemodTreeModel() { delete m_root; } QVariant PokemodTreeModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); BaseModel* object = static_cast(index.internalPointer()); return object->data(role); } QVariant PokemodTreeModel::headerData(int /*section*/, Qt::Orientation /*orientation*/, int /*role = Qt::DisplayRole*/) const { return QVariant(); } QModelIndex PokemodTreeModel::index(int row, int /*column*/, const QModelIndex& parent) const { if (row < 0) return createIndex(row, 0, m_root); BaseModel* object = getItem(parent)->childItem(row); return createIndex(row, 0, object); } QModelIndex PokemodTreeModel::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 PokemodTreeModel::rowCount(const QModelIndex& parent) const { BaseModel* object = getItem(parent); return object->rowCount(); } int PokemodTreeModel::columnCount(const QModelIndex& /*parent*/) const { return 1; } Qt::ItemFlags PokemodTreeModel::flags(const QModelIndex& index) const { if (!index.isValid()) return 0; BaseModel* object = static_cast(index.internalPointer()); return object->flags(); } bool PokemodTreeModel::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(dataChanged(index, index)); emit(layoutChanged()); return success; } BaseModel* PokemodTreeModel::getItem(const QModelIndex& index) const { if (index.isValid()) { BaseModel* object = static_cast(index.internalPointer()); if (object) return object; } return m_root; } QStringList PokemodTreeModel::mimeTypes() const { return QStringList() << "application/x-pokemod+xml"; } QMimeData* PokemodTreeModel::mimeData(const QModelIndexList& indexes) const { QMimeData *mimeData = new QMimeData(); if ((indexes.size() == 1) && indexes[0].isValid()) { QDomDocument xml; xml.setContent(data(indexes[0], BaseModel::XmlRole).toString()); mimeData->setData("application/x-pokemod+xml", xml.toByteArray()); } return mimeData; } bool PokemodTreeModel::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-pokemod+xml")) return false; if (parent.isValid()) return setData(parent, data->data("application/x-pokemod+xml"), BaseModel::XmlRole); emit(layoutAboutToBeChanged()); bool success = m_root->setData(data->data("application/x-pokemod+xml"), BaseModel::XmlRole); emit(layoutChanged()); return success; } void PokemodTreeModel::addPokemod(Pokemod* pokemod) { m_root->addPokemod(pokemod); emit(reset()); } void PokemodTreeModel::deletePokemod(const Pokemod* pokemod) { m_root->deletePokemod(pokemod); emit(reset()); }