#include "multicookbook.h" #include namespace { static QErrorMessage *errorDialog = Q_NULLPTR; void showError(QString errorMessage) { if (errorDialog == NULL) { errorDialog = new QErrorMessage; errorDialog->setWindowModality(Qt::ApplicationModal); errorDialog->setGeometry(QRect(0, 511, 1080, 511)); } errorDialog->showMessage(errorMessage); errorDialog->exec(); } } MultiCookBook::MultiCookBook(QObject *parent) : QObject(parent) { mode = Define::InvalidMode; type = Define::InvalidCookType; } void MultiCookBook::setMode(Define::Mode mode) { this->mode = mode; loadTypes(); } void MultiCookBook::setType(Define::CookType type) { this->type = type; loadCooks(); book = CookBook(type); } bool MultiCookBook::checkType(Define::CookType type) { return availables.contains(type); } QList MultiCookBook::names() { QList list; foreach (QString root, roots) list.append(book.name(root)); return list; } MultiAutoCook *MultiCookBook::cook(int index) { QString type = Define::name(this->type); if (type.isEmpty()) { showError("Invalid cook type"); return Q_NULLPTR; } QString root = QString("/prime/cookbook/%1/%2").arg(type).arg(roots.at(index)); QString name = book.name(root); Cook cook(this->type, root, name); cook.load(); if (!cook.isLoaded()) { showError("Invalid cook data"); return Q_NULLPTR; } MultiAutoCook *c = new MultiAutoCook; c->setName(name); c->setMode(mode); foreach (CookStep s, cook.steps) c->append(s.temp, s.humidity, s.time); return c; } void MultiCookBook::loadTypes() { QString mode = Define::name(this->mode); if (mode.isEmpty()) { showError("Invalid cook mode"); return; } QString filename = QString("/prime/multi/types.%1").arg(mode); QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { showError("File not found: " + filename); return; } availables.clear(); int lineCount = 0; while (!file.atEnd()) { lineCount++; QString line = QString::fromUtf8(file.readLine().trimmed()); if (line.isEmpty()) continue; Define::CookType type; if (line == "poultry") type = Define::Poultry; else if (line == "meat") type = Define::Meat; else if (line == "fish") type = Define::Fish; else if (line == "desert") type = Define::Desert; else if (line == "vegetable") type = Define::Vegetable; else if (line == "bread") type = Define::Bread; else if (line == "etc") type = Define::Etc; else { showError("Invalid cook type"); return; } availables.append(type); } } void MultiCookBook::loadCooks() { QString type = Define::name(this->type); if (type.isEmpty()) { showError("Invalid cook type"); return; } QString mode = Define::name(this->mode); if (mode.isEmpty()) { showError("Invalid cook mode"); return; } QString filename = QString("/prime/multi/%1.%2").arg(type).arg(mode); QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { showError("File not found: " + filename); return; } roots.clear(); int lineCount = 0; while (!file.atEnd()) { lineCount++; QString line = QString::fromUtf8(file.readLine().trimmed()); if (line.isEmpty()) continue; roots.append(line); } }