PixelWars/src/mainwindow.cpp
2016-06-04 19:22:29 +02:00

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();
}