Status and Priority service singleton

This commit is contained in:
Aurelie Delhaie
2023-02-12 22:33:22 +01:00
parent d0186d0759
commit 35dee6684f
13 changed files with 191 additions and 85 deletions

View File

@@ -4,8 +4,8 @@ greaterThan(QT_MAJOR_VERSION, 5): QT += widgets
CONFIG += c++17 CONFIG += c++17
win32:VERSION = 0.2.1.0 # major.minor.patch.build win32:VERSION = 0.3.0.0 # major.minor.patch.build
else:VERSION = 0.2.1 # major.minor.patch else:VERSION = 0.3.0 # major.minor.patch
DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\" DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\"
DEFINES += APP_NAME=\"\\\"TaskBoard\\\"\" DEFINES += APP_NAME=\"\\\"TaskBoard\\\"\"
@@ -80,6 +80,7 @@ SOURCES += \
src/models/status.cpp \ src/models/status.cpp \
src/models/task.cpp \ src/models/task.cpp \
src/frames/taskdialog.cpp \ src/frames/taskdialog.cpp \
src/services/taskstateservice.cpp \
src/tools.cpp src/tools.cpp
HEADERS += \ HEADERS += \
@@ -94,6 +95,7 @@ HEADERS += \
src/models/status.h \ src/models/status.h \
src/models/task.h \ src/models/task.h \
src/frames/taskdialog.h \ src/frames/taskdialog.h \
src/services/taskstateservice.h \
src/tools.h src/tools.h
FORMS += \ FORMS += \

View File

