Show UnsavedDocumentsDialog when closing window or quitting application

so user can save and or discard docs more efficiently.
This commit is contained in:
eelke 2026-10-19 18:16:25 +02:00
parent b97adced4c
commit 784ad68758
16 changed files with 544 additions and 164 deletions

View file

@ -0,0 +1,143 @@
#include "SqlDocument.h"
#include "util/SqlSyntaxHighlighter.h"
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QStandardPaths>
#include <QStringConverter>
#include <QPlainTextDocumentLayout>
#include <QTextDocument>
#include <QTextStream>
SqlDocument::SqlDocument(QObject *parent)
: QObject(parent)
, m_document(new QTextDocument(this))
, m_highlighter(new SqlSyntaxHighlighter(m_document))
{
// QPlainTextEdit only accepts documents that use a QPlainTextDocumentLayout
m_document->setDocumentLayout(new QPlainTextDocumentLayout(m_document));
connect(m_document, &QTextDocument::modificationChanged, this, &SqlDocument::modifiedChanged);
setFileName(tr("new"));
}
SqlDocument::~SqlDocument() = default;
bool SqlDocument::isModified() const
{
return m_document->isModified();
}
void SqlDocument::setModified(bool modified)
{
m_document->setModified(modified);
}
void SqlDocument::clear()
{
m_document->clear();
setFileName(tr("new"));
m_new = true;
setModified(false);
}
bool SqlDocument::load(const QString &filename)
{
bool result = false;
QFile file(filename);
if (file.open(QIODevice::ReadOnly)) {
QByteArray ba = file.readAll();
auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
QString text = toUtf16(ba);
if (toUtf16.hasError()) {
file.reset();
QTextStream stream(&file);
text = stream.readAll();
}
m_document->setPlainText(text);
setModified(false);
setFileName(filename);
m_new = false;
result = true;
}
return result;
}
bool SqlDocument::save(QWidget *parent)
{
bool result;
if (m_fileName.isEmpty() || m_new) {
result = saveAs(parent);
}
else {
result = saveSqlTo(m_fileName);
}
return result;
}
bool SqlDocument::saveAs(QWidget *parent)
{
bool result = false;
QString filename = promptUserForSaveSqlFilename(parent);
if (!filename.isEmpty()) {
result = saveSqlTo(filename);
if (result) {
setFileName(filename);
m_new = false;
}
}
return result;
}
bool SqlDocument::saveCopyAs(QWidget *parent)
{
bool result = false;
QString filename = promptUserForSaveSqlFilename(parent);
if (!filename.isEmpty()) {
result = saveSqlTo(filename);
}
return result;
}
void SqlDocument::addEditor(QWidget *editor)
{
if (!m_editors.contains(editor))
m_editors.append(editor);
}
void SqlDocument::removeEditor(QWidget *editor)
{
m_editors.removeAll(editor);
}
void SqlDocument::setFileName(const QString &filename)
{
m_fileName = filename;
emit fileNameChanged();
}
bool SqlDocument::saveSqlTo(const QString &filename)
{
bool result = false;
QFile file(filename);
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream.setEncoding(QStringConverter::Utf8);
QString text = m_document->toPlainText();
stream << text;
stream.flush();
if (stream.status() == QTextStream::Ok) {
setModified(false);
result = true;
}
}
return result;
}
QString SqlDocument::promptUserForSaveSqlFilename(QWidget *parent)
{
QString home_dir = QStandardPaths::locate(QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory);
return QFileDialog::getSaveFileName(parent, tr("Save query"), home_dir, tr("SQL file (*.sql)"));
}