#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QObject::connect(ui->gridPreview, &GridPreview::updatedContents, this, &MainWindow::onGridUpdated); colorMap.insert(QString("red"), Qt::red); colorMap.insert(QString("green"), Qt::green); colorMap.insert(QString("blue"), Qt::blue); ui->gridPreview->setColorMap(colorMap); emit ui->gridPreview->updatedContents(); ui->comboLineColor->addItems(colorMap.keys()); } MainWindow::~MainWindow() { delete ui; } void MainWindow::onGridUpdated() { ui->gridPreview->repaint(); ui->textPreview->setPlainText(ui->gridPreview->toLuaTable()); ui->spinGridWidth->setValue(ui->gridPreview->getWidth()); ui->spinGridHeight->setValue(ui->gridPreview->getHeight()); ui->listLines->clear(); QMap> colorCount; for (int i = 0; i< ui->gridPreview->getLines().size(); i++) { ui->listLines->addItem(QString("Line #%1").arg(i + 1)); QString color = ui->gridPreview->getLine(i).getColor(); auto iter = colorCount.find(color); if (iter == colorCount.end()) colorCount.insert(color, { i + 1 }); else iter->push_back(i + 1); } ui->treeWarnings->clear(); for (auto iter = colorCount.begin(); iter != colorCount.end(); iter++) { if (iter->size() > 1) { QString title = QString("Color \"%1\" is used by several lines:").arg(iter.key()); QStringList description{}; for(int i = 0; i < iter->size(); i++) { description.push_back(QString("Line #%1").arg(iter->at(i))); } throwWarning(title, description); } } const QList outOfBounds = ui->gridPreview->pointsOutOfBounds(); for (auto iter = outOfBounds.begin(); iter != outOfBounds.end(); iter++) { const Line &line = ui->gridPreview->getLine(iter->ownerIndex); const QPoint &point = iter->isStart ? line.getStart() : line.getEnd(); QString pointType = iter->isStart ? QString("Start") : QString("End"); QString title = QString("%1 point of Line #%2 is out of bounds:").arg(pointType).arg(iter->ownerIndex + 1); QStringList description { QString("Point located at (%1, %2) while grid size is %3x%4") .arg(point.x()) .arg(point.y()) .arg(ui->gridPreview->getWidth()) .arg(ui->gridPreview->getHeight()) }; throwWarning(title, description); } PointProbe pp = ui->gridPreview->getCapturedProbe(); ui->listLines->setCurrentRow(pp.ownerIndex); } void MainWindow::on_spinGridWidth_valueChanged(int arg1) { ui->gridPreview->setSize(arg1, ui->gridPreview->getHeight()); } void MainWindow::on_spinGridHeight_valueChanged(int arg1) { ui->gridPreview->setSize(ui->gridPreview->getWidth(), arg1); } void MainWindow::on_comboLineColor_currentTextChanged(const QString&) { int selected = ui->listLines->currentRow(); if (!isSelectedLineCorrect(selected)) return; ui->gridPreview->setLineColor(selected, ui->comboLineColor->currentText()); } void MainWindow::on_listLines_currentRowChanged(int currentRow) { if (!isSelectedLineCorrect(currentRow)) return; PointProbe &probe = ui->gridPreview->getCapturedProbe(); probe.ownerIndex = currentRow; Line line = ui->gridPreview->getLine(currentRow); int startX = line.getStart().x(), startY = line.getStart().y(), endX = line.getEnd().x(), endY = line.getEnd().y(); ui->spinLineStartPointX->setValue(startX); ui->spinLineStartPointY->setValue(startY); ui->spinLineEndPointX->setValue(endX); ui->spinLineEndPointY->setValue(endY); ui->comboLineColor->setCurrentIndex(ui->comboLineColor->findText(line.getColor())); } bool MainWindow::isSelectedLineCorrect(int line) { int size = ui->gridPreview->getLines().size(); return line >= 0 && line < size && size > 0; } void MainWindow::throwWarning(const QString &title, const QStringList &description) { QTreeWidgetItem *titleItem = new QTreeWidgetItem(ui->treeWarnings, QStringList{ title }); for (auto iter = description.begin(); iter != description.end(); iter++) { QTreeWidgetItem *descriptionItem = new QTreeWidgetItem(titleItem, QStringList{ *iter }); titleItem->addChild(descriptionItem); } ui->treeWarnings->addTopLevelItem(titleItem); ui->treeWarnings->expandItem(titleItem); } void MainWindow::on_buttonSave_clicked() { QString fileName = QFileDialog::getSaveFileName(this, QString("Save grid"), "level.lua", "Lua source code (*.lua)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); out << ui->gridPreview->toLuaTable(); } void MainWindow::on_buttonClear_clicked() { ui->gridPreview->clear(); } void MainWindow::on_buttonDeleteLine_clicked() { int selected = ui->listLines->currentRow(); if (!isSelectedLineCorrect(selected)) return; ui->gridPreview->getCapturedProbe().ownerIndex = -1; ui->gridPreview->removeLine(selected); ui->listLines->clearSelection(); }