aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/dialogs
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/dialogs')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp43
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h3
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/constraintdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp28
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui37
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp4
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/searchtextdialog.cpp2
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp2
14 files changed, 122 insertions, 11 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp
index a217da6..cf5848a 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.cpp
@@ -9,11 +9,13 @@
#include "constraints/constraintpanel.h"
#include "datatype.h"
#include "uiutils.h"
+#include "common/dialogsizehandler.h"
#include <QDebug>
#include <QCheckBox>
#include <QMessageBox>
#include <QDebug>
#include <QPushButton>
+#include <schemaresolver.h>
ColumnDialog::ColumnDialog(Db* db, QWidget *parent) :
QDialog(parent),
@@ -33,6 +35,7 @@ void ColumnDialog::init()
ui->setupUi(this);
limitDialogWidth(this);
setWindowIcon(ICONS.COLUMN);
+ DialogSizeHandler::applyFor(this);
ui->scale->setStrict(true, true);
ui->precision->setStrict(true, true);
@@ -403,7 +406,7 @@ void ColumnDialog::updateTypeValidations()
setValidState(ui->typeCombo, typeOk, typeErrorMsg);
if (typeOk && integerTypeEnforced)
- setValidStateTooltip(ui->typeCombo, integerEnforcedMsg);
+ setValidStateTooltip(ui->typeCombo, integerEnforcedMsg);
if (!scaleOk || !precisionOk || !typeOk)
{
@@ -437,6 +440,43 @@ bool ColumnDialog::hasAutoIncr() const
return false;
}
+void ColumnDialog::validateFkTypeMatch()
+{
+ QString fkTypeWarningMsg = tr("Referenced column type (%1) is different than type declared in this column. It may cause issues while inserting or updating data.");
+
+ for (SqliteCreateTable::Column::Constraint*& constr : column->getConstraints(SqliteCreateTable::Column::Constraint::FOREIGN_KEY))
+ {
+ if (!constr->foreignKey || constr->foreignKey->indexedColumns.isEmpty() || constr->foreignKey->foreignTable.isNull())
+ continue;
+
+ QString fkTable = constr->foreignKey->foreignTable;
+ QString fkColumn = constr->foreignKey->indexedColumns.first()->name;
+ if (!fkTableTypesCache.contains(fkTable, Qt::CaseInsensitive))
+ {
+ SchemaResolver resolver(db);
+ fkTableTypesCache[fkTable] = resolver.getTableColumnDataTypesByName(fkTable);;
+ }
+
+ StrHash<DataType> fkTypes = fkTableTypesCache.value(fkTable, Qt::CaseInsensitive);
+ if (fkTypes.isEmpty())
+ continue;
+
+ DataType fkType = fkTypes.value(fkColumn, Qt::CaseInsensitive);
+ if (fkType.toString().toLower().trimmed() != ui->typeCombo->currentText().toLower().trimmed())
+ {
+ auto fkButton = getToolButtonForConstraint(constr);
+ if (!fkButton)
+ continue;
+
+ if (isValidStateIndicatorVisible(fkButton))
+ continue;
+
+ setValidStateWarning(fkButton, fkTypeWarningMsg.arg(fkType.toString()));
+ break;
+ }
+ }
+}
+
void ColumnDialog::moveConstraintUp()
{
QModelIndex idx = ui->constraintsView->currentIndex();
@@ -618,6 +658,7 @@ void ColumnDialog::updateValidations()
updateConstraint(constr);
updateTypeValidations();
+ validateFkTypeMatch();
}
void ColumnDialog::updateConstraint(SqliteCreateTable::Column::Constraint* constraint)
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h
index c9faf23..bc02d14 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.h
@@ -5,6 +5,7 @@
#include "common/extactioncontainer.h"
#include "constraintdialog.h"
#include "guiSQLiteStudio_global.h"
+#include "common/strhash.h"
#include <QDialog>
#include <QPointer>
@@ -71,6 +72,7 @@ class GUI_API_EXPORT ColumnDialog : public QDialog, public ExtActionContainer
void updateTypeValidations();
void updateTypeForAutoIncr();
bool hasAutoIncr() const;
+ void validateFkTypeMatch();
Ui::ColumnDialog *ui = nullptr;
SqliteCreateTable::ColumnPtr column;
@@ -79,6 +81,7 @@ class GUI_API_EXPORT ColumnDialog : public QDialog, public ExtActionContainer
Db* db = nullptr;
bool integerTypeEnforced = false;
QSet<ConstraintDialog::Constraint> disabledConstraints;
+ StrHash<StrHash<DataType>> fkTableTypesCache;
private slots:
void updateConstraintsToolbarState();
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp
index 8c80f6d..425acad 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp
@@ -28,6 +28,7 @@
#include "syntaxhighlighterplugin.h"
#include "sqleditor.h"
#include "style.h"
+#include "common/dialogsizehandler.h"
#include <QSignalMapper>
#include <QLineEdit>
#include <QSpinBox>
@@ -201,6 +202,7 @@ void ConfigDialog::init()
{
ui->setupUi(this);
setWindowIcon(ICONS.CONFIGURE);
+ DialogSizeHandler::applyFor(this);
ui->categoriesTree->setCurrentItem(ui->categoriesTree->topLevelItem(0));
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/constraintdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/constraintdialog.cpp
index 0333cbc..84c4cdc 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/constraintdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/constraintdialog.cpp
@@ -79,6 +79,8 @@ void ConstraintDialog::init()
}
currentPanel->setDb(db);
+ currentPanel->setCreateTableStmt(createTable.data());
+ currentPanel->setColumnStmt(columnStmt.data());
currentPanel->setConstraint(constrStatement);
connect(currentPanel, SIGNAL(updateValidation()), this, SLOT(validate()));
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp
index e6a53db..2b85be3 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp
@@ -145,6 +145,8 @@ void DbDialog::init()
ui->testConnIcon->setVisible(false);
+ connect(ui->existingDatabaseRadio, SIGNAL(clicked()), this, SLOT(updateCreateMode()));
+ connect(ui->createDatabaseRadio, SIGNAL(clicked()), this, SLOT(updateCreateMode()));
connect(ui->fileEdit, SIGNAL(textChanged(QString)), this, SLOT(fileChanged(QString)));
connect(ui->nameEdit, SIGNAL(textEdited(QString)), this, SLOT(nameModified(QString)));
connect(ui->browseOpenButton, SIGNAL(clicked()), this, SLOT(browseClicked()));
@@ -172,7 +174,9 @@ void DbDialog::updateOptions()
customBrowseHandler = nullptr;
ui->pathGroup->setTitle(tr("File"));
- ui->browseOpenButton->setToolTip(tr("Select new or existing file on local computer"));
+ ui->existingDatabaseRadio->setChecked(true);
+ ui->createDatabaseRadio->setChecked(false);
+ updateCreateMode();
optionWidgets.clear();
optionKeyToWidget.clear();
@@ -209,6 +213,10 @@ void DbDialog::addOption(const DbPluginOption& option, int& row)
// This option does not add any editor, but has it's own label for path edit.
row--;
ui->pathGroup->setTitle(option.label);
+ ui->existingDatabaseRadio->setChecked(true);
+ ui->createDatabaseRadio->setChecked(false);
+ ui->createDatabaseRadio->setVisible(false);
+ updateCreateMode();
if (!option.toolTip.isEmpty())
ui->browseOpenButton->setToolTip(option.toolTip);
@@ -567,6 +575,13 @@ bool DbDialog::validate()
setValidState(ui->fileEdit, false, tr("Enter a database file path."));
fileState = false;
}
+ else if (QFileInfo(getPath()).isRelative())
+ {
+ setValidStateWarning(ui->fileEdit,
+ tr("You're using a relative file path, which will be resolved to \"%1\" according to the application's working directory. It's always better to use absolute file path to avoid unexpected database location.")
+ .arg(QFileInfo(getPath()).absoluteFilePath()));
+ fileState = false;
+ }
if (fileState)
{
@@ -689,7 +704,7 @@ void DbDialog::browseClicked()
else
dir = getFileDialogInitPath();
- QString path = getDbPath(dir);
+ QString path = getDbPath(createMode, dir);
if (path.isNull())
return;
@@ -728,6 +743,15 @@ void DbDialog::nameModified(const QString &value)
updateState();
}
+void DbDialog::updateCreateMode()
+{
+ createMode = ui->createDatabaseRadio->isChecked();
+ ui->browseOpenButton->setToolTip(
+ createMode ? tr("Choose a location for the new database file")
+ : tr("Browse for existing database file on local computer")
+ );
+}
+
void DbDialog::accept()
{
QString name = getName();
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h
index 76cd3ec..a52734b 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h
@@ -74,6 +74,7 @@ class GUI_API_EXPORT DbDialog : public QDialog
bool disableTypeAutodetection = false;
bool doAutoTest = false;
bool nameManuallyEdited = false;
+ bool createMode = false;
ImmediateTooltip* connIconTooltip = nullptr;
static const constexpr int ADDITIONAL_ROWS_BEGIN_INDEX = 1;
@@ -88,6 +89,7 @@ class GUI_API_EXPORT DbDialog : public QDialog
void propertyChanged();
void dbTypeChanged(int index);
void nameModified(const QString &value);
+ void updateCreateMode();
public slots:
void accept();
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui
index f0ebe2a..880175f 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui
@@ -44,21 +44,42 @@
<property name="title">
<string>File</string>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
- <widget class="QLineEdit" name="fileEdit"/>
+ <widget class="QRadioButton" name="existingDatabaseRadio">
+ <property name="text">
+ <string>Select an existing database file</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
</item>
<item>
- <widget class="QToolButton" name="browseOpenButton">
+ <widget class="QRadioButton" name="createDatabaseRadio">
<property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="../icons.qrc">
- <normaloff>:/icons/img/open_sql_file.png</normaloff>:/icons/img/open_sql_file.png</iconset>
+ <string>Create a new database file</string>
</property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <widget class="QLineEdit" name="fileEdit"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="browseOpenButton">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="icon">
+ <iconset resource="../icons.qrc">
+ <normaloff>:/icons/img/open_sql_file.png</normaloff>:/icons/img/open_sql_file.png</iconset>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp
index 3af221f..f3863c8 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/ddlpreviewdialog.cpp
@@ -4,6 +4,7 @@
#include "uiconfig.h"
#include "sqlitestudio.h"
#include "db/db.h"
+#include "common/dialogsizehandler.h"
DdlPreviewDialog::DdlPreviewDialog(Db* db, QWidget *parent) :
QDialog(parent),
@@ -11,6 +12,7 @@ DdlPreviewDialog::DdlPreviewDialog(Db* db, QWidget *parent) :
db(db)
{
ui->setupUi(this);
+ DialogSizeHandler::applyFor(this);
}
DdlPreviewDialog::~DdlPreviewDialog()
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp
index 135bc9d..820e4cc 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp
@@ -16,6 +16,7 @@
#include "services/notifymanager.h"
#include "themetuner.h"
#include "uiconfig.h"
+#include "common/dialogsizehandler.h"
#include <QClipboard>
#include <QDebug>
#include <QDir>
@@ -52,6 +53,7 @@ void ExportDialog::init()
ui->setupUi(this);
THEME_TUNER->darkThemeFix(this);
limitDialogWidth(this);
+ DialogSizeHandler::applyFor(this);
#ifdef Q_OS_MACX
resize(width() + 150, height());
@@ -61,7 +63,9 @@ void ExportDialog::init()
widgetCover = new WidgetCover(this);
widgetCover->initWithInterruptContainer(tr("Cancel"));
connect(widgetCover, SIGNAL(cancelClicked()), EXPORT_MANAGER, SLOT(interrupt()));
+ connect(EXPORT_MANAGER, SIGNAL(finishedStep(int)), widgetCover, SLOT(setProgress(int)));
widgetCover->setVisible(false);
+ widgetCover->displayProgress(0, "%v");
initPageOrder();
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp
index f443f18..6c9c8c7 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp
@@ -13,6 +13,7 @@
#include "themetuner.h"
#include "iconmanager.h"
#include "mainwindow.h"
+#include "common/dialogsizehandler.h"
#include <QDir>
#include <QDebug>
#include <QFileDialog>
@@ -102,6 +103,7 @@ void ImportDialog::init()
ui->setupUi(this);
THEME_TUNER->darkThemeFix(this);
limitDialogWidth(this);
+ DialogSizeHandler::applyFor(this);
#ifdef Q_OS_MACX
resize(width() + 150, height());
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp
index d5249d0..ad56f64 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/indexdialog.cpp
@@ -13,6 +13,7 @@
#include "indexexprcolumndialog.h"
#include "windows/editorwindow.h"
#include "services/codeformatter.h"
+#include "common/dialogsizehandler.h"
#include <QDebug>
#include <QGridLayout>
#include <QSignalMapper>
@@ -64,6 +65,7 @@ void IndexDialog::init()
{
ui->setupUi(this);
limitDialogWidth(this);
+ DialogSizeHandler::applyFor(this);
if (!db || !db->isOpen())
{
qCritical() << "Created IndexDialog for null or closed database.";
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp
index 89fff04..734f813 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/populatedialog.cpp
@@ -11,6 +11,7 @@
#include "services/populatemanager.h"
#include "common/widgetcover.h"
#include "common/compatibility.h"
+#include "common/dialogsizehandler.h"
#include <QPushButton>
#include <QGridLayout>
#include <QCheckBox>
@@ -45,6 +46,7 @@ void PopulateDialog::init()
{
ui->setupUi(this);
limitDialogWidth(this);
+ DialogSizeHandler::applyFor(this);
ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Populate", "populate dialog button"));
plugins = PLUGINS->getLoadedPlugins<PopulatePlugin>();
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/searchtextdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/searchtextdialog.cpp
index 578a253..b8992b4 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/searchtextdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/searchtextdialog.cpp
@@ -2,12 +2,14 @@
#include "ui_searchtextdialog.h"
#include "searchtextlocator.h"
#include "common/unused.h"
+#include "common/dialogsizehandler.h"
SearchTextDialog::SearchTextDialog(SearchTextLocator* textLocator, QWidget *parent) :
QDialog(parent),
ui(new Ui::SearchTextDialog), textLocator(textLocator)
{
ui->setupUi(this);
+ DialogSizeHandler::applyFor(this);
connect(textLocator, SIGNAL(replaceAvailable(bool)), this, SLOT(setReplaceAvailable(bool)));
connect(ui->findEdit, SIGNAL(textChanged(QString)), this, SLOT(markModifiedState()));
connect(ui->caseSensitiveCheck, SIGNAL(toggled(bool)), this, SLOT(markModifiedState()));
diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp
index 5091613..61fdadd 100644
--- a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp
+++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp
@@ -13,6 +13,7 @@
#include "services/config.h"
#include "uiutils.h"
#include "services/codeformatter.h"
+#include "common/dialogsizehandler.h"
#include <QDebug>
#include <QMessageBox>
#include <QPushButton>
@@ -83,6 +84,7 @@ void TriggerDialog::init()
{
ui->setupUi(this);
limitDialogWidth(this);
+ DialogSizeHandler::applyFor(this);
connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateDdlTab(int)));
connect(ui->actionColumns, SIGNAL(clicked()), this, SLOT(showColumnsDialog()));