From 1e06446189cf03f4d5f6a69e5735f4577dd3d6b6 Mon Sep 17 00:00:00 2001
From: Roman Telezhynskyi <kroluku@gmail.com>
Date: Fri, 14 Apr 2017 10:35:44 +0300
Subject: [PATCH] Improved editing custom measurement and increment.

Fixed case when a user input empty string. In this case return auto generated
name. Fixed case when the name is not unique. In this case find unique with
index "new_name" + "_number".

--HG--
branch : release
---
 src/app/tape/tmainwindow.cpp                  | 77 +++++++++++--------
 src/app/tape/tmainwindow.h                    |  3 +-
 .../valentina/dialogs/dialogincrements.cpp    | 64 ++++++++-------
 src/app/valentina/dialogs/dialogincrements.h  |  4 +-
 4 files changed, 87 insertions(+), 61 deletions(-)

diff --git a/src/app/tape/tmainwindow.cpp b/src/app/tape/tmainwindow.cpp
index f5f41da63..1959c538f 100644
--- a/src/app/tape/tmainwindow.cpp
+++ b/src/app/tape/tmainwindow.cpp
@@ -1280,15 +1280,8 @@ void TMainWindow::Fx()
 //---------------------------------------------------------------------------------------------------------------------
 void TMainWindow::AddCustom()
 {
-    qint32 num = 1;
-    QString name;
-    do
-    {
-        name = CustomMSign + qApp->TrVars()->InternalVarToUser(measurement_) + QString().number(num);
-        num++;
-    } while (data->IsUnique(name) == false);
-
-    qint32 currentRow;
+    const QString name = GetCustomName();
+    qint32 currentRow = -1;
 
     if (ui->tableWidget->currentRow() == -1)
     {
@@ -1489,7 +1482,7 @@ void TMainWindow::ShowMData()
         ShowMDiagram(meash->GetName());
 
         // Don't block all signal for QLineEdit. Need for correct handle with clear button.
-        disconnect(ui->lineEditName, &QLineEdit::editingFinished, this, &TMainWindow::SaveMName);
+        disconnect(ui->lineEditName, &QLineEdit::textEdited, this, &TMainWindow::SaveMName);
         ui->plainTextEditDescription->blockSignals(true);
         if (meash->IsCustom())
         {
@@ -1504,7 +1497,7 @@ void TMainWindow::ShowMData()
             ui->lineEditFullName->setText(qApp->TrVars()->GuiText(meash->GetName()));
             ui->lineEditName->setText(nameField->text());
         }
-        connect(ui->lineEditName, &QLineEdit::editingFinished, this, &TMainWindow::SaveMName);
+        connect(ui->lineEditName, &QLineEdit::textEdited, this, &TMainWindow::SaveMName);
         ui->plainTextEditDescription->blockSignals(false);
 
         if (mType == MeasurementsType::Standard)
@@ -1614,7 +1607,7 @@ void TMainWindow::DeployFormula()
 }
 
 //---------------------------------------------------------------------------------------------------------------------
-void TMainWindow::SaveMName()
+void TMainWindow::SaveMName(const QString &text)
 {
     const int row = ui->tableWidget->currentRow();
 
@@ -1640,26 +1633,32 @@ void TMainWindow::SaveMName()
         return;
     }
 
-    QString newName = ui->lineEditName->text();
+    QString newName = text;
+
     if (meash->IsCustom())
     {
-        newName = CustomMSign + newName;
+        newName.isEmpty() ? newName = GetCustomName() : newName = CustomMSign + newName;
 
-        if (data->IsUnique(newName))
+        if (not data->IsUnique(newName))
         {
-            m->SetMName(nameField->text(), newName);
-            MeasurementsWasSaved(false);
-            RefreshData();
-            search->RefreshList(ui->lineEditFind->text());
+            qint32 num = 2;
+            QString name = newName;
+            do
+            {
+                name = name + QLatin1String("_") + QString().number(num);
+                num++;
+            } while (not data->IsUnique(name));
+            newName = name;
+        }
 
-            ui->tableWidget->blockSignals(true);
-            ui->tableWidget->selectRow(row);
-            ui->tableWidget->blockSignals(false);
-        }
-        else
-        {
-            ui->lineEditName->setText(ClearCustomName(nameField->text()));
-        }
+        m->SetMName(nameField->text(), newName);
+        MeasurementsWasSaved(false);
+        RefreshData();
+        search->RefreshList(ui->lineEditFind->text());
+
+        ui->tableWidget->blockSignals(true);
+        ui->tableWidget->selectRow(row);
+        ui->tableWidget->blockSignals(false);
     }
     else
     {
@@ -2146,11 +2145,9 @@ void TMainWindow::InitWindow()
     ui->actionImportFromPattern->setEnabled(true);
     ui->actionSaveAs->setEnabled(true);
 
-#if QT_VERSION > QT_VERSION_CHECK(5, 1, 0)
-    ui->lineEditName->setValidator( new QRegularExpressionValidator(QRegularExpression(NameRegExp()), this));
-#else
-    ui->lineEditName->setValidator( new QRegExpValidator(QRegExp(NameRegExp()), this));
-#endif
+    ui->lineEditName->setValidator(new QRegularExpressionValidator(QRegularExpression(
+                                                                       QLatin1String("^$|")+NameRegExp()),
+                                                                   this));
 
     connect(ui->toolButtonRemove, &QToolButton::clicked, this, &TMainWindow::Remove);
     connect(ui->toolButtonTop, &QToolButton::clicked, this, &TMainWindow::MoveTop);
@@ -2158,7 +2155,7 @@ void TMainWindow::InitWindow()
     connect(ui->toolButtonDown, &QToolButton::clicked, this, &TMainWindow::MoveDown);
     connect(ui->toolButtonBottom, &QToolButton::clicked, this, &TMainWindow::MoveBottom);
 
-    connect(ui->lineEditName, &QLineEdit::editingFinished, this, &TMainWindow::SaveMName);
+    connect(ui->lineEditName, &QLineEdit::textEdited, this, &TMainWindow::SaveMName);
     connect(ui->plainTextEditDescription, &QPlainTextEdit::textChanged, this, &TMainWindow::SaveMDescription);
     connect(ui->lineEditFullName, &QLineEdit::textEdited, this, &TMainWindow::SaveMFullName);
 
@@ -2492,6 +2489,20 @@ void TMainWindow::RefreshTable()
     }
 }
 
