Adding filters
This commit is contained in:
@@ -1,13 +1,66 @@
|
|||||||
#include "filterdialog.h"
|
#include "filterdialog.h"
|
||||||
#include "ui_filterdialog.h"
|
#include "ui_filterdialog.h"
|
||||||
|
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
FilterDialog::FilterDialog(QString dialogTitle, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent) :
|
FilterDialog::FilterDialog(QString dialogTitle, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
FilterDialog::FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::FilterDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
this->setWindowTitle(dialogTitle);
|
||||||
|
init(boards, status, priorities);
|
||||||
|
|
||||||
|
ui->nameEdit->setText(f.getName());
|
||||||
|
ui->descriptionEdit->setPlainText(f.getDescription());
|
||||||
|
ui->dateComparationCombobox->setCurrentIndex(f.getExpectedForComparator());
|
||||||
|
foreach (QString uuid, f.getBoards())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ui->boardListWidget->count(); ++i)
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = ui->boardListWidget->item(i);
|
||||||
|
if (item->data(1).toString() == uuid)
|
||||||
|
{
|
||||||
|
item->setCheckState(Qt::Checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (QString uuid, f.getStatus())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ui->statusListWidget->count(); ++i)
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = ui->statusListWidget->item(i);
|
||||||
|
if (item->data(1).toString() == uuid)
|
||||||
|
{
|
||||||
|
item->setCheckState(Qt::Checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (QString uuid, f.getPriorities())
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ui->priorityListWidget->count(); ++i)
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = ui->priorityListWidget->item(i);
|
||||||
|
if (item->data(1).toString() == uuid)
|
||||||
|
{
|
||||||
|
item->setCheckState(Qt::Checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FilterDialog::init(QVector<Board *> boards, QVector<Status> status, QVector<Priority> priorities)
|
||||||
|
{
|
||||||
for (Board *b : boards)
|
for (Board *b : boards)
|
||||||
{
|
{
|
||||||
QListWidgetItem *item = new QListWidgetItem();
|
QListWidgetItem *item = new QListWidgetItem();
|
||||||
@@ -37,6 +90,8 @@ FilterDialog::FilterDialog(QString dialogTitle, QVector<Board*> boards, QVector<
|
|||||||
item->setData(1, p.getUUID());
|
item->setData(1, p.getUUID());
|
||||||
ui->priorityListWidget->addItem(item);
|
ui->priorityListWidget->addItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &FilterDialog::validateAndAccept);
|
||||||
}
|
}
|
||||||
|
|
||||||
FilterDialog::~FilterDialog()
|
FilterDialog::~FilterDialog()
|
||||||
@@ -47,6 +102,7 @@ FilterDialog::~FilterDialog()
|
|||||||
const Filter FilterDialog::getFilter()
|
const Filter FilterDialog::getFilter()
|
||||||
{
|
{
|
||||||
QString name = ui->nameEdit->text();
|
QString name = ui->nameEdit->text();
|
||||||
|
QString description = ui->descriptionEdit->toPlainText();
|
||||||
uint8_t dateComparation = 0;
|
uint8_t dateComparation = 0;
|
||||||
if (ui->dateComparationCombobox->currentIndex() > -1)
|
if (ui->dateComparationCombobox->currentIndex() > -1)
|
||||||
{
|
{
|
||||||
@@ -76,5 +132,15 @@ const Filter FilterDialog::getFilter()
|
|||||||
priorities.append(item->data(1).toString());
|
priorities.append(item->data(1).toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Filter(name, dateComparation, boards, status, priorities);
|
return Filter(name, description, dateComparation, boards, status, priorities);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FilterDialog::validateAndAccept()
|
||||||
|
{
|
||||||
|
if (ui->nameEdit->text().count() == 0)
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this, "This filter needs a name", "You need to enter a name to save this filter");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
accept();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,11 +18,17 @@ class FilterDialog : public QDialog
|
|||||||
|
|
||||||
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, QVector<Status> status, QVector<Priority> priorities, QWidget *parent = nullptr);
|
||||||
|
FilterDialog(QString dialogTitle, Filter f, QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities, QWidget *parent = nullptr);
|
||||||
~FilterDialog();
|
~FilterDialog();
|
||||||
const Filter getFilter();
|
const Filter getFilter();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void validateAndAccept();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::FilterDialog *ui;
|
Ui::FilterDialog *ui;
|
||||||
|
|
||||||
|
void init(QVector<Board*> boards, QVector<Status> status, QVector<Priority> priorities);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FILTERDIALOG_H
|
#endif // FILTERDIALOG_H
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>449</width>
|
<width>449</width>
|
||||||
<height>509</height>
|
<height>656</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -32,6 +32,16 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="nameEdit"/>
|
<widget class="QLineEdit" name="nameEdit"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>Description</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPlainTextEdit" name="descriptionEdit"/>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
@@ -133,22 +143,6 @@
|
|||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>FilterDialog</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>rejected()</signal>
|
<signal>rejected()</signal>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#define PRIORITIES_KEY "priorities"
|
#define PRIORITIES_KEY "priorities"
|
||||||
#define STATUS_KEY "status"
|
#define STATUS_KEY "status"
|
||||||
#define BOARDS_KEY "boards"
|
#define BOARDS_KEY "boards"
|
||||||
|
#define FILTERS_KEY "filters"
|
||||||
|
|
||||||
#include <QUuid>
|
#include <QUuid>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
@@ -36,10 +37,13 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
connect(ui->actionNew_filter, &QAction::triggered, this, &MainWindow::onNewFilterClick);
|
connect(ui->actionNew_filter, &QAction::triggered, this, &MainWindow::onNewFilterClick);
|
||||||
connect(ui->boardList, &QListWidget::currentRowChanged, this, &MainWindow::onBoardSelected);
|
connect(ui->boardList, &QListWidget::currentRowChanged, this, &MainWindow::onBoardSelected);
|
||||||
connect(ui->boardList, &QListWidget::customContextMenuRequested, this, &MainWindow::prepareBoardMenu);
|
connect(ui->boardList, &QListWidget::customContextMenuRequested, this, &MainWindow::prepareBoardMenu);
|
||||||
|
connect(ui->filterListWidget, &QListWidget::currentRowChanged, this, &MainWindow::onFilterSelected);
|
||||||
|
connect(ui->filterListWidget, &QListWidget::customContextMenuRequested, this, &MainWindow::prepareFilterMenu);
|
||||||
connect(ui->taskList, &QTreeWidget::itemDoubleClicked, this, &MainWindow::onEditTask);
|
connect(ui->taskList, &QTreeWidget::itemDoubleClicked, this, &MainWindow::onEditTask);
|
||||||
connect(ui->taskList, &QTreeWidget::customContextMenuRequested, this, &MainWindow::prepareTaskMenu);
|
connect(ui->taskList, &QTreeWidget::customContextMenuRequested, this, &MainWindow::prepareTaskMenu);
|
||||||
ui->boardList->setContextMenuPolicy(Qt::CustomContextMenu);
|
ui->boardList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
ui->taskList->setContextMenuPolicy(Qt::CustomContextMenu);
|
ui->taskList->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
ui->filterListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -93,8 +97,10 @@ void MainWindow::prepareBoardMenu(const QPoint &pos)
|
|||||||
|
|
||||||
void MainWindow::prepareTaskMenu(const QPoint &pos)
|
void MainWindow::prepareTaskMenu(const QPoint &pos)
|
||||||
{
|
{
|
||||||
|
bool show = false;
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
if (ui->taskList->selectedItems().length() == 1) {
|
if (ui->taskList->selectedItems().length() == 1) {
|
||||||
|
show = true;
|
||||||
QAction *renameAction = new QAction(tr("Edit the task"), this);
|
QAction *renameAction = new QAction(tr("Edit the task"), this);
|
||||||
connect(renameAction, &QAction::triggered, this, &MainWindow::onEditNameTaskMenu);
|
connect(renameAction, &QAction::triggered, this, &MainWindow::onEditNameTaskMenu);
|
||||||
menu.addAction(renameAction);
|
menu.addAction(renameAction);
|
||||||
@@ -105,12 +111,19 @@ void MainWindow::prepareTaskMenu(const QPoint &pos)
|
|||||||
|
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
}
|
}
|
||||||
|
if (selectedBoardIndex > -1)
|
||||||
|
{
|
||||||
|
show = true;
|
||||||
QAction *addAction = new QAction(tr("New task"), this);
|
QAction *addAction = new QAction(tr("New task"), this);
|
||||||
connect(addAction, &QAction::triggered, this, &MainWindow::onNewTaskClick);
|
connect(addAction, &QAction::triggered, this, &MainWindow::onNewTaskClick);
|
||||||
menu.addAction(addAction);
|
menu.addAction(addAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show)
|
||||||
|
{
|
||||||
menu.exec(ui->taskList->mapToGlobal(pos));
|
menu.exec(ui->taskList->mapToGlobal(pos));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onNewBoardClick()
|
void MainWindow::onNewBoardClick()
|
||||||
{
|
{
|
||||||
@@ -152,14 +165,24 @@ void MainWindow::onNewFilterClick()
|
|||||||
if (dialog.exec() == QDialog::DialogCode::Accepted)
|
if (dialog.exec() == QDialog::DialogCode::Accepted)
|
||||||
{
|
{
|
||||||
Filter f = dialog.getFilter();
|
Filter f = dialog.getFilter();
|
||||||
|
filters.append(f);
|
||||||
QListWidgetItem *item = new QListWidgetItem(f.getName());
|
QListWidgetItem *item = new QListWidgetItem(f.getName());
|
||||||
|
item->setToolTip(f.getDescription());
|
||||||
ui->filterListWidget->addItem(item);
|
ui->filterListWidget->addItem(item);
|
||||||
|
save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onBoardSelected(int i)
|
void MainWindow::onBoardSelected(int i)
|
||||||
{
|
{
|
||||||
selectedBoardIndex = i;
|
selectedBoardIndex = i;
|
||||||
|
selectedFilterIndex = -1;
|
||||||
|
|
||||||
|
ui->filterListWidget->blockSignals(true);
|
||||||
|
ui->filterListWidget->setCurrentIndex(ui->filterListWidget->currentIndex().sibling(-1, -1));
|
||||||
|
ui->filterListWidget->blockSignals(false);
|
||||||
|
|
||||||
|
filterResult.clear();
|
||||||
if (selectedBoardIndex > -1)
|
if (selectedBoardIndex > -1)
|
||||||
{
|
{
|
||||||
Board *b = boards[selectedBoardIndex];
|
Board *b = boards[selectedBoardIndex];
|
||||||
@@ -176,13 +199,34 @@ void MainWindow::onBoardSelected(int i)
|
|||||||
redrawTaskTree();
|
redrawTaskTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onFilterSelected(int i)
|
||||||
|
{
|
||||||
|
selectedFilterIndex = i;
|
||||||
|
selectedBoardIndex = -1;
|
||||||
|
|
||||||
|
ui->boardList->blockSignals(true);
|
||||||
|
ui->boardList->setCurrentIndex(ui->boardList->currentIndex().sibling(-1, -1));
|
||||||
|
ui->boardList->blockSignals(false);
|
||||||
|
|
||||||
|
filterResult.clear();
|
||||||
|
ui->actionNew_task->setDisabled(true);
|
||||||
|
if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
Filter f = filters[selectedFilterIndex];
|
||||||
|
ui->label->setText(f.getName());
|
||||||
|
ui->boardDescription->setText(f.getDescription());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->label->setText("No board selected");
|
||||||
|
ui->boardDescription->clear();
|
||||||
|
}
|
||||||
|
redrawTaskTree();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onEditTask(QTreeWidgetItem *item)
|
void MainWindow::onEditTask(QTreeWidgetItem *item)
|
||||||
{
|
{
|
||||||
if (item != nullptr && selectedBoardIndex > -1)
|
Task *t = getSelectedTask();
|
||||||
{
|
|
||||||
Board *b = boards[selectedBoardIndex];
|
|
||||||
int row = ui->taskList->indexOfTopLevelItem(item);
|
|
||||||
Task *t = b->taskAt(row);
|
|
||||||
if (t != nullptr)
|
if (t != nullptr)
|
||||||
{
|
{
|
||||||
TaskDialog dialog(t, status, priorities, this);
|
TaskDialog dialog(t, status, priorities, this);
|
||||||
@@ -192,6 +236,9 @@ void MainWindow::onEditTask(QTreeWidgetItem *item)
|
|||||||
t->update(editedTask);
|
t->update(editedTask);
|
||||||
updateTaskRow(item, editedTask);
|
updateTaskRow(item, editedTask);
|
||||||
save();
|
save();
|
||||||
|
if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
redrawTaskTree();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,6 +276,22 @@ void MainWindow::onRemoveTaskMenu()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onRemoveFilterMenu()
|
||||||
|
{
|
||||||
|
if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
QMessageBox::StandardButton result = QMessageBox::question(this, "Delete a filter", "Do you want to delete this filter?");
|
||||||
|
if (result == QMessageBox::Yes)
|
||||||
|
{
|
||||||
|
filters.removeAt(selectedFilterIndex);
|
||||||
|
delete ui->filterListWidget->takeItem(selectedFilterIndex);
|
||||||
|
selectedFilterIndex = -1;
|
||||||
|
redrawTaskTree();
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onEditNameBoardMenu()
|
void MainWindow::onEditNameBoardMenu()
|
||||||
{
|
{
|
||||||
if (selectedBoardIndex > -1)
|
if (selectedBoardIndex > -1)
|
||||||
@@ -253,12 +316,55 @@ void MainWindow::onEditNameBoardMenu()
|
|||||||
|
|
||||||
void MainWindow::onEditNameTaskMenu()
|
void MainWindow::onEditNameTaskMenu()
|
||||||
{
|
{
|
||||||
if (selectedBoardIndex > -1 && ui->taskList->selectedItems().length() == 1)
|
Task *t = getSelectedTask();
|
||||||
|
if (t != nullptr)
|
||||||
{
|
{
|
||||||
onEditTask(ui->taskList->currentItem());
|
onEditTask(ui->taskList->currentItem());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onEditFilterMenu()
|
||||||
|
{
|
||||||
|
if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
Filter f = filters[selectedFilterIndex];
|
||||||
|
FilterDialog dialog("Edit the filter", f, boards, status, priorities, this);
|
||||||
|
if (dialog.exec() == QDialog::DialogCode::Accepted)
|
||||||
|
{
|
||||||
|
Filter f = dialog.getFilter();
|
||||||
|
filters[selectedFilterIndex] = f;
|
||||||
|
QListWidgetItem *item = ui->filterListWidget->item(selectedFilterIndex);
|
||||||
|
item->setText(f.getName());
|
||||||
|
item->setToolTip(f.getDescription());
|
||||||
|
ui->label->setText(f.getName());
|
||||||
|
ui->boardDescription->setText(f.getDescription());
|
||||||
|
redrawTaskTree();
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::prepareFilterMenu(const QPoint &pos)
|
||||||
|
{
|
||||||
|
QMenu menu(this);
|
||||||
|
if (ui->filterListWidget->selectedItems().length() == 1) {
|
||||||
|
QAction *renameAction = new QAction(tr("Edit the filter"), this);
|
||||||
|
connect(renameAction, &QAction::triggered, this, &MainWindow::onEditFilterMenu);
|
||||||
|
menu.addAction(renameAction);
|
||||||
|
|
||||||
|
QAction *deleteAction = new QAction(tr("Delete"), this);
|
||||||
|
connect(deleteAction, &QAction::triggered, this, &MainWindow::onRemoveFilterMenu);
|
||||||
|
menu.addAction(deleteAction);
|
||||||
|
|
||||||
|
menu.addSeparator();
|
||||||
|
}
|
||||||
|
QAction *addAction = new QAction(tr("New filter"), this);
|
||||||
|
connect(addAction, &QAction::triggered, this, &MainWindow::onNewFilterClick);
|
||||||
|
menu.addAction(addAction);
|
||||||
|
|
||||||
|
menu.exec(ui->filterListWidget->mapToGlobal(pos));
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::init()
|
void MainWindow::init()
|
||||||
{
|
{
|
||||||
if (Tools::isSaveFileExist())
|
if (Tools::isSaveFileExist())
|
||||||
@@ -270,15 +376,24 @@ void MainWindow::init()
|
|||||||
QJsonArray jsonPriorities = save[PRIORITIES_KEY].toArray();
|
QJsonArray jsonPriorities = save[PRIORITIES_KEY].toArray();
|
||||||
QJsonArray jsonStatus = save[STATUS_KEY].toArray();
|
QJsonArray jsonStatus = save[STATUS_KEY].toArray();
|
||||||
QJsonArray jsonBoards = save[BOARDS_KEY].toArray();
|
QJsonArray jsonBoards = save[BOARDS_KEY].toArray();
|
||||||
for (QJsonValueRef value : jsonPriorities) {
|
QJsonArray jsonFilters = save[FILTERS_KEY].toArray();
|
||||||
|
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()));
|
status.append(Status(value.toObject()));
|
||||||
}
|
}
|
||||||
for (QJsonValueRef value : jsonBoards) {
|
for (QJsonValueRef value : jsonBoards)
|
||||||
|
{
|
||||||
boards.append(new Board(value.toObject()));
|
boards.append(new Board(value.toObject()));
|
||||||
}
|
}
|
||||||
|
for (QJsonValueRef value : jsonFilters)
|
||||||
|
{
|
||||||
|
filters.append(Filter(value.toObject()));
|
||||||
|
}
|
||||||
|
redrawFilterList();
|
||||||
redrawBoardList();
|
redrawBoardList();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -381,13 +496,46 @@ const QJsonDocument MainWindow::getJsonSave()
|
|||||||
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)
|
||||||
|
{
|
||||||
|
jsonFilters.append(f.toJson());
|
||||||
|
}
|
||||||
obj[PRIORITIES_KEY] = jsonPriorities;
|
obj[PRIORITIES_KEY] = jsonPriorities;
|
||||||
obj[STATUS_KEY] = jsonStatus;
|
obj[STATUS_KEY] = jsonStatus;
|
||||||
obj[BOARDS_KEY] = jsonBoards;
|
obj[BOARDS_KEY] = jsonBoards;
|
||||||
|
obj[FILTERS_KEY] = jsonFilters;
|
||||||
doc.setObject(obj);
|
doc.setObject(obj);
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Task *MainWindow::getSelectedTask()
|
||||||
|
{
|
||||||
|
if (selectedBoardIndex > -1)
|
||||||
|
{
|
||||||
|
Board *b = boards[selectedBoardIndex];
|
||||||
|
QList<QTreeWidgetItem*> items = ui->taskList->selectedItems();
|
||||||
|
if (items.count() == 1)
|
||||||
|
{
|
||||||
|
int16_t i = ui->taskList->indexOfTopLevelItem(items[0]);
|
||||||
|
return b->taskAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
if (!filterResult.empty())
|
||||||
|
{
|
||||||
|
QList<QTreeWidgetItem*> items = ui->taskList->selectedItems();
|
||||||
|
if (items.count() == 1)
|
||||||
|
{
|
||||||
|
int16_t i = ui->taskList->indexOfTopLevelItem(items[0]);
|
||||||
|
return filterResult[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::updateTaskRow(QTreeWidgetItem *item, Task t)
|
void MainWindow::updateTaskRow(QTreeWidgetItem *item, Task t)
|
||||||
{
|
{
|
||||||
item->setText(0, t.getTitle());
|
item->setText(0, t.getTitle());
|
||||||
@@ -453,6 +601,22 @@ void MainWindow::redrawBoardList()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::redrawFilterList()
|
||||||
|
{
|
||||||
|
QListWidget *l = ui->filterListWidget;
|
||||||
|
uint16_t itemCount = l->count();
|
||||||
|
for (int16_t i = itemCount; i >= 0; i--)
|
||||||
|
{
|
||||||
|
delete l->takeItem(i);
|
||||||
|
}
|
||||||
|
foreach (Filter f, filters)
|
||||||
|
{
|
||||||
|
QListWidgetItem *item = new QListWidgetItem(f.getName());
|
||||||
|
item->setToolTip(f.getDescription());
|
||||||
|
l->addItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::redrawTaskTree()
|
void MainWindow::redrawTaskTree()
|
||||||
{
|
{
|
||||||
QTreeWidget *l = ui->taskList;
|
QTreeWidget *l = ui->taskList;
|
||||||
@@ -471,7 +635,17 @@ void MainWindow::redrawTaskTree()
|
|||||||
ui->taskList->addTopLevelItem(item);
|
ui->taskList->addTopLevelItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (selectedFilterIndex > -1)
|
||||||
|
{
|
||||||
|
Filter f = filters[selectedFilterIndex];
|
||||||
|
filterResult = f.filter(boards);
|
||||||
|
foreach (Task *t, filterResult)
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = new QTreeWidgetItem();
|
||||||
|
updateTaskRow(item, *t);
|
||||||
|
ui->taskList->addTopLevelItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::save()
|
void MainWindow::save()
|
||||||
|
|||||||
@@ -30,11 +30,15 @@ private slots:
|
|||||||
void onNewTaskClick();
|
void onNewTaskClick();
|
||||||
void onNewFilterClick();
|
void onNewFilterClick();
|
||||||
void onBoardSelected(int i);
|
void onBoardSelected(int i);
|
||||||
|
void onFilterSelected(int i);
|
||||||
void onEditTask(QTreeWidgetItem*);
|
void onEditTask(QTreeWidgetItem*);
|
||||||
void onRemoveBoardMenu();
|
void onRemoveBoardMenu();
|
||||||
void onRemoveTaskMenu();
|
void onRemoveTaskMenu();
|
||||||
|
void onRemoveFilterMenu();
|
||||||
void onEditNameBoardMenu();
|
void onEditNameBoardMenu();
|
||||||
void onEditNameTaskMenu();
|
void onEditNameTaskMenu();
|
||||||
|
void onEditFilterMenu();
|
||||||
|
void prepareFilterMenu(const QPoint &pos);
|
||||||
void prepareBoardMenu(const QPoint &pos);
|
void prepareBoardMenu(const QPoint &pos);
|
||||||
void prepareTaskMenu(const QPoint &pos);
|
void prepareTaskMenu(const QPoint &pos);
|
||||||
|
|
||||||
@@ -44,6 +48,10 @@ private:
|
|||||||
void init();
|
void init();
|
||||||
|
|
||||||
int16_t selectedBoardIndex;
|
int16_t selectedBoardIndex;
|
||||||
|
int16_t selectedFilterIndex;
|
||||||
|
|
||||||
|
QVector<Task*> filterResult;
|
||||||
|
|
||||||
QVector<Priority> priorities;
|
QVector<Priority> priorities;
|
||||||
QVector<Status> status;
|
QVector<Status> status;
|
||||||
QVector<Board*> boards;
|
QVector<Board*> boards;
|
||||||
@@ -61,8 +69,11 @@ private:
|
|||||||
|
|
||||||
const QJsonDocument getJsonSave();
|
const QJsonDocument getJsonSave();
|
||||||
|
|
||||||
|
Task *getSelectedTask();
|
||||||
|
|
||||||
void updateTaskRow(QTreeWidgetItem *item, Task t);
|
void updateTaskRow(QTreeWidgetItem *item, Task t);
|
||||||
void redrawBoardList();
|
void redrawBoardList();
|
||||||
|
void redrawFilterList();
|
||||||
void redrawTaskTree();
|
void redrawTaskTree();
|
||||||
void save();
|
void save();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,14 +2,16 @@
|
|||||||
#include "qjsonarray.h"
|
#include "qjsonarray.h"
|
||||||
|
|
||||||
#define NAME_KEY "name"
|
#define NAME_KEY "name"
|
||||||
|
#define DESCRIPTION_KEY "description"
|
||||||
#define DATE_KEY "date"
|
#define DATE_KEY "date"
|
||||||
#define BOARDS_KEY "boards"
|
#define BOARDS_KEY "boards"
|
||||||
#define STATUS_KEY "status"
|
#define STATUS_KEY "status"
|
||||||
#define PRIORITY_KEY "priority"
|
#define PRIORITY_KEY "priority"
|
||||||
|
|
||||||
Filter::Filter(QString name, uint8_t expectedForComparator, QVector<QString> boards, QVector<QString> status, QVector<QString> priorities)
|
Filter::Filter(QString name, QString description, uint8_t expectedForComparator, QVector<QString> boards, QVector<QString> status, QVector<QString> priorities)
|
||||||
{
|
{
|
||||||
this->name = name;
|
this->name = name;
|
||||||
|
this->description = description;
|
||||||
this->expectedForComparator = expectedForComparator;
|
this->expectedForComparator = expectedForComparator;
|
||||||
this->boards = boards;
|
this->boards = boards;
|
||||||
this->status = status;
|
this->status = status;
|
||||||
@@ -19,6 +21,7 @@ Filter::Filter(QString name, uint8_t expectedForComparator, QVector<QString> boa
|
|||||||
Filter::Filter(QJsonObject obj)
|
Filter::Filter(QJsonObject obj)
|
||||||
{
|
{
|
||||||
this->name = obj[NAME_KEY].toString("!Missing name!");
|
this->name = obj[NAME_KEY].toString("!Missing name!");
|
||||||
|
this->description = obj[DESCRIPTION_KEY].toString();
|
||||||
this->expectedForComparator = obj[DATE_KEY].toInt();
|
this->expectedForComparator = obj[DATE_KEY].toInt();
|
||||||
QJsonArray b = obj[BOARDS_KEY].toArray();
|
QJsonArray b = obj[BOARDS_KEY].toArray();
|
||||||
QJsonArray s = obj[STATUS_KEY].toArray();
|
QJsonArray s = obj[STATUS_KEY].toArray();
|
||||||
@@ -46,7 +49,7 @@ Filter::Filter(QJsonObject obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<Task *> Filter::get(QVector<Board *> allBoards)
|
QVector<Task *> Filter::filter(QVector<Board *> allBoards)
|
||||||
{
|
{
|
||||||
QDate now = QDate::currentDate();
|
QDate now = QDate::currentDate();
|
||||||
QVector<Board*> selectedBoards;
|
QVector<Board*> selectedBoards;
|
||||||
@@ -140,10 +143,36 @@ const QString Filter::getName()
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QString Filter::getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Filter::getExpectedForComparator()
|
||||||
|
{
|
||||||
|
return expectedForComparator;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVector<QString> Filter::getBoards()
|
||||||
|
{
|
||||||
|
return boards;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVector<QString> Filter::getStatus()
|
||||||
|
{
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVector<QString> Filter::getPriorities()
|
||||||
|
{
|
||||||
|
return priorities;
|
||||||
|
}
|
||||||
|
|
||||||
const QJsonObject Filter::toJson()
|
const QJsonObject Filter::toJson()
|
||||||
{
|
{
|
||||||
QJsonObject obj;
|
QJsonObject obj;
|
||||||
obj[name] = name;
|
obj[NAME_KEY] = name;
|
||||||
|
obj[DESCRIPTION_KEY] = description;
|
||||||
obj[DATE_KEY] = expectedForComparator;
|
obj[DATE_KEY] = expectedForComparator;
|
||||||
QJsonArray b;
|
QJsonArray b;
|
||||||
foreach (QString uuid, boards)
|
foreach (QString uuid, boards)
|
||||||
|
|||||||
@@ -12,23 +12,30 @@ class Filter
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
QString name;
|
QString name;
|
||||||
|
QString description;
|
||||||
// 0 none, 1 lower, 2 equal, 3 upper
|
// 0 none, 1 lower, 2 equal, 3 upper
|
||||||
uint8_t expectedForComparator;
|
uint8_t expectedForComparator;
|
||||||
// if empty => all
|
// if empty => all
|
||||||
QVector<QString> boards;
|
QVector<QString> boards;
|
||||||
QVector<QString> status;
|
QVector<QString> status;
|
||||||
QVector<QString> priorities;
|
QVector<QString> priorities;
|
||||||
public:
|
|
||||||
Filter(QString name, uint8_t expectedForComparator,QVector<QString> boards,QVector<QString> status,QVector<QString> priorities);
|
|
||||||
Filter(QJsonObject obj);
|
|
||||||
|
|
||||||
QVector<Task*> get(QVector<Board*>);
|
|
||||||
|
|
||||||
bool filterStatus(Task *t);
|
bool filterStatus(Task *t);
|
||||||
bool filterPriority(Task *t);
|
bool filterPriority(Task *t);
|
||||||
bool filterDate(Task *t, QDate now);
|
bool filterDate(Task *t, QDate now);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Filter(QString name, QString description, uint8_t expectedForComparator,QVector<QString> boards,QVector<QString> status,QVector<QString> priorities);
|
||||||
|
Filter(QJsonObject obj);
|
||||||
|
|
||||||
|
QVector<Task*> filter(QVector<Board*>);
|
||||||
|
|
||||||
const QString getName();
|
const QString getName();
|
||||||
|
const QString getDescription();
|
||||||
|
uint8_t getExpectedForComparator();
|
||||||
|
const QVector<QString> getBoards();
|
||||||
|
const QVector<QString> getStatus();
|
||||||
|
const QVector<QString> getPriorities();
|
||||||
|
|
||||||
const QJsonObject toJson();
|
const QJsonObject toJson();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user