Hide not visible fermentables data inside the fermentablesTable so that all data stays together. Format the fermentables json data again after changes. Add confirmation message to delete a fermentable row. Added buttons for a fermentables row editor.

Mon, 04 Apr 2022 16:21:38 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 04 Apr 2022 16:21:38 +0200
changeset 105
e79079bf013d
parent 104
c02dfb7bb2f9
child 106
2924fb71dce9

Hide not visible fermentables data inside the fermentablesTable so that all data stays together. Format the fermentables json data again after changes. Add confirmation message to delete a fermentable row. Added buttons for a fermentables row editor.

src/EditRecipe.cpp file | annotate | diff | comparison | revisions
src/EditRecipe.h file | annotate | diff | comparison | revisions
--- a/src/EditRecipe.cpp	Sun Apr 03 22:11:45 2022 +0200
+++ b/src/EditRecipe.cpp	Mon Apr 04 16:21:38 2022 +0200
@@ -302,18 +302,40 @@
      * triggers the cellChanged signal. The QTableWidget has no better signal to use. */
     this->ignoreChanges = true;
 
-    const QStringList labels({tr("Fermentable"), tr("EBC"), tr("Type"), tr("Graintype"), tr("When"), tr("Yield"), tr("Amount"), tr("Procent"), tr("100%"), tr("Button")});
-    ui->fermentablesTable->setColumnCount(10);
-    ui->fermentablesTable->setColumnWidth(0, 350);     /* Fermentable	*/
-    ui->fermentablesTable->setColumnWidth(1,  50);     /* Color		*/
-    ui->fermentablesTable->setColumnWidth(2,  75);     /* Type		*/
-    ui->fermentablesTable->setColumnWidth(3,  75);     /* Graintype	*/
-    ui->fermentablesTable->setColumnWidth(4,  75);     /* Added		*/
-    ui->fermentablesTable->setColumnWidth(5,  75);     /* Yield		*/
-    ui->fermentablesTable->setColumnWidth(6,  75);     /* Amount	*/
-    ui->fermentablesTable->setColumnWidth(7,  60);     /* Procent	*/
-    ui->fermentablesTable->setColumnWidth(8,  50);     /* 100%		*/
-    ui->fermentablesTable->setColumnWidth(9,  80);     /* Button	*/
+    const QStringList labels({tr("Supplier"), tr("Fermentable"), tr("EBC"), tr("Type"), tr("Graintype"), tr("When"), tr("Yield"),
+		    	      tr("Amount"), tr("Procent"), tr("100%"), tr("Delete"), tr("Edit"), "13", "14", "15", "16", "17",
+			      "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30" });
+    ui->fermentablesTable->setColumnCount(30);
+    ui->fermentablesTable->setColumnWidth(0, 150);     /* Supplier	*/
+    ui->fermentablesTable->setColumnWidth(1, 200);     /* Fermentable	*/
+    ui->fermentablesTable->setColumnWidth(2,  50);     /* Color		*/
+    ui->fermentablesTable->setColumnWidth(3,  75);     /* Type		*/
+    ui->fermentablesTable->setColumnWidth(4,  75);     /* Graintype	*/
+    ui->fermentablesTable->setColumnWidth(5,  75);     /* Added		*/
+    ui->fermentablesTable->setColumnWidth(6,  75);     /* Yield		*/
+    ui->fermentablesTable->setColumnWidth(7,  75);     /* Amount	*/
+    ui->fermentablesTable->setColumnWidth(8,  60);     /* Procent	*/
+    ui->fermentablesTable->setColumnWidth(9,  50);     /* 100%		*/
+    ui->fermentablesTable->setColumnWidth(10, 80);     /* Delete	*/
+    ui->fermentablesTable->setColumnWidth(11, 80);     /* Edit		*/
+    ui->fermentablesTable->setColumnHidden(12, true);
+    ui->fermentablesTable->setColumnHidden(13, true);
+    ui->fermentablesTable->setColumnHidden(14, true);
+    ui->fermentablesTable->setColumnHidden(15, true);
+    ui->fermentablesTable->setColumnHidden(16, true);
+    ui->fermentablesTable->setColumnHidden(17, true);
+    ui->fermentablesTable->setColumnHidden(18, true);
+    ui->fermentablesTable->setColumnHidden(19, true);
+    ui->fermentablesTable->setColumnHidden(20, true);
+    ui->fermentablesTable->setColumnHidden(21, true);
+    ui->fermentablesTable->setColumnHidden(22, true);
+    ui->fermentablesTable->setColumnHidden(23, true);
+    ui->fermentablesTable->setColumnHidden(24, true);
+    ui->fermentablesTable->setColumnHidden(25, true);
+    ui->fermentablesTable->setColumnHidden(26, true);
+    ui->fermentablesTable->setColumnHidden(27, true);
+    ui->fermentablesTable->setColumnHidden(28, true);
+    ui->fermentablesTable->setColumnHidden(29, true);
     ui->fermentablesTable->setHorizontalHeaderLabels(labels);
     ui->fermentablesTable->verticalHeader()->hide();
     ui->fermentablesTable->setRowCount(this->fermentables.array().size());
@@ -322,85 +344,93 @@
 	for (int i = 0; i < this->fermentables.array().size(); i++) {
             QJsonObject obj = this->fermentables.array().at(i).toObject();
 
-	    w = obj["f_supplier"].toString()+" / "+obj["f_name"].toString();
-            ui->fermentablesTable->setItem(i, 0, new QTableWidgetItem(w));
+            ui->fermentablesTable->setItem(i, 0, new QTableWidgetItem(obj["f_supplier"].toString()));
+            ui->fermentablesTable->setItem(i, 1, new QTableWidgetItem(obj["f_name"].toString()));
 
-	    if (obj["f_color"].isString())
-                d = QString(obj["f_color"].toString()).toDouble();
-            else
-                d = obj["f_color"].toDouble();
-            w = QString("%1").arg(d, 1, 'f', 0, '0');
+            w = QString("%1").arg(obj["f_color"].toDouble(), 1, 'f', 0, '0');
             item = new QTableWidgetItem(w);
             item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
-            ui->fermentablesTable->setItem(i, 1, item);
-
-	    if (obj["f_type"].isString())
-                j = QString(obj["f_type"].toString()).toInt();
-            else
-                j = obj["f_type"].toInt();
-	    item = new QTableWidgetItem(f_types[j]);
-	    item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
-	    ui->fermentablesTable->setItem(i, 2, item);
+	    item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+            ui->fermentablesTable->setItem(i, 2, item);
 
-	    if (obj["f_graintype"].isString())
-                j = QString(obj["f_graintype"].toString()).toInt();
-            else
-                j = obj["f_graintype"].toInt();
-            item = new QTableWidgetItem(f_graintypes[j]);
+	    item = new QTableWidgetItem(f_types[obj["f_type"].toInt()]);
+	    item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
+	    item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+	    ui->fermentablesTable->setItem(i, 3, item);
+
+            item = new QTableWidgetItem(f_graintypes[obj["f_graintype"].toInt()]);
             item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
-            ui->fermentablesTable->setItem(i, 3, item);
-
-	    if (obj["f_added"].isString())
-                j = QString(obj["f_added"].toString()).toInt();
-            else
-                j = obj["f_added"].toInt();
-            item = new QTableWidgetItem(f_added[j]);
-            item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
+	    item->setFlags(item->flags() & ~Qt::ItemIsEditable);
             ui->fermentablesTable->setItem(i, 4, item);
 
-	    if (obj["f_yield"].isString())
-                d = QString(obj["f_yield"].toString()).toDouble();
-            else
-                d = obj["f_yield"].toDouble();
-            w = QString("%1%").arg(d, 2, 'f', 1, '0');
-            item = new QTableWidgetItem(w);
-            item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+            item = new QTableWidgetItem(f_added[obj["f_added"].toInt()]);
+            item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
             ui->fermentablesTable->setItem(i, 5, item);
 
-	    if (obj["f_amount"].isString())
-                d = QString(obj["f_amount"].toString()).toDouble();
-            else
-                d = obj["f_amount"].toDouble();
-            w = QString("%1 Kg").arg(d, 4, 'f', 3, '0');
+            w = QString("%1%").arg(obj["f_yield"].toDouble(), 2, 'f', 1, '0');
             item = new QTableWidgetItem(w);
             item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+	    item->setFlags(item->flags() & ~Qt::ItemIsEditable);
             ui->fermentablesTable->setItem(i, 6, item);
 
-	    if (obj["f_percentage"].isString())
-                d = QString(obj["f_percentage"].toString()).toDouble();
-            else
-                d = obj["f_percentage"].toDouble();
-            w = QString("%1%").arg(d, 2, 'f', 1, '0');
+            w = QString("%1 Kg").arg(obj["f_amount"].toDouble(), 4, 'f', 3, '0');
             item = new QTableWidgetItem(w);
             item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
             ui->fermentablesTable->setItem(i, 7, item);
 
+            w = QString("%1%").arg(obj["f_percentage"].toDouble(), 2, 'f', 1, '0');
+            item = new QTableWidgetItem(w);
+            item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+            ui->fermentablesTable->setItem(i, 8, item);
+
 	    QTableWidgetItem *checkBoxItem = new QTableWidgetItem();
 	    checkBoxItem->setCheckState((obj["f_adjust_to_total_100"].toInt()) ? Qt::Checked : Qt::Unchecked);
 	    checkBoxItem->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
-            ui->fermentablesTable->setItem(i, 8, checkBoxItem);
+            ui->fermentablesTable->setItem(i, 9, checkBoxItem);
 
 	    /* Add the Delete row button */
             pWidget = new QWidget();
-            QPushButton* btn_edit = new QPushButton();
-            btn_edit->setObjectName(QString("%1").arg(i));  /* Send row with the button */
-            btn_edit->setText(tr("Delete"));
-            connect(btn_edit, SIGNAL(clicked()), this, SLOT(on_deleteFermentRow_clicked()));
+            QPushButton* btn_dele = new QPushButton();
+            btn_dele->setObjectName(QString("%1").arg(i));  /* Send row with the button */
+            btn_dele->setText(tr("Delete"));
+            connect(btn_dele, SIGNAL(clicked()), this, SLOT(on_deleteFermentRow_clicked()));
             pLayout = new QHBoxLayout(pWidget);
-            pLayout->addWidget(btn_edit);
+            pLayout->addWidget(btn_dele);
             pLayout->setContentsMargins(5, 0, 5, 0);
             pWidget->setLayout(pLayout);
-            ui->fermentablesTable->setCellWidget(i, 9, pWidget);
+            ui->fermentablesTable->setCellWidget(i, 10, pWidget);
+
+	    pWidget = new QWidget();
+	    QPushButton* btn_edit = new QPushButton();
+	    btn_edit->setObjectName(QString("%1").arg(i));  /* Send row with the button */
+	    btn_edit->setText(tr("Edit"));
+	    connect(btn_edit, SIGNAL(clicked()), this, SLOT(on_editFermentRow_clicked()));
+	    pLayout = new QHBoxLayout(pWidget);
+            pLayout->addWidget(btn_edit);
+	    pLayout->setContentsMargins(5, 0, 5, 0);
+            pWidget->setLayout(pLayout);
+            ui->fermentablesTable->setCellWidget(i, 11, pWidget);
+
+	    /* Hidden columns */
+            ui->fermentablesTable->setItem(i, 12, new QTableWidgetItem(QString("%1").arg(obj["f_acid_to_ph_57"].toDouble(), 6, 'f', 5, '0')));
+            ui->fermentablesTable->setItem(i, 13, new QTableWidgetItem(QString("%1").arg(obj["f_add_after_boil"].toInt(), 1, 'f', 0, '0')));
+            ui->fermentablesTable->setItem(i, 14, new QTableWidgetItem(QString("%1").arg(obj["f_coarse_fine_diff"].toDouble(), 2, 'f', 1, '0')));
+            ui->fermentablesTable->setItem(i, 15, new QTableWidgetItem(QString("%1").arg(obj["f_cost"].toDouble(), 3, 'f', 2, '0')));
+            ui->fermentablesTable->setItem(i, 16, new QTableWidgetItem(QString("%1").arg(obj["f_di_ph"].toDouble(), 6, 'f', 5, '0')));
+            ui->fermentablesTable->setItem(i, 17, new QTableWidgetItem(QString("%1").arg(obj["f_diastatic_power"].toDouble(), 6, 'f', 5, '0')));
+            ui->fermentablesTable->setItem(i, 18, new QTableWidgetItem(QString("%1").arg(obj["f_dissolved_protein"].toDouble(), 2, 'f', 1, '0')));
+            ui->fermentablesTable->setItem(i, 19, new QTableWidgetItem(QString("%1").arg(obj["f_moisture"].toDouble(), 2, 'f', 1, '0')));
+	    ui->fermentablesTable->setItem(i, 20, new QTableWidgetItem(obj["f_origin"].toString()));
+	    ui->fermentablesTable->setItem(i, 21, new QTableWidgetItem(QString("%1").arg(obj["f_protein"].toDouble(), 2, 'f', 1, '0')));
+	    ui->fermentablesTable->setItem(i, 22, new QTableWidgetItem(QString("%1").arg(obj["f_recommend_mash"].toInt(), 1, 'f', 0, '0')));
+	    /* Again these because the visible ones have human readable strings added. */
+	    ui->fermentablesTable->setItem(i, 23, new QTableWidgetItem(QString("%1").arg(obj["f_amount"].toDouble(), 4, 'f', 3, '0')));
+	    ui->fermentablesTable->setItem(i, 24, new QTableWidgetItem(QString("%1").arg(obj["f_percentage"].toDouble(), 2, 'f', 1, '0')));
+	    ui->fermentablesTable->setItem(i, 25, new QTableWidgetItem(QString("%1").arg(obj["f_yield"].toDouble(), 2, 'f', 1, '0')));
+	    ui->fermentablesTable->setItem(i, 26, new QTableWidgetItem(QString("%1").arg(obj["f_max_in_batch"].toDouble(), 2, 'f', 1, '0')));
+	    ui->fermentablesTable->setItem(i, 27, new QTableWidgetItem(QString("%1").arg(obj["f_type"].toDouble(), 1, 'f', 0, '0')));
+	    ui->fermentablesTable->setItem(i, 28, new QTableWidgetItem(QString("%1").arg(obj["f_graintype"].toDouble(), 1, 'f', 0, '0')));
+	    ui->fermentablesTable->setItem(i, 29, new QTableWidgetItem(QString("%1").arg(obj["f_added"].toDouble(), 1, 'f', 0, '0')));
 	}
     }
 
@@ -797,6 +827,72 @@
 }
 
 
+void EditRecipe::fermentable_Json()
+{
+    QTableWidgetItem *item;
+    QJsonArray array;
+
+    ui->fermentablesTable->sortItems(23, Qt::DescendingOrder);   // Sort on amount.
+
+    for (int i = 0; i < ui->fermentablesTable->rowCount(); i++) {
+
+        QJsonObject obj;
+	item = ui->fermentablesTable->item(i, 12);
+	obj.insert("f_acid_to_ph_57", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 13);
+        obj.insert("f_add_after_boil", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 29);
+        obj.insert("f_added", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 9);
+        obj.insert("f_adjust_to_total_100", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 23);
+        obj.insert("f_amount", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 14);
+        obj.insert("f_coarse_fine_diff", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 2);
+        obj.insert("f_color", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 15);
+        obj.insert("f_cost", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 16);
+        obj.insert("f_di_ph", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 17);
+        obj.insert("f_diastatic_power", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 18);
+        obj.insert("f_dissolved_protein", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 28);
+        obj.insert("f_graintype", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 26);
+        obj.insert("f_max_in_batch", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 19);
+        obj.insert("f_moisture", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 1);
+        obj.insert("f_name", item->text());
+	item = ui->fermentablesTable->item(i, 20);
+        obj.insert("f_origin", item->text());
+	item = ui->fermentablesTable->item(i, 24);
+        obj.insert("f_percentage", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 21);
+        obj.insert("f_protein", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 22);
+        obj.insert("f_recommend_mash", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 0);
+        obj.insert("f_supplier", item->text());
+	item = ui->fermentablesTable->item(i, 27);
+        obj.insert("f_type", item->text().toDouble());
+	item = ui->fermentablesTable->item(i, 25);
+        obj.insert("f_yield", item->text().toDouble());
+//	qDebug() << "fermentable_Json" << i << obj;
+	array.append(obj);      /* Append this object */
+    }
+
+    qDebug() << array;
+    /* Copy to the global array and refresh */
+    this->fermentables.setArray(array);
+    is_changed();
+    emit refreshAll();
+}
+
+
 void EditRecipe::cell_Fermentable_changed(int nRow, int nCol)
 {
     if (this->ignoreChanges)
@@ -804,7 +900,7 @@
 
     qDebug() << "Cell at row " + QString::number(nRow) + " column " + QString::number(nCol) + " was changed.";
 
-    if (nCol == 8) {	// 100% checkbox
+    if (nCol == 9) {	// 100% checkbox
 	this->ignoreChanges = true;
 
 	if (ui->fermentablesTable->item(nRow, nCol)->checkState() == Qt::Checked) {
@@ -836,9 +932,34 @@
 {
     QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
     int row = pb->objectName().toInt();
-    qDebug() << "Delete row" << row;
+    qDebug() << "Delete fermentable row" << row;
+
+    QJsonObject obj = this->fermentables.array().at(row).toObject();
+     qDebug() << obj;
+
+    int rc = QMessageBox::warning(this, tr("Delete fermentable"), tr("Delete %1").arg(obj["f_name"].toString()),
+		    QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+    if (rc == QMessageBox::No)
+	return;
+
     ui->fermentablesTable->removeRow(row);
-//    make_Json();
+//    recalculate percentages
+    fermentable_Json();
+}
+
+
+void EditRecipe::on_editFermentRow_clicked()
+{
+    QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
+    int row = pb->objectName().toInt();
+    qDebug() << "Edit fermentable row" << row;
+    // init fermentrow and fermentbackup.
+    // connect popup to refreshfermentables and calcFermentables
+    // popup editor
+    // on abort, restore fermentbackup
+    // on accept, fermentrow to final
+    // disconnect
+    // return
 }
 
 
--- a/src/EditRecipe.h	Sun Apr 03 22:11:45 2022 +0200
+++ b/src/EditRecipe.h	Mon Apr 04 16:21:38 2022 +0200
@@ -5,6 +5,19 @@
 #include <QStringList>
 #include <QJsonDocument>
 
+
+typedef struct f_edit {
+    int 	f_row;				///< Row to edit, -1 for insert.
+    QString	f_name;				///< Fermentable name
+    QString	f_supplier;			///< Fermentable supplier
+    double	f_max_in_batch;			///< Max percentage in batch
+    double	f_percentage;			///< Current percentage in batch
+    double	f_amount;			///< Amount in kg
+    bool	f_adjust_to_total_100;		///< Adjust amount/percentage to 100%
+    int		f_added;			///< When to add fermentable
+} fedit;
+
+
 namespace Ui {
 class EditRecipe;
 }
@@ -36,6 +49,7 @@
     void refreshAll();
     void cell_Fermentable_changed(int nRow, int nCol);
     void on_deleteFermentRow_clicked();
+    void on_editFermentRow_clicked();
 
     void on_perc_mash_valueChanged(int value);
     void on_perc_sugars_valueChanged(int value);
@@ -55,8 +69,10 @@
     bool textIsChanged = false;
     bool ignoreChanges = false;
     QJsonDocument fermentables, hops, miscs, yeasts, mashs;
+    fedit fermentrow, fermentbackup;
 
     void WindowTitle();
+    void fermentable_Json();
     void calcFermentables();
 };
 

mercurial