205 lines
6.1 KiB
C++
205 lines
6.1 KiB
C++
#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);
|
|
|
|
for (int r = 0; r < this->numRows; r++) {
|
|
this->groupNames.append(QString());
|
|
this->slotPercentages.append(0.0);
|
|
this->slotRatios.append(fields[fieldIndex].encounterRates.value(r, 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: {
|
|
int minLevel = value.toInt();
|
|
this->monInfo.wildPokemon[row].minLevel = minLevel;
|
|
if (minLevel > this->monInfo.wildPokemon[row].maxLevel)
|
|
this->monInfo.wildPokemon[row].maxLevel = minLevel;
|
|
break;
|
|
}
|
|
|
|
case ColumnType::MaxLevel: {
|
|
int maxLevel = value.toInt();
|
|
this->monInfo.wildPokemon[row].maxLevel = maxLevel;
|
|
if (maxLevel < this->monInfo.wildPokemon[row].minLevel)
|
|
this->monInfo.wildPokemon[row].minLevel = maxLevel;
|
|
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;
|
|
}
|