Wed, 20 Apr 2022 22:48:20 +0200
Implemented the last widgets on the first tab and added the needed functions for them such as scaling the recipe. This is the last part of the recipe editor, now ready for testing.
src/EditRecipe.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipe.h | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab1.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab2.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab3.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab4.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab5.cpp | file | annotate | diff | comparison | revisions | |
src/EditRecipeTab7.cpp | file | annotate | diff | comparison | revisions | |
ui/EditRecipe.ui | file | annotate | diff | comparison | revisions |
--- a/src/EditRecipe.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipe.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -650,18 +650,18 @@ connect(ui->lockedEdit, &QCheckBox::stateChanged, this, &EditRecipe::is_changed); connect(ui->nameEdit, &QLineEdit::textChanged, this, &EditRecipe::name_changed); connect(ui->notesEdit, SIGNAL(textChanged()), this, SLOT(notes_changed())); - connect(ui->typeEdit, &QComboBox::currentTextChanged, this, &EditRecipe::is_changed); - connect(ui->batch_sizeEdit, &QDoubleSpinBox::textChanged, this, &EditRecipe::is_changed); - connect(ui->boil_timeEdit, &QSpinBox::textChanged, this, &EditRecipe::is_changed); - connect(ui->efficiencyEdit, &QDoubleSpinBox::textChanged, this, &EditRecipe::is_changed); - connect(ui->beerstyleEdit, &QComboBox::currentTextChanged, this, &EditRecipe::style_changed); - connect(ui->est_ogEdit, &QDoubleSpinBox::textChanged, this, &EditRecipe::is_changed); - connect(ui->color_methodEdit, &QComboBox::currentTextChanged, this, &EditRecipe::colormethod_changed); - connect(ui->ibu_methodEdit, &QComboBox::currentTextChanged, this, &EditRecipe::is_changed); + connect(ui->typeEdit, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EditRecipe::brew_type_changed); + connect(ui->batch_sizeEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditRecipe::batch_size_changed); + connect(ui->boil_timeEdit, QOverload<int>::of(&QSpinBox::valueChanged), this, &EditRecipe::boil_time_changed); + connect(ui->efficiencyEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditRecipe::efficiency_changed); + connect(ui->beerstyleEdit, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EditRecipe::style_changed); + connect(ui->est_ogEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditRecipe::est_og_changed); + connect(ui->color_methodEdit, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EditRecipe::colormethod_changed); + connect(ui->ibu_methodEdit, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EditRecipe::ibumethod_changed); // All signals from tab "Fermentables" ui->fermentablesTable->setEditTriggers(QAbstractItemView::NoEditTriggers); - connect(ui->est_og2Edit, &QDoubleSpinBox::textChanged, this, &EditRecipe::is_changed); + connect(ui->est_og2Edit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditRecipe::est_og_changed); connect(ui->perc_mashShow, &QProgressBar::valueChanged, this, &EditRecipe::ferment_perc_mash_valueChanged); connect(ui->perc_sugarsShow, &QProgressBar::valueChanged, this, &EditRecipe::ferment_perc_sugars_valueChanged); connect(ui->perc_caraShow, &QProgressBar::valueChanged, this, &EditRecipe::ferment_perc_cara_valueChanged);
--- a/src/EditRecipe.h Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipe.h Wed Apr 20 22:48:20 2022 +0200 @@ -262,8 +262,14 @@ void is_changed(); void name_changed(QString); void notes_changed(); - void style_changed(); - void colormethod_changed(); + void style_changed(int val); + void colormethod_changed(int val); + void ibumethod_changed(int val); + void est_og_changed(double val); + void efficiency_changed(double val); + void boil_time_changed(int val); + void batch_size_changed(double val); + void brew_type_changed(int val); void refreshFermentables(); void refreshHops(); void refreshMiscs(); @@ -389,7 +395,10 @@ void brewing_salt_sub(QString salt, double val); void set_brewing_salt(QString salt, double val); void calcFermentables(); + void calcFermentablesFromOG(double og); void calcIBUs(); + void adjustHops(double factor); + void adjustMiscs(double factor); double ZAlkalinity(double pHZ); double ZRA(double pHZ); double BufferCapacity(Fermentables F); @@ -400,9 +409,11 @@ double GetBUGU(); double GetOptSO4Clratio(); void calcYeast(); + void adjustYeasts(double factor); double infusionVol(double step_infused, double step_mashkg, double infuse_temp, double step_temp, double last_temp); double decoctionVol(double step_volume, double step_temp, double prev_temp); void calcMash(); + void adjustWaters(double factor); }; #endif
--- a/src/EditRecipeTab1.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab1.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -37,18 +37,15 @@ /* * New beerstyle is selected. */ -void EditRecipe::style_changed() +void EditRecipe::style_changed(int val) { QSqlQuery query; - if (ui->beerstyleEdit->currentIndex() < 1) - return; - query.prepare("SELECT * FROM profile_styles ORDER BY style_guide,style_letter,name"); query.exec(); query.first(); // Skip to the record index. - for (int i = 0; i < (ui->beerstyleEdit->currentIndex() - 1); i++) { + for (int i = 0; i < (val - 1); i++) { query.next(); } // Set relevant fields and update ranges. @@ -89,10 +86,89 @@ } -void EditRecipe::colormethod_changed() +void EditRecipe::colormethod_changed(int val) { + recipe->color_method = val; calcFermentables(); is_changed(); } +void EditRecipe::ibumethod_changed(int val) +{ + recipe->ibu_method = val; + calcIBUs(); + is_changed(); +} + + +void EditRecipe::est_og_changed(double val) +{ + recipe->est_og = val; + calcFermentablesFromOG(val);// Adjust fermentables amounts + calcFermentables(); // Update the recipe details + calcIBUs(); + calcMash(); + is_changed(); + emit refreshAll(); +} + + +void EditRecipe::efficiency_changed(double val) +{ + double estog = recipe->est_og; + recipe->efficiency = val; + calcFermentablesFromOG(estog); + calcFermentables(); + calcIBUs(); + is_changed(); + emit refreshAll(); +} + + +void EditRecipe::boil_time_changed(int val) +{ + qDebug() << "boil_time_changed" << val; + double new_evap = (0.1 * recipe->batch_size) * val / 60.0; + recipe->boil_size = recipe->batch_size + new_evap; + recipe->boil_time = val; + ui->boil_sizeEdit->setValue(recipe->boil_size); + calcFermentables(); + calcIBUs(); + is_changed(); +} + + +void EditRecipe::batch_size_changed(double val) +{ + qDebug() << "batch_size_changed" << val << "old" << recipe->batch_size; + + double evap = (0.1 * val) * recipe->boil_time / 60.0; + recipe->boil_size = val + evap; + double factor = val / recipe->batch_size; + ui->boil_sizeEdit->setValue(recipe->boil_size); + recipe->sparge_volume *= factor; + ui->sp_volEdit->setValue(recipe->sparge_volume); + recipe->batch_size = val; + calcFermentablesFromOG(recipe->est_og); // Keep the OG + adjustWaters(factor); + calcFermentables(); + adjustHops(factor); + adjustMiscs(factor); + adjustYeasts(factor); + calcIBUs(); + calcWater(); + //calcSparge(); + calcMash(); + is_changed(); + emit refreshAll(); +} + + +void EditRecipe::brew_type_changed(int val) +{ + recipe->type; + is_changed(); +} + +
--- a/src/EditRecipeTab2.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab2.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -270,15 +270,15 @@ /* * Color of the wort */ - if (ui->color_methodEdit->currentIndex() == 4) { // Naudts + if (recipe->color_method == 4) { // Naudts color = round(((Utils::sg_to_plato(og) / 8.6) * colorn) + (ui->boil_timeEdit->value() / 60)); - } else if (ui->color_methodEdit->currentIndex() == 3) { // Hans Halberstadt + } else if (recipe->color_method == 3) { // Hans Halberstadt double bv = 0.925; // Beer loss efficiency double sr = 0.95; // Mash and sparge efficiency color = round((4.46 * bv * sr) / ui->batch_sizeEdit->value() * colorh); } else { double cw = colort / ui->batch_sizeEdit->value() * 8.34436; - color = Utils::kw_to_ebc(ui->color_methodEdit->currentIndex(), cw); + color = Utils::kw_to_ebc(recipe->color_method, cw); } qDebug() << " color" << ui->est_colorEdit->value() << color << recipe->est_color; recipe->est_color = color; @@ -349,6 +349,39 @@ } +void EditRecipe::calcFermentablesFromOG(double og) +{ + qDebug() << "calcFermentablesFromOG" << og; + + int i; + double totmass = 0; + double tot = 0; + double d, amount; + double efficiency = recipe->efficiency; + double sug = Utils::sg_to_plato(og) * recipe->batch_size * og / 100.0; // total amount of sugars in kg. + + for (i = 0; i < recipe->fermentables.size(); i++) { + if (recipe->fermentables.at(i).f_added < 4) { + d = recipe->fermentables.at(i).f_percentage / 100.0 * + (recipe->fermentables.at(i).f_yield / 100.0) * + (1 - recipe->fermentables.at(i).f_moisture / 100.0); + if (recipe->fermentables.at(i).f_added == 0) // Mash + d = efficiency / 100.0 * d; + tot += d; + } + } + if (tot) + totmass = round((sug / tot) * 1000.0) / 1000.0; + + if (totmass) { + for (i = 0; i < recipe->fermentables.size(); i++) { + amount = round(recipe->fermentables.at(i).f_percentage * 10.0 * totmass) / 1000.0; + recipe->fermentables[i].f_amount = amount; + } + } +} + + void EditRecipe::ferment_perc_mash_valueChanged(int value) { if (value < 90)
--- a/src/EditRecipeTab3.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab3.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -202,7 +202,7 @@ hop_flavour = 100; if (hop_aroma > 100) hop_aroma = 100; - qDebug() << "ibu" << recipe->est_ibu << ibus << "flavour" << hop_flavour << "aroma" << hop_aroma; + qDebug() << "ibu" << recipe->est_ibu << ibus << "flavour" << hop_flavour << "aroma" << hop_aroma << "method" << recipe->ibu_method; recipe->est_ibu = ibus; ui->est_ibuEdit->setValue(recipe->est_ibu); @@ -632,3 +632,17 @@ } +void EditRecipe::adjustHops(double factor) +{ + double amount; + + if (recipe->hops.size() == 0) + return; + + for (int i = 0; i < recipe->hops.size(); i++) { + amount = recipe->hops.at(i).h_amount * factor; + recipe->hops[i].h_amount = amount; + } +} + +
--- a/src/EditRecipeTab4.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab4.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -638,3 +638,49 @@ emit refreshAll(); } + +void EditRecipe::adjustMiscs(double factor) +{ + double amount; + + if (recipe->miscs.size() == 0) + return; + + this->ignoreChanges = true; + for (int i = 0; i < recipe->miscs.size(); i++) { + amount = recipe->miscs.at(i).m_amount * factor; + recipe->miscs[i].m_amount = amount; + + /* + * Update the water agents. + */ + if (recipe->miscs.at(i).m_type == 4) { + if (recipe->miscs.at(i).m_name == "CaCl2") { + ui->bs_cacl2Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "CaSO4") { + ui->bs_caso4Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "MgSO4") { + ui->bs_mgso4Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "NaCl") { + ui->bs_naclEdit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "MgCl2") { + ui->bs_mgcl2Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "NaHCO3") { + ui->bs_nahco3Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "CaCO3") { + ui->bs_caco3Edit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "Melkzuur" || recipe->miscs.at(i).m_name == "Lactic") { + ui->mw_acidvolEdit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "Zoutzuur" || recipe->miscs.at(i).m_name == "Hydrochloric") { + ui->mw_acidvolEdit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "Fosforzuur" || recipe->miscs.at(i).m_name == "Phosphoric") { + ui->mw_acidvolEdit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } else if (recipe->miscs.at(i).m_name == "Zwavelzuur" || recipe->miscs.at(i).m_name == "Sulfuric") { + ui->mw_acidvolEdit->setValue(recipe->miscs.at(i).m_amount * 1000.0); + } + } + } + this->ignoreChanges = false; +} + +
--- a/src/EditRecipeTab5.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab5.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -552,3 +552,19 @@ emit refreshAll(); } + +void EditRecipe::adjustYeasts(double factor) +{ + double amount; + + if (recipe->yeasts.size() == 0) + return; + + for (int i = 0; i < recipe->yeasts.size(); i++) { + if (recipe->yeasts.at(i).y_form == 1) { // Only adjust dry yeast + amount = recipe->yeasts.at(i).y_amount * factor; + recipe->yeasts[i].y_amount = amount; + } + } +} +
--- a/src/EditRecipeTab7.cpp Wed Apr 20 14:30:06 2022 +0200 +++ b/src/EditRecipeTab7.cpp Wed Apr 20 22:48:20 2022 +0200 @@ -628,6 +628,42 @@ } +void EditRecipe::adjustWaters(double factor) +{ + int i; + double amount; + + if (recipe->mashs.size() == 0) + return; + + double mash_infuse = 0; + for (i = 0; i < recipe->mashs.size(); i++) { + if (recipe->mashs.at(i).step_type == 0) { // Infusion + amount = round(recipe->mashs.at(i).step_infuse_amount * factor * 1000000.0) / 1000000.0; + recipe->mashs[i].step_infuse_amount = amount; + mash_infuse += amount; + recipe->mashs[i].step_volume = mash_infuse; + } + } + + this->ignoreChanges = true; + if (recipe->w2_amount == 0) { + recipe->w1_amount = mash_infuse; + ui->w1_volEdit->setValue(mash_infuse); + } else { + double w1 = (recipe->w1_amount / (recipe->w1_amount + recipe->w2_amount)) * mash_infuse; + double w2 = (recipe->w2_amount / (recipe->w1_amount + recipe->w2_amount)) * mash_infuse; + recipe->w1_amount = w1; + recipe->w2_amount = w2; + ui->w1_volEdit->setValue(recipe->w1_amount); + ui->w2_volEdit->setValue(recipe->w2_amount); + } + recipe->wg_amount = mash_infuse; + ui->wg_volEdit->setValue(mash_infuse); + this->ignoreChanges = false; +} + + void EditRecipe::wb_cacl2_changed(double val) { set_brewing_salt("CaCl2", val); } void EditRecipe::wb_caso4_changed(double val) { set_brewing_salt("CaSO4", val); } void EditRecipe::wb_mgso4_changed(double val) { set_brewing_salt("MgSO4", val); }
--- a/ui/EditRecipe.ui Wed Apr 20 14:30:06 2022 +0200 +++ b/ui/EditRecipe.ui Wed Apr 20 22:48:20 2022 +0200 @@ -310,7 +310,7 @@ <number>1</number> </property> <property name="singleStep"> - <double>0.100000000000000</double> + <double>0.500000000000000</double> </property> </widget> <widget class="QSpinBox" name="boil_timeEdit"> @@ -334,6 +334,9 @@ <property name="maximum"> <number>1536</number> </property> + <property name="singleStep"> + <number>5</number> + </property> </widget> <widget class="QDoubleSpinBox" name="batch_sizeEdit"> <property name="geometry">