@@ -3,22 +3,24 @@
#include <QMessageBox> #include <QMessageBox>
FilterDialog::FilterDialog(QString dialogTitle, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent) : #include "../services/taskstateservice.h"
FilterDialog::FilterDialog(QString dialogTitle, QVector<Board*> boards, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::FilterDialog) ui(new Ui::FilterDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle(dialogTitle); this->setWindowTitle(dialogTitle);
init(boards, status, priorities); init(boards);
} }
FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent) : FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::FilterDialog) ui(new Ui::FilterDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle(dialogTitle); this->setWindowTitle(dialogTitle);
init(boards, status, priorities); init(boards);
ui->nameEdit->setText(f.getName()); ui->nameEdit->setText(f.getName());
ui->descriptionEdit->setPlainText(f.getDescription()); ui->descriptionEdit->setPlainText(f.getDescription());
@@ -59,7 +61,7 @@ FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards
} }
void FilterDialog::init(QVector<Board *> boards, QVector<Status> status, QVector<Priority> priorities) void FilterDialog::init(QVector<Board *> boards)
{ {
for (Board *b : boards) for (Board *b : boards)
{ {
@@ -71,7 +73,8 @@ void FilterDialog::init(QVector<Board *> boards, QVector<Status> status, QVector
ui->boardListWidget->addItem(item); ui->boardListWidget->addItem(item);
} }
for (Status s : status) QVector<Status> statuses = TaskStateService::getInstance()->getStatuses();
for (Status s : statuses)
{ {
QListWidgetItem *item = new QListWidgetItem(); QListWidgetItem *item = new QListWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
@@ -81,6 +84,7 @@ void FilterDialog::init(QVector<Board *> boards, QVector<Status> status, QVector
ui->statusListWidget->addItem(item); ui->statusListWidget->addItem(item);
} }
QVector<Priority> priorities = TaskStateService::getInstance()->getPriorities();
for (Priority p : priorities) for (Priority p : priorities)
{ {
QListWidgetItem *item = new QListWidgetItem(); QListWidgetItem *item = new QListWidgetItem();

View File

@@ -17,8 +17,8 @@ class FilterDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit FilterDialog(QString dialogTitle, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent = nullptr); explicit FilterDialog(QString dialogTitle, QVector<Board*> boards, QWidget *parent = nullptr);
FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent = nullptr); FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QWidget *parent = nullptr);
~FilterDialog(); ~FilterDialog();
const Filter getFilter(); const Filter getFilter();
@@ -28,7 +28,7 @@ private slots:
private: private:
Ui::FilterDialog *ui; Ui::FilterDialog *ui;
void init(QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities); void init(QVector<Board*> boards);
}; };
#endif // FILTERDIALOG_H #endif // FILTERDIALOG_H

View File

@@ -18,6 +18,7 @@
#include "taskdialog.h" #include "taskdialog.h"
#include "filterdialog.h" #include "filterdialog.h"
#include "../tools.h" #include "../tools.h"
#include "../services/taskstateservice.h"
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
@@ -61,11 +62,11 @@ MainWindow::~MainWindow()
void MainWindow::openPreferences() void MainWindow::openPreferences()
{ {
PrefDialog dialog(status, priorities, this); PrefDialog dialog(this);
if (dialog.exec() == QDialog::DialogCode::Accepted) if (dialog.exec() == QDialog::DialogCode::Accepted)
{ {
this->priorities = dialog.getPriorities(); TaskStateService::getInstance()->updatePriorities(dialog.getPriorities());
this->status = dialog.getStatus(); TaskStateService::getInstance()->updateStatuses(dialog.getStatus());
save(); save();
redrawTaskTree(); redrawTaskTree();
} }
@@ -153,7 +154,7 @@ void MainWindow::onNewTaskClick()
{ {
if (selectedBoardIndex > -1) if (selectedBoardIndex > -1)
{ {
TaskDialog dialog(status, priorities, this); TaskDialog dialog(this);
if (dialog.exec() == QDialog::DialogCode::Accepted) if (dialog.exec() == QDialog::DialogCode::Accepted)
{ {
Task t = dialog.getTask(); Task t = dialog.getTask();
@@ -169,7 +170,7 @@ void MainWindow::onNewTaskClick()
void MainWindow::onNewFilterClick() void MainWindow::onNewFilterClick()
{ {
FilterDialog dialog("New filter", boards, status, priorities, this); FilterDialog dialog("New filter", boards, this);
if (dialog.exec() == QDialog::DialogCode::Accepted) if (dialog.exec() == QDialog::DialogCode::Accepted)
{ {
Filter f = dialog.getFilter(); Filter f = dialog.getFilter();
@@ -237,7 +238,7 @@ void MainWindow::onEditTask(QTreeWidgetItem *item)
Task *t = getSelectedTask(); Task *t = getSelectedTask();
if (t != nullptr) if (t != nullptr)
{ {
TaskDialog dialog(t, status, priorities, this); TaskDialog dialog(t, this);
if (dialog.exec() == QDialog::DialogCode::Accepted) if (dialog.exec() == QDialog::DialogCode::Accepted)
{ {
Task editedTask = dialog.getTask(); Task editedTask = dialog.getTask();
@@ -346,7 +347,7 @@ void MainWindow::onEditFilterMenu()
{ {
int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row(); int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row();
Filter f = filters[i]; 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) if (dialog.exec() == QDialog::DialogCode::Accepted)
{ {
Filter f = dialog.getFilter(); Filter f = dialog.getFilter();
@@ -396,13 +397,15 @@ void MainWindow::init()
QJsonArray jsonStatus = save[STATUS_KEY].toArray(); QJsonArray jsonStatus = save[STATUS_KEY].toArray();
QJsonArray jsonBoards = save[BOARDS_KEY].toArray(); QJsonArray jsonBoards = save[BOARDS_KEY].toArray();
QJsonArray jsonFilters = save[FILTERS_KEY].toArray(); QJsonArray jsonFilters = save[FILTERS_KEY].toArray();
QVector<Priority> priorities;
QVector<Status> statuses;
for (QJsonValueRef value : jsonPriorities) for (QJsonValueRef value : jsonPriorities)
{ {
priorities.append(Priority(value.toObject())); priorities.append(Priority(value.toObject()));
} }
for (QJsonValueRef value : jsonStatus) for (QJsonValueRef value : jsonStatus)
{ {
status.append(Status(value.toObject())); statuses.append(Status(value.toObject()));
} }
for (QJsonValueRef value : jsonBoards) for (QJsonValueRef value : jsonBoards)
{ {
@@ -412,35 +415,16 @@ void MainWindow::init()
{ {
filters.append(Filter(value.toObject())); filters.append(Filter(value.toObject()));
} }
TaskStateService::getInstance()->updatePriorities(priorities);
TaskStateService::getInstance()->updateStatuses(statuses);
redrawFilterList(); redrawFilterList();
redrawBoardList(); redrawBoardList();
return; return;
} }
} }
this->priorities = defaultPriorities();
this->status = defaultStatus();
save(); save();
} }
QVector<Priority> MainWindow::defaultPriorities()
{
QVector<Priority> 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<Status> MainWindow::defaultStatus()
{
QVector<Status> 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<Filter> MainWindow::defaultFilters() QVector<Filter> MainWindow::defaultFilters()
{ {
QVector<Filter> res; QVector<Filter> res;
@@ -449,54 +433,42 @@ QVector<Filter> MainWindow::defaultFilters()
const QString MainWindow::getPriorityLabel(QString uuid) const QString MainWindow::getPriorityLabel(QString uuid)
{ {
QString res = ""; std::optional<Priority> p = TaskStateService::getInstance()->getPriorityByUUID(uuid);
foreach (Priority p, priorities) if (p.has_value())
{ {
if (p.getUUID() == uuid) return p.value().getName();
{
res = p.getName();
}
} }
return res; return "";
} }
const QString MainWindow::getStatusLabel(QString uuid) const QString MainWindow::getStatusLabel(QString uuid)
{ {
QString res = ""; std::optional<Status> s = TaskStateService::getInstance()->getStatusByUUID(uuid);
foreach (Status s, status) if (s.has_value())
{ {
if (s.getUUID() == uuid) return s.value().getName();
{
res = s.getName();
}
} }
return res; return "";
} }
const QColor MainWindow::getPriorityColor(QString uuid, QColor defaultColor) const QColor MainWindow::getPriorityColor(QString uuid, QColor defaultColor)
{ {
QColor color = defaultColor; std::optional<Priority> p = TaskStateService::getInstance()->getPriorityByUUID(uuid);
foreach (Priority p, priorities) if (p.has_value())
{ {
if (p.getUUID() == uuid) return p.value().getColor();
{
color = p.getColor();
}
} }
return color; return defaultColor;
} }
const QColor MainWindow::getStatusColor(QString uuid, QColor defaultColor) const QColor MainWindow::getStatusColor(QString uuid, QColor defaultColor)
{ {
QColor color = defaultColor; std::optional<Status> s = TaskStateService::getInstance()->getStatusByUUID(uuid);
foreach (Status s, status) if (s.has_value())
{ {
if (s.getUUID() == uuid) return s.value().getColor();
{
color = s.getColor();
}
} }
return color; return defaultColor;
} }
const QJsonDocument MainWindow::getJsonSave() const QJsonDocument MainWindow::getJsonSave()
@@ -504,18 +476,24 @@ const QJsonDocument MainWindow::getJsonSave()
QJsonDocument doc; QJsonDocument doc;
QJsonObject obj; QJsonObject obj;
QJsonArray jsonPriorities; QJsonArray jsonPriorities;
foreach (Priority p, this->priorities) { QJsonArray jsonStatus;
QJsonArray jsonBoards;
QJsonArray jsonFilters;
QVector<Priority> priorities = TaskStateService::getInstance()->getPriorities();
foreach (Priority p, priorities) {
jsonPriorities.append(p.toJson()); jsonPriorities.append(p.toJson());
} }
QJsonArray jsonStatus;
foreach (Status s, this->status) { QVector<Status> statuses = TaskStateService::getInstance()->getStatuses();
foreach (Status s, statuses) {
jsonStatus.append(s.toJson()); jsonStatus.append(s.toJson());
} }
QJsonArray jsonBoards;
foreach (Board *b, this->boards) { foreach (Board *b, this->boards) {
jsonBoards.append(b->toJson()); jsonBoards.append(b->toJson());
} }
QJsonArray jsonFilters;
foreach (Filter f, this->filters) foreach (Filter f, this->filters)
{ {
jsonFilters.append(f.toJson()); jsonFilters.append(f.toJson());

View File

@@ -57,8 +57,6 @@ private:
QVector<Task*> filterResult; QVector<Task*> filterResult;
QVector<Priority> priorities;
QVector<Status> status;
QVector<Board*> boards; QVector<Board*> boards;
QVector<Filter> filters; QVector<Filter> filters;

View File

@@ -5,13 +5,15 @@
#include <QUuid> #include <QUuid>
#include "../tools.h" #include "../tools.h"
#include "../services/taskstateservice.h"
PrefDialog::PrefDialog(QVector<Status> status, QVector<Priority> priorities, QWidget *parent) : PrefDialog::PrefDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::PrefDialog) ui(new Ui::PrefDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
QVector<Status> status = TaskStateService::getInstance()->getStatuses();
foreach (Status s, status) foreach (Status s, status)
{ {
QListWidgetItem *item = new QListWidgetItem(s.getName()); QListWidgetItem *item = new QListWidgetItem(s.getName());
@@ -20,6 +22,7 @@ PrefDialog::PrefDialog(QVector<Status> status, QVector<Priority> priorities, QWi
ui->statusListWidget->addItem(item); ui->statusListWidget->addItem(item);
} }
QVector<Priority> priorities = TaskStateService::getInstance()->getPriorities();
foreach (Priority p, priorities) foreach (Priority p, priorities)
{ {
QListWidgetItem *item = new QListWidgetItem(p.getName()); QListWidgetItem *item = new QListWidgetItem(p.getName());

View File

@@ -17,7 +17,7 @@ class PrefDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit PrefDialog(QVector<Status> status, QVector<Priority> priorities, QWidget *parent = nullptr); explicit PrefDialog(QWidget *parent = nullptr);
~PrefDialog(); ~PrefDialog();
QVector<Priority> getPriorities(); QVector<Priority> getPriorities();

View File

@@ -3,14 +3,16 @@
#include <QDate> #include <QDate>
TaskDialog::TaskDialog(QVector<Status> status, QVector<Priority> priorities, QWidget *parent) : #include "../services/taskstateservice.h"
TaskDialog::TaskDialog(QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::TaskDialog) ui(new Ui::TaskDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle("New task"); this->setWindowTitle("New task");
this->status = status; this->status = TaskStateService::getInstance()->getStatuses();
this->priorities = priorities; this->priorities = TaskStateService::getInstance()->getPriorities();
foreach (Status s, this->status) foreach (Status s, this->status)
{ {
@@ -27,14 +29,14 @@ TaskDialog::TaskDialog(QVector<Status> status, QVector<Priority> priorities, QWi
ui->expectedForEdit->setDate(expectedFor); ui->expectedForEdit->setDate(expectedFor);
} }
TaskDialog::TaskDialog(Task *t, QVector<Status> status, QVector<Priority> priorities, QWidget *parent) : TaskDialog::TaskDialog(Task *t, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::TaskDialog) ui(new Ui::TaskDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setWindowTitle("Edit task"); this->setWindowTitle("Edit task");
this->status = status; this->status = TaskStateService::getInstance()->getStatuses();
this->priorities = priorities; this->priorities = TaskStateService::getInstance()->getPriorities();
foreach (Status s, this->status) foreach (Status s, this->status)
{ {

View File

@@ -17,8 +17,8 @@ class TaskDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit TaskDialog(QVector<Status>, QVector<Priority>, QWidget *parent = nullptr); explicit TaskDialog(QWidget *parent = nullptr);
TaskDialog(Task*, QVector<Status>, QVector<Priority>, QWidget *parent = nullptr); TaskDialog(Task *t, QWidget *parent = nullptr);
~TaskDialog(); ~TaskDialog();
Task getTask(); Task getTask();

View File

@@ -4,6 +4,8 @@
#define TASKS_KEY "tasks" #define TASKS_KEY "tasks"
#define UUID_KEY "uuid" #define UUID_KEY "uuid"
#define DESCRIPTION_KEY "description" #define DESCRIPTION_KEY "description"
#define AUTOSTATUS_KEY "auto_status"
#define STATUS_KEY "status"
#include <QJsonArray> #include <QJsonArray>
#include <QJsonValue> #include <QJsonValue>
@@ -23,6 +25,8 @@ Board::Board(QJsonObject obj)
this->uuid = obj[UUID_KEY].toString(uuid.toString(QUuid::WithoutBraces)); this->uuid = obj[UUID_KEY].toString(uuid.toString(QUuid::WithoutBraces));
this->name = obj[NAME_KEY].toString("!Missing name!"); this->name = obj[NAME_KEY].toString("!Missing name!");
this->description = obj[DESCRIPTION_KEY].toString(""); 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(); QJsonArray jsonTasks = obj[TASKS_KEY].toArray();
foreach (QJsonValue value, jsonTasks) { foreach (QJsonValue value, jsonTasks) {
Task *t = new Task(value.toObject()); Task *t = new Task(value.toObject());
@@ -54,6 +58,16 @@ const QString Board::getDescription()
return description; return description;
} }
const QString Board::getStatus()
{
return statusUUID;
}
bool Board::isAutoStatus()
{
return autoStatus;
}
void Board::setName(const QString name) void Board::setName(const QString name)
{ {
this->name = name; this->name = name;
@@ -100,6 +114,8 @@ const QJsonObject Board::toJson()
QJsonObject obj; QJsonObject obj;
obj[NAME_KEY] = this->name; obj[NAME_KEY] = this->name;
obj[UUID_KEY] = this->uuid; obj[UUID_KEY] = this->uuid;
obj[STATUS_KEY] = this->statusUUID;
obj[AUTOSTATUS_KEY] = this->autoStatus;
obj[TASKS_KEY] = array; obj[TASKS_KEY] = array;
obj[DESCRIPTION_KEY] = description; obj[DESCRIPTION_KEY] = description;
return obj; return obj;

View File

@@ -17,6 +17,8 @@ public:
const QString getUuid(); const QString getUuid();
const QString getName(); const QString getName();
const QString getDescription(); const QString getDescription();
const QString getStatus();
bool isAutoStatus();
void setName(const QString name); void setName(const QString name);
void setDescription(const QString description); void setDescription(const QString description);
void add(Task); void add(Task);
@@ -32,6 +34,9 @@ private:
QString name; QString name;
QString description; QString description;
QString statusUUID;
bool autoStatus;
}; };
#endif // BOARD_H #endif // BOARD_H

View File

@@ -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<Status> statuses)
{
this->statuses = statuses;
}
void TaskStateService::updatePriorities(QVector<Priority> priorities)
{
this->priorities = priorities;
}
QVector<Status> TaskStateService::getStatuses()
{
return statuses;
}
QVector<Priority> TaskStateService::getPriorities()
{
return priorities;
}
std::optional<Status> TaskStateService::getStatusByUUID(QString uuid)
{
foreach (Status s, statuses) {
if (s.getUUID() == uuid)
{
return std::optional{s};
}
}
return std::nullopt;
}
std::optional<Priority> 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)));
}

View File

@@ -0,0 +1,32 @@
#ifndef TASKSTATESERVICE_H
#define TASKSTATESERVICE_H
#include <QVector>
#include "../models/priority.h"
#include "../models/status.h"
class TaskStateService
{
public:
static TaskStateService *getInstance();
void updateStatuses(QVector<Status>);
void updatePriorities(QVector<Priority>);
QVector<Status> getStatuses();
QVector<Priority> getPriorities();
std::optional<Status> getStatusByUUID(QString);
std::optional<Priority> getPriorityByUUID(QString);
private:
TaskStateService();
static TaskStateService *instance;
QVector<Priority> priorities;
QVector<Status> statuses;
};
#endif // TASKSTATESERVICE_H