# HG changeset patch # User Michiel Broek # Date 1674898619 -3600 # Node ID a3653722b0d67a113898051ee5bdf1b7f57f0216 # Parent 27e179759bf2d439396eb54fa829a943e2989b33 Add dry primary yeasts weights to get a mixed total. Use the parameters from the first and mmost used yeast. Changed in products and recipes. Recalculated WLP purepitch viability and planned next generation purepitch. We need a better way to set these parameters like a packages table. Fixed several yeast edit values due to adding a STA1 column. Removed several unneeded refresh_all() calls as they screwed the sorting of the yeasts during edit. Added STA1 display to recipes. Changed products database starter_viability from integer to float. diff -r 27e179759bf2 -r a3653722b0d6 src/EditProductTab6.cpp --- a/src/EditProductTab6.cpp Wed Jan 25 16:17:07 2023 +0100 +++ b/src/EditProductTab6.cpp Sat Jan 28 10:36:59 2023 +0100 @@ -209,7 +209,6 @@ bool maybe_starter = false; qDebug() << "calcYeast()"; - qDebug() << " " << product->prop_volume[0] << product->prop_volume[1] << product->prop_volume[2] << product->prop_volume[3]; ui->yeastProcedure->setCurrentIndex(0); if (sg <= 1.0001 && product->fg > 1.000) @@ -230,6 +229,12 @@ return; // No yeast in product. calcViability(); + double dry_amount = 0; + for (int i = 0; i < product->yeasts.size(); i++) { + if (product->yeasts.at(i).use == YEAST_USE_PRIMARY && product->yeasts.at(i).form == YEAST_FORMS_DRY) { + dry_amount += product->yeasts.at(i).amount; + } + } for (int i = 0; i < product->yeasts.size(); i++) { if (product->yeasts.at(i).use == YEAST_USE_PRIMARY) { // Primary @@ -250,15 +255,16 @@ qDebug() << " sg:" << sg << "og:" << og << "f1:" << f1 << "f2:" << f2 << "multiplier:" << multiplier; double yeast_grams = round(volume * multiplier * 100.0) / product->starter_viability; double yeast_gr_hl = round((yeast_grams / (volume * 0.01)) * 100.0) / 100.0; - double pitch_gr_hl = round(((product->yeasts.at(i).amount * 1000.0) / (volume * 0.01)) * 100.0) / 100.0; + double pitch_gr_hl = round(((dry_amount * 1000.0) / (volume * 0.01)) * 100.0) / 100.0; ui->dry_needShow->setValue(yeast_grams); ui->dry_pitchrateShow->setValue(yeast_gr_hl); ui->pitch_grShow->setValue(pitch_gr_hl); ui->pitch_grShow->setStyleSheet((pitch_gr_hl < yeast_gr_hl) ? "background-color: red":""); #ifdef DEBUG_YEAST - qDebug() << " need" << yeast_grams << "grams, gr/hl:" << yeast_gr_hl << "pitch:" << pitch_gr_hl; + qDebug() << " Need" << yeast_grams << "grams, gr/hl:" << yeast_gr_hl << "pitch:" << pitch_gr_hl; #endif + calcBU(); return; } else { /* @@ -284,6 +290,9 @@ } is_changed(); ui->pitchrateEdit->setValue(product->yeast_pitchrate); +#ifdef DEBUG_YEAST + qDebug() << " Guessed pitchrate" << product->yeast_pitchrate; +#endif } initcells = (product->yeasts.at(i).cells / 1000000) * product->yeasts.at(i).amount * (product->starter_viability / 100.0); @@ -297,7 +306,7 @@ } #ifdef DEBUG_YEAST - qDebug() << " pitchrate:" << product->yeast_pitchrate << "needed:" << needed << "initcells:" << initcells << "starter" << maybe_starter; + qDebug() << " Pitchrate:" << product->yeast_pitchrate << "needed:" << needed << "initcells:" << initcells << "starter" << maybe_starter; #endif } break; @@ -388,7 +397,7 @@ res.totcells = totcells; res.growf = round((ncells / start) * 100.0) / 100.0; #ifdef DEBUG_YEAST - qDebug() << " calcStep(" << svol << "," << stype << "," << start << ") irate" << irate + qDebug() << " calcStep(" << svol << "," << stype << "," << start << ") irate" << irate << "ncells" << res.ncells << "totcells" << res.totcells << "growf" << res.growf; #endif return res; @@ -431,8 +440,6 @@ return; for (step = 1; step < 5; step++) { - qDebug() << " step" << step; - for (i = lasti; i <= mvols; i++) { lasti = i; svol = uvols[lasti]; @@ -587,7 +594,12 @@ vpm = 0.80; max = 97; if (product->yeasts.at(i).laboratory == "White Labs") { // PurePitch - vpm = 0.95; + /* + * Purepitch 6th month viability point 80,8%. + * Purepitch Next Generation 6th month viability point 94,9%. + */ + vpm = 0.9648; // Purepitch + //vpm = 0.9914; // Purepitch Next Generation max = 100; } } else if (product->yeasts.at(i).form == YEAST_FORMS_DRY) { @@ -622,11 +634,10 @@ } if (base > max) base = max; - base = round(base); - product->starter_viability = base; + product->starter_viability = round(base * 10) / 10; ui->conditionShow->setValue(product->starter_viability); #ifdef DEBUG_YEAST - qDebug() << "age" << timeDiff << "degrade" << degrade << "base" << base ; + qDebug() << "age" << timeDiff << "degrade" << degrade << "viability" << product->starter_viability; #endif } @@ -899,7 +910,7 @@ return; product->yeasts.removeAt(row); - bool primary = false; + bool primary = false; /* Check if any primary yeast is left */ for (int i = 0; i < product->yeasts.size(); i++) { if (product->yeasts.at(i).use == YEAST_USE_PRIMARY) primary = true; @@ -936,7 +947,7 @@ item = new QTableWidgetItem(QString("%1 ml").arg(val, 3, 'f', 2, '0')); } item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); - ui->yeastsTable->setItem(product->yeasts_row, 9, item); + ui->yeastsTable->setItem(product->yeasts_row, 10, item); calcYeast(); is_changed(); @@ -1019,6 +1030,7 @@ yamountEdit->setDecimals(0); yamountEdit->setSingleStep(1.0); yamountLabel->setText(tr("Total packs:")); + product->yeast_pitchrate = 0; } else if ((product->yeasts.at(product->yeasts_row).form == YEAST_FORMS_DRY) || (product->yeasts.at(product->yeasts_row).form == YEAST_FORMS_DRIED)) { if (oldform == YEAST_FORMS_LIQUID) product->yeasts[product->yeasts_row].amount = 0.01; @@ -1033,6 +1045,7 @@ yamountEdit->setDecimals(1); yamountEdit->setSingleStep(0.5); yamountLabel->setText(tr("Amount in ml:")); + product->yeast_pitchrate = 0; } ui->yeastsTable->setItem(product->yeasts_row, 0, new QTableWidgetItem(product->yeasts.at(product->yeasts_row).name)); @@ -1100,7 +1113,6 @@ } is_changed(); - emit refreshAll(); } @@ -1139,9 +1151,8 @@ product->yeasts[product->yeasts_row].use = val; QTableWidgetItem *item = new QTableWidgetItem(QCoreApplication::translate("YeastUse", g_yeast_use[val])); item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); - ui->yeastsTable->setItem(product->yeasts_row, 5, item); + ui->yeastsTable->setItem(product->yeasts_row, 4, item); is_changed(); - emit refreshAll(); } diff -r 27e179759bf2 -r a3653722b0d6 src/EditRecipeTab5.cpp --- a/src/EditRecipeTab5.cpp Wed Jan 25 16:17:07 2023 +0100 +++ b/src/EditRecipeTab5.cpp Sat Jan 28 10:36:59 2023 +0100 @@ -38,21 +38,22 @@ std::sort(recipe->yeasts.begin(), recipe->yeasts.end(), yeast_sort_test); const QStringList labels({tr("Yeast"), tr("Laboratory"), tr("Code"), tr("Type"), tr("Use for"), tr("Min. °C"), tr("Max. °C"), - tr("Tol. %"), tr("Attn. %"), tr("Amount"), tr("Delete"), tr("Edit") }); + tr("Tol. %"), tr("Attn. %"), tr("STA"), tr("Amount"), tr("Delete"), tr("Edit") }); - ui->yeastsTable->setColumnCount(12); + ui->yeastsTable->setColumnCount(13); ui->yeastsTable->setColumnWidth(0, 200); /* Yeast */ ui->yeastsTable->setColumnWidth(1, 125); /* Laboratory */ ui->yeastsTable->setColumnWidth(2, 80); /* Code */ ui->yeastsTable->setColumnWidth(3, 80); /* Type */ ui->yeastsTable->setColumnWidth(4, 100); /* Usage */ - ui->yeastsTable->setColumnWidth(5, 60); /* Min. */ - ui->yeastsTable->setColumnWidth(6, 60); /* Max. */ - ui->yeastsTable->setColumnWidth(7, 60); /* Tolerance */ - ui->yeastsTable->setColumnWidth(8, 60); /* Attenuation */ - ui->yeastsTable->setColumnWidth(9, 90); /* Amount */ - ui->yeastsTable->setColumnWidth(10, 80); /* Delete */ - ui->yeastsTable->setColumnWidth(11, 80); /* Edit */ + ui->yeastsTable->setColumnWidth(5, 50); /* Min. */ + ui->yeastsTable->setColumnWidth(6, 50); /* Max. */ + ui->yeastsTable->setColumnWidth(7, 50); /* Tolerance */ + ui->yeastsTable->setColumnWidth(8, 50); /* Attenuation */ + ui->yeastsTable->setColumnWidth(9, 40); /* STA1 gen */ + ui->yeastsTable->setColumnWidth(10, 90); /* Amount */ + ui->yeastsTable->setColumnWidth(11, 80); /* Delete */ + ui->yeastsTable->setColumnWidth(12, 80); /* Edit */ ui->yeastsTable->setHorizontalHeaderLabels(labels); ui->yeastsTable->verticalHeader()->hide(); ui->yeastsTable->setRowCount(recipe->yeasts.size()); @@ -87,14 +88,28 @@ item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); ui->yeastsTable->setItem(i, 8, item); - if (recipe->yeasts.at(i).form == 0) + if (recipe->yeasts.at(i).use != YEAST_USE_BOTTLE && recipe->yeasts.at(i).sta1) { + QWidget *pWidget = new QWidget(); + QLabel *label = new QLabel; + label->setPixmap(QPixmap(":icons/silk/tick.png")); + QHBoxLayout *pLayout = new QHBoxLayout(pWidget); + pLayout->addWidget(label); + pLayout->setAlignment(Qt::AlignCenter); + pLayout->setContentsMargins(0, 0, 0, 0); + pWidget->setLayout(pLayout); + ui->yeastsTable->setCellWidget(i, 9, pWidget); + } else { + ui->yeastsTable->removeCellWidget(i, 9); + } + + if (recipe->yeasts.at(i).form == YEAST_FORMS_LIQUID) item = new QTableWidgetItem(QString("%1 pack").arg(recipe->yeasts.at(i).amount, 1, 'f', 0, '0')); - else if (recipe->yeasts.at(i).form == 1) + else if (recipe->yeasts.at(i).form == YEAST_FORMS_DRY || recipe->yeasts.at(i).form == YEAST_FORMS_DRIED) item = new QTableWidgetItem(QString("%1 gr").arg(recipe->yeasts.at(i).amount * 1000.0, 3, 'f', 2, '0')); else item = new QTableWidgetItem(QString("%1 ml").arg(recipe->yeasts.at(i).amount * 1000.0, 3, 'f', 2, '0')); item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); - ui->yeastsTable->setItem(i, 9, item); + ui->yeastsTable->setItem(i, 10, item); pWidget = new QWidget(); QPushButton* btn_dele = new QPushButton(); @@ -105,7 +120,7 @@ pLayout->addWidget(btn_dele); pLayout->setContentsMargins(5, 0, 5, 0); pWidget->setLayout(pLayout); - ui->yeastsTable->setCellWidget(i, 10, pWidget); + ui->yeastsTable->setCellWidget(i, 11, pWidget); pWidget = new QWidget(); QPushButton* btn_edit = new QPushButton(); @@ -116,7 +131,7 @@ pLayout->addWidget(btn_edit); pLayout->setContentsMargins(5, 0, 5, 0); pWidget->setLayout(pLayout); - ui->yeastsTable->setCellWidget(i, 11, pWidget); + ui->yeastsTable->setCellWidget(i, 12, pWidget); } } @@ -140,8 +155,8 @@ return; // No yeast in recipe. for (int i = 0; i < recipe->yeasts.size(); i++) { - if (recipe->yeasts.at(i).use == 0) { // Primary - if (recipe->yeasts.at(i).form == 1) { + if (recipe->yeasts.at(i).use == YEAST_USE_PRIMARY) { // Primary + if (recipe->yeasts.at(i).form == YEAST_FORMS_DRY) { /* * Dry yeast, build the formule with the yeast parameters. * Based on https://www.lallemandbrewing.com/en/canada/brewers-corner/brewing-tools/pitching-rate-calculator/ @@ -210,7 +225,9 @@ { Yeasts newy; +#ifdef DEBUG_YEAST qDebug() << "Add yeast row"; +#endif for (int i = 0; i < recipe->yeasts.size(); i++) { if (recipe->yeasts.at(i).amount == 0) @@ -221,8 +238,8 @@ newy.laboratory = ""; newy.product_id = ""; newy.amount = 0; - newy.type = 0; - newy.form = 0; + newy.type = YEAST_TYPES_ALE; + newy.form = YEAST_FORMS_LIQUID; newy.min_temperature = 0; newy.max_temperature = 0; newy.flocculation = 0; @@ -230,7 +247,7 @@ newy.cells = 0; newy.tolerance = 0; newy.inventory = 0; - newy.use = 0; + newy.use = YEAST_USE_PRIMARY; newy.sta1 = false; newy.bacteria = false; newy.harvest_top = false; @@ -256,7 +273,9 @@ QPushButton *pb = qobject_cast(QObject::sender()); int row = pb->objectName().toInt(); +#ifdef DEBUG_YEAST qDebug() << "Delete yeast row" << row << recipe->yeasts.size(); +#endif int rc = QMessageBox::warning(this, tr("Delete yeast"), tr("Delete %1").arg(recipe->yeasts.at(row).name), QMessageBox::Yes | QMessageBox::No, QMessageBox::No); @@ -286,7 +305,7 @@ item = new QTableWidgetItem(QString("%1 ml").arg(val, 3, 'f', 2, '0')); } item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); - ui->yeastsTable->setItem(recipe->yeasts_row, 9, item); + ui->yeastsTable->setItem(recipe->yeasts_row, 10, item); calcYeast(); is_changed(); @@ -303,7 +322,9 @@ if (val < 1) return; +#ifdef DEBUG_YEAST qDebug() << "yeast_select_changed()" << recipe->yeasts_row << val << instock; +#endif /* * Search the yeast pointed by the index and instock flag. @@ -320,7 +341,9 @@ for (int i = 0; i < (val - 1); i++) { query.next(); } +#ifdef DEBUG_YEAST qDebug() << "found" << query.value(0).toString() << query.value(2).toString(); +#endif /* * Replace the yeast record contents @@ -393,7 +416,20 @@ item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); ui->yeastsTable->setItem(recipe->yeasts_row, 8, item); - calcYeast(); + if (recipe->yeasts.at(product->yeasts_row).use != YEAST_USE_BOTTLE && recipe->yeasts.at(product->yeasts_row).sta1) { + QWidget *pWidget = new QWidget(); + QLabel *label = new QLabel; + label->setPixmap(QPixmap(":icons/silk/tick.png")); + QHBoxLayout *pLayout = new QHBoxLayout(pWidget); + pLayout->addWidget(label); + pLayout->setAlignment(Qt::AlignCenter); + pLayout->setContentsMargins(0, 0, 0, 0); + pWidget->setLayout(pLayout); + ui->yeastsTable->setCellWidget(product->yeasts_row, 9, pWidget); + } else { + ui->yeastsTable->removeCellWidget(product->yeasts_row, 9); + } + is_changed(); } @@ -402,7 +438,9 @@ { QSqlQuery query; +#ifdef DEBUG_YEAST qDebug() << "yeast_instock_changed()" << recipe->yeasts_row << val; +#endif this->yselectEdit->setCurrentIndex(-1); this->yselectEdit->clear(); @@ -424,14 +462,15 @@ void EditRecipe::yeast_useat_changed(int val) { +#ifdef DEBUG_YEAST qDebug() << "yeast_useat_changed()" << recipe->yeasts_row << val; +#endif recipe->yeasts[recipe->yeasts_row].use = val; QTableWidgetItem *item = new QTableWidgetItem(QCoreApplication::translate("YeastUse", g_yeast_use[val])); item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter); ui->yeastsTable->setItem(recipe->yeasts_row, 5, item); is_changed(); - emit refreshAll(); } @@ -444,7 +483,9 @@ QPushButton *pb = qobject_cast(QObject::sender()); recipe->yeasts_row = pb->objectName().toInt(); +#ifdef DEBUG_YEAST qDebug() << "Edit yeast row" << recipe->yeasts_row; +#endif Yeasts backup = recipe->yeasts.at(recipe->yeasts_row); QDialog* dialog = new QDialog(this); @@ -560,7 +601,9 @@ dialog->setModal(true); dialog->exec(); if (dialog->result() == QDialog::Rejected) { +#ifdef DEBUG_YEAST qDebug() << "reject and rollback"; +#endif recipe->yeasts[recipe->yeasts_row] = backup; } else { diff -r 27e179759bf2 -r a3653722b0d6 src/database/db_product.cpp --- a/src/database/db_product.cpp Wed Jan 25 16:17:07 2023 +0100 +++ b/src/database/db_product.cpp Sat Jan 28 10:36:59 2023 +0100 @@ -249,7 +249,7 @@ prod->starter_enable = query.value("starter_enable").toInt() ? true:false; prod->starter_type = query.value("starter_type").toInt(); prod->starter_sg = query.value("starter_sg").toDouble(); - prod->starter_viability = query.value("starter_viability").toInt(); + prod->starter_viability = query.value("starter_viability").toDouble(); if (query.value("yeast_prod_date").toString().length() == 10) prod->yeast_prod_date = query.value("yeast_prod_date").toDate(); else @@ -835,7 +835,7 @@ query.bindValue(":starter_enable", prod->starter_enable ? 1:0); query.bindValue(":starter_type", prod->starter_type); query.bindValue(":starter_sg", round(prod->starter_sg * 1000) / 1000); - query.bindValue(":starter_viability", prod->starter_viability); + query.bindValue(":starter_viability", round(prod->starter_viability * 10) / 10); query.bindValue(":yeast_prod_date", prod->yeast_prod_date); query.bindValue(":yeast_pitchrate", round(prod->yeast_pitchrate * 1000) / 1000); query.bindValue(":prop1_type", prod->prop_type[0]); diff -r 27e179759bf2 -r a3653722b0d6 src/global.h --- a/src/global.h Wed Jan 25 16:17:07 2023 +0100 +++ b/src/global.h Sat Jan 28 10:36:59 2023 +0100 @@ -14,7 +14,7 @@ // #define DEBUG_IBU 1 // #define DEBUG_FERMENTABLES 1 #define DEBUG_YEAST 1 -#define DEBUG_WATER 1 +// #define DEBUG_WATER 1 #define Ka1 0.0000004445 #define Ka2 0.0000000000468 @@ -645,7 +645,7 @@ bool starter_enable; int starter_type; double starter_sg; - int starter_viability; + double starter_viability; QDate yeast_prod_date; double yeast_pitchrate; int prop_type[4]; diff -r 27e179759bf2 -r a3653722b0d6 translations/bmsapp_en.ts --- a/translations/bmsapp_en.ts Wed Jan 25 16:17:07 2023 +0100 +++ b/translations/bmsapp_en.ts Sat Jan 28 10:36:59 2023 +0100 @@ -2350,8 +2350,8 @@ - - + + Delete @@ -3424,7 +3424,7 @@ - + Volume @@ -4230,7 +4230,7 @@ - + Type @@ -4254,7 +4254,7 @@ - + Amount @@ -4262,7 +4262,7 @@ - + Stock @@ -4283,8 +4283,8 @@ - - + + Edit @@ -4330,9 +4330,9 @@ - + - + Delete %1 @@ -4366,7 +4366,7 @@ - + Use at: @@ -4380,7 +4380,7 @@ - + In stock: @@ -4522,8 +4522,8 @@ - - + + Amount in gr: @@ -4562,8 +4562,8 @@ - - + + Amount in ml: @@ -4574,13 +4574,13 @@ - + Primary - + Secondary @@ -4590,185 +4590,185 @@ - + Yeast - + Laboratory - + Code - + Use for - + Min. - + Max. - + Tol. - + Attn. - + STA - - + + Yeast already used - + Method - + Inj. factor - + New cells - + Total cells - + Grow factor - + BMSapp - Pitchrate - + Beer pitch type: - + 0.075 Real Kveik - + 0.75 Ale, upto 1.060 - + 1.0 Ale, above 1.060 - + 1.5 Lager, upto 1.060 - + 2.0 Lager, above 1.060 - + Retry starter - + Retry to automatic create starter steps - + Start step type: - + Starter step volume: - + Stirred - + Shaken - + Simple - + Delete yeast - - + + Total packs: - + Yeast name: - - + + Laboratory: - + Select yeast: - + Tertiary - + Bottle @@ -4980,9 +4980,9 @@ - - - + + + @@ -5257,72 +5257,72 @@ - + Open File - + Cannot load %1: %2 - + Image here - + Image type: - + Image comment: - + The comment for this image. - + Delete image - + Files (*.png) - + No PNG file selected. - + Saved %1 - - - - + + + + Database error - - - - + + + + MySQL error: %1 %2 diff -r 27e179759bf2 -r a3653722b0d6 translations/bmsapp_nl.ts --- a/translations/bmsapp_nl.ts Wed Jan 25 16:17:07 2023 +0100 +++ b/translations/bmsapp_nl.ts Sat Jan 28 10:36:59 2023 +0100 @@ -2650,8 +2650,8 @@ - - + + Delete Verwijder @@ -3314,7 +3314,7 @@ - + Volume Volume @@ -4640,10 +4640,10 @@ - - - - + + + + Database error Database fout @@ -4688,10 +4688,10 @@ - - - - + + + + MySQL error: %1 %2 @@ -4734,7 +4734,7 @@ - + Type Soort @@ -4758,7 +4758,7 @@ - + Amount Hoeveel @@ -4766,7 +4766,7 @@ - + Stock Voorraad @@ -4787,8 +4787,8 @@ - - + + Edit Wijzig @@ -4846,9 +4846,9 @@ - + - + Delete %1 Verwijder %1 @@ -4882,7 +4882,7 @@ - + Use at: Toevoegen bij: @@ -4896,7 +4896,7 @@ - + In stock: In voorraad: @@ -5038,8 +5038,8 @@ - - + + Amount in gr: Gewicht in gr: @@ -5097,8 +5097,8 @@ - - + + Amount in ml: Hoeveelheid in ml: @@ -5109,13 +5109,13 @@ - + Primary Hoofdgisting - + Secondary Nagisting/lagering @@ -5125,185 +5125,185 @@ Bottelen - + Yeast Gist - + Laboratory Laboratorium - + Code Product code - + Use for Toepassing - + Min. - + Max. - + Tol. - + Attn. - + STA STA - - + + Yeast already used Gist is al verwerkt - + Method Methode - + Inj. factor Injectie - + New cells Celgroei - + Total cells Totaal - + Grow factor Groeifactor - + BMSapp - Pitchrate BMSapp - Gist enten - + Beer pitch type: Biergist nodig: - + 0.075 Real Kveik 0,075 Echte Kveik - + 0.75 Ale, upto 1.060 0,75 Bovengist tot 1.060 - + 1.0 Ale, above 1.060 1,0 Bovengist hoger 1.060 - + 1.5 Lager, upto 1.060 1,5 Ondergist tot 1.060 - + 2.0 Lager, above 1.060 2,0 Ondergist hoger 1.060 - + Retry starter Ververs starter - + Retry to automatic create starter steps Ververs de starter stappen automatisch - + Start step type: Starter stap type: - + Starter step volume: Starter stap volume: - + Stirred Geroerd - + Shaken Geschud - + Simple Simpel - + Delete yeast Verwijder gist - - + + Total packs: Aantal pakken: - + Yeast name: Gist naam: - - + + Laboratory: Laboratorium: - + Select yeast: Kies gist: - + Tertiary Lageren - + Bottle Bottelen @@ -5489,9 +5489,9 @@ - - - + + + @@ -5869,53 +5869,53 @@ Bevestig dat het proeven gedaan is en opmerkingen ingevuld zijn. - + Open File Open bestand - + Cannot load %1: %2 Kan niet laden %1: %2 - + Image here Plaatje hier - + Image type: Soort plaatje: - + Image comment: Bijschrift: - + The comment for this image. Het bijschrift of commentaar bij dit plaatje. - + Delete image Wis plaatje - + Files (*.png) Bestanden (*.png) - + No PNG file selected. Geen PNG bestand gekozen. - + Saved %1 Opgeslagen %1 diff -r 27e179759bf2 -r a3653722b0d6 ui/EditProduct.ui --- a/ui/EditProduct.ui Wed Jan 25 16:17:07 2023 +0100 +++ b/ui/EditProduct.ui Sat Jan 28 10:36:59 2023 +0100 @@ -4128,7 +4128,7 @@ :/icons/silk/date.png:/icons/silk/date.png - + 170 @@ -4152,8 +4152,8 @@ % - - 100 + + 1