+//---------------------------------------------------------------------------------------------------------------------
+QString TMainWindow::GetCustomName() const
+{
+    qint32 num = 1;
+    QString name;
+    do
+    {
+        name = CustomMSign + qApp->TrVars()->InternalVarToUser(measurement_) + QString().number(num);
+        num++;
+    } while (data->IsUnique(name) == false);
+
+    return name;
+}
+
 //---------------------------------------------------------------------------------------------------------------------
 void TMainWindow::Controls()
 {
diff --git a/src/app/tape/tmainwindow.h b/src/app/tape/tmainwindow.h
index 30af38ec1..6d8984442 100644
--- a/src/app/tape/tmainwindow.h
+++ b/src/app/tape/tmainwindow.h
@@ -117,7 +117,7 @@ private slots:
 
     void DeployFormula();
 
-    void SaveMName();
+    void SaveMName(const QString &text);
     void SaveMValue();
     void SaveMBaseValue(double value);
     void SaveMSizeIncrease(double value);
@@ -181,6 +181,7 @@ private:
     void RefreshData();
     void RefreshTable();
 
+    QString GetCustomName() const;
     QString ClearCustomName(const QString &name) const;
 
     bool EvalFormula(const QString &formula, bool fromUser, VContainer *data, QLabel *label);
diff --git a/src/app/valentina/dialogs/dialogincrements.cpp b/src/app/valentina/dialogs/dialogincrements.cpp
index ef9ae5920..b96cc22a8 100644
--- a/src/app/valentina/dialogs/dialogincrements.cpp
+++ b/src/app/valentina/dialogs/dialogincrements.cpp
@@ -92,11 +92,8 @@ DialogIncrements::DialogIncrements(VContainer *data, VPattern *doc, QWidget *par
     connect(this->doc, &VPattern::FullUpdateFromFile, this, &DialogIncrements::FullUpdateFromFile);
 
     ui->tabWidget->setCurrentIndex(0);
-#if QT_VERSION > QT_VERSION_CHECK(5, 1, 0)
-    ui->lineEditName->setValidator( new QRegularExpressionValidator(QRegularExpression(NameRegExp()), this));
-#else
-    ui->lineEditName->setValidator( new QRegExpValidator(QRegExp(NameRegExp()), this));
-#endif
+    ui->lineEditName->setValidator( new QRegularExpressionValidator(QRegularExpression(
+                                                                        QLatin1String("^$|")+NameRegExp()), this));
 
     connect(ui->tableWidgetIncrement, &QTableWidget::itemSelectionChanged, this,
             &DialogIncrements::ShowIncrementDetails);
@@ -107,7 +104,7 @@ DialogIncrements::DialogIncrements(VContainer *data, VPattern *doc, QWidget *par
     connect(ui->toolButtonDown, &QToolButton::clicked, this, &DialogIncrements::MoveDown);
     connect(ui->pushButtonGrow, &QPushButton::clicked, this, &DialogIncrements::DeployFormula);
     connect(ui->toolButtonExpr, &QToolButton::clicked, this, &DialogIncrements::Fx);
-    connect(ui->lineEditName, &QLineEdit::editingFinished, this, &DialogIncrements::SaveIncrName);
+    connect(ui->lineEditName, &QLineEdit::textEdited, this, &DialogIncrements::SaveIncrName);
     connect(ui->plainTextEditDescription, &QPlainTextEdit::textChanged, this, &DialogIncrements::SaveIncrDescription);
     connect(ui->plainTextEditFormula, &QPlainTextEdit::textChanged, this, &DialogIncrements::SaveIncrFormula);
     connect(ui->lineEditFind, &QLineEdit::textEdited, RECEIVER(this)[this](const QString &term){search->Find(term);});
@@ -300,6 +297,19 @@ void DialogIncrements::AddCell(QTableWidget *table, const QString &text, int row
     table->setItem(row, column, item);
 }
 
+//---------------------------------------------------------------------------------------------------------------------
+QString DialogIncrements::GetCustomName() const
+{
+    qint32 num = 1;
+    QString name;
+    do
+    {
+        name = CustomIncrSign + qApp->TrVars()->InternalVarToUser(increment_) + QString().number(num);
+        num++;
+    } while (not data->IsUnique(name));
+    return name;
+}
+
 //---------------------------------------------------------------------------------------------------------------------
 QString DialogIncrements::ClearIncrementName(const QString &name) const
 {
@@ -467,15 +477,9 @@ void DialogIncrements::FullUpdateFromFile()
 void DialogIncrements::AddIncrement()
 {
     qCDebug(vDialog, "Add a new increment");
-    qint32 num = 1;
-    QString name;
-    do
-    {
-        name = CustomIncrSign + qApp->TrVars()->InternalVarToUser(increment_) + QString().number(num);
-        num++;
-    } while (data->IsUnique(name)==false);
 
-    qint32 currentRow;
+    const QString name = GetCustomName();
+    qint32 currentRow = -1;
 
     if (ui->tableWidgetIncrement->currentRow() == -1)
     {
@@ -554,7 +558,7 @@ void DialogIncrements::MoveDown()
 }
 
 //---------------------------------------------------------------------------------------------------------------------
-void DialogIncrements::SaveIncrName()
+void DialogIncrements::SaveIncrName(const QString &text)
 {
     const int row = ui->tableWidgetIncrement->currentRow();
 
@@ -564,19 +568,27 @@ void DialogIncrements::SaveIncrName()
     }
 
     const QTableWidgetItem *nameField = ui->tableWidgetIncrement->item(row, 0);
-    const QString newName = CustomIncrSign + ui->lineEditName->text();
-    if (data->IsUnique(newName))
+
+    QString newName = text;
+    newName.isEmpty() ? newName = GetCustomName() : newName = CustomIncrSign + newName;
+
+    if (not data->IsUnique(newName))
     {
-        doc->SetIncrementName(nameField->text(), newName);
-        FullUpdateTree(Document::LiteParse);
-        ui->tableWidgetIncrement->blockSignals(true);
-        ui->tableWidgetIncrement->selectRow(row);
-        ui->tableWidgetIncrement->blockSignals(false);
-    }
-    else
-    {
-        ui->lineEditName->setText(ClearIncrementName(nameField->text()));
+        qint32 num = 2;
+        QString name = newName;
+        do
+        {
+            name = name + QLatin1String("_") + QString().number(num);
+            num++;
+        } while (not data->IsUnique(name));
+        newName = name;
     }
+
+    doc->SetIncrementName(nameField->text(), newName);
+    FullUpdateTree(Document::LiteParse);
+    ui->tableWidgetIncrement->blockSignals(true);
+    ui->tableWidgetIncrement->selectRow(row);
+    ui->tableWidgetIncrement->blockSignals(false);
 }
 
 //---------------------------------------------------------------------------------------------------------------------
diff --git a/src/app/valentina/dialogs/dialogincrements.h b/src/app/valentina/dialogs/dialogincrements.h
index 4403c123f..2b19efe85 100644
--- a/src/app/valentina/dialogs/dialogincrements.h
+++ b/src/app/valentina/dialogs/dialogincrements.h
@@ -66,7 +66,7 @@ private slots:
     void RemoveIncrement();
     void MoveUp();
     void MoveDown();
-    void SaveIncrName();
+    void SaveIncrName(const QString &text);
     void SaveIncrDescription();
     void SaveIncrFormula();
     void DeployFormula();
@@ -105,7 +105,9 @@ private:
 
     void AddCell(QTableWidget *table, const QString &text, int row, int column, int aligment, bool ok = true);
 
+    QString GetCustomName() const;
     QString ClearIncrementName(const QString &name) const;
+
     bool    EvalIncrementFormula(const QString &formula, bool fromUser, VContainer *data, QLabel *label);
     void    Controls();
     void    EnableDetails(bool enabled);