diff --git a/TaskBoard.pro b/TaskBoard.pro index 6f66dbb..4dd8303 100644 --- a/TaskBoard.pro +++ b/TaskBoard.pro @@ -4,8 +4,8 @@ greaterThan(QT_MAJOR_VERSION, 5): QT += widgets CONFIG += c++17 -win32:VERSION = 0.2.1.0 # major.minor.patch.build -else:VERSION = 0.2.1 # major.minor.patch +win32:VERSION = 0.3.0.0 # major.minor.patch.build +else:VERSION = 0.3.0 # major.minor.patch DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\" DEFINES += APP_NAME=\"\\\"TaskBoard\\\"\" @@ -80,6 +80,7 @@ SOURCES += \ src/models/status.cpp \ src/models/task.cpp \ src/frames/taskdialog.cpp \ + src/services/taskstateservice.cpp \ src/tools.cpp HEADERS += \ @@ -94,6 +95,7 @@ HEADERS += \ src/models/status.h \ src/models/task.h \ src/frames/taskdialog.h \ + src/services/taskstateservice.h \ src/tools.h FORMS += \ diff --git a/src/frames/filterdialog.cpp b/src/frames/filterdialog.cpp index 1f77e2d..fab0139 100644 --- a/src/frames/filterdialog.cpp +++ b/src/frames/filterdialog.cpp @@ -3,22 +3,24 @@ #include -FilterDialog::FilterDialog(QString dialogTitle, QVector boards, QVector status, QVector priorities, QWidget *parent) : +#include "../services/taskstateservice.h" + +FilterDialog::FilterDialog(QString dialogTitle, QVector boards, QWidget *parent) : QDialog(parent), ui(new Ui::FilterDialog) { ui->setupUi(this); this->setWindowTitle(dialogTitle); - init(boards, status, priorities); + init(boards); } -FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector boards, QVector status, QVector priorities, QWidget *parent) : +FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector boards, QWidget *parent) : QDialog(parent), ui(new Ui::FilterDialog) { ui->setupUi(this); this->setWindowTitle(dialogTitle); - init(boards, status, priorities); + init(boards); ui->nameEdit->setText(f.getName()); ui->descriptionEdit->setPlainText(f.getDescription()); @@ -59,7 +61,7 @@ FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector boards } -void FilterDialog::init(QVector boards, QVector status, QVector priorities) +void FilterDialog::init(QVector boards) { for (Board *b : boards) { @@ -71,7 +73,8 @@ void FilterDialog::init(QVector boards, QVector status, QVector ui->boardListWidget->addItem(item); } - for (Status s : status) + QVector statuses = TaskStateService::getInstance()->getStatuses(); + for (Status s : statuses) { QListWidgetItem *item = new QListWidgetItem(); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); @@ -81,6 +84,7 @@ void FilterDialog::init(QVector boards, QVector status, QVector ui->statusListWidget->addItem(item); } + QVector priorities = TaskStateService::getInstance()->getPriorities(); for (Priority p : priorities) { QListWidgetItem *item = new QListWidgetItem(); diff --git a/src/frames/filterdialog.h b/src/frames/filterdialog.h index 6d08f40..4e746f1 100644 --- a/src/frames/filterdialog.h +++ b/src/frames/filterdialog.h @@ -17,8 +17,8 @@ class FilterDialog : public QDialog Q_OBJECT public: - explicit FilterDialog(QString dialogTitle, QVector boards, QVector status, QVector priorities, QWidget *parent = nullptr); - FilterDialog(QString dialogTitle, Filter f, QVector boards, QVector status, QVector priorities, QWidget *parent = nullptr); + explicit FilterDialog(QString dialogTitle, QVector boards, QWidget *parent = nullptr); + FilterDialog(QString dialogTitle, Filter f, QVector boards, QWidget *parent = nullptr); ~FilterDialog(); const Filter getFilter(); @@ -28,7 +28,7 @@ private slots: private: Ui::FilterDialog *ui; - void init(QVector boards, QVector status, QVector priorities); + void init(QVector boards); }; #endif // FILTERDIALOG_H diff --git a/src/frames/mainwindow.cpp b/src/frames/mainwindow.cpp index bf83d87..ae52a69 100644 --- a/src/frames/mainwindow.cpp +++ b/src/frames/mainwindow.cpp @@ -18,6 +18,7 @@ #include "taskdialog.h" #include "filterdialog.h" #include "../tools.h" +#include "../services/taskstateservice.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -61,11 +62,11 @@ MainWindow::~MainWindow() void MainWindow::openPreferences() { - PrefDialog dialog(status, priorities, this); + PrefDialog dialog(this); if (dialog.exec() == QDialog::DialogCode::Accepted) { - this->priorities = dialog.getPriorities(); - this->status = dialog.getStatus(); + TaskStateService::getInstance()->updatePriorities(dialog.getPriorities()); + TaskStateService::getInstance()->updateStatuses(dialog.getStatus()); save(); redrawTaskTree(); } @@ -153,7 +154,7 @@ void MainWindow::onNewTaskClick() { if (selectedBoardIndex > -1) { - TaskDialog dialog(status, priorities, this); + TaskDialog dialog(this); if (dialog.exec() == QDialog::DialogCode::Accepted) { Task t = dialog.getTask(); @@ -169,7 +170,7 @@ void MainWindow::onNewTaskClick() void MainWindow::onNewFilterClick() { - FilterDialog dialog("New filter", boards, status, priorities, this); + FilterDialog dialog("New filter", boards, this); if (dialog.exec() == QDialog::DialogCode::Accepted) { Filter f = dialog.getFilter(); @@ -237,7 +238,7 @@ void MainWindow::onEditTask(QTreeWidgetItem *item) Task *t = getSelectedTask(); if (t != nullptr) { - TaskDialog dialog(t, status, priorities, this); + TaskDialog dialog(t, this); if (dialog.exec() == QDialog::DialogCode::Accepted) { Task editedTask = dialog.getTask(); @@ -346,7 +347,7 @@ void MainWindow::onEditFilterMenu() { int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row(); Filter f = filters[i]; - FilterDialog dialog("Edit the filter", f, boards, status, priorities, this); + FilterDialog dialog("Edit the filter", f, boards, this); if (dialog.exec() == QDialog::DialogCode::Accepted) { Filter f = dialog.getFilter(); @@ -396,13 +397,15 @@ void MainWindow::init() QJsonArray jsonStatus = save[STATUS_KEY].toArray(); QJsonArray jsonBoards = save[BOARDS_KEY].toArray(); QJsonArray jsonFilters = save[FILTERS_KEY].toArray(); + QVector priorities; + QVector statuses; for (QJsonValueRef value : jsonPriorities) { priorities.append(Priority(value.toObject())); } for (QJsonValueRef value : jsonStatus) { - status.append(Status(value.toObject())); + statuses.append(Status(value.toObject())); } for (QJsonValueRef value : jsonBoards) { @@ -412,35 +415,16 @@ void MainWindow::init() { filters.append(Filter(value.toObject())); } + TaskStateService::getInstance()->updatePriorities(priorities); + TaskStateService::getInstance()->updateStatuses(statuses); redrawFilterList(); redrawBoardList(); return; } } - this->priorities = defaultPriorities(); - this->status = defaultStatus(); save(); } -QVector MainWindow::defaultPriorities() -{ - QVector res; - res.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "None", QColor(217, 217, 217))); - res.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "Low", QColor(48, 157, 176))); - res.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "Medium", QColor(176, 142, 48))); - res.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "High", QColor(176, 67, 48))); - return res; -} - -QVector MainWindow::defaultStatus() -{ - QVector res; - res.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "To Do", QColor(143, 143, 143))); - res.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "Working on", QColor(95, 48, 176))); - res.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "Completed", QColor(48, 176, 73))); - return res; -} - QVector MainWindow::defaultFilters() { QVector res; @@ -449,54 +433,42 @@ QVector MainWindow::defaultFilters() const QString MainWindow::getPriorityLabel(QString uuid) { - QString res = ""; - foreach (Priority p, priorities) + std::optional p = TaskStateService::getInstance()->getPriorityByUUID(uuid); + if (p.has_value()) { - if (p.getUUID() == uuid) - { - res = p.getName(); - } + return p.value().getName(); } - return res; + return ""; } const QString MainWindow::getStatusLabel(QString uuid) { - QString res = ""; - foreach (Status s, status) + std::optional s = TaskStateService::getInstance()->getStatusByUUID(uuid); + if (s.has_value()) { - if (s.getUUID() == uuid) - { - res = s.getName(); - } + return s.value().getName(); } - return res; + return ""; } const QColor MainWindow::getPriorityColor(QString uuid, QColor defaultColor) { - QColor color = defaultColor; - foreach (Priority p, priorities) + std::optional p = TaskStateService::getInstance()->getPriorityByUUID(uuid); + if (p.has_value()) { - if (p.getUUID() == uuid) - { - color = p.getColor(); - } + return p.value().getColor(); } - return color; + return defaultColor; } const QColor MainWindow::getStatusColor(QString uuid, QColor defaultColor) { - QColor color = defaultColor; - foreach (Status s, status) + std::optional s = TaskStateService::getInstance()->getStatusByUUID(uuid); + if (s.has_value()) { - if (s.getUUID() == uuid) - { - color = s.getColor(); - } + return s.value().getColor(); } - return color; + return defaultColor; } const QJsonDocument MainWindow::getJsonSave() @@ -504,18 +476,24 @@ const QJsonDocument MainWindow::getJsonSave() QJsonDocument doc; QJsonObject obj; QJsonArray jsonPriorities; - foreach (Priority p, this->priorities) { + QJsonArray jsonStatus; + QJsonArray jsonBoards; + QJsonArray jsonFilters; + + QVector priorities = TaskStateService::getInstance()->getPriorities(); + foreach (Priority p, priorities) { jsonPriorities.append(p.toJson()); } - QJsonArray jsonStatus; - foreach (Status s, this->status) { + + QVector statuses = TaskStateService::getInstance()->getStatuses(); + foreach (Status s, statuses) { jsonStatus.append(s.toJson()); } - QJsonArray jsonBoards; + foreach (Board *b, this->boards) { jsonBoards.append(b->toJson()); } - QJsonArray jsonFilters; + foreach (Filter f, this->filters) { jsonFilters.append(f.toJson()); diff --git a/src/frames/mainwindow.h b/src/frames/mainwindow.h index 6dae9f6..b3ea50d 100644 --- a/src/frames/mainwindow.h +++ b/src/frames/mainwindow.h @@ -57,8 +57,6 @@ private: QVector filterResult; - QVector priorities; - QVector status; QVector boards; QVector filters; diff --git a/src/frames/prefdialog.cpp b/src/frames/prefdialog.cpp index 1935909..6b21ce1 100644 --- a/src/frames/prefdialog.cpp +++ b/src/frames/prefdialog.cpp @@ -5,13 +5,15 @@ #include #include "../tools.h" +#include "../services/taskstateservice.h" -PrefDialog::PrefDialog(QVector status, QVector priorities, QWidget *parent) : +PrefDialog::PrefDialog(QWidget *parent) : QDialog(parent), ui(new Ui::PrefDialog) { ui->setupUi(this); + QVector status = TaskStateService::getInstance()->getStatuses(); foreach (Status s, status) { QListWidgetItem *item = new QListWidgetItem(s.getName()); @@ -20,6 +22,7 @@ PrefDialog::PrefDialog(QVector status, QVector priorities, QWi ui->statusListWidget->addItem(item); } + QVector priorities = TaskStateService::getInstance()->getPriorities(); foreach (Priority p, priorities) { QListWidgetItem *item = new QListWidgetItem(p.getName()); diff --git a/src/frames/prefdialog.h b/src/frames/prefdialog.h index 224ee78..9e2c622 100644 --- a/src/frames/prefdialog.h +++ b/src/frames/prefdialog.h @@ -17,7 +17,7 @@ class PrefDialog : public QDialog Q_OBJECT public: - explicit PrefDialog(QVector status, QVector priorities, QWidget *parent = nullptr); + explicit PrefDialog(QWidget *parent = nullptr); ~PrefDialog(); QVector getPriorities(); diff --git a/src/frames/taskdialog.cpp b/src/frames/taskdialog.cpp index 137d888..79db195 100644 --- a/src/frames/taskdialog.cpp +++ b/src/frames/taskdialog.cpp @@ -3,14 +3,16 @@ #include -TaskDialog::TaskDialog(QVector status, QVector priorities, QWidget *parent) : +#include "../services/taskstateservice.h" + +TaskDialog::TaskDialog(QWidget *parent) : QDialog(parent), ui(new Ui::TaskDialog) { ui->setupUi(this); this->setWindowTitle("New task"); - this->status = status; - this->priorities = priorities; + this->status = TaskStateService::getInstance()->getStatuses(); + this->priorities = TaskStateService::getInstance()->getPriorities(); foreach (Status s, this->status) { @@ -27,14 +29,14 @@ TaskDialog::TaskDialog(QVector status, QVector priorities, QWi ui->expectedForEdit->setDate(expectedFor); } -TaskDialog::TaskDialog(Task *t, QVector status, QVector priorities, QWidget *parent) : +TaskDialog::TaskDialog(Task *t, QWidget *parent) : QDialog(parent), ui(new Ui::TaskDialog) { ui->setupUi(this); this->setWindowTitle("Edit task"); - this->status = status; - this->priorities = priorities; + this->status = TaskStateService::getInstance()->getStatuses(); + this->priorities = TaskStateService::getInstance()->getPriorities(); foreach (Status s, this->status) { diff --git a/src/frames/taskdialog.h b/src/frames/taskdialog.h index f1fcb71..30e0953 100644 --- a/src/frames/taskdialog.h +++ b/src/frames/taskdialog.h @@ -17,8 +17,8 @@ class TaskDialog : public QDialog Q_OBJECT public: - explicit TaskDialog(QVector, QVector, QWidget *parent = nullptr); - TaskDialog(Task*, QVector, QVector, QWidget *parent = nullptr); + explicit TaskDialog(QWidget *parent = nullptr); + TaskDialog(Task *t, QWidget *parent = nullptr); ~TaskDialog(); Task getTask(); diff --git a/src/models/board.cpp b/src/models/board.cpp index 7b120b0..0a7f734 100644 --- a/src/models/board.cpp +++ b/src/models/board.cpp @@ -4,6 +4,8 @@ #define TASKS_KEY "tasks" #define UUID_KEY "uuid" #define DESCRIPTION_KEY "description" +#define AUTOSTATUS_KEY "auto_status" +#define STATUS_KEY "status" #include #include @@ -23,6 +25,8 @@ Board::Board(QJsonObject obj) this->uuid = obj[UUID_KEY].toString(uuid.toString(QUuid::WithoutBraces)); this->name = obj[NAME_KEY].toString("!Missing name!"); this->description = obj[DESCRIPTION_KEY].toString(""); + this->autoStatus = obj[AUTOSTATUS_KEY].toBool(true); + this->statusUUID = obj[STATUS_KEY].toString(); QJsonArray jsonTasks = obj[TASKS_KEY].toArray(); foreach (QJsonValue value, jsonTasks) { Task *t = new Task(value.toObject()); @@ -54,6 +58,16 @@ const QString Board::getDescription() return description; } +const QString Board::getStatus() +{ + return statusUUID; +} + +bool Board::isAutoStatus() +{ + return autoStatus; +} + void Board::setName(const QString name) { this->name = name; @@ -100,6 +114,8 @@ const QJsonObject Board::toJson() QJsonObject obj; obj[NAME_KEY] = this->name; obj[UUID_KEY] = this->uuid; + obj[STATUS_KEY] = this->statusUUID; + obj[AUTOSTATUS_KEY] = this->autoStatus; obj[TASKS_KEY] = array; obj[DESCRIPTION_KEY] = description; return obj; diff --git a/src/models/board.h b/src/models/board.h index bf1dffb..6dd6e0a 100644 --- a/src/models/board.h +++ b/src/models/board.h @@ -17,6 +17,8 @@ public: const QString getUuid(); const QString getName(); const QString getDescription(); + const QString getStatus(); + bool isAutoStatus(); void setName(const QString name); void setDescription(const QString description); void add(Task); @@ -32,6 +34,9 @@ private: QString name; QString description; + QString statusUUID; + bool autoStatus; + }; #endif // BOARD_H diff --git a/src/services/taskstateservice.cpp b/src/services/taskstateservice.cpp new file mode 100644 index 0000000..e7632a6 --- /dev/null +++ b/src/services/taskstateservice.cpp @@ -0,0 +1,66 @@ +#include "taskstateservice.h" + +TaskStateService *TaskStateService::instance = nullptr; + +TaskStateService *TaskStateService::getInstance() +{ + if (instance == nullptr) + { + instance = new TaskStateService(); + } + return instance; +} + +void TaskStateService::updateStatuses(QVector statuses) +{ + this->statuses = statuses; +} + +void TaskStateService::updatePriorities(QVector priorities) +{ + this->priorities = priorities; +} + +QVector TaskStateService::getStatuses() +{ + return statuses; +} + +QVector TaskStateService::getPriorities() +{ + return priorities; +} + +std::optional TaskStateService::getStatusByUUID(QString uuid) +{ + foreach (Status s, statuses) { + if (s.getUUID() == uuid) + { + return std::optional{s}; + } + } + return std::nullopt; +} + +std::optional TaskStateService::getPriorityByUUID(QString uuid) +{ + foreach (Priority p, priorities) { + if (p.getUUID() == uuid) + { + return std::optional{p}; + } + } + return std::nullopt; +} + +TaskStateService::TaskStateService() +{ + priorities.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "None", QColor(217, 217, 217))); + priorities.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "Low", QColor(48, 157, 176))); + priorities.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "Medium", QColor(176, 142, 48))); + priorities.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "High", QColor(176, 67, 48))); + + statuses.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "To Do", QColor(143, 143, 143))); + statuses.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "Working on", QColor(95, 48, 176))); + statuses.append(Status(QUuid::createUuid().toString(QUuid::WithoutBraces), "Completed", QColor(48, 176, 73))); +} diff --git a/src/services/taskstateservice.h b/src/services/taskstateservice.h new file mode 100644 index 0000000..a5011c0 --- /dev/null +++ b/src/services/taskstateservice.h @@ -0,0 +1,32 @@ +#ifndef TASKSTATESERVICE_H +#define TASKSTATESERVICE_H + +#include + +#include "../models/priority.h" +#include "../models/status.h" + +class TaskStateService +{ +public: + static TaskStateService *getInstance(); + + void updateStatuses(QVector); + void updatePriorities(QVector); + + QVector getStatuses(); + QVector getPriorities(); + + std::optional getStatusByUUID(QString); + std::optional getPriorityByUUID(QString); + + +private: + TaskStateService(); + static TaskStateService *instance; + + QVector priorities; + QVector statuses; +}; + +#endif // TASKSTATESERVICE_H