Show UnsavedDocumentsDialog when closing window or quitting application
so user can save and or discard docs more efficiently.
This commit is contained in:
parent
b97adced4c
commit
784ad68758
16 changed files with 544 additions and 164 deletions
143
pglab/querytool/SqlDocument.cpp
Normal file
143
pglab/querytool/SqlDocument.cpp
Normal 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)"));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue