From 35dee6684fc258bccfdc9862bec144d3de610efb Mon Sep 17 00:00:00 2001 From: Aurelie Delhaie Date: Sun, 12 Feb 2023 22:33:22 +0100 Subject: [PATCH 1/3] Status and Priority service singleton --- TaskBoard.pro | 6 +- src/frames/filterdialog.cpp | 16 +++-- src/frames/filterdialog.h | 6 +- src/frames/mainwindow.cpp | 102 ++++++++++++------------------ src/frames/mainwindow.h | 2 - src/frames/prefdialog.cpp | 5 +- src/frames/prefdialog.h | 2 +- src/frames/taskdialog.cpp | 14 ++-- src/frames/taskdialog.h | 4 +- src/models/board.cpp | 16 +++++ src/models/board.h | 5 ++ src/services/taskstateservice.cpp | 66 +++++++++++++++++++ src/services/taskstateservice.h | 32 ++++++++++ 13 files changed, 191 insertions(+), 85 deletions(-) create mode 100644 src/services/taskstateservice.cpp create mode 100644 src/services/taskstateservice.h 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 -- 2.49.1 From 1b56b5eec56e102372c8645b5f6db31a0aac4722 Mon Sep 17 00:00:00 2001 From: Aurelie Delhaie Date: Thu, 16 Feb 2023 21:53:07 +0100 Subject: [PATCH 2/3] auto determine board status, show board status --- src/frames/mainwindow.cpp | 26 +++++++++++ src/frames/mainwindow.h | 1 + src/frames/mainwindow.ui | 73 +++++++++++++++++++++++-------- src/frames/prefdialog.cpp | 52 ++++++++++++++++++++++ src/frames/prefdialog.h | 3 +- src/frames/prefdialog.ui | 36 ++++++++++++++- src/models/board.cpp | 18 ++++++++ src/services/taskstateservice.cpp | 14 ++++++ src/services/taskstateservice.h | 1 + src/tools.cpp | 13 ++++++ src/tools.h | 3 ++ 11 files changed, 219 insertions(+), 21 deletions(-) diff --git a/src/frames/mainwindow.cpp b/src/frames/mainwindow.cpp index ae52a69..eac6c84 100644 --- a/src/frames/mainwindow.cpp +++ b/src/frames/mainwindow.cpp @@ -25,6 +25,7 @@ MainWindow::MainWindow(QWidget *parent) , ui(new Ui::MainWindow) { ui->setupUi(this); + ui->boardStatus->setVisible(false); this->menuSelectedBoardItem = nullptr; this->menuSelectedFilterItem = nullptr; this->menuSelectedTaskItem = nullptr; @@ -245,6 +246,7 @@ void MainWindow::onEditTask(QTreeWidgetItem *item) t->update(editedTask); updateTaskRow(item, editedTask); save(); + redrawBoardStatus(); if (selectedFilterIndex > -1) { redrawTaskTree(); @@ -629,6 +631,13 @@ void MainWindow::redrawTaskTree() if (selectedBoardIndex > -1) { Board *b = boards[selectedBoardIndex]; + std::optional boardStatus = TaskStateService::getInstance()->getStatusByUUID(b->getStatus()); + if (boardStatus.has_value()) + { + ui->boardStatus->setStyleSheet(Tools::getStatusLabelStylesheet(boardStatus.value())); + ui->boardStatus->setText(boardStatus.value().getName()); + ui->boardStatus->setVisible(true); + } foreach (Task *t, b->getTasks()) { QTreeWidgetItem *item = new QTreeWidgetItem(); @@ -647,6 +656,23 @@ void MainWindow::redrawTaskTree() ui->taskList->addTopLevelItem(item); } } + redrawBoardStatus(); +} + +void MainWindow::redrawBoardStatus() +{ + ui->boardStatus->setVisible(false); + if (selectedBoardIndex > -1) + { + Board *b = boards[selectedBoardIndex]; + std::optional boardStatus = TaskStateService::getInstance()->getStatusByUUID(b->getStatus()); + if (boardStatus.has_value()) + { + ui->boardStatus->setStyleSheet(Tools::getStatusLabelStylesheet(boardStatus.value())); + ui->boardStatus->setText(boardStatus.value().getName()); + ui->boardStatus->setVisible(true); + } + } } void MainWindow::save() diff --git a/src/frames/mainwindow.h b/src/frames/mainwindow.h index b3ea50d..7aaf725 100644 --- a/src/frames/mainwindow.h +++ b/src/frames/mainwindow.h @@ -78,6 +78,7 @@ private: void redrawBoardList(); void redrawFilterList(); void redrawTaskTree(); + void redrawBoardStatus(); void save(); }; #endif // MAINWINDOW_H diff --git a/src/frames/mainwindow.ui b/src/frames/mainwindow.ui index 7c1ccf6..f0702e0 100644 --- a/src/frames/mainwindow.ui +++ b/src/frames/mainwindow.ui @@ -24,7 +24,7 @@ - + @@ -88,23 +88,60 @@ QLayout::SetMaximumSize - - - - 19 - - - - No board selected - - - - - - - Create or select a board to start - - + + + + + + + + 19 + + + + No board selected + + + + + + + Create or select a board to start + + + + + + + + + + 100 + 24 + + + + + 100 + 24 + + + + border-color: rgb(87, 227, 137); +border: solid; +background-color: rgb(87, 227, 137); +border-radius: 4px; +color: white; + + + TextLabel + + + Qt::AlignCenter + + + + diff --git a/src/frames/prefdialog.cpp b/src/frames/prefdialog.cpp index 6b21ce1..5bef786 100644 --- a/src/frames/prefdialog.cpp +++ b/src/frames/prefdialog.cpp @@ -41,6 +41,8 @@ PrefDialog::PrefDialog(QWidget *parent) : connect(ui->namePriorityEdit, &QLineEdit::textEdited, this, &PrefDialog::onNameChange); connect(ui->removeStatusButton, &QPushButton::clicked, this, &PrefDialog::onRemoveStatusButtonClick); connect(ui->removePriorityButton, &QPushButton::clicked, this, &PrefDialog::onRemovePriorityButtonClick); + connect(ui->upStatus, &QPushButton::clicked, this, &PrefDialog::onUpStatusButtonClick); + connect(ui->downStatus, &QPushButton::clicked, this, &PrefDialog::onDownStatusButtonClick); } PrefDialog::~PrefDialog() @@ -116,6 +118,16 @@ void PrefDialog::onItemSelectionChange(int index) colorBtn = ui->colorStatusButton; nameEdit = ui->nameStatusEdit; colorEdit = ui->colorStatusEdit; + if (index > -1) + { + ui->downStatus->setEnabled((index > 0)); + ui->upStatus->setEnabled((index < statusUUIDRef.size()-1)); + } + else + { + ui->downStatus->setEnabled(false); + ui->upStatus->setEnabled(false); + } } else { @@ -211,6 +223,46 @@ void PrefDialog::onRemovePriorityButtonClick() priorityUUIDRef.removeAt(index); } +void PrefDialog::onUpStatusButtonClick() +{ + if (ui->statusListWidget->selectedItems().size() != 1) + { + return; + } + int i = ui->statusListWidget->indexFromItem(ui->statusListWidget->selectedItems()[0]).row(); + if (i < statusUUIDRef.size()) + { + QListWidgetItem *item = ui->statusListWidget->takeItem(i); + i++; + ui->statusListWidget->insertItem(i, item); + statusUUIDRef.move(i-1, i); + + ui->downStatus->setEnabled((i > 0)); + ui->upStatus->setEnabled((i < statusUUIDRef.size()-1)); + ui->statusListWidget->setCurrentRow(i); + } +} + +void PrefDialog::onDownStatusButtonClick() +{ + if (ui->statusListWidget->selectedItems().size() != 1) + { + return; + } + int i = ui->statusListWidget->indexFromItem(ui->statusListWidget->selectedItems()[0]).row(); + if (i > 0) + { + QListWidgetItem *item = ui->statusListWidget->takeItem(i); + i--; + ui->statusListWidget->insertItem(i, item); + statusUUIDRef.move(i+1, i); + + ui->downStatus->setEnabled((i > 0)); + ui->upStatus->setEnabled((i < statusUUIDRef.size()-1)); + ui->statusListWidget->setCurrentRow(i); + } +} + void PrefDialog::setItemColor(QListWidgetItem *item, QColor bgColor) { QColor fgColor = Tools::getForegroundColor(bgColor); diff --git a/src/frames/prefdialog.h b/src/frames/prefdialog.h index 9e2c622..67f62bb 100644 --- a/src/frames/prefdialog.h +++ b/src/frames/prefdialog.h @@ -31,7 +31,8 @@ private slots: void onNameChange(); void onRemoveStatusButtonClick(); void onRemovePriorityButtonClick(); - + void onUpStatusButtonClick(); + void onDownStatusButtonClick(); private: Ui::PrefDialog *ui; diff --git a/src/frames/prefdialog.ui b/src/frames/prefdialog.ui index dde847f..5b20809 100644 --- a/src/frames/prefdialog.ui +++ b/src/frames/prefdialog.ui @@ -150,7 +150,7 @@ 570 310 41 - 32 + 21 @@ -166,13 +166,45 @@ 520 310 41 - 31 + 21 - + + + false + + + + 20 + 310 + 41 + 21 + + + + Down + + + + + false + + + + 70 + 310 + 41 + 21 + + + + Up + + diff --git a/src/models/board.cpp b/src/models/board.cpp index 0a7f734..b05365f 100644 --- a/src/models/board.cpp +++ b/src/models/board.cpp @@ -11,6 +11,8 @@ #include #include +#include "../services/taskstateservice.h" + Board::Board(QString name, QString description) { QUuid uuid = QUuid::createUuid(); @@ -60,6 +62,22 @@ const QString Board::getDescription() const QString Board::getStatus() { + if (autoStatus) + { + TaskStateService *tss = TaskStateService::getInstance(); + int16_t h = -1; + QString suuid = ""; + for (Task *t : tasks) + { + int16_t w = tss->getStatusWeight(t->getStatusUUID()); + if (w > -1 && h < w) + { + h = w; + suuid = t->getStatusUUID(); + } + } + return suuid; + } return statusUUID; } diff --git a/src/services/taskstateservice.cpp b/src/services/taskstateservice.cpp index e7632a6..a17d8ee 100644 --- a/src/services/taskstateservice.cpp +++ b/src/services/taskstateservice.cpp @@ -53,6 +53,20 @@ std::optional TaskStateService::getPriorityByUUID(QString uuid) return std::nullopt; } +int16_t TaskStateService::getStatusWeight(QString uuid) +{ + int16_t weight = -1; + for (uint16_t i = 0; i < statuses.count(); i++) + { + if (statuses[i].getUUID() == uuid) + { + weight = i; + break; + } + } + return weight; +} + TaskStateService::TaskStateService() { priorities.append(Priority(QUuid::createUuid().toString(QUuid::WithoutBraces), "None", QColor(217, 217, 217))); diff --git a/src/services/taskstateservice.h b/src/services/taskstateservice.h index a5011c0..8e4863b 100644 --- a/src/services/taskstateservice.h +++ b/src/services/taskstateservice.h @@ -19,6 +19,7 @@ public: std::optional getStatusByUUID(QString); std::optional getPriorityByUUID(QString); + int16_t getStatusWeight(QString uuid); private: diff --git a/src/tools.cpp b/src/tools.cpp index 3dd196f..5d24b1e 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -8,6 +8,8 @@ #include #include +#include "services/taskstateservice.h" + Tools::Tools() { @@ -95,3 +97,14 @@ bool Tools::readSaveFile(QJsonDocument &doc) { doc = QJsonDocument::fromJson(json.toUtf8()); return true; } + +const QString Tools::getStatusLabelStylesheet(Status status) +{ + QColor bg = status.getColor(); + QColor fg = Tools::getForegroundColor(bg); + return QString("border-color: %1; \ + border: solid; \ + background-color: %1; \ + border-radius: 4px; \ + color: %2;").arg(bg.name(QColor::HexRgb), fg.name(QColor::HexRgb)); +} diff --git a/src/tools.h b/src/tools.h index 86ca753..3f6fd98 100644 --- a/src/tools.h +++ b/src/tools.h @@ -4,6 +4,8 @@ #include #include +#include "models/status.h" + class Tools { public: @@ -14,6 +16,7 @@ public: static bool isSaveFileExist(); static bool writeSaveToFile(QJsonDocument doc); static bool readSaveFile(QJsonDocument &doc); + static const QString getStatusLabelStylesheet(Status); private: static const QString getSaveFilePath(); -- 2.49.1 From 22ebe6eded9b24eb46f392986a344a60e7f2d68f Mon Sep 17 00:00:00 2001 From: Aurelie Delhaie Date: Mon, 20 Feb 2023 16:51:21 +0100 Subject: [PATCH 3/3] fix out of bound crash when edit or remove a board, add board config dialog, fix glibc version in about dialog --- TaskBoard.pro | 3 + src/frames/aboutdialog.cpp | 6 +- src/frames/boardconfigdialog.cpp | 75 +++++++++++++++++++ src/frames/boardconfigdialog.h | 32 +++++++++ src/frames/boardconfigdialog.ui | 119 +++++++++++++++++++++++++++++++ src/frames/mainwindow.cpp | 82 ++++++++++++++++++--- src/frames/mainwindow.ui | 3 + src/frames/taskdialog.cpp | 90 ++++++++++------------- src/frames/taskdialog.h | 5 +- src/models/board.cpp | 12 ++++ src/models/board.h | 6 ++ 11 files changed, 364 insertions(+), 69 deletions(-) create mode 100644 src/frames/boardconfigdialog.cpp create mode 100644 src/frames/boardconfigdialog.h create mode 100644 src/frames/boardconfigdialog.ui diff --git a/TaskBoard.pro b/TaskBoard.pro index 4dd8303..f00e34e 100644 --- a/TaskBoard.pro +++ b/TaskBoard.pro @@ -68,6 +68,7 @@ linux-* { #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + src/frames/boardconfigdialog.cpp \ src/frames/filterdialog.cpp \ src/frames/aboutdialog.cpp \ src/models/board.cpp \ @@ -84,6 +85,7 @@ SOURCES += \ src/tools.cpp HEADERS += \ + src/frames/boardconfigdialog.h \ src/frames/filterdialog.h \ src/frames/aboutdialog.h \ src/models/board.h \ @@ -99,6 +101,7 @@ HEADERS += \ src/tools.h FORMS += \ + src/frames/boardconfigdialog.ui \ src/frames/filterdialog.ui \ src/frames/aboutdialog.ui \ src/frames/mainwindow.ui \ diff --git a/src/frames/aboutdialog.cpp b/src/frames/aboutdialog.cpp index c5b303d..363eaf1 100644 --- a/src/frames/aboutdialog.cpp +++ b/src/frames/aboutdialog.cpp @@ -1,10 +1,6 @@ #include "aboutdialog.h" #include "ui_aboutdialog.h" -#ifdef unix -#include -#endif - AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDialog) @@ -33,7 +29,7 @@ QString AboutDialog::getCompilerInfo() #ifdef __MINGW32__ return QString("MinGW_%1.%2").arg(QString::number(__MINGW32_MAJOR_VERSION), QString::number(__MINGW32_MINOR_VERSION)); #else - return QString("GLIBC_%1").arg(gnu_get_libc_version()); + return QString("GLIBC_%1.%2").arg(QString::number(__GLIBC__), QString::number(__GLIBC_MINOR__)); #endif #elif _MSC_VER return QString("MSVC_%1").arg(_MSC_VER); diff --git a/src/frames/boardconfigdialog.cpp b/src/frames/boardconfigdialog.cpp new file mode 100644 index 0000000..f2ebdd6 --- /dev/null +++ b/src/frames/boardconfigdialog.cpp @@ -0,0 +1,75 @@ +#include "boardconfigdialog.h" +#include "ui_boardconfigdialog.h" + +#include "../services/taskstateservice.h" +#include + +BoardConfigDialog::BoardConfigDialog(Board *b, QWidget *parent) : + QDialog(parent), + ui(new Ui::BoardConfigDialog) +{ + ui->setupUi(this); + ui->nameField->setText(b->getName()); + ui->descriptionField->setPlainText(b->getDescription()); + if (!b->isAutoStatus()) + { + QVector statuses = TaskStateService::getInstance()->getStatuses(); + foreach (Status s, statuses) + { + ui->statusCombobox->addItem(s.getName(), s.getUUID()); + } + ui->autoStatusCheckbox->setChecked(false); + ui->statusCombobox->setEnabled(true); + } + connect(ui->autoStatusCheckbox, &QCheckBox::stateChanged, this, &BoardConfigDialog::onAutoStatusCheckboxChange); +} + +BoardConfigDialog::~BoardConfigDialog() +{ + delete ui; +} + +const QString BoardConfigDialog::getName() +{ + return ui->nameField->text(); +} + +const QString BoardConfigDialog::getDescription() +{ + return ui->descriptionField->toPlainText(); +} + +bool BoardConfigDialog::isAutoStatus() +{ + return ui->autoStatusCheckbox->isChecked(); +} + +const QString BoardConfigDialog::getStatus() +{ + if (!ui->autoStatusCheckbox->isChecked()) + { + if (!ui->statusCombobox->currentData().isNull()) + { + return ui->statusCombobox->currentData().toString(); + } + } + return ""; +} + +void BoardConfigDialog::onAutoStatusCheckboxChange(int state) +{ + if (state == Qt::CheckState::Unchecked) + { + QVector statuses = TaskStateService::getInstance()->getStatuses(); + foreach (Status s, statuses) + { + ui->statusCombobox->addItem(s.getName(), s.getUUID()); + } + ui->statusCombobox->setEnabled(true); + } + else + { + ui->statusCombobox->setEnabled(false); + ui->statusCombobox->clear(); + } +} diff --git a/src/frames/boardconfigdialog.h b/src/frames/boardconfigdialog.h new file mode 100644 index 0000000..fe2c88f --- /dev/null +++ b/src/frames/boardconfigdialog.h @@ -0,0 +1,32 @@ +#ifndef BOARDCONFIGDIALOG_H +#define BOARDCONFIGDIALOG_H + +#include + +#include "../models/board.h" + +namespace Ui { +class BoardConfigDialog; +} + +class BoardConfigDialog : public QDialog +{ + Q_OBJECT + +public: + explicit BoardConfigDialog(Board *b, QWidget *parent = nullptr); + ~BoardConfigDialog(); + + const QString getName(); + const QString getDescription(); + bool isAutoStatus(); + const QString getStatus(); + +private slots: + void onAutoStatusCheckboxChange(int); + +private: + Ui::BoardConfigDialog *ui; +}; + +#endif // BOARDCONFIGDIALOG_H diff --git a/src/frames/boardconfigdialog.ui b/src/frames/boardconfigdialog.ui new file mode 100644 index 0000000..4eab8d5 --- /dev/null +++ b/src/frames/boardconfigdialog.ui @@ -0,0 +1,119 @@ + + + BoardConfigDialog + + + + 0 + 0 + 400 + 379 + + + + Board Configuration + + + + + + Name + + + + + + + + + + Description + + + + + + + + + + Qt::Horizontal + + + + + + + Auto determine status + + + true + + + + + + + + + Status + + + + + + + false + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + BoardConfigDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + BoardConfigDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/frames/mainwindow.cpp b/src/frames/mainwindow.cpp index eac6c84..eaec679 100644 --- a/src/frames/mainwindow.cpp +++ b/src/frames/mainwindow.cpp @@ -17,6 +17,7 @@ #include "namedialog.h" #include "taskdialog.h" #include "filterdialog.h" +#include "boardconfigdialog.h" #include "../tools.h" #include "../services/taskstateservice.h" @@ -197,7 +198,16 @@ void MainWindow::onBoardSelected(int i) { Board *b = boards[selectedBoardIndex]; ui->label->setText(b->getName()); - ui->boardDescription->setText(b->getDescription()); + if (b->getDescription().length() > 0) + { + ui->boardDescription->setText(b->getDescription()); + ui->boardDescription->setEnabled(true); + } + else + { + ui->boardDescription->setText("No description"); + ui->boardDescription->setEnabled(false); + } ui->actionNew_task->setDisabled(false); } else @@ -224,7 +234,16 @@ void MainWindow::onFilterSelected(int i) { Filter f = filters[selectedFilterIndex]; ui->label->setText(f.getName()); - ui->boardDescription->setText(f.getDescription()); + if (f.getDescription().length() > 0) + { + ui->boardDescription->setText(f.getDescription()); + ui->boardDescription->setEnabled(true); + } + else + { + ui->boardDescription->setText("No description"); + ui->boardDescription->setEnabled(false); + } } else { @@ -259,7 +278,11 @@ void MainWindow::onRemoveBoardMenu() { if (menuSelectedBoardItem != nullptr) { - int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row(); + int i = ui->boardList->indexFromItem(menuSelectedBoardItem).row(); + if (i == -1) + { + return; + } QMessageBox::StandardButton result = QMessageBox::question(this, "Delete a board", "Do you want to delete this board?"); if (result == QMessageBox::Yes) { @@ -296,6 +319,10 @@ void MainWindow::onRemoveFilterMenu() if (menuSelectedFilterItem != nullptr) { int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row(); + if (i == -1) + { + return; + } QMessageBox::StandardButton result = QMessageBox::question(this, "Delete a filter", "Do you want to delete this filter?"); if (result == QMessageBox::Yes) { @@ -315,20 +342,50 @@ void MainWindow::onEditNameBoardMenu() { if (menuSelectedBoardItem != nullptr) { - int i = ui->filterListWidget->indexFromItem(menuSelectedFilterItem).row(); + int i = ui->boardList->indexFromItem(menuSelectedBoardItem).row(); + if (i == -1) + { + return; + } Board *b = boards.at(i); - NameDialog dialog("Edit board name", b->getName(), b->getDescription(), this); + BoardConfigDialog dialog(b, this); if (dialog.exec() == QDialog::DialogCode::Accepted) { - QString newName = dialog.getChoosenName(); + QString newName = dialog.getName(); QString newDesc = dialog.getDescription(); b->setName(newName); b->setDescription(newDesc); + if (!dialog.isAutoStatus()) + { + std::optional status = TaskStateService::getInstance()->getStatusByUUID(dialog.getStatus()); + if (status.has_value()) + { + b->setDirtyStatus(status.value()); + } + else + { + b->removeDirtyStatus(); + } + } + else + { + b->removeDirtyStatus(); + } QListWidgetItem *item = ui->boardList->item(i); item->setText(newName); item->setToolTip(newDesc); ui->label->setText(newName); - ui->boardDescription->setText(newDesc); + if (newDesc.length() > 0) + { + ui->boardDescription->setText(newDesc); + ui->boardDescription->setEnabled(true); + } + else + { + ui->boardDescription->setText("No description"); + ui->boardDescription->setEnabled(false); + } + redrawBoardStatus(); save(); } } @@ -358,7 +415,16 @@ void MainWindow::onEditFilterMenu() item->setText(f.getName()); item->setToolTip(f.getDescription()); ui->label->setText(f.getName()); - ui->boardDescription->setText(f.getDescription()); + if (f.getDescription().length() > 0) + { + ui->boardDescription->setText(f.getDescription()); + ui->boardDescription->setEnabled(true); + } + else + { + ui->boardDescription->setText("No description"); + ui->boardDescription->setEnabled(false); + } redrawTaskTree(); save(); } diff --git a/src/frames/mainwindow.ui b/src/frames/mainwindow.ui index f0702e0..2b74a66 100644 --- a/src/frames/mainwindow.ui +++ b/src/frames/mainwindow.ui @@ -52,6 +52,9 @@ 250 + + true + diff --git a/src/frames/taskdialog.cpp b/src/frames/taskdialog.cpp index 79db195..e5eb6a8 100644 --- a/src/frames/taskdialog.cpp +++ b/src/frames/taskdialog.cpp @@ -10,19 +10,8 @@ TaskDialog::TaskDialog(QWidget *parent) : ui(new Ui::TaskDialog) { ui->setupUi(this); + init(); this->setWindowTitle("New task"); - this->status = TaskStateService::getInstance()->getStatuses(); - this->priorities = TaskStateService::getInstance()->getPriorities(); - - foreach (Status s, this->status) - { - ui->statusCombo->addItem(s.getName()); - } - - foreach (Priority p, this->priorities) - { - ui->priorityCombo->addItem(p.getName()); - } QDate expectedFor = QDate::currentDate(); expectedFor = expectedFor.addDays(10); @@ -34,19 +23,8 @@ TaskDialog::TaskDialog(Task *t, QWidget *parent) : ui(new Ui::TaskDialog) { ui->setupUi(this); + init(); this->setWindowTitle("Edit task"); - this->status = TaskStateService::getInstance()->getStatuses(); - this->priorities = TaskStateService::getInstance()->getPriorities(); - - foreach (Status s, this->status) - { - ui->statusCombo->addItem(s.getName()); - } - - foreach (Priority p, this->priorities) - { - ui->priorityCombo->addItem(p.getName()); - } // set fields ui->nameEdit->setText(t->getTitle()); @@ -55,34 +33,12 @@ TaskDialog::TaskDialog(Task *t, QWidget *parent) : if (t->getPriorityUUID().length() > 0) { - int16_t refindex = -1; - for (uint16_t i = 0; i < this->priorities.count(); i++) - { - if (this->priorities[i].getUUID() == t->getPriorityUUID()) - { - refindex = i; - } - } - if (refindex > -1) - { - ui->priorityCombo->setCurrentIndex(refindex); - } + initSelectionCombobox(t->getPriorityUUID(), ui->priorityCombo); } if (t->getStatusUUID().length() > 0) { - int16_t refindex = -1; - for (uint16_t i = 0; i < this->status.count(); i++) - { - if (this->status[i].getUUID() == t->getStatusUUID()) - { - refindex = i; - } - } - if (refindex > -1) - { - ui->statusCombo->setCurrentIndex(refindex); - } + initSelectionCombobox(t->getStatusUUID(), ui->statusCombo); } } @@ -98,16 +54,42 @@ Task TaskDialog::getTask() QString description = ui->descriptionEdit->toMarkdown(QTextDocument::MarkdownFeature::MarkdownDialectCommonMark); QDate expectedFor = ui->expectedForEdit->date(); QString priorityUUID = ""; - if (ui->priorityCombo->currentIndex() > -1) + if (!ui->priorityCombo->currentData().isNull()) { - Priority priority = priorities[ui->priorityCombo->currentIndex()]; - priorityUUID = priority.getUUID(); + priorityUUID = ui->priorityCombo->currentData().toString(); } QString statusUUID = ""; - if (ui->statusCombo->currentIndex() > -1) + if (!ui->statusCombo->currentData().isNull()) { - Status s = status[ui->statusCombo->currentIndex()]; - statusUUID = s.getUUID(); + statusUUID = ui->statusCombo->currentData().toString(); } return Task(title, description, expectedFor, priorityUUID, statusUUID); } + +void TaskDialog::init() +{ + QVector statuses = TaskStateService::getInstance()->getStatuses(); + QVector priorities = TaskStateService::getInstance()->getPriorities(); + + foreach (Status s, statuses) + { + ui->statusCombo->addItem(s.getName(), s.getUUID()); + } + + foreach (Priority p, priorities) + { + ui->priorityCombo->addItem(p.getName(), p.getUUID()); + } +} + +void TaskDialog::initSelectionCombobox(QString uuid, QComboBox *cbx) +{ + for (uint16_t i = 0; i < cbx->count(); i++) + { + if (cbx->itemData(i).toString() == uuid) + { + cbx->setCurrentIndex(i); + break; + } + } +} diff --git a/src/frames/taskdialog.h b/src/frames/taskdialog.h index 30e0953..64edb9b 100644 --- a/src/frames/taskdialog.h +++ b/src/frames/taskdialog.h @@ -3,6 +3,7 @@ #include #include +#include #include "../models/status.h" #include "../models/priority.h" @@ -26,8 +27,8 @@ public: private: Ui::TaskDialog *ui; - QVector status; - QVector priorities; + void init(); + void initSelectionCombobox(QString uuid, QComboBox *cbx); }; #endif // TASKDIALOG_H diff --git a/src/models/board.cpp b/src/models/board.cpp index b05365f..c6a61e5 100644 --- a/src/models/board.cpp +++ b/src/models/board.cpp @@ -96,6 +96,18 @@ void Board::setDescription(const QString description) this->description = description; } +void Board::setDirtyStatus(Status s) +{ + this->autoStatus = false; + this->statusUUID = s.getUUID(); +} + +void Board::removeDirtyStatus() +{ + this->autoStatus = true; + this->statusUUID = ""; +} + void Board::add(Task t) { tasks.append(new Task(t)); diff --git a/src/models/board.h b/src/models/board.h index 6dd6e0a..3f1343d 100644 --- a/src/models/board.h +++ b/src/models/board.h @@ -6,6 +6,7 @@ #include #include "task.h" +#include "status.h" class Board { @@ -19,10 +20,15 @@ public: const QString getDescription(); const QString getStatus(); bool isAutoStatus(); + void setName(const QString name); void setDescription(const QString description); + void setDirtyStatus(Status s); + void removeDirtyStatus(); + void add(Task); void remove(uint16_t index); + Task *taskAt(uint16_t); const QVector getTasks(); -- 2.49.1