#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); setupUi(); // define allowed methods signatures.push_back(domain::FunctionSignature("divisible", std::vector{domain::Value::INT, domain::Value::INT})); signatures.push_back(domain::FunctionSignature("less_then", std::vector{domain::Value::INT, domain::Value::INT})); signatures.push_back(domain::FunctionSignature("greater_then", std::vector{domain::Value::INT, domain::Value::INT})); signatures.push_back(domain::FunctionSignature("contains_address", std::vector{domain::Value::ADDRESS_SPACE, domain::Value::INT})); signatures.push_back(domain::FunctionSignature("contains", std::vector{domain::Value::ADDRESS_SPACE, domain::Value::INT, domain::Value::INT})); signatures.push_back(domain::FunctionSignature("unique", std::vector{domain::Value::ADDRESS_SPACE, domain::Value::INT, domain::Value::INT})); } void MainWindow::setupUi() { auto layout = new QHBoxLayout(); ui->centralwidget->setLayout(layout); // setup toolbar ui->toolBar->addAction("Load library", this, &MainWindow::onLoadLibrary); ui->toolBar->addAction("Load schema", this, &MainWindow::onLoadSchema); ui->toolBar->addAction("Load test", this, &MainWindow::onTestModal); // setup central content libraryDisplay = new display::Library(); auto schemaParent = new QWidget(); auto schemaLayout = new QVBoxLayout(); schemaParent->setLayout(schemaLayout); schemaDisplay = new display::Schema(); schemaLayout->setMargin(0); schemaLayout->addWidget(schemaDisplay, 1); layout->setMargin(0); layout->addWidget(libraryDisplay); layout->addWidget(schemaParent, 1); log = new QPlainTextEdit(); log->setFont(QFont("Courier")); schemaLayout->addWidget(log); } void MainWindow::onTestModal() { QString filename = "/home/bbr/Documents/personal/projects/modeler/schema.csl"; std::ostringstream buffer; if(!filename.isEmpty()) { clear(); ParseContext parseContext; auto schemaNode = loadSchemaFromFile(&parseContext, filename.toStdString().c_str(), buffer); if(schemaNode) { domain::SchemaCreator generator(signatures); library = generator.loadLibrary(*schemaNode->library); if(library) { schema = generator.loadSchema(*schemaNode, *library); } for (auto& error : generator.getErrors()) { parseContext.formatError(error, buffer, "ERROR: "); } if(generator.getErrors().empty()) { libraryDisplay->setLibrary(library); schemaDisplay->setSchema(schema); } else { libraryDisplay->setLibrary(std::nullopt); schemaDisplay->setSchema(std::nullopt); } } } log->appendPlainText(QString::fromStdString(buffer.str())); } void MainWindow::onLoadLibrary() { auto filename = QFileDialog::getOpenFileName(this, tr("Open library"), "/home", tr("Comdel library (*.csl)")); if(!filename.isEmpty()) { clear(); ParseContext parseContext; auto libraryNode = loadLibraryFromFile(&parseContext, filename.toStdString().c_str(), std::cout); if(libraryNode) { domain::SchemaCreator generator(signatures); library = generator.loadLibrary(*libraryNode); for (auto& error : generator.getErrors()) { parseContext.formatError(error, std::cout, "ERROR: "); } libraryDisplay->setLibrary(library); } else { std::cout<<"Bad request"<library); for (auto& error : generator.getErrors()) { parseContext.formatError(error, std::cout, "ERROR: "); } if(library) { schema = generator.loadSchema(*schemaNode, *library); for (auto& error : generator.getErrors()) { parseContext.formatError(error, std::cout, "ERROR: "); } } libraryDisplay->setLibrary(library); schemaDisplay->setSchema(schema); } } } void MainWindow::clear() { schema = std::nullopt; library = std::nullopt; libraryDisplay->setLibrary(library); schemaDisplay->setSchema(schema); } MainWindow::~MainWindow() { delete ui; }