Added inventory yeasts editor. Fixed resource icons location.

Mon, 21 Feb 2022 21:17:33 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 21 Feb 2022 21:17:33 +0100
changeset 25
a9da2744609e
parent 24
684c6e74cc1b
child 26
dfc4df8f9632

Added inventory yeasts editor. Fixed resource icons location.

CMakeLists.txt file | annotate | diff | comparison | revisions
resources/icons.qrc file | annotate | diff | comparison | revisions
src/EditYeast.cpp file | annotate | diff | comparison | revisions
src/EditYeast.h file | annotate | diff | comparison | revisions
src/InventoryYeasts.cpp file | annotate | diff | comparison | revisions
src/InventoryYeasts.h file | annotate | diff | comparison | revisions
src/MainWindow.cpp file | annotate | diff | comparison | revisions
src/MainWindow.h file | annotate | diff | comparison | revisions
src/bmsapp.h file | annotate | diff | comparison | revisions
ui/EditFermentable.ui file | annotate | diff | comparison | revisions
ui/EditHop.ui file | annotate | diff | comparison | revisions
ui/EditMisc.ui file | annotate | diff | comparison | revisions
ui/EditSupplier.ui file | annotate | diff | comparison | revisions
ui/EditYeast.ui file | annotate | diff | comparison | revisions
ui/InventoryFermentables.ui file | annotate | diff | comparison | revisions
ui/InventoryHops.ui file | annotate | diff | comparison | revisions
ui/InventoryMiscs.ui file | annotate | diff | comparison | revisions
ui/InventorySuppliers.ui file | annotate | diff | comparison | revisions
ui/InventoryYeasts.ui file | annotate | diff | comparison | revisions
ui/MainWindow.ui file | annotate | diff | comparison | revisions
ui/Setup.ui file | annotate | diff | comparison | revisions
--- a/CMakeLists.txt	Sun Feb 20 20:22:49 2022 +0100
+++ b/CMakeLists.txt	Mon Feb 21 21:17:33 2022 +0100
@@ -104,6 +104,8 @@
     ${SRCDIR}/EditFermentable.cpp
     ${SRCDIR}/InventoryHops.cpp
     ${SRCDIR}/EditHop.cpp
+    ${SRCDIR}/InventoryYeasts.cpp
+    ${SRCDIR}/EditYeast.cpp
     ${SRCDIR}/Setup.cpp
     ${SRCDIR}/Utils.cpp
     ${SRCDIR}/MainWindow.cpp
@@ -120,6 +122,8 @@
     ${SRCDIR}/EditFermentable.h
     ${SRCDIR}/InventoryHops.h
     ${SRCDIR}/EditHop.h
+    ${SRCDIR}/InventoryYeasts.h
+    ${SRCDIR}/EditYeast.h
     ${SRCDIR}/Setup.h
     ${SRCDIR}/Utils.h
     ${SRCDIR}/MainWindow.h
--- a/resources/icons.qrc	Sun Feb 20 20:22:49 2022 +0100
+++ b/resources/icons.qrc	Mon Feb 21 21:17:33 2022 +0100
@@ -1,5 +1,5 @@
 <RCC>
-    <qresource prefix="/icons/silk">
+    <qresource>
         <file>icons/silk/accept.png</file>
         <file>icons/silk/add.png</file>
         <file>icons/silk/anchor.png</file>
@@ -1001,7 +1001,7 @@
         <file>icons/silk/zoom_out.png</file>
         <file>icons/silk/zoom.png</file>
     </qresource>
-    <qresource prefix="/icons/bms">
+    <qresource>
 	<file>icons/bms/beer.png</file>
 	<file>icons/bms/beerbottle.png</file>
 	<file>icons/bms/beerstyles.png</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/EditYeast.cpp	Mon Feb 21 21:17:33 2022 +0100
@@ -0,0 +1,373 @@
+/**
+ * EditYeast.cpp is part of bmsapp.
+ *
+ * bmsapp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * bmsapp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "EditYeast.h"
+#include "../ui/ui_EditYeast.h"
+#include "bmsapp.h"
+
+
+EditYeast::EditYeast(int id, QWidget *parent) : QDialog(parent), ui(new Ui::EditYeast)
+{
+    QSqlQuery query;
+
+    qDebug() << "EditYeast record:" << id;
+    ui->setupUi(this);
+    this->recno = id;
+
+    WindowTitle();
+
+    ui->typeEdit->addItem(tr("Lager"));
+    ui->typeEdit->addItem(tr("Ale"));
+    ui->typeEdit->addItem(tr("Wheat"));
+    ui->typeEdit->addItem(tr("Wine"));
+    ui->typeEdit->addItem(tr("Champagne"));
+    ui->typeEdit->addItem(tr("Brett"));
+    ui->typeEdit->addItem(tr("Kveik"));
+    ui->typeEdit->addItem(tr("Hybrid"));
+
+    ui->formEdit->addItem(tr("Liquid"));
+    ui->formEdit->addItem(tr("Dry"));
+    ui->formEdit->addItem(tr("Slant"));
+    ui->formEdit->addItem(tr("Culture"));
+    ui->formEdit->addItem(tr("Frozen"));
+    ui->formEdit->addItem(tr("Bottle"));
+    ui->formEdit->addItem(tr("Dried"));
+
+    ui->flocEdit->addItem(tr("Low"));
+    ui->flocEdit->addItem(tr("Medium"));
+    ui->flocEdit->addItem(tr("High"));
+    ui->flocEdit->addItem(tr("Very high"));
+
+    if (id >= 0) {
+	query.prepare("SELECT * FROM inventory_yeasts WHERE record = :recno");
+	query.bindValue(":recno", id);
+	query.exec();
+	query.next();
+
+	ui->nameEdit->setText(query.value(1).toString());
+	ui->typeEdit->setCurrentIndex(query.value(2).toInt());
+	ui->formEdit->setCurrentIndex(query.value(3).toInt());
+	ui->laboratoryEdit->setText(query.value(4).toString());
+	ui->productidEdit->setText(query.value(5).toString());
+	ui->temploEdit->setValue(query.value(6).toDouble());
+	ui->temphiEdit->setValue(query.value(7).toDouble());
+	ui->flocEdit->setCurrentIndex(query.value(8).toInt());
+	ui->attEdit->setValue(query.value(9).toDouble());
+	ui->toleranceEdit->setValue(query.value(10).toDouble());
+	ui->notesEdit->setPlainText(query.value(11).toString());
+	ui->bestforEdit->setPlainText(query.value(12).toString());
+	ui->reuseEdit->setValue(query.value(13).toInt());
+	if (query.value(3).toInt() == 0)
+	    ui->inventoryEdit->setValue(query.value(14).toDouble());		/* Liquid */
+	else
+	    ui->inventoryEdit->setValue(query.value(14).toDouble() * 1000);
+	ui->costEdit->setValue(query.value(15).toDouble());
+	SetForm(query.value(3).toInt());
+	if (query.value(16).toString().length() == 10) {
+            ui->prodEdit->setDate(query.value(16).toDate());
+        } else {
+            ui->prodEdit->clear();
+        }
+	if (query.value(17).toString().length() == 10) {
+	    ui->thtEdit->setDate(query.value(17).toDate());
+	} else {
+	    ui->thtEdit->clear();
+	}
+	ui->cellsEdit->setValue(query.value(18).toDouble() / 1000000000);
+	ui->sta1Edit->setChecked(query.value(19).toInt() ? true:false);
+	ui->bacteriaEdit->setChecked(query.value(20).toInt() ? true:false);
+	ui->harvesttopEdit->setChecked(query.value(21).toInt() ? true:false);
+	ui->harvesttimeEdit->setValue(query.value(22).toInt());
+	ui->pitchtempEdit->setValue(query.value(23).toDouble());
+	ui->pofEdit->setChecked(query.value(24).toInt() ? true:false);
+	ui->yeastbankEdit->setText(query.value(26).toString());
+	ui->grhlloEdit->setValue(query.value(27).toInt());
+	ui->sgloEdit->setValue(query.value(28).toDouble());
+	ui->grhlhiEdit->setValue(query.value(29).toInt());
+	ui->sghiEdit->setValue(query.value(30).toDouble());
+    } else {
+	/* Set some defaults */
+	ui->typeEdit->setCurrentIndex(1);
+	ui->formEdit->setCurrentIndex(1);
+	SetForm(1);
+	ui->temploEdit->setValue(18.0);
+	ui->temphiEdit->setValue(22.0);
+	ui->attEdit->setValue(77.0);
+	ui->reuseEdit->setValue(10);
+	ui->grhlloEdit->setValue(50);
+	ui->sgloEdit->setValue(1.050);
+	ui->grhlhiEdit->setValue(80);
+	ui->sghiEdit->setValue(1.080);
+	ui->prodEdit->clear();
+	ui->thtEdit->clear();
+    }
+    connect(ui->nameEdit, &QLineEdit::textChanged, this, &EditYeast::is_changed);
+    connect(ui->typeEdit, &QComboBox::currentTextChanged, this, &EditYeast::is_changed);
+    connect(ui->formEdit, &QComboBox::currentTextChanged, this, &EditYeast::is_changed);
+    connect(ui->laboratoryEdit, &QLineEdit::textChanged, this, &EditYeast::is_changed);
+    connect(ui->productidEdit, &QLineEdit::textChanged, this, &EditYeast::is_changed);
+    connect(ui->temploEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::temp_lo_changed);
+    connect(ui->temphiEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::temp_hi_changed);
+    connect(ui->flocEdit, &QComboBox::currentTextChanged, this, &EditYeast::is_changed);
+    connect(ui->attEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->toleranceEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->notesEdit, SIGNAL(textChanged()), this, SLOT(is_changed()));
+    connect(ui->bestforEdit, SIGNAL(textChanged()), this, SLOT(is_changed()));
+    connect(ui->reuseEdit, &QSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->inventoryEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->costEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->prodEdit, &QDateEdit::dateChanged, this, &EditYeast::is_changed);
+    connect(ui->thtEdit, &QDateEdit::dateChanged, this, &EditYeast::is_changed);
+    connect(ui->cellsEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->sta1Edit, &QCheckBox::stateChanged, this, &EditYeast::is_changed);
+    connect(ui->bacteriaEdit, &QCheckBox::stateChanged, this, &EditYeast::is_changed);
+    connect(ui->harvesttopEdit, &QCheckBox::stateChanged, this, &EditYeast::is_changed);
+    connect(ui->harvesttimeEdit, &QSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->pitchtempEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->pofEdit, &QCheckBox::stateChanged, this, &EditYeast::is_changed);
+    connect(ui->yeastbankEdit, &QLineEdit::textChanged, this, &EditYeast::is_changed);
+    connect(ui->grhlloEdit, &QSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->sgloEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->grhlhiEdit, &QSpinBox::textChanged, this, &EditYeast::is_changed);
+    connect(ui->sghiEdit, &QDoubleSpinBox::textChanged, this, &EditYeast::is_changed);
+
+    ui->saveButton->setEnabled(false);
+    ui->deleteButton->setEnabled((ui->inventoryEdit->value() == 0 && id >= 0) ? true:false);
+}
+
+
+EditYeast::~EditYeast()
+{
+    qDebug() << "EditYeast done";
+    delete ui;
+    emit entry_changed();
+}
+
+
+void EditYeast::SetForm(int form)
+{
+    if (form == 0) {
+	/*
+	 * Liquid yeast
+	 */
+	ui->costLabel->setText(tr("Price per pack:"));
+	ui->inventoryLabel->setText(tr("Inventory Packs:"));
+	ui->cellsLabel->setText(tr("Billion cells/pack:"));
+	ui->inventoryEdit->setDecimals(0);
+	ui->inventoryEdit->setSingleStep(1.0);
+	ui->valueEdit->setValue(ui->inventoryEdit->value() * ui->costEdit->value());
+    } else if (form == 1 || form == 6) {
+	/*
+	 * Dry or dried yeast
+	 */
+	ui->costLabel->setText(tr("Price per Kg:"));
+	ui->inventoryLabel->setText(tr("Inventory gram:"));
+	ui->cellsLabel->setText(tr("Billion cells/gram:"));
+	ui->inventoryEdit->setDecimals(1);
+	ui->inventoryEdit->setSingleStep(0.5);
+	ui->valueEdit->setValue((ui->inventoryEdit->value() / 1000) * ui->costEdit->value());
+    } else {
+	/*
+	 * All others
+	 */
+	ui->costLabel->setText(tr("Price per litre:"));
+	ui->inventoryLabel->setText(tr("Inventory ml:"));
+	ui->cellsLabel->setText(tr("Billion cells/ml:"));
+	ui->inventoryEdit->setDecimals(1);
+	ui->inventoryEdit->setSingleStep(0.5);
+	ui->valueEdit->setValue((ui->inventoryEdit->value() / 1000) * ui->costEdit->value());
+    }
+}
+
+
+
+/*
+ * Window header, mark any change with '**'
+ */
+void EditYeast::WindowTitle()
+{
+    QString txt;
+
+    if (this->recno < 0) {
+	txt = QString(tr("BMSapp - Add new hop"));
+    } else {
+	txt = QString(tr("BMSapp - Edit hop %1").arg(this->recno));
+    }
+
+    if (this->textIsChanged) {
+	txt.append((QString(" **")));
+    }
+    setWindowTitle(txt);
+}
+
+
+void EditYeast::on_saveButton_clicked()
+{
+    QSqlQuery query;
+
+    /* If there are errors in the form, show a message and do "return;" */
+    if (ui->nameEdit->text().length() < 2) {
+	QMessageBox::warning(this, tr("Edit Yeast"), tr("Name empty or too short."));
+	return;
+    }
+    if (ui->laboratoryEdit->text().length() < 2) {
+        QMessageBox::warning(this, tr("Edit Yeast"), tr("Laboratory empty or too short."));
+        return;
+    }
+
+    if (this->textIsChanged) {
+    	if (this->recno == -1) {
+    	    query.prepare("INSERT INTO inventory_yeasts SET name=:name, type=:type, form=:form, "
+		"laboratory=:laboratory, product_id=:productid, min_temperature=:templo, max_temperature=:temphi, "
+		"flocculation=:floc, attenuation=:att, tolerance=:tolerance, notes=:notes, best_for=:bestfor, "
+		"max_reuse=:reuse, inventory=:inventory, cost=:cost, production_date=:prod, tht_date=:tht, "
+		"cells=:cells, sta1=:sta1, bacteria=:bacteria, harvest_top=:harvesttop, harvest_time=:harvesttime, "
+		"pitch_temperature=:pitchtemp, pofpos=:pof, short_desc=:yeastbank, gr_hl_lo=:grhllo, sg_lo=:sglo, "
+		"gr_hl_hi=:grhlhi, sg_hi=:sghi, uuid = :uuid");
+    	} else {
+	    query.prepare("UPDATE inventory_yeasts SET name=:name, type=:type, form=:form, "
+		"laboratory=:laboratory, product_id=:productid, min_temperature=:templo, max_temperature=:temphi, "
+		"flocculation=:floc, attenuation=:att, tolerance=:tolerance, notes=:notes, best_for=:bestfor, "
+		"max_reuse=:reuse, inventory=:inventory, cost=:cost, production_date=:prod, tht_date=:tht, "
+		"cells=:cells, sta1=:sta1, bacteria=:bacteria, harvest_top=:harvesttop, harvest_time=:harvesttime, "
+		"pitch_temperature=:pitchtemp, pofpos=:pof, short_desc=:yeastbank, gr_hl_lo=:grhllo, sg_lo=:sglo, "
+		"gr_hl_hi=:grhlhi, sg_hi=:sghi WHERE record = :recno");
+    	}
+	query.bindValue(":name", ui->nameEdit->text());
+	query.bindValue(":type", ui->typeEdit->currentIndex());
+	query.bindValue(":form", ui->formEdit->currentIndex());
+	query.bindValue(":laboratory", ui->laboratoryEdit->text());
+	query.bindValue(":productid", ui->productidEdit->text());
+	query.bindValue(":templo", QString("%1").arg(ui->temploEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":temphi", QString("%1").arg(ui->temphiEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":floc", ui->flocEdit->currentIndex());
+	query.bindValue(":att", QString("%1").arg(ui->attEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":tolerance", QString("%1").arg(ui->toleranceEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":notes", ui->notesEdit->toPlainText());
+	query.bindValue(":bestfor", ui->bestforEdit->toPlainText());
+	query.bindValue(":reuse", ui->reuseEdit->value());
+	if (ui->formEdit->currentIndex() == 0)
+	    query.bindValue(":inventory", QString("%1").arg(ui->inventoryEdit->value(), 5, 'f', 4, '0'));
+	else
+	    query.bindValue(":inventory", QString("%1").arg(ui->inventoryEdit->value() / 1000, 5, 'f', 4, '0'));
+	query.bindValue(":cost", QString("%1").arg(ui->costEdit->value(), 3, 'f', 2, '0'));
+	/* Uses https://www.qtcentre.org/threads/17295-How-to-put-empty-value-in-QDateEdit */
+	query.bindValue(":prod", ui->prodEdit->nullDate());
+	query.bindValue(":tht", ui->thtEdit->nullDate());
+	query.bindValue(":cells", QString("%1").arg(ui->cellsEdit->value() * 1000000000, 1, 'f', 0, '0'));
+	query.bindValue(":sta1", ui->sta1Edit->isChecked() ? 1:0);
+	query.bindValue(":bacteria", ui->bacteriaEdit->isChecked() ? 1:0);
+	query.bindValue(":harvesttop", ui->harvesttopEdit->isChecked() ? 1:0);
+	query.bindValue(":harvesttime", ui->harvesttimeEdit->value());
+	query.bindValue(":pitchtemp", QString("%1").arg(ui->pitchtempEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":pof", ui->pofEdit->isChecked() ? 1:0);
+	query.bindValue(":yeastbank", ui->yeastbankEdit->text());
+	query.bindValue(":grhllo", QString("%1").arg(ui->grhlloEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":sglo", ui->sgloEdit->value());
+	query.bindValue(":grhlhi", QString("%1").arg(ui->grhlhiEdit->value(), 2, 'f', 1, '0'));
+	query.bindValue(":sghi", ui->sghiEdit->value());
+	if (this->recno == -1) {
+	    query.bindValue(":uuid", QUuid::createUuid().toString().mid(1, 36));
+	} else {
+	    query.bindValue(":recno", this->recno);
+	}
+	query.exec();
+	if (query.lastError().isValid()) {
+	    qDebug() << "EditYeast" << query.lastError();
+	    QMessageBox::warning(this, tr("Database error"),
+                        tr("MySQL error: %1\n%2\n%3")
+                        .arg(query.lastError().nativeErrorCode())
+                        .arg(query.lastError().driverText())
+                        .arg(query.lastError().databaseText()));
+	} else {
+	    qDebug() << "EditYeast Saved";
+	}
+    }
+
+    ui->saveButton->setEnabled(false);
+    this->textIsChanged = false;
+    WindowTitle();
+}
+
+
+void EditYeast::on_deleteButton_clicked()
+{
+    QSqlQuery query;
+
+    query.prepare("DELETE FROM inventory_yeasts WHERE record = :recno");
+    query.bindValue(":recno", this->recno);
+    query.exec();
+    if (query.lastError().isValid()) {
+	qDebug() << "EditYeast" << query.lastError();
+	QMessageBox::warning(this, tr("Database error"),
+                        tr("MySQL error: %1\n%2\n%3")
+                        .arg(query.lastError().nativeErrorCode())
+                        .arg(query.lastError().driverText())
+                        .arg(query.lastError().databaseText()));
+    } else {
+	qDebug() << "EditYeast Deleted" << this->recno;
+    }
+
+    this->close();
+    this->setResult(1);
+}
+
+
+void EditYeast::is_changed()
+{
+    SetForm(ui->formEdit->currentIndex());
+    ui->saveButton->setEnabled(true);
+    ui->deleteButton->setEnabled((ui->inventoryEdit->value() == 0 && this->recno >= 0) ? true:false);
+    this->textIsChanged = true;
+    WindowTitle();
+}
+
+
+void EditYeast::temp_lo_changed()
+{
+    if (ui->temploEdit->value() > (ui->temphiEdit->value() - 1))
+	ui->temphiEdit->setValue(ui->temploEdit->value() + 1);
+    is_changed();
+}
+
+
+void EditYeast::temp_hi_changed()
+{
+    if (ui->temphiEdit->value() < (ui->temploEdit->value() + 1))
+	ui->temploEdit->setValue(ui->temphiEdit->value() - 1);
+    is_changed();
+}
+
+
+void EditYeast::on_quitButton_clicked()
+{
+    if (this->textIsChanged) {
+	int rc = QMessageBox::warning(this, tr("Yeast changed"), tr("The yeast has been modified\n Save changes?"),
+                                QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);
+        switch (rc) {
+            case QMessageBox::Save:
+                        on_saveButton_clicked();
+                        break;  /* Saved and then Quit */
+            case QMessageBox::Discard:
+                        break;  /* Quit without Save */
+            case QMessageBox::Cancel:
+                        return; /* Return to the editor page */
+        }
+    }
+
+    this->close();
+    this->setResult(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/EditYeast.h	Mon Feb 21 21:17:33 2022 +0100
@@ -0,0 +1,39 @@
+#ifndef _EDITYEAST_H
+#define _EDITYEAST_H
+
+#include <QDialog>
+
+
+namespace Ui {
+class EditYeast;
+}
+
+class EditYeast : public QDialog
+{
+    Q_OBJECT
+
+signals:
+    void entry_changed();
+
+public:
+    explicit EditYeast(int id, QWidget *parent = 0);
+    ~EditYeast();
+
+private slots:
+    void on_saveButton_clicked();
+    void on_quitButton_clicked();
+    void on_deleteButton_clicked();
+    void is_changed();
+    void temp_lo_changed();
+    void temp_hi_changed();
+
+private:
+    Ui::EditYeast *ui;
+    int recno;
+    bool textIsChanged = false;
+
+    void WindowTitle();
+    void SetForm(int form);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/InventoryYeasts.cpp	Mon Feb 21 21:17:33 2022 +0100
@@ -0,0 +1,184 @@
+/**
+ * InventoryYeasts.cpp is part of bmsapp.
+ *
+ * bmsapp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * bmsapp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "InventoryYeasts.h"
+#include "EditYeast.h"
+#include "../ui/ui_InventoryYeasts.h"
+#include "config.h"
+#include "bmsapp.h"
+
+
+InventoryYeasts::InventoryYeasts(QWidget *parent) : QDialog(parent), ui(new Ui::InventoryYeasts)
+{
+    qDebug() << "InventoryYeasts start";
+
+    ui->setupUi(this);
+    emit refreshTable();
+
+    setWindowTitle( QString("BMSapp - %1 - Inventory Yeasts").arg(VERSIONSTRING) );
+}
+
+
+void InventoryYeasts::refreshTable()
+{
+    QString w;
+    QWidget* pWidget;
+    QLabel *label;
+    QHBoxLayout* pLayout;
+
+    qDebug() << "InventoryYeasts reload";
+
+    QSqlQuery query("SELECT * FROM inventory_yeasts ORDER BY laboratory,product_id,name");
+    const QStringList labels({tr("Laboratory"), tr("Product id"), tr("Name"), tr("Type"), tr("Form"), tr("SVG %"), tr("Tol %"), tr("POF+"), tr("STA1"), tr("Stock"), tr("Edit")});
+    const QStringList types({tr("Lager"), tr("Ale"), tr("Wheat"), tr("Wine"), tr("Champagne"), tr("Brett"), tr("Kveik"), tr("Hybrid")});
+    const QStringList form({tr("Liquid"), tr("Dry"), tr("Slant"), tr("Culture"), tr("Frozen"), tr("Bottle"), tr("Dried")});
+
+    /* origin supplier name type graintype color yield inventory Edit */
+    ui->tableYeasts->setColumnCount(11);
+    ui->tableYeasts->setColumnWidth(0, 120);	/* Laboratory	*/
+    ui->tableYeasts->setColumnWidth(1, 120);	/* Product ID	*/
+    ui->tableYeasts->setColumnWidth(2, 250);	/* Name		*/
+    ui->tableYeasts->setColumnWidth(3,  70);	/* Type		*/
+    ui->tableYeasts->setColumnWidth(4,  70);	/* Form		*/
+    ui->tableYeasts->setColumnWidth(5,  80);	/* SVG		*/
+    ui->tableYeasts->setColumnWidth(6,  80);	/* Tolerance	*/
+    ui->tableYeasts->setColumnWidth(7,  60);	/* POF+		*/
+    ui->tableYeasts->setColumnWidth(8,  60);	/* STA1		*/
+    ui->tableYeasts->setColumnWidth(9,  80);	/* Stock	*/
+    ui->tableYeasts->setColumnWidth(10, 80);	/* Edit button	*/
+    ui->tableYeasts->setRowCount(query.size());
+    ui->tableYeasts->setHorizontalHeaderLabels(labels);
+    ui->tableYeasts->verticalHeader()->hide();
+    ui->tableYeasts->setFixedSize(1070 + 24, 640);	/* Even if this is too large, it works */
+
+    QTableWidgetItem *rightitem = new QTableWidgetItem();
+    rightitem->setTextAlignment(Qt::AlignRight);
+
+    query.first();
+    for (int ridx = 0 ; ridx < query.size() ; ridx++ ) {
+	ui->tableYeasts->setItem(ridx, 0, new QTableWidgetItem(query.value(4).toString()));	/* Laboratory */
+	ui->tableYeasts->setItem(ridx, 1, new QTableWidgetItem(query.value(5).toString()));	/* Product id */
+	ui->tableYeasts->setItem(ridx, 2, new QTableWidgetItem(query.value(1).toString()));	/* Name	*/
+	ui->tableYeasts->setItem(ridx, 3, new QTableWidgetItem(types[query.value(2).toInt()]));	/* Type */
+	ui->tableYeasts->setItem(ridx, 4, new QTableWidgetItem(form[query.value(3).toInt()]));	/* Form */
+	w = QString("%1 %").arg(query.value(9).toDouble(), 2, 'f', 1, '0' );	/* Attenuation% */
+	QTableWidgetItem *item = new QTableWidgetItem(w);
+        item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+        ui->tableYeasts->setItem(ridx, 5, item);
+	w = QString("");
+	if (query.value(10).toDouble() > 0)
+	    w = QString("%1 %").arg(query.value(10).toDouble(), 2, 'f', 1, '0' );	/* Alcohol% */
+        item = new QTableWidgetItem(w);
+        item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+        ui->tableYeasts->setItem(ridx, 6, item);
+
+	if (query.value(24).toInt()) {
+	    pWidget = new QWidget();
+	    label = new QLabel;
+	    label->setPixmap(QPixmap(":icons/silk/tick.png"));
+	    pLayout = new QHBoxLayout(pWidget);
+            pLayout->addWidget(label);
+	    pLayout->setAlignment(Qt::AlignCenter);
+            pLayout->setContentsMargins(0, 0, 0, 0);
+            pWidget->setLayout(pLayout);
+	    ui->tableYeasts->setCellWidget(ridx, 7, pWidget);
+	}
+        if (query.value(19).toInt()) {
+            pWidget = new QWidget();
+            label = new QLabel;
+            label->setPixmap(QPixmap(":icons/silk/tick.png"));
+            pLayout = new QHBoxLayout(pWidget);
+            pLayout->addWidget(label);
+            pLayout->setAlignment(Qt::AlignCenter);
+            pLayout->setContentsMargins(0, 0, 0, 0);
+            pWidget->setLayout(pLayout);
+            ui->tableYeasts->setCellWidget(ridx, 8, pWidget);
+        }
+
+	w = QString("");
+	if (query.value(14).toDouble() > 0) {
+	  if (query.value(3).toInt() == 0 && query.value(14).toDouble() > 1) {		/* Liquid yeast, multiple packs */
+	    w = QString("%1 packs").arg(query.value(14).toDouble(), 1, 'f', 0, '0');
+	  } else if (query.value(3).toInt() == 0) {					/* Liquid yeast */
+	    w = QString("%1 pack").arg(query.value(14).toDouble(), 1, 'f', 0, '0');
+	  } else if (query.value(3).toInt() == 1 || query.value(3).toInt() == 6) {	/* Dry or dried */
+	    w = QString("%1 gram").arg(query.value(14).toDouble() * 1000, 2, 'f', 1, '0');
+	  } else {									/* Any other form */
+	    w = QString("%1 ml").arg(query.value(14).toDouble() * 1000, 2, 'f', 1, '0');
+	  }
+	}
+	item = new QTableWidgetItem(w);
+	item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
+	ui->tableYeasts->setItem(ridx, 9, item);
+
+	/* Add the Edit button */
+	pWidget = new QWidget();
+	QPushButton* btn_edit = new QPushButton();
+	btn_edit->setObjectName(QString("%1").arg(query.value(0).toString()));	/* Send record with the button */
+	btn_edit->setText(tr("Edit"));
+	connect(btn_edit, SIGNAL(clicked()), this, SLOT(on_editButton_clicked()));
+	pLayout = new QHBoxLayout(pWidget);
+	pLayout->addWidget(btn_edit);
+	pLayout->setContentsMargins(5, 0, 5, 0);
+	pWidget->setLayout(pLayout);
+	ui->tableYeasts->setCellWidget(ridx, 10, pWidget);
+	query.next();
+    }
+
+    setWindowTitle( QString("BMSapp - %1 - Inventory Yeasts").arg(VERSIONSTRING) );
+}
+
+
+InventoryYeasts::~InventoryYeasts()
+{
+    qDebug() << "InventoryYeasts done";
+    delete ui;
+}
+
+
+void InventoryYeasts::edit(int recno)
+{
+    qDebug() << "InventoryYeasts edit:" << recno;
+
+    EditYeast dialog(recno, this);
+    /* Signal from editor if a refresh is needed */
+    connect(&dialog, SIGNAL(entry_changed()), this, SLOT(refreshTable()));
+    dialog.setModal(true);
+    dialog.exec();
+}
+
+
+void InventoryYeasts::on_editButton_clicked()
+{
+    QPushButton *pb = qobject_cast<QPushButton *>(QObject::sender());
+    int recno = pb->objectName().toInt();
+    qDebug() << Q_FUNC_INFO << recno;
+    edit(recno);
+}
+
+
+void InventoryYeasts::on_insertButton_clicked()
+{
+    qDebug() << Q_FUNC_INFO;
+    edit(-1);
+}
+
+
+void InventoryYeasts::on_quitButton_clicked()
+{
+    emit firstWindow();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/InventoryYeasts.h	Mon Feb 21 21:17:33 2022 +0100
@@ -0,0 +1,32 @@
+#ifndef _INVENTORYYEASTS_H
+#define _INVENTORYYEASTS_H
+
+#include <QDialog>
+
+namespace Ui {
+class InventoryYeasts;
+}
+
+class InventoryYeasts : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit InventoryYeasts(QWidget *parent = nullptr);
+    ~InventoryYeasts();
+
+signals:
+    void firstWindow();
+
+private slots:
+    void on_quitButton_clicked();
+    void on_insertButton_clicked();
+    void on_editButton_clicked();
+    void refreshTable(void);
+
+private:
+    Ui::InventoryYeasts *ui;
+    void edit(int recno);
+};
+
+#endif
--- a/src/MainWindow.cpp	Sun Feb 20 20:22:49 2022 +0100
+++ b/src/MainWindow.cpp	Mon Feb 21 21:17:33 2022 +0100
@@ -19,6 +19,7 @@
 #include "InventorySuppliers.h"
 #include "InventoryFermentables.h"
 #include "InventoryHops.h"
+#include "InventoryYeasts.h"
 #include "Setup.h"
 #include "../ui/ui_MainWindow.h"
 #include "config.h"
@@ -107,6 +108,24 @@
 }
 
 
+void MainWindow::fromInventoryYeasts()
+{
+    qDebug() << Q_FUNC_INFO;
+    delete InventoryYeastsWindow;
+    this->show();
+}
+
+
+void MainWindow::on_actionYeasts_triggered()
+{
+    qDebug() << Q_FUNC_INFO;
+    InventoryYeastsWindow = new InventoryYeasts(this);
+    QObject::connect(InventoryYeastsWindow, SIGNAL(firstWindow()), this, SLOT(fromInventoryYeasts()));
+    this->hide();    // Close the main window
+    InventoryYeastsWindow->show();  // Show a second window
+}
+
+
 void MainWindow::fromSetup()
 {
     qDebug() << Q_FUNC_INFO;
--- a/src/MainWindow.h	Sun Feb 20 20:22:49 2022 +0100
+++ b/src/MainWindow.h	Mon Feb 21 21:17:33 2022 +0100
@@ -4,6 +4,7 @@
 #include "InventorySuppliers.h"
 #include "InventoryFermentables.h"
 #include "InventoryHops.h"
+#include "InventoryYeasts.h"
 #include "Setup.h"
 
 #include <QMainWindow>
@@ -28,6 +29,7 @@
     void on_actionSuppliers_triggered();
     void on_actionFermentables_triggered();
     void on_actionHops_triggered();
+    void on_actionYeasts_triggered();
     void on_actionSetup_triggered();
     void on_actionAbout_triggered();
 
@@ -35,6 +37,7 @@
     void fromInventorySuppliers();
     void fromInventoryFermentables();
     void fromInventoryHops();
+    void fromInventoryYeasts();
     void fromSetup();
 
 private:
@@ -43,7 +46,8 @@
     // Keep pointers to new windows.
     InventorySuppliers *InventorySuppliersWindow;
     InventoryFermentables *InventoryFermentablesWindow;
-    InventoryHops * InventoryHopsWindow;
+    InventoryHops *InventoryHopsWindow;
+    InventoryYeasts *InventoryYeastsWindow;
     Setup *SetupWindow;
 };
 
--- a/src/bmsapp.h	Sun Feb 20 20:22:49 2022 +0100
+++ b/src/bmsapp.h	Mon Feb 21 21:17:33 2022 +0100
@@ -20,6 +20,7 @@
 #include <QStyle>
 #include <QPlainTextEdit>
 #include <QMessageBox>
+#include <QLabel>
 
 #include "Utils.h"
 #include "database/database.h"
--- a/ui/EditFermentable.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/EditFermentable.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -848,7 +848,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -868,7 +868,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="deleteButton">
@@ -888,7 +888,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/delete.png</normaloff>:/icons/silk/icons/silk/delete.png</iconset>
+        <normaloff>:icons/silk/delete.png</normaloff>:icons/silk/delete.png</iconset>
       </property>
      </widget>
      <widget class="QDoubleSpinBox" name="valueEdit">
--- a/ui/EditHop.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/EditHop.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -278,7 +278,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -298,7 +298,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="deleteButton">
@@ -318,7 +318,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/delete.png</normaloff>:/icons/silk/icons/silk/delete.png</iconset>
+        <normaloff>:icons/silk/delete.png</normaloff>:icons/silk/delete.png</iconset>
       </property>
      </widget>
      <widget class="QDoubleSpinBox" name="valueEdit">
--- a/ui/EditMisc.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/EditMisc.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -278,7 +278,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -298,7 +298,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="deleteButton">
@@ -318,7 +318,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/delete.png</normaloff>:/icons/silk/icons/silk/delete.png</iconset>
+        <normaloff>:icons/silk/delete.png</normaloff>:icons/silk/delete.png</iconset>
       </property>
      </widget>
      <widget class="QDoubleSpinBox" name="valueEdit">
--- a/ui/EditSupplier.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/EditSupplier.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -346,7 +346,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -363,7 +363,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="deleteButton">
@@ -380,7 +380,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/delete.png</normaloff>:/icons/silk/icons/silk/delete.png</iconset>
+        <normaloff>:icons/silk/delete.png</normaloff>:icons/silk/delete.png</iconset>
       </property>
      </widget>
     </widget>
--- a/ui/EditYeast.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/EditYeast.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -19,9 +19,9 @@
      <widget class="QLabel" name="nameLabel">
       <property name="geometry">
        <rect>
-        <x>30</x>
+        <x>5</x>
         <y>10</y>
-        <width>91</width>
+        <width>121</width>
         <height>20</height>
        </rect>
       </property>
@@ -35,9 +35,9 @@
      <widget class="QLabel" name="notesLabel">
       <property name="geometry">
        <rect>
-        <x>30</x>
-        <y>40</y>
-        <width>91</width>
+        <x>5</x>
+        <y>70</y>
+        <width>121</width>
         <height>20</height>
        </rect>
       </property>
@@ -52,7 +52,7 @@
       <property name="geometry">
        <rect>
         <x>5</x>
-        <y>410</y>
+        <y>430</y>
         <width>121</width>
         <height>20</height>
        </rect>
@@ -68,7 +68,7 @@
       <property name="geometry">
        <rect>
         <x>5</x>
-        <y>440</y>
+        <y>460</y>
         <width>121</width>
         <height>20</height>
        </rect>
@@ -83,9 +83,9 @@
      <widget class="QLabel" name="valueLabel">
       <property name="geometry">
        <rect>
-        <x>5</x>
-        <y>470</y>
-        <width>121</width>
+        <x>270</x>
+        <y>460</y>
+        <width>81</width>
         <height>20</height>
        </rect>
       </property>
@@ -100,7 +100,7 @@
       <property name="geometry">
        <rect>
         <x>660</x>
-        <y>410</y>
+        <y>430</y>
         <width>141</width>
         <height>20</height>
        </rect>
@@ -116,7 +116,7 @@
       <property name="geometry">
        <rect>
         <x>660</x>
-        <y>440</y>
+        <y>460</y>
         <width>141</width>
         <height>20</height>
        </rect>
@@ -141,14 +141,14 @@
        <number>128</number>
       </property>
       <property name="placeholderText">
-       <string>Name of the fermentable</string>
+       <string>Name of the yeast</string>
       </property>
      </widget>
      <widget class="QPlainTextEdit" name="notesEdit">
       <property name="geometry">
        <rect>
         <x>140</x>
-        <y>40</y>
+        <y>70</y>
         <width>791</width>
         <height>81</height>
        </rect>
@@ -161,7 +161,7 @@
       <property name="geometry">
        <rect>
         <x>140</x>
-        <y>410</y>
+        <y>430</y>
         <width>121</width>
         <height>24</height>
        </rect>
@@ -195,7 +195,7 @@
       <property name="geometry">
        <rect>
         <x>140</x>
-        <y>440</y>
+        <y>460</y>
         <width>121</width>
         <height>24</height>
        </rect>
@@ -220,7 +220,7 @@
       <property name="geometry">
        <rect>
         <x>810</x>
-        <y>410</y>
+        <y>430</y>
         <width>121</width>
         <height>24</height>
        </rect>
@@ -246,7 +246,7 @@
       <property name="geometry">
        <rect>
         <x>810</x>
-        <y>440</y>
+        <y>460</y>
         <width>121</width>
         <height>24</height>
        </rect>
@@ -277,8 +277,8 @@
        <string>Quit</string>
       </property>
       <property name="icon">
-       <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+       <iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -297,8 +297,8 @@
        <string>Save</string>
       </property>
       <property name="icon">
-       <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+       <iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="deleteButton">
@@ -317,15 +317,15 @@
        <string>Delete</string>
       </property>
       <property name="icon">
-       <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/delete.png</normaloff>:/icons/silk/icons/silk/delete.png</iconset>
+       <iconset>
+        <normaloff>:icons/silk/delete.png</normaloff>:icons/silk/delete.png</iconset>
       </property>
      </widget>
      <widget class="QDoubleSpinBox" name="valueEdit">
       <property name="geometry">
        <rect>
-        <x>140</x>
-        <y>470</y>
+        <x>360</x>
+        <y>460</y>
         <width>107</width>
         <height>24</height>
        </rect>
@@ -340,6 +340,751 @@
        <enum>QAbstractSpinBox::NoButtons</enum>
       </property>
      </widget>
+     <widget class="QLabel" name="productidLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>40</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Product id:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLineEdit" name="productidEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>40</y>
+        <width>271</width>
+        <height>23</height>
+       </rect>
+      </property>
+      <property name="maxLength">
+       <number>128</number>
+      </property>
+      <property name="placeholderText">
+       <string>Product number, name or code</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="typeLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>160</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Type:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="formLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>190</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Form:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="laboratoryLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>220</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Laboratory:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="bestforLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>250</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Best for:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="yeastbankLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>310</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Yeast bank:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="pofLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>340</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>POF+:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="sta1Label">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>370</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>STA1 (diastatic):</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QComboBox" name="typeEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>160</y>
+        <width>121</width>
+        <height>23</height>
+       </rect>
+      </property>
+     </widget>
+     <widget class="QComboBox" name="formEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>190</y>
+        <width>121</width>
+        <height>23</height>
+       </rect>
+      </property>
+     </widget>
+     <widget class="QLineEdit" name="laboratoryEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>220</y>
+        <width>511</width>
+        <height>23</height>
+       </rect>
+      </property>
+      <property name="maxLength">
+       <number>128</number>
+      </property>
+      <property name="placeholderText">
+       <string>Yeast laboratory</string>
+      </property>
+     </widget>
+     <widget class="QLineEdit" name="yeastbankEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>310</y>
+        <width>511</width>
+        <height>23</height>
+       </rect>
+      </property>
+      <property name="maxLength">
+       <number>128</number>
+      </property>
+      <property name="placeholderText">
+       <string>Yeast bank remark</string>
+      </property>
+     </widget>
+     <widget class="QPlainTextEdit" name="bestforEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>250</y>
+        <width>511</width>
+        <height>51</height>
+       </rect>
+      </property>
+      <property name="placeholderText">
+       <string>Best used in these style of beers</string>
+      </property>
+     </widget>
+     <widget class="QCheckBox" name="pofEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>340</y>
+        <width>85</width>
+        <height>21</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Yes</string>
+      </property>
+     </widget>
+     <widget class="QCheckBox" name="sta1Edit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>370</y>
+        <width>85</width>
+        <height>21</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Yes</string>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="temploEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>160</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="accelerated">
+       <bool>true</bool>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="maximum">
+       <double>45.000000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.500000000000000</double>
+      </property>
+     </widget>
+     <widget class="QLabel" name="temploLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>160</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Min. temperature °C:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="temphiLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>190</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Max. temperature °C:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="attLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>220</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Attenuatiom %:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="toleranceLable">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>250</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Alcohol tolerance %:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="flocLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>280</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Flocculation:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="cellsLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>310</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Billion cells/gram:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="reuseLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>340</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Max. reuse:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="pitchtempLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>370</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Pitch temperature °C:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="harvesttimeLabel">
+      <property name="geometry">
+       <rect>
+        <x>660</x>
+        <y>400</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Harvest time:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="temphiEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>190</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="accelerated">
+       <bool>true</bool>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="maximum">
+       <double>45.000000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.500000000000000</double>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="attEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>220</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="accelerated">
+       <bool>true</bool>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="minimum">
+       <double>50.000000000000000</double>
+      </property>
+      <property name="maximum">
+       <double>100.000000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.500000000000000</double>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="toleranceEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>250</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="maximum">
+       <double>25.000000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.500000000000000</double>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="cellsEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>310</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="maximum">
+       <double>500.000000000000000</double>
+      </property>
+     </widget>
+     <widget class="QSpinBox" name="reuseEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>340</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="maximum">
+       <number>25</number>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="pitchtempEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>370</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="accelerated">
+       <bool>true</bool>
+      </property>
+      <property name="decimals">
+       <number>1</number>
+      </property>
+      <property name="maximum">
+       <double>45.000000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.500000000000000</double>
+      </property>
+     </widget>
+     <widget class="QSpinBox" name="harvesttimeEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>400</y>
+        <width>121</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="accelerated">
+       <bool>true</bool>
+      </property>
+     </widget>
+     <widget class="QComboBox" name="flocEdit">
+      <property name="geometry">
+       <rect>
+        <x>810</x>
+        <y>280</y>
+        <width>121</width>
+        <height>23</height>
+       </rect>
+      </property>
+     </widget>
+     <widget class="QSpinBox" name="grhlloEdit">
+      <property name="geometry">
+       <rect>
+        <x>500</x>
+        <y>160</y>
+        <width>51</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string>grams / 100 litres</string>
+      </property>
+      <property name="minimum">
+       <number>2</number>
+      </property>
+      <property name="maximum">
+       <number>400</number>
+      </property>
+     </widget>
+     <widget class="QSpinBox" name="grhlhiEdit">
+      <property name="geometry">
+       <rect>
+        <x>500</x>
+        <y>190</y>
+        <width>51</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string>grams / 100 litres</string>
+      </property>
+      <property name="minimum">
+       <number>4</number>
+      </property>
+      <property name="maximum">
+       <number>400</number>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="sgloEdit">
+      <property name="geometry">
+       <rect>
+        <x>580</x>
+        <y>160</y>
+        <width>71</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string>at this gravity</string>
+      </property>
+      <property name="decimals">
+       <number>3</number>
+      </property>
+      <property name="minimum">
+       <double>1.020000000000000</double>
+      </property>
+      <property name="maximum">
+       <double>1.100000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.005000000000000</double>
+      </property>
+     </widget>
+     <widget class="QDoubleSpinBox" name="sghiEdit">
+      <property name="geometry">
+       <rect>
+        <x>580</x>
+        <y>190</y>
+        <width>71</width>
+        <height>24</height>
+       </rect>
+      </property>
+      <property name="toolTip">
+       <string>at this gravity</string>
+      </property>
+      <property name="decimals">
+       <number>3</number>
+      </property>
+      <property name="minimum">
+       <double>1.020000000000000</double>
+      </property>
+      <property name="maximum">
+       <double>1.100000000000000</double>
+      </property>
+      <property name="singleStep">
+       <double>0.005000000000000</double>
+      </property>
+     </widget>
+     <widget class="QLabel" name="pitchloLabel">
+      <property name="geometry">
+       <rect>
+        <x>350</x>
+        <y>160</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Pitch from gr/hl:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="pitchhiLabel">
+      <property name="geometry">
+       <rect>
+        <x>350</x>
+        <y>190</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Pitch upto gr/hl:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QLabel" name="bacteriaLabel">
+      <property name="geometry">
+       <rect>
+        <x>5</x>
+        <y>400</y>
+        <width>121</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Bacteria:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QCheckBox" name="bacteriaEdit">
+      <property name="geometry">
+       <rect>
+        <x>140</x>
+        <y>400</y>
+        <width>85</width>
+        <height>21</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Yes</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="harvesttopLabel">
+      <property name="geometry">
+       <rect>
+        <x>350</x>
+        <y>400</y>
+        <width>141</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Harvest top:</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+      </property>
+     </widget>
+     <widget class="QCheckBox" name="harvesttopEdit">
+      <property name="geometry">
+       <rect>
+        <x>500</x>
+        <y>400</y>
+        <width>85</width>
+        <height>21</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>Yes</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="at1">
+      <property name="geometry">
+       <rect>
+        <x>555</x>
+        <y>160</y>
+        <width>20</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>@</string>
+      </property>
+     </widget>
+     <widget class="QLabel" name="at2">
+      <property name="geometry">
+       <rect>
+        <x>555</x>
+        <y>190</y>
+        <width>20</width>
+        <height>20</height>
+       </rect>
+      </property>
+      <property name="text">
+       <string>@</string>
+      </property>
+     </widget>
     </widget>
    </item>
   </layout>
--- a/ui/InventoryFermentables.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/InventoryFermentables.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -64,7 +64,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+          <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
         </property>
        </widget>
       </item>
@@ -125,7 +125,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/table_row_insert.png</normaloff>:/icons/silk/icons/silk/table_row_insert.png</iconset>
+          <normaloff>:icons/silk/table_row_insert.png</normaloff>:icons/silk/table_row_insert.png</iconset>
         </property>
        </widget>
       </item>
--- a/ui/InventoryHops.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/InventoryHops.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -64,7 +64,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+          <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
         </property>
        </widget>
       </item>
@@ -125,7 +125,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/table_row_insert.png</normaloff>:/icons/silk/icons/silk/table_row_insert.png</iconset>
+          <normaloff>:icons/silk/table_row_insert.png</normaloff>:icons/silk/table_row_insert.png</iconset>
         </property>
        </widget>
       </item>
--- a/ui/InventoryMiscs.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/InventoryMiscs.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -64,7 +64,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+          <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
         </property>
        </widget>
       </item>
@@ -125,7 +125,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/table_row_insert.png</normaloff>:/icons/silk/icons/silk/table_row_insert.png</iconset>
+          <normaloff>:icons/silk/table_row_insert.png</normaloff>:icons/silk/table_row_insert.png</iconset>
         </property>
        </widget>
       </item>
--- a/ui/InventorySuppliers.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/InventorySuppliers.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -58,7 +58,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+          <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
         </property>
        </widget>
       </item>
@@ -75,7 +75,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/table_row_insert.png</normaloff>:/icons/silk/icons/silk/table_row_insert.png</iconset>
+          <normaloff>:icons/silk/table_row_insert.png</normaloff>:icons/silk/table_row_insert.png</iconset>
         </property>
        </widget>
       </item>
--- a/ui/InventoryYeasts.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/InventoryYeasts.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -64,7 +64,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+          <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
         </property>
        </widget>
       </item>
@@ -125,7 +125,7 @@
         </property>
         <property name="icon">
          <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-          <normaloff>:/icons/silk/icons/silk/table_row_insert.png</normaloff>:/icons/silk/icons/silk/table_row_insert.png</iconset>
+          <normaloff>:icons/silk/table_row_insert.png</normaloff>:icons/silk/table_row_insert.png</iconset>
         </property>
        </widget>
       </item>
--- a/ui/MainWindow.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/MainWindow.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -132,7 +132,7 @@
   <action name="actionExit">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/cross.png</normaloff>:/icons/silk/icons/silk/cross.png</iconset>
+     <normaloff>:icons/silk/cross.png</normaloff>:icons/silk/cross.png</iconset>
    </property>
    <property name="text">
     <string>Exit</string>
@@ -141,7 +141,7 @@
   <action name="actionAbout">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/information.png</normaloff>:/icons/silk/icons/silk/information.png</iconset>
+     <normaloff>:icons/silk/information.png</normaloff>:icons/silk/information.png</iconset>
    </property>
    <property name="text">
     <string>About</string>
@@ -150,7 +150,7 @@
   <action name="actionSystens">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/server.png</normaloff>:/icons/silk/icons/silk/server.png</iconset>
+     <normaloff>:icons/silk/server.png</normaloff>:icons/silk/server.png</iconset>
    </property>
    <property name="text">
     <string>Systems</string>
@@ -159,7 +159,7 @@
   <action name="actionFermenters">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/fridge.png</normaloff>:/icons/bms/icons/bms/fridge.png</iconset>
+     <normaloff>:icons/bms/fridge.png</normaloff>:icons/bms/fridge.png</iconset>
    </property>
    <property name="text">
     <string>Fermenters</string>
@@ -168,7 +168,7 @@
   <action name="actionCO2_Meters">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/beerbottle.png</normaloff>:/icons/bms/icons/bms/beerbottle.png</iconset>
+     <normaloff>:icons/bms/beerbottle.png</normaloff>:icons/bms/beerbottle.png</iconset>
    </property>
    <property name="text">
     <string>CO2 Meters</string>
@@ -177,7 +177,7 @@
   <action name="actioniSpindels">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/fermenter.png</normaloff>:/icons/bms/icons/bms/fermenter.png</iconset>
+     <normaloff>:icons/bms/fermenter.png</normaloff>:icons/bms/fermenter.png</iconset>
    </property>
    <property name="text">
     <string>iSpindels</string>
@@ -186,7 +186,7 @@
   <action name="actionSuppliers">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/user.png</normaloff>:/icons/silk/icons/silk/user.png</iconset>
+     <normaloff>:icons/silk/user.png</normaloff>:icons/silk/user.png</iconset>
    </property>
    <property name="text">
     <string>Suppliers</string>
@@ -198,7 +198,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/graan.png</normaloff>:/icons/bms/icons/bms/graan.png</iconset>
+     <normaloff>:icons/bms/graan.png</normaloff>:icons/bms/graan.png</iconset>
    </property>
    <property name="text">
     <string>Fermentables</string>
@@ -210,7 +210,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/hop.png</normaloff>:/icons/bms/icons/bms/hop.png</iconset>
+     <normaloff>:icons/bms/hop.png</normaloff>:icons/bms/hop.png</iconset>
    </property>
    <property name="text">
     <string>Hops</string>
@@ -218,11 +218,11 @@
   </action>
   <action name="actionYeasts">
    <property name="enabled">
-    <bool>false</bool>
+    <bool>true</bool>
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/erlenmeyer.png</normaloff>:/icons/bms/icons/bms/erlenmeyer.png</iconset>
+     <normaloff>:icons/bms/erlenmeyer.png</normaloff>:icons/bms/erlenmeyer.png</iconset>
    </property>
    <property name="text">
     <string>Yeasts</string>
@@ -234,7 +234,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/peper.png</normaloff>:/icons/bms/icons/bms/peper.png</iconset>
+     <normaloff>:icons/bms/peper.png</normaloff>:icons/bms/peper.png</iconset>
    </property>
    <property name="text">
     <string>Miscs</string>
@@ -246,7 +246,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/water.png</normaloff>:/icons/bms/icons/bms/water.png</iconset>
+     <normaloff>:icons/bms/water.png</normaloff>:icons/bms/water.png</iconset>
    </property>
    <property name="text">
     <string>Waters</string>
@@ -258,7 +258,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/mash.png</normaloff>:/icons/bms/icons/bms/mash.png</iconset>
+     <normaloff>:icons/bms/mash.png</normaloff>:icons/bms/mash.png</iconset>
    </property>
    <property name="text">
     <string>Equipments</string>
@@ -270,7 +270,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/database.png</normaloff>:/icons/silk/icons/silk/database.png</iconset>
+     <normaloff>:icons/silk/database.png</normaloff>:icons/silk/database.png</iconset>
    </property>
    <property name="text">
     <string>Supplies list</string>
@@ -282,7 +282,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/science.png</normaloff>:/icons/bms/icons/bms/science.png</iconset>
+     <normaloff>:icons/bms/science.png</normaloff>:icons/bms/science.png</iconset>
    </property>
    <property name="text">
     <string>Yeast bank</string>
@@ -294,7 +294,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/water.png</normaloff>:/icons/bms/icons/bms/water.png</iconset>
+     <normaloff>:icons/bms/water.png</normaloff>:icons/bms/water.png</iconset>
    </property>
    <property name="text">
     <string>Water profiles</string>
@@ -306,7 +306,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/mash.png</normaloff>:/icons/bms/icons/bms/mash.png</iconset>
+     <normaloff>:icons/bms/mash.png</normaloff>:icons/bms/mash.png</iconset>
    </property>
    <property name="text">
     <string>Mash schedules</string>
@@ -318,7 +318,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/beerstyles.png</normaloff>:/icons/bms/icons/bms/beerstyles.png</iconset>
+     <normaloff>:icons/bms/beerstyles.png</normaloff>:icons/bms/beerstyles.png</iconset>
    </property>
    <property name="text">
     <string>Beer styles</string>
@@ -330,7 +330,7 @@
    </property>
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/bms/icons/bms/fermenter.png</normaloff>:/icons/bms/icons/bms/fermenter.png</iconset>
+     <normaloff>:icons/bms/fermenter.png</normaloff>:icons/bms/fermenter.png</iconset>
    </property>
    <property name="text">
     <string>Fermentation schedules</string>
@@ -339,7 +339,7 @@
   <action name="actionSetup">
    <property name="icon">
     <iconset resource="../resources/icons.qrc">
-     <normaloff>:/icons/silk/icons/silk/wrench.png</normaloff>:/icons/silk/icons/silk/wrench.png</iconset>
+     <normaloff>:icons/silk/wrench.png</normaloff>:icons/silk/wrench.png</iconset>
    </property>
    <property name="text">
     <string>Global settings</string>
--- a/ui/Setup.ui	Sun Feb 20 20:22:49 2022 +0100
+++ b/ui/Setup.ui	Mon Feb 21 21:17:33 2022 +0100
@@ -616,7 +616,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/door_out.png</normaloff>:/icons/silk/icons/silk/door_out.png</iconset>
+        <normaloff>:icons/silk/door_out.png</normaloff>:icons/silk/door_out.png</iconset>
       </property>
      </widget>
      <widget class="QPushButton" name="saveButton">
@@ -633,7 +633,7 @@
       </property>
       <property name="icon">
        <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
-        <normaloff>:/icons/silk/icons/silk/disk.png</normaloff>:/icons/silk/icons/silk/disk.png</iconset>
+        <normaloff>:icons/silk/disk.png</normaloff>:icons/silk/disk.png</iconset>
       </property>
      </widget>
     </widget>

mercurial