diff --git a/flowlayout.cpp b/flowlayout.cpp index ee77562..a3df0f9 100644 --- a/flowlayout.cpp +++ b/flowlayout.cpp @@ -63,7 +63,7 @@ QLayoutItem *FlowLayout::takeAt(int index) Qt::Orientations FlowLayout::expandingDirections() const { - return 0; + return Qt::Orientations{0}; } bool FlowLayout::hasHeightForWidth() const diff --git a/stripsgrid.cpp b/stripsgrid.cpp index 853224f..376e200 100644 --- a/stripsgrid.cpp +++ b/stripsgrid.cpp @@ -1,9 +1,7 @@ #include "stripsgrid.h" -#include #include #include -#include #include #include #include @@ -35,7 +33,7 @@ StripsGrid::StripsGrid(QWidget *parent) : int row{0}; { int column{0}; - for (const auto text : {"Story", "To Do:", "In Progress:", "In Review:", "Done:"}) + for (auto &header : m_tableHeader) { if (column) { @@ -45,14 +43,14 @@ StripsGrid::StripsGrid(QWidget *parent) : m_layout->addWidget(line, row, column++, (stories*2)+1, 1); } - auto label = new QLabel{text}; + header = new QLabel; { - auto font = label->font(); - font.setPointSize(24); - label->setFont(font); + auto font = header->font(); + font.setPointSize(20); + header->setFont(font); } - label->setFixedHeight(40); - m_layout->addWidget(label, row, column++); + header->setFixedHeight(40); + m_layout->addWidget(header, row, column++); } } @@ -69,12 +67,10 @@ StripsGrid::StripsGrid(QWidget *parent) : row++; - int storyPoints{0}; - Story story; - story.widget = new StripWidget; + story.widget = new StripWidget{StripWidget::Story}; story.widget->setTitle(QString("ATC-%0").arg(random.bounded(1000, 5000))); - story.widget->setStyleSheet("StripWidget { background-color: #AFA; }"); + story.widget->setOwner("RH"); for (int column = 0; column < 5; column++) { @@ -93,15 +89,10 @@ StripsGrid::StripsGrid(QWidget *parent) : call_n_times(random.bounded(6), [&]() { - auto widget = new StripWidget; + auto widget = new StripWidget{StripWidget::Subtask}; widget->setTitle(QString("ATC-%0").arg(random.bounded(1000, 5000))); - { - const auto points = std::array{1,3,5,8,13}[random.bounded(5)]; - widget->setPoints(points); - storyPoints += points; - } + widget->setPoints(std::array{1,3,5,8,13}[random.bounded(5)]); widget->setOwner(std::array{"DB", "KW", "BK", "MS", "AS"}[random.bounded(5)]); - widget->setStyleSheet("StripWidget { background-color: #FCC; }"); test.layout->addWidget(widget); test.widgets.push_back(widget); }); @@ -110,13 +101,14 @@ StripsGrid::StripsGrid(QWidget *parent) : } } - story.widget->setPoints(storyPoints); m_stories.push_back(story); row++; }); m_layout->addItem(new QSpacerItem{0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding}, ++row, 0, 1, 5); + + updatePoints(); } void StripsGrid::mousePressEvent(QMouseEvent *event) @@ -133,16 +125,15 @@ void StripsGrid::mousePressEvent(QMouseEvent *event) if (subtaskWidget->startDragging(event->pos() - subtaskWidget->pos())) { m_draggedWidget = subtaskWidget; - m_draggedWidget->setGraphicsEffect(new QGraphicsBlurEffect); + m_draggedWidget->beginDrag(); - m_dragWidget = new StripWidget{this}; + m_dragWidget = new StripWidget{StripWidget::DraggedSubtask, this}; m_dragWidget->setTitle(m_draggedWidget->title()); m_dragWidget->setDescription(m_draggedWidget->description()); m_dragWidget->setPoints(m_draggedWidget->points()); m_dragWidget->setOwner(m_draggedWidget->owner()); m_dragWidget->setStyleSheet(m_draggedWidget->styleSheet()); m_dragWidget->move(m_draggedWidget->pos()); - m_dragWidget->setGraphicsEffect(new QGraphicsDropShadowEffect); m_dragWidget->show(); m_dragOffset = event->pos() - m_draggedWidget->pos(); @@ -163,8 +154,9 @@ void StripsGrid::mouseReleaseEvent(QMouseEvent *event) if (event->button() == Qt::LeftButton && m_dragWidget) { - m_draggedWidget->setGraphicsEffect(nullptr); + m_draggedWidget->endDrag(); m_draggedWidget = nullptr; + m_dragWidget->deleteLater(); m_dragWidget = nullptr; } @@ -210,6 +202,8 @@ void StripsGrid::mouseMoveEvent(QMouseEvent *event) newColumn->layout->addWidget(m_draggedWidget); newColumn->widgets.push_back(m_draggedWidget); newColumn->layout->update(); + + updatePoints(); } m_dragWidget->move(event->pos() - m_dragOffset); @@ -217,3 +211,35 @@ void StripsGrid::mouseMoveEvent(QMouseEvent *event) QWidget::mouseMoveEvent(event); } + +void StripsGrid::updatePoints() +{ + std::array sumsPerColumn{0,0,0,0,0}; + + for (const auto &story : m_stories) + { + int storyPoints = 0; + sumsPerColumn[0] += story.widget->points(); + + for (int i = 0; i < 4; i++) + { + int columnSum = 0; + for (const auto *widget : story.columns[i].widgets) + columnSum += widget->points(); + sumsPerColumn[i+1] += columnSum; + storyPoints += columnSum; + } + story.widget->setPoints(storyPoints); + } + + std::array texts{ + tr("Stories (%0)"), + tr("To Do (%0)"), + tr("In Progress (%0)"), + tr("In Review (%0)"), + tr("Done (%0)") + }; + + for (int i = 0; i < 5; i++) + m_tableHeader[i]->setText(texts[i].arg(sumsPerColumn[i])); +} diff --git a/stripsgrid.h b/stripsgrid.h index 488f68b..455f27d 100644 --- a/stripsgrid.h +++ b/stripsgrid.h @@ -5,6 +5,7 @@ #include class QGridLayout; +class QLabel; class StripWidget; class FlowLayout; @@ -22,12 +23,16 @@ protected: void mouseMoveEvent(QMouseEvent *event) override; private: + void updatePoints(); + QGridLayout *m_layout; StripWidget *m_draggedWidget{}; StripWidget *m_dragWidget{}; QPoint m_dragOffset; + std::array m_tableHeader; + struct Story { StripWidget *widget; diff --git a/stripwidget.cpp b/stripwidget.cpp index 14b9930..c10d319 100644 --- a/stripwidget.cpp +++ b/stripwidget.cpp @@ -1,6 +1,9 @@ #include "stripwidget.h" #include "ui_stripwidget.h" +#include +#include + StripWidget::StripWidget(QWidget *parent) : QFrame{parent}, m_ui{std::make_unique()} @@ -12,6 +15,27 @@ StripWidget::StripWidget(QWidget *parent) : setFixedSize(size()); } +StripWidget::StripWidget(StripWidget::Story_t, QWidget *parent) : + StripWidget{parent} +{ + m_ui->points->setReadOnly(true); + m_ui->points->setMaximum(9999); + + setStyleSheet("StripWidget { background-color: #AFA; }"); +} + +StripWidget::StripWidget(StripWidget::Subtask_t, QWidget *parent) : + StripWidget{parent} +{ + setStyleSheet("StripWidget { background-color: #FCC; }"); +} + +StripWidget::StripWidget(StripWidget::DraggedSubtask_t, QWidget *parent) : + StripWidget{Subtask, parent} +{ + setGraphicsEffect(new QGraphicsDropShadowEffect); +} + StripWidget::~StripWidget() = default; bool StripWidget::startDragging(const QPoint &pos) const @@ -41,20 +65,30 @@ void StripWidget::setDescription(const QString &description) int StripWidget::points() const { - return m_ui->points->text().toInt(); + return m_ui->points->value(); } void StripWidget::setPoints(int points) { - m_ui->points->setText(QString::number(points)); + m_ui->points->setValue(points); } QString StripWidget::owner() const { - return m_ui->owner->text(); + return m_ui->owner->currentText(); } void StripWidget::setOwner(const QString &owner) { - m_ui->owner->setText(owner); + m_ui->owner->setCurrentIndex(m_ui->owner->findText(owner)); +} + +void StripWidget::beginDrag() +{ + setGraphicsEffect(new QGraphicsOpacityEffect); +} + +void StripWidget::endDrag() +{ + setGraphicsEffect(nullptr); } diff --git a/stripwidget.h b/stripwidget.h index cd523d5..e8f94da 100644 --- a/stripwidget.h +++ b/stripwidget.h @@ -10,8 +10,21 @@ class StripWidget : public QFrame { Q_OBJECT -public: explicit StripWidget(QWidget *parent = nullptr); + +public: + struct Story_t{}; + static constexpr const Story_t Story{}; + + struct Subtask_t{}; + static constexpr const Subtask_t Subtask{}; + + struct DraggedSubtask_t{}; + static constexpr const DraggedSubtask_t DraggedSubtask{}; + + explicit StripWidget(Story_t, QWidget *parent = nullptr); + explicit StripWidget(Subtask_t, QWidget *parent = nullptr); + explicit StripWidget(DraggedSubtask_t, QWidget *parent = nullptr); ~StripWidget() override; bool startDragging(const QPoint &pos) const; @@ -28,6 +41,9 @@ public: QString owner() const; void setOwner(const QString &owner); + void beginDrag(); + void endDrag(); + private: std::unique_ptr m_ui; }; diff --git a/stripwidget.ui b/stripwidget.ui index 0dd2016..e1817c2 100644 --- a/stripwidget.ui +++ b/stripwidget.ui @@ -71,20 +71,9 @@ - - - - 12 - - - - QFrame::Panel - - - QFrame::Sunken - - - 1 + + + QAbstractSpinBox::NoButtons @@ -102,21 +91,45 @@ - - - - 12 - - - - QFrame::Panel - - - QFrame::Sunken - - - OW + + + false + + + BK + + + + + KW + + + + + DB + + + + + MS + + + + + AS + + + + + MS + + + + + RH + +