From 841c87752ff7e431a41f06b1191fc5f63f5cc58e Mon Sep 17 00:00:00 2001 From: Vyn Date: Wed, 17 Apr 2024 17:34:26 +0200 Subject: [PATCH] Refactor TasksView, Mirai instance doesn't depend on it anymore --- src/Backend.cpp | 32 +++++++++++++++++--------------- src/Backend.h | 2 +- src/core/Mirai.cpp | 34 +++++++++------------------------- src/core/Mirai.h | 13 +------------ src/core/TasksView.cpp | 9 +++++++-- src/core/TasksView.h | 5 +++-- src/main.cpp | 1 + 7 files changed, 39 insertions(+), 57 deletions(-) diff --git a/src/Backend.cpp b/src/Backend.cpp index 19f6ddb..9f8a0d9 100644 --- a/src/Backend.cpp +++ b/src/Backend.cpp @@ -7,6 +7,7 @@ #include "Backend.h" #include "TaskItem.h" #include "core/TaskItem.h" +#include "core/TasksView.h" #include "core/TodoMd.h" #include #include @@ -15,7 +16,7 @@ #include #include -Backend::Backend() +Backend::Backend() : view(&mirai) { std::cout << "Backend created" << std::endl; QDir().mkdir(QDir::homePath() + "/.config/mirai"); @@ -51,8 +52,7 @@ Backend::Backend() jsonTagsConfig.toObject()[jsonTagConfigKey].toObject()["color"].toString(); } } - - view = mirai.getTasks(); + view.update(); rebuildQMLTasksList(); } @@ -60,6 +60,7 @@ void Backend::addTodo(QString newTodo, QString date) { mirai.addTask(newTodo.toStdString(), date.toStdString()); mirai.save(); + view.update(); rebuildQMLTasksList(); emit tasksChanged(); } @@ -75,42 +76,42 @@ void Backend::addTodoFromRawFormat(QString filePath, QString text, QString date) mirai::TodoMdFormat::StringToTask(text.toStdString(), date.toStdString()) ); mirai.save(); - view.lock()->update(); + view.update(); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::addTagFilter(QString tag) { - view.lock()->addTagFilter(tag.toStdString()); + view.addTagFilter(tag.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeTagFilter(QString tag) { - view.lock()->removeTagFilter(tag.toStdString()); + view.removeTagFilter(tag.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::addFileFilter(QString fileName) { - view.lock()->addFileFilter(fileName.toStdString()); + view.addFileFilter(fileName.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeFileFilter(QString fileName) { - view.lock()->removeFileFilter(fileName.toStdString()); + view.removeFileFilter(fileName.toStdString()); rebuildQMLTasksList(); emit tasksChanged(); } void Backend::removeFilters() { - view.lock()->removeFilters(); + view.removeFilters(); rebuildQMLTasksList(); emit tasksChanged(); } @@ -122,7 +123,7 @@ void Backend::updateTodoFromRawFormat(int todoIndex, QString text, QString date) *(taskItem.taskItem) = mirai::TodoMdFormat::StringToTask(text.toStdString(), date.toStdString()); mirai.save(); - view.lock()->update(); + view.update(); rebuildQMLTasksList(); emit tasksChanged(); } @@ -138,7 +139,7 @@ void Backend::updateTodo(int todoIndex, QString state, QString text, QString dat taskItem.taskItem->setText(text.toStdString()); taskItem.taskItem->setDate(date.toStdString()); mirai.save(); - view.lock()->update(); + view.update(); rebuildQMLTasksList(); emit tasksChanged(); } @@ -148,6 +149,7 @@ void Backend::removeTodo(int todoIndex) QMLTaskItem &taskItem = QMLTasks[todoIndex]; mirai.removeTask(taskItem.taskItem); mirai.save(); + view.update(); rebuildQMLTasksList(); emit tasksChanged(); } @@ -173,8 +175,8 @@ void Backend::rebuildQMLTasksList() 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]; + for (int i = 0; i < view.count(); ++i) { + mirai::TaskItem &task = view[i]; if (shouldHideCompletedTasks_ && task.getState() == mirai::DONE && task.hasDate() && task.getDate() < currentDate.str()) { continue; @@ -199,12 +201,12 @@ void Backend::rebuildQMLTasksList() } QMLActiveTagsFilter.clear(); - for (auto &activeTagFilter : view.lock()->getActiveTagsFilter()) { + for (auto &activeTagFilter : view.getActiveTagsFilter()) { QMLActiveTagsFilter.push_back(QString::fromStdString(activeTagFilter)); } QMLActiveFilesFilter.clear(); - for (auto &activeFileFilter : view.lock()->getActiveFilesFilter()) { + for (auto &activeFileFilter : view.getActiveFilesFilter()) { QMLActiveFilesFilter.push_back(QString::fromStdString(activeFileFilter)); } } diff --git a/src/Backend.h b/src/Backend.h index e252d2c..8e67dcc 100644 --- a/src/Backend.h +++ b/src/Backend.h @@ -65,7 +65,7 @@ class Backend : public QObject bool shouldHideCompletedTasks(); mirai::Mirai mirai; - std::weak_ptr view; + mirai::TasksView view; QList QMLTasks; QList QMLTasksFiles; diff --git a/src/core/Mirai.cpp b/src/core/Mirai.cpp index c76ddd1..fc3cd7f 100644 --- a/src/core/Mirai.cpp +++ b/src/core/Mirai.cpp @@ -21,13 +21,13 @@ namespace mirai void Mirai::loadFile(const std::string &path) { auto tasksFile = TodoMdFormat::readFile(path); - files->push_back(std::move(tasksFile)); + files.push_back(std::move(tasksFile)); reloadTags(); } void Mirai::save() { - for (auto &file : *files) { + for (auto &file : files) { if (file->isDirty()) { TodoMdFormat::writeFile(*file); file->setDirty(false); @@ -38,10 +38,7 @@ void Mirai::save() void Mirai::addTask(TaskItemData taskItem) { - (*files)[0]->addTask(taskItem); - for (auto &view : views) { - view->update(); - } + files[0]->addTask(taskItem); } void Mirai::addTask(std::string text, std::string date) @@ -50,46 +47,33 @@ void Mirai::addTask(std::string text, std::string date) /*std::tm tm = *std::localtime(&t);*/ /*std::stringstream ssCreationDate;*/ /*ssCreationDate << std::put_time(&tm, "%Y-%m-%d");*/ - (*files)[0]->addTask(text, date); - for (auto &view : views) { - view->update(); - } + files[0]->addTask(text, date); } void Mirai::removeTask(const TaskItem *taskItem) { - for (auto &file : *files) { + for (auto &file : files) { file->removeTask(taskItem); } - for (auto &view : views) { - view->update(); - } } std::vector> &Mirai::getFiles() { - return *files.get(); + return files; } std::optional> Mirai::getFileByPath(const std::string &path) { - auto fileIterator = std::ranges::find_if(*files, [&](const std::unique_ptr &file) { + auto fileIterator = std::ranges::find_if(files, [&](const std::unique_ptr &file) { return file->getPath() == path; }); - if (fileIterator == files->end()) { + if (fileIterator == files.end()) { return std::nullopt; } return *(fileIterator->get()); } -std::weak_ptr Mirai::getTasks() -{ - auto view = std::make_shared(files); - views.push_back(view); - return view; -} - const std::vector &Mirai::getTags() { return tags; @@ -98,7 +82,7 @@ const std::vector &Mirai::getTags() void Mirai::reloadTags() { tags.clear(); - for (auto &file : *files) { + for (auto &file : files) { for (auto &task : file->getTasks()) { for (auto &tag : task->getTags()) { if (!vectorUtils::contains(tags, tag)) { diff --git a/src/core/Mirai.h b/src/core/Mirai.h index c6b1485..a30fd82 100644 --- a/src/core/Mirai.h +++ b/src/core/Mirai.h @@ -9,7 +9,6 @@ #include "TaskItem.h" #include "TasksFile.h" -#include "TasksView.h" #include "TodoMd.h" #include #include @@ -33,22 +32,12 @@ class Mirai std::optional> getFileByPath(const std::string &path); std::vector> &getFiles(); - std::weak_ptr getTasks(); const std::vector &getTags(); void reloadTags(); private: - // The `TasksFile`s are shared to the views, their lifetime can outlive - // this (Mirai) object - // because we can't control if the caller will keep the main object alive. - std::shared_ptr>> files = - std::make_shared>>(); - - // We keep a vector of shared_ptr because we need the ref counting mechanism to know - // if we have to remove the view (not used) or tell the view to update() on - // some changes. - std::vector> views; + std::vector> files = std::vector>(); std::vector tags; }; } // namespace mirai diff --git a/src/core/TasksView.cpp b/src/core/TasksView.cpp index 26d95cf..f85f6be 100644 --- a/src/core/TasksView.cpp +++ b/src/core/TasksView.cpp @@ -5,19 +5,24 @@ */ #include "TasksView.h" +#include "core/Mirai.h" #include "utils.h" #include #include #include #include #include +#include #include namespace mirai { -TasksView::TasksView(std::shared_ptr>> files) : files(files) +TasksView::TasksView(Mirai *miraiInstance) : mirai(miraiInstance) { + if (!miraiInstance) { + throw std::runtime_error("NULL pointer passed in TasksView"); + } update(); } @@ -34,7 +39,7 @@ size_t TasksView::count() const void TasksView::update() { tasksToShow.clear(); - for (auto &file : *files) { + for (auto &file : mirai->getFiles()) { if (filesFilter.size() > 0 && !vectorUtils::contains(filesFilter, file->getName())) { continue; } diff --git a/src/core/TasksView.h b/src/core/TasksView.h index 3b67144..1aa796c 100644 --- a/src/core/TasksView.h +++ b/src/core/TasksView.h @@ -7,6 +7,7 @@ #ifndef MIRAI_TASKSVIEW_H #define MIRAI_TASKSVIEW_H #include "TasksFile.h" +#include "core/Mirai.h" #include "using.h" #include #include @@ -19,7 +20,7 @@ class TasksView { public: - TasksView(std::shared_ptr>> files); + TasksView(Mirai *mirai); TaskItem &operator[](int index); @@ -34,7 +35,7 @@ class TasksView const std::vector &getActiveFilesFilter(); private: - std::shared_ptr>> files; + Mirai *mirai; std::vector tasksToShow; Tags tagsFilter; std::vector filesFilter; diff --git a/src/main.cpp b/src/main.cpp index a9cbf3b..2f82038 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,6 +16,7 @@ int main(int argc, char *argv[]) { try { + std::cout << "Mirai started" << std::endl; QGuiApplication app(argc, argv); qreal refDpi = 54.;