#include "mainwindow.h" #include "drawwidget.h" #include "ui_mainwindow.h" #include "simulationdialog.h" #include "simulation.h" #include #include #include #include #include #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(); }