schema_editor/mainwindow.cpp

187 lines
5.4 KiB
C++
Raw Normal View History

2022-03-29 19:31:45 +00:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "application.h"
2022-03-29 19:31:45 +00:00
2022-04-07 22:21:23 +00:00
#include <QFileDialog>
#include <QHBoxLayout>
2022-05-27 06:18:17 +00:00
#include <comdel/parser/parse_context.h>
#include <comdel/parser/parser_util.h>
#include <comdel/domain/schema_creator.h>
2022-04-07 22:21:23 +00:00
#include <iostream>
2022-04-09 19:11:17 +00:00
#include <QPlainTextEdit>
2022-05-27 06:18:17 +00:00
#include <comdel/domain/comdel_validator.h>
2022-04-24 20:21:45 +00:00
#include <fstream>
#include <comdel/domain/comdel_generator.h>
2022-04-07 22:21:23 +00:00
2022-03-29 19:31:45 +00:00
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
2022-04-07 22:21:23 +00:00
setupUi();
}
void MainWindow::setupUi()
{
2022-04-12 21:37:05 +00:00
setWindowTitle("COMDEL schema editor");
2022-04-07 22:21:23 +00:00
auto layout = new QHBoxLayout();
ui->centralwidget->setLayout(layout);
// setup toolbar
2022-06-09 18:24:27 +00:00
ui->toolBar->addAction("Učitaj bibiloteku", this, &MainWindow::onLoadLibrary);
ui->toolBar->addAction("Učitaj shemu", this, &MainWindow::onLoadSchema);
ui->toolBar->addAction("Spremi shemu", this, &MainWindow::onStoreScheme);
ui->toolBar->addAction("Generiraj comdel", this, &MainWindow::onGenerateComdel);
2022-04-07 22:21:23 +00:00
2022-06-09 18:24:27 +00:00
connect(ui->actionSave_schema, &QAction::triggered, this, &MainWindow::onStoreScheme);
connect(ui->actionExport_schema, &QAction::triggered, this, &MainWindow::onGenerateComdel);
2022-04-10 12:23:18 +00:00
connect(ui->actionValidate, &QAction::triggered, this, &MainWindow::onValidateSchema);
2022-04-07 22:21:23 +00:00
// setup central content
libraryDisplay = new display::Library();
2022-04-09 19:11:17 +00:00
auto schemaParent = new QWidget();
auto schemaLayout = new QVBoxLayout();
schemaParent->setLayout(schemaLayout);
2022-04-07 22:21:23 +00:00
schemaDisplay = new display::Schema();
2022-06-09 18:24:27 +00:00
schemaLayout->setContentsMargins(0, 0, 0, 0);
2022-04-09 19:11:17 +00:00
schemaLayout->addWidget(schemaDisplay, 1);
2022-04-07 22:21:23 +00:00
2022-06-09 18:24:27 +00:00
layout->setContentsMargins(0, 0, 0, 0);
2022-04-07 22:21:23 +00:00
layout->addWidget(libraryDisplay);
2022-04-09 19:11:17 +00:00
layout->addWidget(schemaParent, 1);
2022-04-07 22:21:23 +00:00
2022-04-09 19:11:17 +00:00
log = new QPlainTextEdit();
log->setFont(QFont("Courier"));
2022-04-12 21:37:05 +00:00
log->setReadOnly(false);
2022-04-09 19:11:17 +00:00
schemaLayout->addWidget(log);
2022-04-07 22:21:23 +00:00
}
2022-04-12 21:37:05 +00:00
void MainWindow::onLoadLibrary() {
auto filename = QFileDialog::getOpenFileName(this,
2022-06-09 18:24:27 +00:00
tr("Otvori biblioteku"), "", tr("Comdel biblioteka (*.csl)"));
2022-04-07 22:21:23 +00:00
if(!filename.isEmpty()) {
std::ostringstream output;
log->clear();
2022-04-07 22:21:23 +00:00
auto librarySource = filename.toStdString();
2022-04-07 22:21:23 +00:00
auto instance = Application::instance();
if(!instance->loadLibrary(librarySource, output)) {
log->appendPlainText(QString::fromStdString(output.str()));
2022-04-07 22:21:23 +00:00
}
libraryDisplay->refreshContent();
schemaDisplay->refreshContent();
}
2022-04-07 22:21:23 +00:00
}
void MainWindow::onLoadSchema() {
auto filename = QFileDialog::getOpenFileName(this,
2022-06-09 18:24:27 +00:00
tr("Otvori shemu"), "", tr("Comdel shema (*.csl)"));
2022-04-07 22:21:23 +00:00
if(!filename.isEmpty()) {
std::ostringstream output;
log->clear();
2022-04-07 22:21:23 +00:00
auto schemaSource = filename.toStdString();
2022-04-07 22:21:23 +00:00
auto instance = Application::instance();
auto result = instance->loadSchema(schemaSource, output);
if(!result.first){
formatErrors(result.second, output);
log->appendPlainText(QString::fromStdString(output.str()));
2022-04-07 22:21:23 +00:00
}
2022-04-12 21:37:05 +00:00
libraryDisplay->refreshContent();
schemaDisplay->refreshContent();
}
2022-04-10 12:23:18 +00:00
}
2022-04-24 20:21:45 +00:00
void MainWindow::onStoreScheme() {
auto filename = QFileDialog::getSaveFileName(this,
2022-06-09 18:24:27 +00:00
tr("Spremi shemu"), "", tr("Comdel shema (*.csl)"));
if(!filename.isEmpty()) {
log->clear();
2022-04-24 20:21:45 +00:00
std::ostringstream output;
2022-04-24 20:21:45 +00:00
if(Application::instance()->generateSchema(output)) {
std::ofstream out(filename.toStdString(), std::ios::out | std::ios::binary);
out<<output.str();
out.close();
2022-06-09 18:24:27 +00:00
log->appendPlainText("Uspješno spremljena shema\n");
} else {
2022-06-09 18:24:27 +00:00
log->appendPlainText("Greška tijekom spremanja sheme\n");
}
}
2022-04-24 20:21:45 +00:00
}
2022-04-24 20:21:45 +00:00
void MainWindow::onGenerateComdel() {
auto filename = QFileDialog::getSaveFileName(this,
2022-06-09 18:24:27 +00:00
tr("Spremi shemu"), "", tr("Comdel sustav (*.system)"));
if(!filename.isEmpty()) {
log->clear();
2022-04-24 20:21:45 +00:00
std::ostringstream output;
2022-04-24 20:21:45 +00:00
auto validationErrors = Application::instance()->generateComdel(output);
2022-04-24 20:21:45 +00:00
std::ostringstream buff;
formatErrors(validationErrors, buff);
log->appendPlainText(QString::fromStdString(buff.str()));
2022-04-24 20:21:45 +00:00
if(!Application::hasErrors(validationErrors)) {
std::ofstream out(filename.toStdString(), std::ios::out | std::ios::binary);
out<<output.str();
out.close();
2022-06-09 18:24:27 +00:00
log->appendPlainText("Uspješno generiranje comdel modela\n");
} else {
2022-06-09 18:24:27 +00:00
log->appendPlainText("Neuspješno generiranje comdel modela\n");
}
2022-04-12 21:37:05 +00:00
}
}
2022-04-12 21:37:05 +00:00
2022-04-10 12:23:18 +00:00
void MainWindow::onValidateSchema(bool /*toggled*/) {
2022-04-10 12:23:18 +00:00
log->clear();
2022-04-10 12:23:18 +00:00
auto errors = Application::instance()->validateSchema();
2022-05-19 22:44:40 +00:00
std::ostringstream buff;
formatErrors(errors, buff);
2022-05-19 22:44:40 +00:00
log->appendPlainText(QString::fromStdString(buff.str()));
2022-04-10 12:23:18 +00:00
}
2022-04-10 12:23:18 +00:00
void MainWindow::formatErrors(std::vector<domain::ValidationError>& errors, std::ostream& output) {
for(auto& err: errors) {
if(err.instance != nullptr) {
output << err.instance->name;
2022-04-10 12:23:18 +00:00
}
if(err.attribute != nullptr) {
output << "::" << err.attribute->name;
2022-04-10 12:23:18 +00:00
}
if(err.type == domain::Action::ERROR) {
output << " [ERROR] ";
2022-04-10 12:23:18 +00:00
} else {
output << " [WARNING] ";
2022-04-10 12:23:18 +00:00
}
output << err.message << std::endl;
2022-04-10 12:23:18 +00:00
}
2022-04-07 22:21:23 +00:00
}
2022-03-29 19:31:45 +00:00
MainWindow::~MainWindow()
{
delete ui;
2022-06-09 18:24:27 +00:00
}