Implemented recalculating of story points

This commit is contained in:
2020-03-07 15:17:04 +01:00
parent 5e204fd74d
commit ec528901b5
6 changed files with 153 additions and 59 deletions

View File

@@ -63,7 +63,7 @@ QLayoutItem *FlowLayout::takeAt(int index)
Qt::Orientations FlowLayout::expandingDirections() const
{
return 0;
return Qt::Orientations{0};
}
bool FlowLayout::hasHeightForWidth() const

View File

@@ -1,9 +1,7 @@
#include "stripsgrid.h"
#include <QDebug>
#include <QGridLayout>
#include <QMouseEvent>
#include <QGraphicsOpacityEffect>
#include <QLabel>
#include <QSpacerItem>
#include <QRandomGenerator>
@@ -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<int, 5>{1,3,5,8,13}[random.bounded(5)];
widget->setPoints(points);
storyPoints += points;
}
widget->setPoints(std::array<int, 5>{1,3,5,8,13}[random.bounded(5)]);
widget->setOwner(std::array<const char *, 5>{"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<int, 5> 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<QString, 5> 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]));
}

View File

@@ -5,6 +5,7 @@
#include <vector>
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<QLabel*, 5> m_tableHeader;
struct Story {
StripWidget *widget;

View File

@@ -1,6 +1,9 @@
#include "stripwidget.h"
#include "ui_stripwidget.h"
#include <QGraphicsDropShadowEffect>
#include <QGraphicsOpacityEffect>
StripWidget::StripWidget(QWidget *parent) :
QFrame{parent},
m_ui{std::make_unique<Ui::StripWidget>()}
@@ -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);
}

View File

@@ -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<Ui::StripWidget> m_ui;
};

View File

@@ -71,20 +71,9 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="points">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="text">
<string>1</string>
<widget class="QSpinBox" name="points">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
@@ -102,21 +91,45 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="owner">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<property name="text">
<string>OW</string>
<widget class="QComboBox" name="owner">
<property name="frame">
<bool>false</bool>
</property>
<item>
<property name="text">
<string>BK</string>
</property>
</item>
<item>
<property name="text">
<string>KW</string>
</property>
</item>
<item>
<property name="text">
<string>DB</string>
</property>
</item>
<item>
<property name="text">
<string>MS</string>
</property>
</item>
<item>
<property name="text">
<string>AS</string>
</property>
</item>
<item>
<property name="text">
<string>MS</string>
</property>
</item>
<item>
<property name="text">
<string>RH</string>
</property>
</item>
</widget>
</item>
</layout>