Initial wild pokemon summary chart

This commit is contained in:
GriffinR 2024-08-21 13:06:30 -04:00
parent baaf9c8c9d
commit b1814e0e3f
10 changed files with 200 additions and 4 deletions

View file

@ -3010,6 +3010,13 @@
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_SummaryChart">
<property name="text">
<string>Summary Chart...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_ConfigureEncountersJSON">
<property name="text">

43
forms/wildmonchart.ui Normal file
View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WildMonChart</class>
<widget class="QWidget" name="WildMonChart">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Wild Pokémon Summary</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QChartView" name="chartView"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QChartView</class>
<extends>QGraphicsView</extends>
<header>QtCharts</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -83,6 +83,7 @@ public:
void removeCurrentConnection();
void addNewWildMonGroup(QWidget *window);
void deleteWildMonGroup();
QTableView* getCurrentWildMonTable();
void updateDiveMap(QString mapName);
void updateEmergeMap(QString mapName);
void setSelectedConnectionFromMap(QString mapName);

View file

@ -27,6 +27,7 @@
#include "preferenceeditor.h"
#include "projectsettingseditor.h"
#include "customscriptseditor.h"
#include "wildmonchart.h"
#include "updatepromoter.h"
#include "aboutporymap.h"
@ -285,6 +286,7 @@ private slots:
void on_horizontalSlider_CollisionZoom_valueChanged(int value);
void on_pushButton_NewWildMonGroup_clicked();
void on_pushButton_DeleteWildMonGroup_clicked();
void on_pushButton_SummaryChart_clicked();
void on_pushButton_ConfigureEncountersJSON_clicked();
void on_pushButton_CreatePrefab_clicked();
void on_spinBox_SelectedElevation_valueChanged(int elevation);
@ -314,6 +316,7 @@ private:
QPointer<UpdatePromoter> updatePromoter = nullptr;
QPointer<NetworkAccessManager> networkAccessManager = nullptr;
QPointer<AboutPorymap> aboutWindow = nullptr;
QPointer<WildMonChart> wildMonChart = nullptr;
FilterChildrenProxyModel *mapListProxyModel;
QStandardItemModel *mapListModel;
QList<QStandardItem*> *mapGroupItemsList;

View file

@ -29,6 +29,7 @@ public:
};
WildMonInfo encounterData();
QList<double> percentages() const { return slotPercentages; }
void resize(int rows, int cols);
private:

28
include/ui/wildmonchart.h Normal file
View file

@ -0,0 +1,28 @@
#ifndef WILDMONCHART_H
#define WILDMONCHART_H
#include "encountertablemodel.h"
#include <QWidget>
namespace Ui {
class WildMonChart;
}
class WildMonChart : public QWidget
{
Q_OBJECT
public:
explicit WildMonChart(QWidget *parent, EncounterTableModel *data);
~WildMonChart();
public slots:
void setChartData(EncounterTableModel *data);
void updateChart();
private:
Ui::WildMonChart *ui;
EncounterTableModel *data;
};
#endif // WILDMONCHART_H

View file

@ -4,7 +4,7 @@
#
#-------------------------------------------------
QT += core gui qml network
QT += core gui qml network charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@ -106,7 +106,8 @@ SOURCES += src/core/block.cpp \
src/settings.cpp \
src/log.cpp \
src/ui/uintspinbox.cpp \
src/ui/updatepromoter.cpp
src/ui/updatepromoter.cpp \
src/ui/wildmonchart.cpp
HEADERS += include/core/block.h \
include/core/bitpacker.h \
@ -202,7 +203,8 @@ HEADERS += include/core/block.h \
include/settings.h \
include/log.h \
include/ui/uintspinbox.h \
include/ui/updatepromoter.h
include/ui/updatepromoter.h \
include/ui/wildmonchart.h
FORMS += forms/mainwindow.ui \
forms/prefabcreationdialog.ui \
@ -221,7 +223,8 @@ FORMS += forms/mainwindow.ui \
forms/projectsettingseditor.ui \
forms/customscriptseditor.ui \
forms/customscriptslistitem.ui \
forms/updatepromoter.ui
forms/updatepromoter.ui \
forms/wildmonchart.ui
RESOURCES += \
resources/images.qrc \

View file

