Sat, 11 Jun 2022 12:59:49 +0200
Added import from xml, equipments and beerstyles.
/** * ImportXML.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 "ImportXML.h" #include "../ui/ui_ImportXML.h" #include "MainWindow.h" ImportXML::ImportXML(QWidget *parent) : QDialog(parent), ui(new Ui::ImportXML) { qDebug() << "ImportXML start"; ui->setupUi(this); WindowTitle(); ui->progressBar->setValue(0); connect(ui->quitButton, SIGNAL(clicked()), parent, SLOT(fromImportXML())); } ImportXML::~ImportXML() { qDebug() << "ImportXML done"; delete ui; } void ImportXML::WindowTitle() { QString txt = QString(tr("BMSapp - Import XML")); setWindowTitle(txt); } void ImportXML::on_openButton_clicked() { QSqlQuery query; QString sql, log; int eq_total = 0, eq_errors = 0, f_total = 0, f_errors = 0, h_total = 0, h_errors = 0; int m_total = 0, m_errors = 0, y_total = 0, y_errors = 0, rec_total = 0, rec_errors = 0; int st_total = 0, st_errors = 0, mash_total = 0, mash_errors = 0, w_total = 0, w_errors = 0; int total = 0, errors = 0; QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath() + "/*.xml", tr("Files (*.xml)")); if (fileName == 0) { QMessageBox::warning(this, tr("Open File"), tr("No XML file selected.")); return; } ui->fileEdit->setText(fileName); QFile file(fileName); qint64 fsize = file.size(); log = "Import XML file `" + fileName + "`\n\n"; qInfo() << "Import XML" << fileName << "length" << fsize << "bytes"; file.open(QIODevice::ReadOnly); QXmlStreamReader *xml = new QXmlStreamReader(&file); while (xml->readNext()) { if (xml->atEnd()) break; if (xml->tokenType() == QXmlStreamReader::StartDocument) { // qDebug() << xml->readElementText(); // Just skip } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENTS")) { /* * Equipments */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENTS")) { qDebug() << "0 /EQUIPMENTS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EQUIPMENT")) { /* * Equipment */ eq_total++; total++; sql = "INSERT INTO inventory_equipments SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); sql.append("', top_up_water=0"); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "EQUIPMENT")) { query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); eq_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { sql.append(QString(", name='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { sql.append(QString(", notes='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_SIZE")) { sql.append(QString(", boil_size=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BATCH_SIZE")) { sql.append(QString(", batch_size=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_VOLUME")) { sql.append(QString(", tun_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_WEIGHT")) { sql.append(QString(", tun_weight=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_SPECIFIC_HEAT")) { sql.append(QString(", tun_specific_heat=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TUN_HEIGHT")) { sql.append(QString(", tun_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TRUB_CHILLER_LOSS")) { sql.append(QString(", trub_chiller_loss=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EVAP_RATE")) { sql.append(QString(", evap_rate=%1").arg(xml->readElementText().toDouble(), 3, 'f', 2, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "BOIL_TIME")) { sql.append(QString(", boil_time=%1").arg(xml->readElementText().toDouble(), 1, 'f', 0, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CALC_BOIL_VOLUME")) { sql.append(QString(", calc_boil_volume=%1").arg((xml->readElementText() == "TRUE") ? "true":"false")); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TOP_UP_KETTLE")) { sql.append(QString(", top_up_kettle=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOP_UTILIZATION")) { sql.append(QString(", hop_utilization=%1").arg(xml->readElementText().toDouble(), 1, 'f', 0, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_VOLUME")) { sql.append(QString(", lauter_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_HEIGHT")) { sql.append(QString(", lauter_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "LAUTER_DEADSPACE")) { sql.append(QString(", lauter_deadspace=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_VOLUME")) { sql.append(QString(", kettle_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "KETTLE_HEIGHT")) { sql.append(QString(", kettle_height=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASH_VOLUME")) { sql.append(QString(", mash_volume=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EFFICIENCY")) { sql.append(QString(", efficiency=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLES")) { /* * Styles */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLES")) { qDebug() << "0 /STYLES"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE")) { /* * Style */ st_total++; total++; sql = "INSERT INTO profile_styles SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); sql.append("'"); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "STYLE")) { query.exec(sql); if (query.lastError().isValid()) { qWarning() << sql << query.lastError(); st_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && ((xml->name() == "VERSION")) || (xml->name() == "DISPLAY_OG_MIN") || (xml->name() == "DISPLAY_OG_MAX") || (xml->name() == "DISPLAY_FG_MIN") || (xml->name() == "DISPLAY_FG_MAX") || (xml->name() == "DISPLAY_IBU_MIN") || (xml->name() == "DISPLAY_IBU_MAX") || (xml->name() == "DISPLAY_COLOR_MIN") || (xml->name() == "DISPLAY_COLOR_MAX") || (xml->name() == "DISPLAY_CARB_MIN") || (xml->name() == "DISPLAY_CARB_MAX") || (xml->name() == "DISPLAY_ABV_MIN") || (xml->name() == "DISPLAY_ABV_MAX") || (xml->name() == "OG_RANGE") || (xml->name() == "FG_RANGE") || (xml->name() == "IBU_RANGE") || (xml->name() == "CARB_RANGE") || (xml->name() == "COLOR_RANGE") || (xml->name() == "ABV_RANGE")) { // Ignore. } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NAME")) { sql.append(QString(", name='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY")) { sql.append(QString(", category='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CATEGORY_NUMBER")) { sql.append(QString(", category_number=%1").arg(xml->readElementText().toInt())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_LETTER")) { sql.append(QString(", style_letter='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "STYLE_GUIDE")) { sql.append(QString(", style_guide='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "TYPE")) { sql.append(QString(", type=%1").arg(xml->readElementText().toInt())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "NOTES")) { sql.append(QString(", notes='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MIN")) { sql.append(QString(", og_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "OG_MAX")) { sql.append(QString(", og_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MIN")) { sql.append(QString(", fg_min=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FG_MAX")) { sql.append(QString(", fg_max=%1").arg(xml->readElementText().toDouble(), 4, 'f', 3, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MIN")) { sql.append(QString(", ibu_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "IBU_MAX")) { sql.append(QString(", ibu_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MIN")) { sql.append(QString(", color_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "COLOR_MAX")) { sql.append(QString(", color_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MIN")) { sql.append(QString(", carb_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "CARB_MAX")) { sql.append(QString(", carb_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MIN")) { sql.append(QString(", abv_min=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "ABV_MAX")) { sql.append(QString(", abv_max=%1").arg(xml->readElementText().toDouble(), 2, 'f', 1, '0')); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "PROFILE")) { sql.append(QString(", profile='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "INGREDIENTS")) { sql.append(QString(", ingredients='%1'").arg(xml->readElementText())); } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "EXAMPLES")) { sql.append(QString(", examples='%1'").arg(xml->readElementText())); } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLES")) { /* * Fermentables */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLES")) { qDebug() << "0 /FERMENTABLES"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "FERMENTABLE")) { /* * Fermentable */ f_total++; total++; sql = "INSERT INTO inventory_fermentables SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "FERMENTABLE")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); f_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOPS")) { /* * Hops */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "HOPS")) { qDebug() << "0 /HOPS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "HOP")) { /* * Hop */ h_total++; total++; sql = "INSERT INTO inventory_hops SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "HOP")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); h_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MISCS")) { /* * Miscs */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MISCS")) { qDebug() << "0 /MISCS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MISC")) { /* * Misc */ m_total++; total++; sql = "INSERT INTO inventory_miscs SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MISC")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); m_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YEASTS")) { /* * Yeasts */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "YEASTS")) { qDebug() << "0 /YEASTS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "YEAST")) { /* * Yeast */ y_total++; total++; sql = "INSERT INTO inventory_yeasts SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "YEAST")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); y_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "WATERS")) { /* * Waters */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "WATERS")) { qDebug() << "0 /WATERS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "WATER")) { /* * Water */ w_total++; total++; sql = "INSERT INTO inventory_waters SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "WATER")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); w_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECIPES")) { /* * Recipes */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "RECIPES")) { qDebug() << "0 /RECIPES"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "RECIPE")) { /* * Recipe */ rec_total++; total++; sql = "INSERT INTO recipes SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "RECIPE")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); rec_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASHS")) { /* * Mashes */ while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MASHS")) { qDebug() << "0 /MASHS"; break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "MASH")) { /* * Mash */ mash_total++; total++; sql = "INSERT INTO inventory_mashs SET uuid='"; sql.append(QUuid::createUuid().toString().mid(1, 36)); while (xml->readNext()) { if (xml->atEnd()) break; if ((xml->tokenType() == QXmlStreamReader::EndElement) && (xml->name() == "MASH")) { // query.exec(sql); if (query.lastError().isValid()) { // qWarning() << sql << query.lastError(); mash_errors++; errors++; } ui->progressBar->setValue(round(100 * xml->characterOffset() / fsize)); break; } if ((xml->tokenType() == QXmlStreamReader::StartElement) && (xml->name() == "VERSION")) { // Ignore. } else { if (xml->tokenType() == QXmlStreamReader::StartElement) qDebug() << "2 " << xml->tokenType() << xml->name(); } } } } } else { qDebug() << "Unknown level 0" << xml->name(); } if (xml->atEnd()) break; } log.append(QString(" total errors\n")); log.append(QString(" ----- ------\n")); log.append(QString("styles %1 %2\n").arg(st_total, 3).arg(st_errors, 3)); log.append(QString("equipments %1 %2\n").arg(eq_total, 3).arg(eq_errors, 3)); log.append(QString("fermentables %1 %2\n").arg(f_total, 3).arg(f_errors, 3)); log.append(QString("hops %1 %2\n").arg(h_total, 3).arg(h_errors, 3)); log.append(QString("miscs %1 %2\n").arg(m_total, 3).arg(m_errors, 3)); log.append(QString("yeasts %1 %2\n").arg(y_total, 3).arg(y_errors, 3)); log.append(QString("waters %1 %2\n").arg(w_total, 3).arg(w_errors, 3)); log.append(QString("mashes %1 %2\n").arg(mash_total, 3).arg(mash_errors, 3)); log.append(QString("recipes %1 %2\n").arg(rec_total, 3).arg(rec_errors, 3)); log.append(QString(" ----- ------\n")); log.append(QString("total %1 %2\n").arg(total, 3).arg(errors, 3)); ui->logEdit->setPlainText(log); ui->progressBar->setValue(100); if (xml->hasError()) { qWarning() << "error" << xml->error(); } else { qDebug() << "all good" << eq_total << eq_errors; } file.close(); }