diff options
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/constraints')
12 files changed, 262 insertions, 113 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.ui index a481875..0c3478e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columncollatepanel.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -23,7 +23,16 @@ </size> </property> <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -46,7 +55,16 @@ <item> <widget class="QWidget" name="namedWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp index 3d7090a..4f402b2 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.cpp @@ -1,9 +1,9 @@ #include "columndefaultpanel.h" #include "ui_columndefaultpanel.h" -#include "parser/ast/sqlitecreatetable.h" #include "parser/parser.h" #include "parser/keywords.h" #include "uiutils.h" +#include "schemaresolver.h" #include <QDebug> ColumnDefaultPanel::ColumnDefaultPanel(QWidget *parent) : @@ -34,6 +34,22 @@ void ColumnDefaultPanel::changeEvent(QEvent *e) bool ColumnDefaultPanel::validate() { + if (!ui->exprEdit->isSyntaxChecked()) + { + setValidState(ui->exprEdit, false, tr("Enter a default value expression.")); + currentMode = Mode::ERROR; + return false; + } + + // First check if we already validated this text. + // This method is called twice, by both errors checking and syntax highlighting, + // because signal for textChange() is connected with call to updateValidation(). + QString text = ui->exprEdit->toPlainText(); + if (!lastValidatedText.isNull() && lastValidatedText == text) + return lastValidationResult; + + lastValidatedText = text; + bool nameOk = true; if (ui->namedCheck->isChecked() && ui->namedEdit->text().isEmpty()) nameOk = false; @@ -41,12 +57,40 @@ bool ColumnDefaultPanel::validate() bool exprOk = !ui->exprEdit->toPlainText().trimmed().isEmpty() && !ui->exprEdit->haveErrors(); - bool exprCheckedOk = exprOk && ui->exprEdit->isSyntaxChecked(); + QString exprError; + if (exprOk) + { + // Everything looks fine, so lets do the final check - if the value is considered constant by SQLite. + static QString tempDdlLiteralTpl = QStringLiteral("CREATE TABLE temp.%1 (col DEFAULT %2);"); + static QString tempDdlExprTpl = QStringLiteral("CREATE TABLE temp.%1 (col DEFAULT (%2));"); + static QString dropTempDdl = QStringLiteral("DROP TABLE IF EXISTS temp.%1;"); + + QString tableName = getTempTable(); + QString tempDdl = tempDdlExprTpl.arg(tableName, ui->exprEdit->toPlainText()); + SqlQueryPtr res = db->exec(tempDdl); + if (res->isError()) + { + tempDdl = tempDdlLiteralTpl.arg(tableName, ui->exprEdit->toPlainText()); + res = db->exec(tempDdl); + if (res->isError()) + { + exprOk = false; + exprError = tr("Invalid default value expression: %1").arg(res->getErrorText()); + } + else + currentMode = Mode::LITERAL; + } + else + currentMode = Mode::EXPR; + + db->exec(dropTempDdl.arg(tableName)); + } - setValidState(ui->exprEdit, exprOk, tr("Enter a default value expression.")); + setValidState(ui->exprEdit, exprOk, exprError); setValidState(ui->namedEdit, nameOk, tr("Enter a name of the constraint.")); - return exprCheckedOk && nameOk; + lastValidationResult = (exprOk && nameOk); + return lastValidationResult; } bool ColumnDefaultPanel::validateOnly() @@ -69,18 +113,99 @@ void ColumnDefaultPanel::storeConfiguration() if (constraint.isNull()) return; + if (currentMode == Mode::ERROR) + { + qCritical() << "Call to ColumnDefaultPanel::storeConfiguration() while its mode is in ERROR state."; + return; + } + SqliteCreateTable::Column::Constraint* constr = dynamic_cast<SqliteCreateTable::Column::Constraint*>(constraint.data()); constr->type = SqliteCreateTable::Column::Constraint::DEFAULT; - SqliteExprPtr expr = parseExpression(ui->exprEdit->toPlainText()); - SqliteExpr* newExpr = new SqliteExpr(*expr.data()); - newExpr->setParent(constraint.data()); - constr->expr = newExpr; + switch (currentMode) + { + case Mode::EXPR: + storeExpr(constr); + break; + case Mode::LITERAL: + storeLiteral(constr); + break; + case Mode::ERROR: + return; + } if (ui->namedCheck->isChecked()) constr->name = ui->namedEdit->text(); } +void ColumnDefaultPanel::storeExpr(SqliteCreateTable::Column::Constraint* constr) +{ + QString text = ui->exprEdit->toPlainText(); + clearDefault(constr); + if (text.toUpper() == "NULL") + { + // We will just use literal null, no need to create expression with null. + constr->literalNull = true; + return; + } + + Parser parser(db->getDialect()); + SqliteExpr* newExpr = parser.parseExpr(text); + newExpr->setParent(constraint.data()); + constr->expr = newExpr; +} + +void ColumnDefaultPanel::storeLiteral(SqliteCreateTable::Column::Constraint* constr) +{ + QString text = ui->exprEdit->toPlainText(); + + Parser parser(db->getDialect()); + SqliteCreateTablePtr createTable = parser.parse<SqliteCreateTable>("CREATE TABLE tab (col DEFAULT "+text+");"); + if (!createTable || createTable->columns.size() == 0 || createTable->columns.first()->constraints.size() == 0) + { + qCritical() << "ColumnDefaultPanel::storeLiteral(): create table not parsed! Cannot store literal. Expression was:" << text; + return; + } + + SqliteCreateTable::Column::Constraint* parsedConstr = createTable->columns.first()->constraints.first(); + if (parsedConstr->type != SqliteCreateTable::Column::Constraint::Type::DEFAULT) + { + qCritical() << "ColumnDefaultPanel::storeLiteral(): parsed constraint not a DEFAULT! Cannot store literal. Expression was:" << text; + return; + } + + clearDefault(constr); + if (!parsedConstr->id.isNull()) + constr->id = parsedConstr->id; + else if (!parsedConstr->ctime.isNull()) + constr->ctime = parsedConstr->ctime.toUpper(); + else if (parsedConstr->expr) + { + qWarning() << "ColumnDefaultPanel::storeLiteral(): parsed constraint turned out to be an expression. This should be handled by ColumnDefaultPanel::storeExpr." + << "Expression was:" << text; + constr->expr = parsedConstr->expr; + parsedConstr->expr = nullptr; + constr->expr->setParent(constr); + } + else if (parsedConstr->literalNull) + constr->literalNull = true; + else + constr->literalValue = parsedConstr->literalValue; +} + +void ColumnDefaultPanel::clearDefault(SqliteCreateTable::Column::Constraint* constr) +{ + if (constr->expr) + { + delete constr->expr; + constr->expr = nullptr; + } + constr->literalNull = false; + constr->literalValue = QVariant(); + constr->id = QString(); + constr->ctime = QString(); +} + void ColumnDefaultPanel::init() { setFocusProxy(ui->exprEdit); @@ -101,101 +226,49 @@ void ColumnDefaultPanel::readConstraint() SqliteCreateTable::Column::Constraint* constr = dynamic_cast<SqliteCreateTable::Column::Constraint*>(constraint.data()); if (constr->expr) + { ui->exprEdit->setPlainText(constr->expr->detokenize()); + currentMode = Mode::EXPR; + } else if (!constr->literalValue.isNull()) - ui->exprEdit->setPlainText(constr->literalValue.toString()); - - if (!constr->name.isNull()) { - ui->namedCheck->setChecked(true); - ui->namedEdit->setText(constr->name); + ui->exprEdit->setPlainText(constr->literalValue.toString()); + currentMode = Mode::LITERAL; } -} - -void ColumnDefaultPanel::updateVirtualSql() -{ - ui->exprEdit->setDb(db); - - SqliteCreateTable::Column* column = dynamic_cast<SqliteCreateTable::Column*>(constraint->parentStatement()); - SqliteCreateTable* createTable = dynamic_cast<SqliteCreateTable*>(column->parentStatement()); - - createTable->rebuildTokens(); - TokenList tokens = createTable->tokens; - TokenList colTokens = column->tokens; - if (createTable->columns.indexOf(column) == -1) + else if (!constr->id.isNull()) { - if (createTable->columns.size() == 0) - { - // No columns. Cannot get any context info. - return; - } - - colTokens = createTable->columns.last()->tokens; + ui->exprEdit->setPlainText(constr->id); + currentMode = Mode::LITERAL; } - - if (colTokens.size() == 0) + else if (!constr->ctime.isNull()) { - qWarning() << "CREATE TABLE tokens are invalid (0) while call to ColumnDefaultPanel::updateVirtualSql()."; - return; + ui->exprEdit->setPlainText(constr->ctime); + currentMode = Mode::LITERAL; } - - int idx = tokens.lastIndexOf(colTokens.last()); - if (idx == -1) + else if (constr->literalNull) { - qWarning() << "CREATE TABLE tokens are invalid while call to ColumnDefaultPanel::updateVirtualSql()."; - return; + ui->exprEdit->setPlainText("NULL"); + currentMode = Mode::LITERAL; } - idx++; - - TokenList newTokens; - newTokens << TokenPtr::create(Token::SPACE, " ") - << TokenPtr::create(Token::KEYWORD, "DEFAULT") - << TokenPtr::create(Token::SPACE, " "); - if (constraint->dialect == Dialect::Sqlite3) - { - newTokens << TokenPtr::create(Token::PAR_LEFT, "(") - << TokenPtr::create(Token::OTHER, "%1") - << TokenPtr::create(Token::PAR_RIGHT, ")"); - } - else + if (!constr->name.isNull()) { - newTokens << TokenPtr::create(Token::OTHER, "%1"); + ui->namedCheck->setChecked(true); + ui->namedEdit->setText(constr->name); } - - tokens.insert(idx, newTokens); - QString sql = tokens.detokenize(); - - ui->exprEdit->setVirtualSqlExpression(sql); } -SqliteExprPtr ColumnDefaultPanel::parseExpression(const QString& sql) +void ColumnDefaultPanel::updateVirtualSql() { - Parser parser(db->getDialect()); - if (!parser.parse("SELECT "+sql)) - return SqliteExprPtr(); - - QList<SqliteQueryPtr> queries = parser.getQueries(); - if (queries.size() == 0) - return SqliteExprPtr(); - - SqliteQueryPtr first = queries.first(); - if (first->queryType != SqliteQueryType::Select) - return SqliteExprPtr(); - - SqliteSelectPtr select = first.dynamicCast<SqliteSelect>(); - if (select->coreSelects.size() < 1) - return SqliteExprPtr(); - - SqliteSelect::Core* core = select->coreSelects.first(); - if (core->resultColumns.size() < 1) - return SqliteExprPtr(); - - SqliteSelect::Core::ResultColumn* resCol = core->resultColumns.first(); - if (!resCol->expr) - return SqliteExprPtr(); + static QString sql = QStringLiteral("CREATE TABLE tab (col DEFAULT %1)"); + ui->exprEdit->setDb(db); + ui->exprEdit->setVirtualSqlExpression(sql.arg(db->getDialect() == Dialect::Sqlite3 ? "(%1)" : "%1")); +} - return resCol->expr->detach().dynamicCast<SqliteExpr>(); +QString ColumnDefaultPanel::getTempTable() +{ + SchemaResolver resolver(db); + return resolver.getUniqueName("temp", "sqlitestudio_temp_table"); } void ColumnDefaultPanel::updateState() diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.h b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.h index 933c2dd..3cdd962 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.h +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.h @@ -4,6 +4,7 @@ #include "constraintpanel.h" #include "parser/ast/sqliteconflictalgo.h" #include "guiSQLiteStudio_global.h" +#include "parser/ast/sqlitecreatetable.h" #include <QWidget> namespace Ui { @@ -27,12 +28,25 @@ class GUI_API_EXPORT ColumnDefaultPanel : public ConstraintPanel void storeConfiguration(); private: + enum class Mode + { + EXPR, + LITERAL, + ERROR + }; + void init(); void readConstraint(); void updateVirtualSql(); - SqliteExprPtr parseExpression(const QString& sql); + QString getTempTable(); + void storeExpr(SqliteCreateTable::Column::Constraint* constr); + void storeLiteral(SqliteCreateTable::Column::Constraint* constr); + void clearDefault(SqliteCreateTable::Column::Constraint* constr); Ui::ColumnDefaultPanel *ui = nullptr; + QString lastValidatedText; + bool lastValidationResult = false; + Mode currentMode = Mode::ERROR; private slots: void updateState(); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.ui index fdf55b0..0026fdb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columndefaultpanel.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp index cf234f7..f4eb3eb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.cpp @@ -217,7 +217,7 @@ void ColumnForeignKeyPanel::storeConfiguration() storeCondition(SqliteForeignKey::Condition::DELETE, ui->onDeleteCombo->currentText()); if (ui->onUpdateCheckBox->isChecked()) - storeCondition(SqliteForeignKey::Condition::UPDATE, ui->onDeleteCombo->currentText()); + storeCondition(SqliteForeignKey::Condition::UPDATE, ui->onUpdateCombo->currentText()); if (ui->matchCheckBox->isChecked()) storeMatchCondition(ui->matchCombo->currentText()); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.ui index c442967..23e2300 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnforeignkeypanel.ui @@ -17,7 +17,7 @@ </size> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -61,7 +61,7 @@ <item row="0" column="0"> <widget class="QCheckBox" name="onUpdateCheckBox"> <property name="text"> - <string>ON UPDATE</string> + <string notr="true">ON UPDATE</string> </property> </widget> </item> @@ -71,14 +71,14 @@ <item row="1" column="0"> <widget class="QCheckBox" name="onDeleteCheckBox"> <property name="text"> - <string>ON DELETE</string> + <string notr="true">ON DELETE</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QCheckBox" name="matchCheckBox"> <property name="text"> - <string>MATCH</string> + <string notr="true">MATCH</string> </property> </widget> </item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.ui index bedabca..d6c15d4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnprimarykeypanel.ui @@ -17,7 +17,7 @@ </size> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -30,7 +30,16 @@ <item> <widget class="QWidget" name="sortOrderWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -56,7 +65,16 @@ <item> <widget class="QWidget" name="namedWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -75,7 +93,16 @@ <item> <widget class="QWidget" name="conflictWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_3"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.ui index 16efc89..7a60f40 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/columnuniqueandnotnullpanel.ui @@ -17,13 +17,22 @@ </size> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QWidget" name="namedWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -42,7 +51,16 @@ <item> <widget class="QWidget" name="conflictWidget" native="true"> <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.ui index 58f58e6..e7021b4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/constraintcheckpanel.ui @@ -7,17 +7,17 @@ <x>0</x> <y>0</y> <width>400</width> - <height>197</height> + <height>211</height> </rect> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="exprGroup"> <property name="title"> - <string>The expression</string> + <string>The condition</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp index 60da220..7354997 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.cpp @@ -327,7 +327,6 @@ void TableForeignKeyPanel::storeConfiguration() QCheckBox* check = nullptr; QComboBox* combo = nullptr; SqliteIndexedColumn* idxCol = nullptr; - QString name; for (int i = 0; i < totalColumns; i++) { // Local column @@ -352,7 +351,7 @@ void TableForeignKeyPanel::storeConfiguration() storeCondition(SqliteForeignKey::Condition::DELETE, ui->onDeleteCombo->currentText()); if (ui->onUpdateCheckBox->isChecked()) - storeCondition(SqliteForeignKey::Condition::UPDATE, ui->onDeleteCombo->currentText()); + storeCondition(SqliteForeignKey::Condition::UPDATE, ui->onUpdateCombo->currentText()); if (ui->matchCheckBox->isChecked()) storeMatchCondition(ui->matchCombo->currentText()); diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.ui index 8917381..7ecbe06 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tableforeignkeypanel.ui @@ -17,7 +17,7 @@ </size> </property> <property name="windowTitle"> - <string>Form</string> + <string notr="true">Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -129,7 +129,7 @@ but it's okay to use them anyway.</string> <item row="0" column="0"> <widget class="QCheckBox" name="onUpdateCheckBox"> <property name="text"> - <string>ON UPDATE</string> + <string notr="true">ON UPDATE</string> </property> </widget> </item> @@ -139,14 +139,14 @@ but it's okay to use them anyway.</string> <item row="1" column="0"> <widget class="QCheckBox" name="onDeleteCheckBox"> <property name="text"> - <string>ON DELETE</string> + <string notr="true">ON DELETE</string> </property> </widget> </item> <item row="2" column="0"> <widget class="QCheckBox" name="matchCheckBox"> <property name="text"> - <string>MATCH</string> + <string notr="true">MATCH</string> </property> </widget> </item> diff --git a/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.ui b/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.ui index 9453d3c..52c5af1 100644 --- a/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.ui +++ b/SQLiteStudio3/guiSQLiteStudio/constraints/tablepkanduniquepanel.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>PrimaryKeyOrUniquePanel</string> + <string notr="true">PrimaryKeyOrUniquePanel</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="leftMargin"> |