@ -698,6 +698,12 @@ void Editor::saveEncounterTabData() {
}
}
QTableView* Editor::getCurrentWildMonTable() {
QStackedWidget *stack = ui->stackedWidget_WildMons;
auto tabWidget = static_cast<MonTabWidget *>(stack->widget(stack->currentIndex()));
return tabWidget->tableAt(tabWidget->currentIndex());
}
void Editor::updateEncounterFields(EncounterFields newFields) {
EncounterFields oldFields = project->wildMonFields;
// Go through fields and determine whether we need to update a field.

View file

@ -2572,6 +2572,16 @@ void MainWindow::on_pushButton_DeleteWildMonGroup_clicked() {
editor->deleteWildMonGroup();
}
void MainWindow::on_pushButton_SummaryChart_clicked() {
if (!this->wildMonChart) {
// TODO: Move to editor, connect to signals for when the table data changes
QTableView *table = this->editor->getCurrentWildMonTable();
EncounterTableModel *data = table ? static_cast<EncounterTableModel *>(table->model()) : nullptr;
this->wildMonChart = new WildMonChart(this, data);
}
openSubWindow(this->wildMonChart);
}
void MainWindow::on_pushButton_ConfigureEncountersJSON_clicked() {
editor->configureEncounterJSON(this);
}

94
src/ui/wildmonchart.cpp Normal file
View file

@ -0,0 +1,94 @@
#include "wildmonchart.h"
#include "ui_wildmonchart.h"
#include <QtCharts>
WildMonChart::WildMonChart(QWidget *parent, EncounterTableModel *data) :
QWidget(parent),
ui(new Ui::WildMonChart)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
setWindowFlags(Qt::Window);
ui->chartView->setRenderHint(QPainter::Antialiasing);
setChartData(data);
};
WildMonChart::~WildMonChart() {
delete ui;
};
void WildMonChart::setChartData(EncounterTableModel *data) {
this->data = data;
updateChart();
}
void WildMonChart::updateChart() {
// TODO: Handle empty chart
if (!this->data)
return;
const QList<double> inputValues = data->percentages();
const QVector<WildPokemon> inputPokemon = data->encounterData().wildPokemon;
QList<double> chartValues;
QList<WildPokemon> chartPokemon;
// Combine data for duplicate species entries
QList<QString> seenSpecies;
for (int i = 0; i < qMin(inputValues.length(), inputPokemon.length()); i++) {
const double percent = inputValues.at(i);
const WildPokemon pokemon = inputPokemon.at(i);
int existingIndex = seenSpecies.indexOf(pokemon.species);
if (existingIndex >= 0) {
// Duplicate species entry
chartValues[existingIndex] += percent;
if (pokemon.minLevel < chartPokemon.at(existingIndex).minLevel)
chartPokemon[existingIndex].minLevel = pokemon.minLevel;
if (pokemon.maxLevel > chartPokemon.at(existingIndex).maxLevel)
chartPokemon[existingIndex].maxLevel = pokemon.maxLevel;
} else {
// New species entry
chartValues.append(percent);
chartPokemon.append(pokemon);
seenSpecies.append(pokemon.species);
}
}
// TODO: If pokemon < values, fill remainder with an "empty" slice
// Populate chart
//const QString speciesPrefix = projectConfig.getIdentifier(ProjectIdentifier::regex_species); // TODO: Change regex to prefix
const QString speciesPrefix = "SPECIES_";
QPieSeries *series = new QPieSeries();
for (int i = 0; i < qMin(chartValues.length(), chartPokemon.length()); i++) {
const double percent = chartValues.at(i);
const WildPokemon pokemon = chartPokemon.at(i);
// Strip 'SPECIES_' prefix
QString name = pokemon.species;
if (name.startsWith(speciesPrefix))
name.remove(0, speciesPrefix.length());
QString label = QString("%1\nLv %2").arg(name).arg(pokemon.minLevel);
if (pokemon.minLevel != pokemon.maxLevel)
label.append(QString("-%1").arg(pokemon.maxLevel));
label.append(QString(" (%1%)").arg(percent * 100));
QPieSlice *slice = new QPieSlice(label, percent);
//slice->setLabelPosition(QPieSlice::LabelInsideNormal);
slice->setLabelVisible();
series->append(slice);
}
QChart *chart = new QChart();
chart->addSeries(series);
chart->legend()->hide();
ui->chartView->setChart(chart); // TODO: Leaking old chart
// TODO: Draw icons onto slices
}