|  | @@ -2,20 +2,24 @@
 | 
	
		
			
				|  |  |  #include "ui_brainywindow.h"
 | 
	
		
			
				|  |  |  #include <QFileDialog>
 | 
	
		
			
				|  |  |  #include <QFontDialog>
 | 
	
		
			
				|  |  | +#include <QMessageBox>
 | 
	
		
			
				|  |  |  #include <QFile>
 | 
	
		
			
				|  |  |  #include <QTextStream>
 | 
	
		
			
				|  |  |  #include <QFontMetrics>
 | 
	
		
			
				|  |  |  #include <iostream>
 | 
	
		
			
				|  |  | +#include <memory>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  BrainyWindow::BrainyWindow(QWidget *parent) :
 | 
	
		
			
				|  |  | -    QMainWindow(parent),
 | 
	
		
			
				|  |  | -    ui(new Ui::BrainyWindow)
 | 
	
		
			
				|  |  | +    QMainWindow{ parent },
 | 
	
		
			
				|  |  | +    ui{ std::make_unique<Ui::BrainyWindow>() }
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      ui->setupUi(this);
 | 
	
		
			
				|  |  | -    sh = new SyntaxHighlighter(ui->textEdit->document());
 | 
	
		
			
				|  |  | +    ui->textEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
 | 
	
		
			
				|  |  | +    sh = std::make_unique<SyntaxHighlighter>(ui->textEdit->document());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    ui->actionOpen_2->connect(ui->actionOpen_2, &QAction::triggered, this, &BrainyWindow::openFile);
 | 
	
		
			
				|  |  | -    ui->actionSave_2->connect(ui->actionSave_2, &QAction::triggered, this, &BrainyWindow::saveFile);
 | 
	
		
			
				|  |  | +    ui->actionOpen->connect(ui->actionOpen, &QAction::triggered, this, &BrainyWindow::openFile);
 | 
	
		
			
				|  |  | +    ui->actionSave->connect(ui->actionSave, &QAction::triggered, this, &BrainyWindow::saveFile);
 | 
	
		
			
				|  |  | +    ui->actionSave_As->connect(ui->actionSave_As, &QAction::triggered, this, &BrainyWindow::saveFileAs);
 | 
	
		
			
				|  |  |      ui->actionEditor_Font->connect(ui->actionEditor_Font, &QAction::triggered, this, [this] () {
 | 
	
		
			
				|  |  |          bool ok;
 | 
	
		
			
				|  |  |          QFont font = QFontDialog::getFont(&ok, ui->textEdit->font(), this);
 | 
	
	
		
			
				|  | @@ -26,30 +30,68 @@ BrainyWindow::BrainyWindow(QWidget *parent) :
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  BrainyWindow::~BrainyWindow()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    delete ui;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void BrainyWindow::openFile()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +    /*auto dialog = std::make_unique<QFileDialog>(this, tr("Open File"), "", tr("Brainfuck File (*.bf);; Any File (*.*)"));
 | 
	
		
			
				|  |  | +    dialog->show();*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      auto filename = QFileDialog::getOpenFileName(this,
 | 
	
		
			
				|  |  |          tr("Open File"), "", tr("Brainfuck File (*.bf);; Any File (*.*)"));
 | 
	
		
			
				|  |  | -    openedFile = new QFile(filename);
 | 
	
		
			
				|  |  | -    if (!openedFile->open(QIODevice::ReadWrite | QFile::Text)) return;
 | 
	
		
			
				|  |  | -    QTextStream in(openedFile);
 | 
	
		
			
				|  |  | +    if (filename == "")
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    QFileInfo fileInfo(filename);
 | 
	
		
			
				|  |  | +    if (!fileInfo.exists()) {
 | 
	
		
			
				|  |  | +        QMessageBox::critical(this, "Error opening file", "File does not exist");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    openedFile = std::make_unique<QFile>(filename);
 | 
	
		
			
				|  |  | +    if (!openedFile->open(QIODevice::ReadOnly | QFile::Text)) {
 | 
	
		
			
				|  |  | +        QMessageBox::critical(this, "Error opening file", "Could not open file");
 | 
	
		
			
				|  |  | +        return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    QTextStream in(openedFile.get());
 | 
	
		
			
				|  |  |      ui->textEdit->setText(in.readAll());
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void BrainyWindow::saveFile()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    if (!openedFile->isOpen()) {
 | 
	
		
			
				|  |  | -        openedFile->open(QIODevice::WriteOnly | QFile::Text | QFile::Truncate);
 | 
	
		
			
				|  |  | +    if (!openedFile) {
 | 
	
		
			
				|  |  | +        auto filename = QFileDialog::getSaveFileName(this,
 | 
	
		
			
				|  |  | +            tr("Save File"), "", tr("Brainfuck File (*.bf);; Any File (*.*)"));
 | 
	
		
			
				|  |  | +        if (filename == "")
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        openedFile = std::make_unique<QFile>(filename);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (openedFile->isOpen()) {
 | 
	
		
			
				|  |  | -        openedFile->write(ui->textEdit->document()->toPlainText().toUtf8().data());
 | 
	
		
			
				|  |  | +    if (openedFile) {
 | 
	
		
			
				|  |  | +        if (openedFile->isOpen() && !openedFile->isWritable()) {
 | 
	
		
			
				|  |  | +            openedFile->close();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!openedFile->isOpen()) {
 | 
	
		
			
				|  |  | +            openedFile->open(QIODevice::WriteOnly | QFile::Text | QFile::Truncate);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (openedFile->isOpen()) {
 | 
	
		
			
				|  |  | +            openedFile->write(ui->textEdit->document()->toPlainText().toUtf8().data());
 | 
	
		
			
				|  |  | +            openedFile->close();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else {
 | 
	
		
			
				|  |  | +            QMessageBox::critical(this, "Error saving file", "Could not open file to save");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void BrainyWindow::saveFileAs()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    if (openedFile) {
 | 
	
		
			
				|  |  |          openedFile->close();
 | 
	
		
			
				|  |  | +        openedFile.reset(nullptr);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    saveFile();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |