同步操作将从 陈炳煌/sqlitebrowser 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include "SqlExecutionArea.h"#include "ui_SqlExecutionArea.h"#include "sqltextedit.h"#include "sqlitetablemodel.h"#include "sqlitedb.h"#include "Settings.h"#include "ExportDataDialog.h"#include <QInputDialog>#include <QMessageBox>#include <QShortcut>#include <QFile>SqlExecutionArea::SqlExecutionArea(DBBrowserDB& _db, QWidget* parent) :QWidget(parent),db(_db),ui(new Ui::SqlExecutionArea),m_columnsResized(false),error_state(false){// Create UIui->setupUi(this);// Create modelmodel = new SqliteTableModel(db, this, static_cast<std::size_t>(Settings::getValue("db", "prefetchsize").toUInt()));ui->tableResult->setModel(model);connect(model, &SqliteTableModel::finishedFetch, this, &SqlExecutionArea::fetchedData);ui->findFrame->hide();QShortcut* shortcutHideFind = new QShortcut(QKeySequence("ESC"), ui->findLineEdit);connect(shortcutHideFind, SIGNAL(activated()), this, SLOT(hideFindFrame()));connect(ui->findLineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(findLineEdit_textChanged(const QString &)));connect(ui->previousToolButton, SIGNAL(clicked()), this, SLOT(findPrevious()));connect(ui->nextToolButton, SIGNAL(clicked()), this, SLOT(findNext()));connect(ui->findLineEdit, SIGNAL(returnPressed()), this, SLOT(findNext()));connect(ui->hideFindButton, SIGNAL(clicked()), this, SLOT(hideFindFrame()));connect(&fileSystemWatch, &QFileSystemWatcher::fileChanged, this, &SqlExecutionArea::fileChanged);// Save to settings when sppliter is moved, but only to memory.connect(ui->splitter, &QSplitter::splitterMoved, this, [this]() {Settings::setValue("editor", "splitter1_sizes", ui->splitter->saveState(), /* dont_save_to_disk */ true);});connect(ui->splitter_2, &QSplitter::splitterMoved, this, [this]() {Settings::setValue("editor", "splitter2_sizes", ui->splitter_2->saveState(), /* dont_save_to_disk */ true);});// Set collapsible the editErrors panelui->splitter_2->setCollapsible(1, true);// Load settingsreloadSettings();}SqlExecutionArea::~SqlExecutionArea(){delete ui;}QString SqlExecutionArea::getSql() const{return ui->editEditor->text();}QString SqlExecutionArea::getSelectedSql() const{return ui->editEditor->selectedText().trimmed().replace(QChar(0x2029), '\n');}void SqlExecutionArea::finishExecution(const QString& result, const bool ok){error_state = !ok;m_columnsResized = false;ui->editErrors->setPlainText(result);// Set reddish background when not okif (showErrorIndicators){if (ok)ui->editErrors->setStyleSheet("");elseui->editErrors->setStyleSheet("QTextEdit {color: white; background-color: rgb(255, 102, 102)}");}}void SqlExecutionArea::fetchedData(){// Don't resize the columns more than once to fit their contents. This is necessary because the finishedFetch signal of the model// is emitted for each loaded prefetch block and we want to avoid resizes while scrolling down.if(m_columnsResized)return;m_columnsResized = true;// Set column widths according to their contents but make sure they don't exceed a certain sizeui->tableResult->resizeColumnsToContents();for(int i = 0; i < model->columnCount(); i++){if(ui->tableResult->columnWidth(i) > 300)ui->tableResult->setColumnWidth(i, 300);}}SqlTextEdit *SqlExecutionArea::getEditor(){return ui->editEditor;}ExtendedTableWidget *SqlExecutionArea::getTableResult(){return ui->tableResult;}QTextEdit* SqlExecutionArea::getStatusEdit(){return ui->editErrors;}void SqlExecutionArea::saveAsCsv(){ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, model->query());dialog.exec();}void SqlExecutionArea::reloadSettings(){// Reload editor and table settingsui->editEditor->reloadSettings();ui->tableResult->reloadSettings();// Set fontQFont logfont(Settings::getValue("editor", "font").toString());logfont.setStyleHint(QFont::TypeWriter);logfont.setPointSize(Settings::getValue("log", "fontsize").toInt());ui->editErrors->setFont(logfont);// Apply horizontal/vertical tiling optionif(Settings::getValue("editor", "horizontal_tiling").toBool())ui->splitter->setOrientation(Qt::Horizontal);elseui->splitter->setOrientation(Qt::Vertical);ui->splitter->restoreState(Settings::getValue("editor", "splitter1_sizes").toByteArray());ui->splitter_2->restoreState(Settings::getValue("editor", "splitter2_sizes").toByteArray());// Set prefetch settingsmodel->setChunkSize(static_cast<std::size_t>(Settings::getValue("db", "prefetchsize").toUInt()));// Check if error indicators are enabled for the not-ok background clueshowErrorIndicators = Settings::getValue("editor", "error_indicators").toBool();if (!showErrorIndicators)ui->editErrors->setStyleSheet("");}void SqlExecutionArea::find(QString expr, bool forward){bool found = ui->editEditor->findText(expr,ui->regexpCheckBox->isChecked(),ui->caseCheckBox->isChecked(),ui->wholeWordsCheckBox->isChecked(),/* wrap */ true,forward);// Set reddish background when not foundif (found || expr == "")ui->findLineEdit->setStyleSheet("");elseui->findLineEdit->setStyleSheet("QLineEdit {color: white; background-color: rgb(255, 102, 102)}");}void SqlExecutionArea::findPrevious(){find(ui->findLineEdit->text(), false);}void SqlExecutionArea::findNext(){find(ui->findLineEdit->text(), true);}void SqlExecutionArea::findLineEdit_textChanged(const QString &){// When the text changes, perform an incremental search from cursor// position, or from begin of the selection position.// For incremental search while typing we need to start from the// begining of the current selection, otherwise we'd jump to the// next occurrenceif (ui->editEditor->hasSelectedText()) {int lineFrom;int indexFrom;int lineTo;int indexTo;ui->editEditor->getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo);ui->editEditor->setCursorPosition(lineFrom, indexFrom);}find(ui->findLineEdit->text(), true);}void SqlExecutionArea::hideFindFrame(){ui->editEditor->setFocus();ui->findFrame->hide();emit findFrameVisibilityChanged(false);}void SqlExecutionArea::setFindFrameVisibility(bool show){if (show) {ui->findFrame->show();ui->findLineEdit->setFocus();ui->findLineEdit->selectAll();emit findFrameVisibilityChanged(true);} else {hideFindFrame();}}void SqlExecutionArea::openFile(const QString& filename){// Open file for readingQFile f(filename);f.open(QIODevice::ReadOnly);if(!f.isOpen()){QMessageBox::warning(this, qApp->applicationName(), tr("Couldn't read file: %1.").arg(f.errorString()));return;}// Read in the entire fileui->editEditor->setText(f.readAll());// No modifications yetui->editEditor->setModified(false);// Remember file namesqlFileName = filename;// Start watching this file for changes and unwatch the previously watched file, if anyif(!fileSystemWatch.files().empty())fileSystemWatch.removePaths(fileSystemWatch.files());fileSystemWatch.addPath(filename);}void SqlExecutionArea::saveFile(const QString& filename){// Unwatch all files now. By unwathing them before the actual saving, we are not notified of our own changesif(!fileSystemWatch.files().empty())fileSystemWatch.removePaths(fileSystemWatch.files());// Open file for writingQFile f(filename);f.open(QIODevice::WriteOnly);if(!f.isOpen()){QMessageBox::warning(this, qApp->applicationName(), tr("Couldn't save file: %1.").arg(f.errorString()));return;}// Write to the fileif(f.write(getSql().toUtf8()) != -1){// Set modified to false so we can get control of unsaved changes when closing.ui->editEditor->setModified(false);// Remember file namesqlFileName = filename;// Start watching this filefileSystemWatch.addPath(filename);} else {QMessageBox::warning(this, qApp->applicationName(), tr("Couldn't save file: %1.").arg(f.errorString()));return;}}void SqlExecutionArea::fileChanged(const QString& filename){// Check if there are unsaved changes in the fileQString changes;if(ui->editEditor->isModified())changes = QString(" ") + tr("Your changes will be lost when reloading it!");// Ask user whether to realod the modified fileif(QMessageBox::question(this,qApp->applicationName(),tr("The file \"%1\" was modified by another program. Do you want to reload it?%2").arg(filename).arg(changes),QMessageBox::Yes | QMessageBox::Ignore) == QMessageBox::Yes){// Read in the fileopenFile(filename);} else {// The file does not match the file on the disk anymore. So set the modified flagui->editEditor->setModified(true);}}void SqlExecutionArea::saveState() {// Save to disk last stored splitter sizesSettings::setValue("editor", "splitter1_sizes", Settings::getValue("editor", "splitter1_sizes"));Settings::setValue("editor", "splitter2_sizes", Settings::getValue("editor", "splitter2_sizes"));}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。