# HG changeset patch # User Michiel Broek # Date 1649082098 -7200 # Node ID e79079bf013d799f6aacaa88fa8ab8f8abcf1f51 # Parent c02dfb7bb2f965003efc5907bea57670c243d049 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. diff -r c02dfb7bb2f9 -r e79079bf013d src/EditRecipe.cpp --- 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(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(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 } diff -r c02dfb7bb2f9 -r e79079bf013d src/EditRecipe.h --- 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 #include + +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(); };