174 lines
5.5 KiB
C++
174 lines
5.5 KiB
C++
#include "mainwindow.h"
|
|
#include "drawwidget.h"
|
|
#include "ui_mainwindow.h"
|
|
#include "simulationdialog.h"
|
|
#include "simulation.h"
|
|
#include <iostream>
|
|
#include <chrono>
|
|
#include <QTimer>
|
|
#include <QErrorMessage>
|
|
#include <QPalette>
|
|
#include "mapscene.h"
|
|
|
|
MainWindow::MainWindow(QWidget *parent) :
|
|
QMainWindow(parent),
|
|
ui(new Ui::MainWindow),
|
|
p_simu(NULL),
|
|
m_simSpeed(0),
|
|
m_simSpeedChanged(false),
|
|
m_paused(false)
|
|
{
|
|
setWindowIcon(QIcon(":qss_icons/rc/PixelWars.png"));
|
|
ui->setupUi(this);
|
|
ui->actionAction_step->setEnabled(false);
|
|
ui->actionPlayPause->setEnabled(false);
|
|
ui->actionStop->setEnabled(false);
|
|
m_simuTimer = new QTimer(this);
|
|
connect(m_simuTimer,SIGNAL(timeout()),this, SLOT(updateSimu()));
|
|
m_simuTimer->start(m_simSpeed);
|
|
connect(ui->actionCreate_new_simulation, SIGNAL(triggered(bool)), this, SLOT(openSimuDialog()));
|
|
connect(ui->simSpeedSlider, SIGNAL(valueChanged(int)), this, SLOT(changeSimSpeed(int)));
|
|
connect(ui->flatSphereSlider, SIGNAL(valueChanged(int)), ui->drawWidget, SLOT(setFlatSphere(int)));
|
|
connect(ui->surfaceRatioSlider, SIGNAL(valueChanged(int)), ui->drawWidget, SLOT(setSurfaceRatio(int)));
|
|
connect(ui->flatSphereSlider, SIGNAL(valueChanged(int)), ui->drawWidget, SLOT(repaint()));
|
|
connect(ui->surfaceRatioSlider, SIGNAL(valueChanged(int)), ui->drawWidget, SLOT(repaint()));
|
|
connect(ui->actionDebug, SIGNAL(toggled(bool)), ui->drawWidget, SLOT(setCursorEnabled(bool)));
|
|
connect(ui->actionPlayPause, SIGNAL(toggled(bool)), this, SLOT(pauseSimu(bool)));
|
|
connect(ui->actionAction_step, SIGNAL(triggered(bool)), this, SLOT(stepSimu()));
|
|
connect(ui->actionStop, SIGNAL(triggered(bool)), this, SLOT(stopSimu()));
|
|
connect(ui->resetToDefaultAdvanced, SIGNAL(pressed()), this, SLOT(resetAdvancedToDefault()));
|
|
connect(ui->drawWidget, SIGNAL(debugPickChanged(Coord)), this, SLOT(changeDebugCursorPos(Coord)));
|
|
changeSimSpeed(ui->simSpeedSlider->value());
|
|
ui->advancedGroupBox->hide();
|
|
ui->debugGroupBox->hide();
|
|
ui->actionDebug->setEnabled(false);
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MainWindow::openSimuDialog()
|
|
{
|
|
pauseSimu(true);
|
|
SimulationDialog *dialog = new SimulationDialog(this);
|
|
dialog->setWindowTitle("Starting a new Simulation");
|
|
QErrorMessage *err = new QErrorMessage(dialog);
|
|
connect(dialog, SIGNAL(sendError(QString)), err, SLOT(showMessage(QString)));
|
|
int ret = dialog->exec();
|
|
if(ret == QDialog::Accepted)
|
|
{
|
|
if(p_simu != NULL)
|
|
{
|
|
delete p_simu;
|
|
p_simu = NULL;
|
|
}
|
|
m_date = 0;
|
|
p_simu = dialog->getSimulation();
|
|
ui->drawWidget->startSimulation(p_simu->getMap());
|
|
ui->actionAction_step->setEnabled(true);
|
|
ui->actionPlayPause->setEnabled(true);
|
|
ui->actionStop->setEnabled(true);
|
|
ui->actionDebug->setEnabled(true);
|
|
}
|
|
pauseSimu(false);
|
|
delete dialog;
|
|
}
|
|
|
|
void MainWindow::changeSimSpeed(int newSpeed)
|
|
{
|
|
m_simSpeedChanged = true;
|
|
m_simSpeed = ui->simSpeedSlider->maximum()+20-newSpeed;
|
|
}
|
|
|
|
void MainWindow::updateSimu()
|
|
{
|
|
if(!m_paused)
|
|
{
|
|
if(p_simu != NULL)
|
|
{
|
|
p_simu->update();
|
|
ui->dateLabel->setText(QString::number(++m_date));
|
|
ui->populationLabel->setText(QString::number(p_simu->getPopulation()));
|
|
ui->drawWidget->updateDudesBehavior();
|
|
ui->drawWidget->setFlatSphere(ui->flatSphereSlider->value());
|
|
ui->drawWidget->setSurfaceRatio(ui->surfaceRatioSlider->value());
|
|
if(m_debugEnabled)
|
|
updateDebugMessage();
|
|
ui->drawWidget->repaint();
|
|
}
|
|
if(m_simSpeedChanged)
|
|
{
|
|
m_simuTimer->stop();
|
|
m_simuTimer->start(m_simSpeed);
|
|
m_simSpeedChanged = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MainWindow::stepSimu()
|
|
{
|
|
m_paused = false;
|
|
updateSimu();
|
|
pauseSimu(true);
|
|
}
|
|
|
|
void MainWindow::stopSimu()
|
|
{
|
|
if(p_simu != NULL)
|
|
{
|
|
ui->drawWidget->stopSimulation();
|
|
delete p_simu;
|
|
p_simu = NULL;
|
|
}
|
|
pauseSimu(true);
|
|
m_date = 0;
|
|
ui->actionAction_step->setEnabled(false);
|
|
ui->actionPlayPause->setEnabled(false);
|
|
ui->actionStop->setEnabled(false);
|
|
if(ui->actionDebug->isChecked())
|
|
ui->actionDebug->toggle();
|
|
ui->actionDebug->setEnabled(false);
|
|
}
|
|
|
|
void MainWindow::resetAdvancedToDefault()
|
|
{
|
|
ui->flatSphereSlider->setValue(0);
|
|
ui->surfaceRatioSlider->setValue(50);
|
|
}
|
|
|
|
void MainWindow::pauseSimu(bool pause)
|
|
{
|
|
m_paused = pause;
|
|
ui->actionPlayPause->setChecked(m_paused);
|
|
if(m_paused)
|
|
m_simuTimer->stop();
|
|
else
|
|
m_simuTimer->start(m_simSpeed);
|
|
m_simSpeedChanged = false;
|
|
}
|
|
|
|
void MainWindow::updateDebugMessage()
|
|
{
|
|
static char buffer[DEBUG_OUTPUT_MAX_SIZE] = {0};
|
|
MapScene *map = p_simu->getMap();
|
|
Pixel &px = map->getPixel(m_debugCursorPos);
|
|
ui->pixelDescriptionArea->clear();
|
|
p_simu->getPixelInfoString((char*)buffer, px);
|
|
ui->pixelDescriptionArea->appendPlainText(QString(buffer));
|
|
ui->pixelNameLabel->setText(PixelProperty::getName(px.type));
|
|
glm::vec3 color = map->getColor(px);
|
|
color *= 255;
|
|
ui->pixelColorWidget->setStyleSheet(QString("QLineEdit {background-color: rgb(%1, %2, %3);}")
|
|
.arg(int(color.r)).arg(int(color.g)).arg(int(color.b)));
|
|
}
|
|
|
|
void MainWindow::changeDebugCursorPos(Coord pos)
|
|
{
|
|
if(!ui->actionDebug->isChecked())
|
|
ui->actionDebug->toggle();
|
|
m_debugCursorPos = pos;
|
|
updateDebugMessage();
|
|
}
|