/* * 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 . */ // KDE includes #include // Pokemod includes #include // PokeModr includes #include "ObjectUI.h" #include "MapUI.h" // Header include #include "TilemapModel.h" TilemapModel::TilemapModel(QObject* parent, Matrix* map, const Pokemod* pokemod) : QAbstractTableModel(parent), m_map(map), m_pokemod(pokemod) { } int TilemapModel::rowCount(const QModelIndex&) const { return m_map->height(); } int TilemapModel::columnCount(const QModelIndex&) const { return m_map->width(); } QVariant TilemapModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole) { int idx = m_pokemod->tileIndex(m_map->at(index.row(), index.column())); if (idx != INT_MAX) return m_pokemod->tile(idx)->sprite(); } if (role == Qt::EditRole) m_map->at(index.row(), index.column()); if (role == Qt::ToolTipRole) { int idx = m_pokemod->tileIndex(m_map->at(index.row(), index.column())); if (idx != INT_MAX) return m_pokemod->tile(idx)->name(); } return QVariant(); } QVariant TilemapModel::headerData(int section, Qt::Orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); return QString::number(section); } bool TilemapModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (role != Qt::EditRole) return false; (*m_map)(index.row(), index.column()) = m_pokemod->tile(value.toInt())->id(); emit(dataChanged(index, index)); return true; } Qt::ItemFlags TilemapModel::flags(const QModelIndex&) const { return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable; } bool TilemapModel::addRow() { return insertRows(m_map->height(), 1); } bool TilemapModel::addColumn() { return insertColumns(m_map->width(), 1); } bool TilemapModel::insertRows(int row, int count, const QModelIndex&) { emit(beginInsertRows(QModelIndex(), row, row + count)); if (m_map->width()) { for (int i = 0; i < count; ++i) m_map->insertRow(row); } else { m_map->addColumn(); insertColumns(0, 0); } emit(endInsertRows()); return true; } bool TilemapModel::insertColumns(int column, int count, const QModelIndex&) { emit(beginInsertColumns(QModelIndex(), column, column + count)); if (m_map->height()) { for (int i = 0; i < count; ++i) m_map->insertColumn(column); } else { m_map->addRow(); insertRows(0, 0); } emit(endInsertColumns()); return true; } bool TilemapModel::removeRows(int row, int count, const QModelIndex&) { if (m_map->height() == 1) removeColumns(0, m_map->width()); emit(beginRemoveRows(QModelIndex(), row, row + count - 1)); for (int i = 0; i < count; ++i) m_map->deleteRow(row); emit(endRemoveRows()); return true; } bool TilemapModel::removeColumns(int column, int count, const QModelIndex&) { if (m_map->width() == 1) removeRows(0, m_map->height()); emit(beginRemoveColumns(QModelIndex(), column, column + count - 1)); for (int i = 0; i < count; ++i) m_map->deleteColumn(column); emit(endRemoveColumns()); return true; }