multicookbook.cpp 3.7 KB
#include "multicookbook.h"

#include <QErrorMessage>

namespace
{

static QErrorMessage *errorDialog = Q_NULLPTR;
void showError(QString errorMessage)
{
    if (errorDialog == NULL)
    {
        errorDialog = new QErrorMessage;
        errorDialog->setWindowModality(Qt::ApplicationModal);
        errorDialog->setGeometry(QRect(0, 426, 900, 426));
    }

    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<QString> MultiCookBook::names()
{
    QList<QString> 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);
    }
}