///////////////////////////////////////////////////////////////////////////// // Name: pokegen/TilemapModel.cpp // Purpose: Provides a model for tiles in the tilemap editor // Author: Ben Boeckel // Modified by: Ben Boeckel // Created: Tue Feb 5 19:43:22 2008 // Copyright: ©2007-2008 Ben Boeckel and Nerdy Productions // Licence: // 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 . ///////////////////////////////////////////////////////////////////////////// #include #include #include #include "ObjectUI.h" #include "MapUI.h" #include "TilemapModel.h" TilemapModel::TilemapModel(QObject* parent, Matrix* tilemap, const Pokemod* mod) : QAbstractTableModel(parent), map(tilemap), pokemod(mod) { } int TilemapModel::rowCount(const QModelIndex&) const { return map->getHeight(); } int TilemapModel::columnCount(const QModelIndex&) const { return map->getWidth(); } QVariant TilemapModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole) { int idx = pokemod->getTileIndex(map->at(index.row(), index.column())); if (idx != INT_MAX) return ImageCache::open(pokemod->getTile(idx)->getPic()); } if (role == Qt::EditRole) map->at(index.row(), index.column()); if (role == Qt::ToolTipRole) { int idx = pokemod->getTileIndex(map->at(index.row(), index.column())); if (idx != INT_MAX) return pokemod->getTile(idx)->getName(); } 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; map->set(index.row(), index.column(), pokemod->getTile(value.toInt())->getId()); 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(map->getHeight(), 1); } bool TilemapModel::addColumn() { return insertColumns(map->getWidth(), 1); } bool TilemapModel::insertRows(int row, int count, const QModelIndex&) { emit(beginInsertRows(QModelIndex(), row, row + count)); if (map->getWidth()) { for (int i = 0; i < count; ++i) map->insertRow(row); } else { map->addCol(); insertColumns(0, 0); } emit(endInsertRows()); return true; } bool TilemapModel::insertColumns(int column, int count, const QModelIndex&) { emit(beginInsertColumns(QModelIndex(), column, column + count)); if (map->getHeight()) { for (int i = 0; i < count; ++i) map->insertCol(column); } else { map->addRow(); insertRows(0, 0); } emit(endInsertColumns()); return true; } bool TilemapModel::removeRows(int row, int count, const QModelIndex&) { if (map->getHeight() == 1) removeColumns(0, map->getWidth()); emit(beginRemoveRows(QModelIndex(), row, row + count - 1)); for (int i = 0; i < count; ++i) map->deleteRow(row); emit(endRemoveRows()); return true; } bool TilemapModel::removeColumns(int column, int count, const QModelIndex&) { if (map->getWidth() == 1) removeRows(0, map->getHeight()); emit(beginRemoveColumns(QModelIndex(), column, column + count - 1)); for (int i = 0; i < count; ++i) map->deleteCol(column); emit(endRemoveColumns()); return true; }