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 Qt::Orientations FlowLayout::expandingDirections() const
{ {
return 0; return Qt::Orientations{0};
} }
bool FlowLayout::hasHeightForWidth() const bool FlowLayout::hasHeightForWidth() const

View File

@@ -1,9 +1,7 @@
#include "stripsgrid.h" #include "stripsgrid.h"
#include <QDebug>
#include <QGridLayout> #include <QGridLayout>
#include <QMouseEvent> #include <QMouseEvent>
#include <QGraphicsOpacityEffect>
#include <QLabel> #include <QLabel>
#include <QSpacerItem> #include <QSpacerItem>
#include <QRandomGenerator> #include <QRandomGenerator>
@@ -35,7 +33,7 @@ StripsGrid::StripsGrid(QWidget *parent) :
int row{0}; int row{0};
{ {
int column{0}; int column{0};
for (const auto text : {"Story", "To Do:", "In Progress:", "In Review:", "Done:"}) for (auto &header : m_tableHeader)
{ {
if (column) if (column)
{ {
@@ -45,14 +43,14 @@ StripsGrid::StripsGrid(QWidget *parent) :
m_layout->addWidget(line, row, column++, (stories*2)+1, 1); m_layout->addWidget(line, row, column++, (stories*2)+1, 1);
} }
auto label = new QLabel{text}; header = new QLabel;
{ {
auto font = label->font(); auto font = header->font();
font.setPointSize(24); font.setPointSize(20);
label->setFont(font); header->setFont(font);
} }
label->setFixedHeight(40); header->setFixedHeight(40);
m_layout->addWidget(label, row, column++); m_layout->addWidget(header, row, column++);
} }
} }
@@ -69,12 +67,10 @@ StripsGrid::StripsGrid(QWidget *parent) :
row++; row++;
int storyPoints{0};
Story story; 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->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++) for (int column = 0; column < 5; column++)
{ {
@@ -93,15 +89,10 @@ StripsGrid::StripsGrid(QWidget *parent) :
call_n_times(random.bounded(6), [&]() 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))); widget->setTitle(QString("ATC-%0").arg(random.bounded(1000, 5000)));
{ widget->setPoints(std::array<int, 5>{1,3,5,8,13}[random.bounded(5)]);
const auto points = std::array<int, 5>{1,3,5,8,13}[random.bounded(5)];
widget->setPoints(points);
storyPoints += points;
}
widget->setOwner(std::array<const char *, 5>{"DB", "KW", "BK", "MS", "AS"}[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.layout->addWidget(widget);
test.widgets.push_back(widget); test.widgets.push_back(widget);
}); });
@@ -110,13 +101,14 @@ StripsGrid::StripsGrid(QWidget *parent) :
} }
} }
story.widget->setPoints(storyPoints);
m_stories.push_back(story); m_stories.push_back(story);
row++; row++;
}); });
m_layout->addItem(new QSpacerItem{0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding}, ++row, 0, 1, 5); m_layout->addItem(new QSpacerItem{0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding}, ++row, 0, 1, 5);
updatePoints();
} }
void StripsGrid::mousePressEvent(QMouseEvent *event) void StripsGrid::mousePressEvent(QMouseEvent *event)
@@ -133,16 +125,15 @@ void StripsGrid::mousePressEvent(QMouseEvent *event)
if (subtaskWidget->startDragging(event->pos() - subtaskWidget->pos())) if (subtaskWidget->startDragging(event->pos() - subtaskWidget->pos()))
{ {
m_draggedWidget = subtaskWidget; 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->setTitle(m_draggedWidget->title());
m_dragWidget->setDescription(m_draggedWidget->description()); m_dragWidget->setDescription(m_draggedWidget->description());
m_dragWidget->setPoints(m_draggedWidget->points()); m_dragWidget->setPoints(m_draggedWidget->points());
m_dragWidget->setOwner(m_draggedWidget->owner()); m_dragWidget->setOwner(m_draggedWidget->owner());
m_dragWidget->setStyleSheet(m_draggedWidget->styleSheet()); m_dragWidget->setStyleSheet(m_draggedWidget->styleSheet());
m_dragWidget->move(m_draggedWidget->pos()); m_dragWidget->move(m_draggedWidget->pos());
m_dragWidget->setGraphicsEffect(new QGraphicsDropShadowEffect);
m_dragWidget->show(); m_dragWidget->show();
m_dragOffset = event->pos() - m_draggedWidget->pos(); m_dragOffset = event->pos() - m_draggedWidget->pos();
@@ -163,8 +154,9 @@ void StripsGrid::mouseReleaseEvent(QMouseEvent *event)
if (event->button() == Qt::LeftButton && if (event->button() == Qt::LeftButton &&
m_dragWidget) m_dragWidget)
{ {
m_draggedWidget->setGraphicsEffect(nullptr); m_draggedWidget->endDrag();
m_draggedWidget = nullptr; m_draggedWidget = nullptr;
m_dragWidget->deleteLater(); m_dragWidget->deleteLater();
m_dragWidget = nullptr; m_dragWidget = nullptr;
} }
@@ -210,6 +202,8 @@ void StripsGrid::mouseMoveEvent(QMouseEvent *event)
newColumn->layout->addWidget(m_draggedWidget); newColumn->layout->addWidget(m_draggedWidget);
newColumn->widgets.push_back(m_draggedWidget); newColumn->widgets.push_back(m_draggedWidget);
newColumn->layout->update(); newColumn->layout->update();
updatePoints();
} }
m_dragWidget->move(event->pos() - m_dragOffset); m_dragWidget->move(event->pos() - m_dragOffset);
@@ -217,3 +211,35 @@ void StripsGrid::mouseMoveEvent(QMouseEvent *event)
QWidget::mouseMoveEvent(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> #include <vector>
class QGridLayout; class QGridLayout;
class QLabel;
class StripWidget; class StripWidget;
class FlowLayout; class FlowLayout;
@@ -22,12 +23,16 @@ protected:
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
private: private:
void updatePoints();
QGridLayout *m_layout; QGridLayout *m_layout;
StripWidget *m_draggedWidget{}; StripWidget *m_draggedWidget{};
StripWidget *m_dragWidget{}; StripWidget *m_dragWidget{};
QPoint m_dragOffset; QPoint m_dragOffset;
std::array<QLabel*, 5> m_tableHeader;
struct Story { struct Story {
StripWidget *widget; StripWidget *widget;

View File

@@ -1,6 +1,9 @@
#include "stripwidget.h" #include "stripwidget.h"
#include "ui_stripwidget.h" #include "ui_stripwidget.h"
#include <QGraphicsDropShadowEffect>
#include <QGraphicsOpacityEffect>
StripWidget::StripWidget(QWidget *parent) : StripWidget::StripWidget(QWidget *parent) :
QFrame{parent}, QFrame{parent},
m_ui{std::make_unique<Ui::StripWidget>()} m_ui{std::make_unique<Ui::StripWidget>()}
@@ -12,6 +15,27 @@ StripWidget::StripWidget(QWidget *parent) :
setFixedSize(size()); 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; StripWidget::~StripWidget() = default;
bool StripWidget::startDragging(const QPoint &pos) const bool StripWidget::startDragging(const QPoint &pos) const
@@ -41,20 +65,30 @@ void StripWidget::setDescription(const QString &description)
int StripWidget::points() const int StripWidget::points() const
{ {
return m_ui->points->text().toInt(); return m_ui->points->value();
} }
void StripWidget::setPoints(int points) void StripWidget::setPoints(int points)
{ {
m_ui->points->setText(QString::number(points)); m_ui->points->setValue(points);
} }
QString StripWidget::owner() const QString StripWidget::owner() const
{ {
return m_ui->owner->text(); return m_ui->owner->currentText();
} }
void StripWidget::setOwner(const QString &owner) 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 Q_OBJECT
public:
explicit StripWidget(QWidget *parent = nullptr); 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; ~StripWidget() override;
bool startDragging(const QPoint &pos) const; bool startDragging(const QPoint &pos) const;
@@ -28,6 +41,9 @@ public:
QString owner() const; QString owner() const;
void setOwner(const QString &owner); void setOwner(const QString &owner);
void beginDrag();
void endDrag();
private: private:
std::unique_ptr<Ui::StripWidget> m_ui; std::unique_ptr<Ui::StripWidget> m_ui;
}; };

View File

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