mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-19 18:40:13 -06:00
Avoid inheriting the style sheet in child widgets by naming the widget type where it is set. This had the effect, reported in issue #838, of setting an unwanted style in child widgets, like the tool-tip of the "Load all data" button, the tool-tip of the SQL results pane or the context menu of the search-bar edit line.
201 lines
5.7 KiB
C++
201 lines
5.7 KiB
C++
#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>
|
|
|
|
SqlExecutionArea::SqlExecutionArea(DBBrowserDB& _db, QWidget* parent) :
|
|
QWidget(parent),
|
|
db(_db),
|
|
ui(new Ui::SqlExecutionArea),
|
|
m_columnsResized(false)
|
|
{
|
|
// Create UI
|
|
ui->setupUi(this);
|
|
|
|
// Create model
|
|
model = new SqliteTableModel(db, this, Settings::getValue("db", "prefetchsize").toInt());
|
|
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()));
|
|
|
|
// Load settings
|
|
reloadSettings();
|
|
}
|
|
|
|
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)
|
|
{
|
|
m_columnsResized = false;
|
|
ui->editErrors->setPlainText(result);
|
|
// Set reddish background when not ok
|
|
if (showErrorIndicators)
|
|
{
|
|
if (ok)
|
|
ui->editErrors->setStyleSheet("");
|
|
else
|
|
ui->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 size
|
|
ui->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;
|
|
}
|
|
|
|
void SqlExecutionArea::saveAsCsv()
|
|
{
|
|
ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, model->query());
|
|
dialog.exec();
|
|
}
|
|
|
|
void SqlExecutionArea::reloadSettings()
|
|
{
|
|
// Reload editor and table settings
|
|
ui->editEditor->reloadSettings();
|
|
ui->tableResult->reloadSettings();
|
|
|
|
// Set font
|
|
QFont 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 option
|
|
if(Settings::getValue("editor", "horizontal_tiling").toBool())
|
|
ui->splitter->setOrientation(Qt::Horizontal);
|
|
else
|
|
ui->splitter->setOrientation(Qt::Vertical);
|
|
|
|
// Set prefetch settings
|
|
model->setChunkSize(Settings::getValue("db", "prefetchsize").toInt());
|
|
|
|
// Check if error indicators are enabled for the not-ok background clue
|
|
showErrorIndicators = 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 found
|
|
if (found || expr == "")
|
|
ui->findLineEdit->setStyleSheet("");
|
|
else
|
|
ui->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 occurrence
|
|
if (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();
|
|
}
|
|
}
|