Implemented recalculating of story points
This commit is contained in:
@@ -63,7 +63,7 @@ QLayoutItem *FlowLayout::takeAt(int index)
|
||||
|
||||
Qt::Orientations FlowLayout::expandingDirections() const
|
||||
{
|
||||
return 0;
|
||||
return Qt::Orientations{0};
|
||||
}
|
||||
|
||||
bool FlowLayout::hasHeightForWidth() const
|
||||
|
@@ -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]));
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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;
|
||||
};
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user