diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/dialogs')
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())); |
