/* * 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 PokemodTreeModel::PokemodTreeModel(const QStringList& pokemods, QObject* parent) : QAbstractItemModel(parent) { emit(layoutAboutToBeChanged()); m_root = new RootModel(QList()); emit(layoutChanged()); } 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* object = static_cast(index.internalPointer()); BaseModel* parent = object->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; } bool PokemodTreeModel::insertRows(int /*position*/, int rows, const QModelIndex& parent) { BaseModel* object = getItem(parent); if (!object->canInsertRows()) return false; emit(layoutAboutToBeChanged()); bool success = object->insertRows(rows); emit(layoutChanged()); return success; } bool PokemodTreeModel::removeRows(int position, int rows, const QModelIndex& parent) { BaseModel* object = getItem(parent); if (!object->canRemoveRows()) return false; emit(layoutAboutToBeChanged()); bool success = object->removeRows(position, rows); 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; }