/* * Mirai. Copyright (C) 2024 Vyn * This file is licensed under version 3 of the GNU General Public License (GPL-3.0-only) * The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt */ #include "Backend.h" #include "core/TodoMd.h" Backend::Backend() { std::cout << "Backend created" << std::endl; QDir().mkdir(QDir::homePath() + "/.config/mirai"); QFile loadFile(QDir::homePath() + "/.config/mirai/config.json"); if (!loadFile.open(QIODevice::ReadOnly)) { qWarning() << "Couldn't find existing config file"; exit(1); } QByteArray loadData = loadFile.readAll(); QJsonDocument json = QJsonDocument::fromJson(loadData); loadFile.close(); if (!json.isObject()) { qWarning() << "config.json is not a valid config file"; exit(1); } QJsonObject jsonRootObject = json.object(); auto jsonFilesPath = json["files"]; if (!jsonFilesPath.isArray()) { qWarning() << "config.json should contains a 'files' string array"; exit(1); } QString filePath = jsonFilesPath.toArray()[0].toString(); mirai.loadFile(filePath.toStdString()); view = mirai.getTasks(); rebuildQMLTasksList(); } void Backend::addTodo(QString newTodo, QString date) { mirai.addTask(newTodo.toStdString(), date.toStdString()); mirai.save(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::addTodoFromRawFormat(QString text, QString date) { mirai.addTask(mirai::TodoMdFormat::StringToTask(text.toStdString(), date.toStdString())); mirai.save(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::addTagFilter(QString tag) { view.lock()->addTagFilter(tag.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeTagFilter(QString tag) { view.lock()->removeTagFilter(tag.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeFilters() { view.lock()->removeFilters(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::updateTodoFromRawFormat(int todoIndex, QString text, QString date) { QMLTaskItem& taskItem = QMLTasks[todoIndex]; *(taskItem.taskItem) = mirai::TodoMdFormat::StringToTask(text.toStdString(), date.toStdString()); mirai.save(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::updateTodo(int todoIndex, QString state, QString text, QString date) { QMLTaskItem& taskItem = QMLTasks[todoIndex]; taskItem.taskItem->state = state == "TODO" ? mirai::TODO : mirai::DONE; if (state == "DONE") { taskItem.taskItem->markAsDone(); } else if (state == "TODO") { taskItem.taskItem->markAsUndone(); } taskItem.taskItem->setText(text.toStdString()); taskItem.taskItem->setDate(date.toStdString()); mirai.save(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeTodo(int todoIndex) { QMLTaskItem& taskItem = QMLTasks[todoIndex]; mirai.removeTask(taskItem.taskItem); mirai.save(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::hideCompletedTasks(bool shouldHide) { shouldHideCompletedTasks_ = shouldHide; rebuildQMLTasksList(); emit tasksChanged(); } void Backend::rebuildQMLTasksList() { QMLTasks.clear(); std::string lastDate = ""; std::time_t t = std::time(nullptr); std::tm tm = *std::localtime(&t); std::stringstream currentDate; currentDate << std::put_time(&tm, "%Y-%m-%d"); for (int i = 0; i < view.lock()->count(); ++i) { mirai::TaskItem& task = (*view.lock())[i]; if (shouldHideCompletedTasks_ && task.getState() == mirai::DONE && task.hasDate() && task.getDate() < currentDate.str()) { continue; } bool shouldShowDate = false; if (lastDate != task.date) { lastDate = task.date; shouldShowDate = true; } QList qStringTags; for (auto& tag : task.getTags()) { qStringTags.push_back(QString::fromStdString(tag)); } QMLTasks.push_back({ .taskItem = &task, .shouldShowDate = shouldShowDate, .tags = qStringTags }); } QMLTags.clear(); for (auto& tag : mirai.getTags()) { QMLTags.push_back(QString::fromStdString(tag)); } QMLActiveTagsFilter.clear(); for (auto& activeTagFilter: view.lock()->getActiveTagsFilter()) { QMLActiveTagsFilter.push_back(QString::fromStdString(activeTagFilter)); } } QVariant Backend::getTasks() { return QVariant::fromValue(QMLTasks); } QVariant Backend::getTags() { return QVariant::fromValue(QMLTags); } QVariant Backend::getActiveTagsFilter() { return QVariant::fromValue(QMLActiveTagsFilter); } bool Backend::shouldHideCompletedTasks() { return shouldHideCompletedTasks_; }