mirror of
https://github.com/huderlem/porymap.git
synced 2026-09-16 21:05:47 -05:00
use custom model for encounter tables
This commit is contained in:
198
src/ui/encountertablemodel.cpp
Normal file
198
src/ui/encountertablemodel.cpp
Normal file
@@ -0,0 +1,198 @@
|
||||
#include "encountertablemodel.h"
|
||||
#include "editor.h"
|
||||
|
||||
|
||||
|
||||
EncounterTableModel::EncounterTableModel(WildMonInfo info, EncounterFields fields, int index, QObject *parent) : QAbstractTableModel(parent) {
|
||||
this->fieldIndex = index;
|
||||
this->encounterFields = fields;
|
||||
this->monInfo = info;
|
||||
|
||||
this->resize(this->monInfo.wildPokemon.size(), ColumnType::Count);
|
||||
|
||||
this->slotRatios = fields[fieldIndex].encounterRates;
|
||||
|
||||
for (int r = 0; r < this->numRows; r++) {
|
||||
this->groupNames.append(QString());
|
||||
this->slotPercentages.append(0.0);
|
||||
}
|
||||
|
||||
if (!this->encounterFields[this->fieldIndex].groups.empty()) {
|
||||
for (auto groupKeyPair : fields[fieldIndex].groups) {
|
||||
int groupTotal = 0;
|
||||
for (int i : groupKeyPair.second) {
|
||||
this->groupNames[i] = groupKeyPair.first;
|
||||
groupTotal += this->slotRatios[i];
|
||||
}
|
||||
for (int i : groupKeyPair.second) {
|
||||
this->slotPercentages[i] = static_cast<double>(this->slotRatios[i]) / static_cast<double>(groupTotal);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int groupTotal = 0;
|
||||
for (int chance : this->encounterFields[this->fieldIndex].encounterRates) {
|
||||
groupTotal += chance;
|
||||
}
|
||||
for (int i = 0; i < this->slotPercentages.count(); i++) {
|
||||
this->slotPercentages[i] = static_cast<double>(this->slotRatios[i]) / static_cast<double>(groupTotal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EncounterTableModel::resize(int rows, int cols) {
|
||||
this->numRows = rows;
|
||||
this->numCols = cols;
|
||||
}
|
||||
|
||||
int EncounterTableModel::rowCount(const QModelIndex &) const {
|
||||
return this->numRows;
|
||||
}
|
||||
|
||||
int EncounterTableModel::columnCount(const QModelIndex &) const {
|
||||
return this->numCols;
|
||||
}
|
||||
|
||||
QVariant EncounterTableModel::data(const QModelIndex &index, int role) const {
|
||||
int row = index.row();
|
||||
int col = index.column();
|
||||
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch (col) {
|
||||
case ColumnType::Slot:
|
||||
return row;
|
||||
|
||||
case ColumnType::Group:
|
||||
return this->groupNames[row];
|
||||
|
||||
case ColumnType::Species:
|
||||
return this->monInfo.wildPokemon[row].species;
|
||||
|
||||
case ColumnType::MinLevel:
|
||||
return this->monInfo.wildPokemon[row].minLevel;
|
||||
|
||||
case ColumnType::MaxLevel:
|
||||
return this->monInfo.wildPokemon[row].maxLevel;
|
||||
|
||||
case ColumnType::EncounterChance:
|
||||
return QString::number(this->slotPercentages[row] * 100.0, 'f', 2) + "%";
|
||||
|
||||
case ColumnType::SlotRatio:
|
||||
return this->slotRatios[row];
|
||||
|
||||
case ColumnType::EncounterRate:
|
||||
if (row == 0) {
|
||||
return this->monInfo.encounterRate;
|
||||
} else {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
default:
|
||||
return QString();
|
||||
}
|
||||
}
|
||||
else if (role == Qt::EditRole) {
|
||||
switch (col) {
|
||||
case ColumnType::Species:
|
||||
return this->monInfo.wildPokemon[row].species;
|
||||
|
||||
case ColumnType::MinLevel:
|
||||
return this->monInfo.wildPokemon[row].minLevel;
|
||||
|
||||
case ColumnType::MaxLevel:
|
||||
return this->monInfo.wildPokemon[row].maxLevel;
|
||||
|
||||
case ColumnType::EncounterRate:
|
||||
if (row == 0) {
|
||||
return this->monInfo.encounterRate;
|
||||
} else {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant EncounterTableModel::headerData(int section, Qt::Orientation orientation, int role) const {
|
||||
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
|
||||
switch (section) {
|
||||
case ColumnType::Slot:
|
||||
return QString("Slot");
|
||||
case ColumnType::Group:
|
||||
return QString("Group");
|
||||
case ColumnType::Species:
|
||||
return QString("Species");
|
||||
case ColumnType::MinLevel:
|
||||
return QString("Min Level");
|
||||
case ColumnType::MaxLevel:
|
||||
return QString("Max Level");
|
||||
case ColumnType::EncounterChance:
|
||||
return QString("Encounter Chance");
|
||||
case ColumnType::SlotRatio:
|
||||
return QString("Slot Ratio");
|
||||
case ColumnType::EncounterRate:
|
||||
return QString("Encounter Rate");
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
bool EncounterTableModel::setData(const QModelIndex &index, const QVariant &value, int role) {
|
||||
if (role == Qt::EditRole) {
|
||||
if (!checkIndex(index))
|
||||
return false;
|
||||
|
||||
int row = index.row();
|
||||
int col = index.column();
|
||||
|
||||
switch (col) {
|
||||
case ColumnType::Species:
|
||||
this->monInfo.wildPokemon[row].species = value.toString();
|
||||
break;
|
||||
|
||||
case ColumnType::MinLevel:
|
||||
this->monInfo.wildPokemon[row].minLevel = value.toInt();
|
||||
break;
|
||||
|
||||
case ColumnType::MaxLevel:
|
||||
this->monInfo.wildPokemon[row].maxLevel = value.toInt();
|
||||
break;
|
||||
|
||||
case ColumnType::EncounterRate:
|
||||
this->monInfo.encounterRate = value.toInt();
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
emit edited();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Qt::ItemFlags EncounterTableModel::flags(const QModelIndex &index) const {
|
||||
Qt::ItemFlags flags = Qt::NoItemFlags;
|
||||
switch (index.column()) {
|
||||
case ColumnType::Species:
|
||||
case ColumnType::MinLevel:
|
||||
case ColumnType::MaxLevel:
|
||||
flags |= Qt::ItemIsEditable;
|
||||
break;
|
||||
case ColumnType::EncounterRate:
|
||||
if (index.row() == 0) flags |= Qt::ItemIsEditable;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return flags | QAbstractTableModel::flags(index);
|
||||
}
|
||||
|
||||
WildMonInfo EncounterTableModel::encounterData() {
|
||||
return this->monInfo;
|
||||
}
|
||||
Reference in New Issue
Block a user