Added per user chart

This commit is contained in:
2020-03-07 17:53:15 +01:00
parent a79718f244
commit eef6347078
9 changed files with 85 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000
SOURCES += main.cpp \ SOURCES += main.cpp \
chartperstory.cpp \ chartperstory.cpp \
chartperuser.cpp \
donutbreakdownchart.cpp \ donutbreakdownchart.cpp \
flowlayout.cpp \ flowlayout.cpp \
mainslice.cpp \ mainslice.cpp \
@@ -19,6 +20,7 @@ FORMS += \
HEADERS += \ HEADERS += \
chartperstory.h \ chartperstory.h \
chartperuser.h \
donutbreakdownchart.h \ donutbreakdownchart.h \
flowlayout.h \ flowlayout.h \
mainslice.h \ mainslice.h \

35
chartperuser.cpp Normal file
View File

@@ -0,0 +1,35 @@
#include "chartperuser.h"
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QGraphicsLayout>
QT_CHARTS_USE_NAMESPACE
ChartPerUser::ChartPerUser(QWidget *parent) :
QChartView{parent}
{
setRenderHint(QPainter::Antialiasing);
}
void ChartPerUser::setPoints(const QMap<QString, int> &points)
{
auto chart = new QChart;
chart->layout()->setContentsMargins(0, 0, 0, 0);
chart->setBackgroundRoundness(0);
chart->setTitle("Story points per owner");
chart->legend()->setAlignment(Qt::AlignBottom);
auto series = new QBarSeries();
for (auto iter = std::begin(points); iter != std::end(points); iter++)
{
auto set = new QBarSet(iter.key());
*set << iter.value();
series->append(set);
}
chart->addSeries(series);
setChart(chart);
delete m_chart;
m_chart = chart;
}

20
chartperuser.h Normal file
View File

@@ -0,0 +1,20 @@
#pragma once
#include <QtCharts/QChartView>
QT_CHARTS_BEGIN_NAMESPACE
class QChart;
QT_CHARTS_END_NAMESPACE
class ChartPerUser : public QtCharts::QChartView
{
Q_OBJECT
public:
explicit ChartPerUser(QWidget *parent = nullptr);
void setPoints(const QMap<QString, int> &points);
private:
QtCharts::QChart *m_chart{};
};

View File

@@ -8,7 +8,10 @@ MainWindow::MainWindow(QWidget *parent) :
m_ui->setupUi(this); m_ui->setupUi(this);
connect(m_ui->stripsGrid, &StripsGrid::pointsPerStoryChanged, m_ui->chartPerStory, &ChartPerStory::setPoints); connect(m_ui->stripsGrid, &StripsGrid::pointsPerStoryChanged, m_ui->chartPerStory, &ChartPerStory::setPoints);
connect(m_ui->stripsGrid, &StripsGrid::pointsPerUserChanged, m_ui->chartPerUser, &ChartPerUser::setPoints);
m_ui->chartPerStory->setPoints(m_ui->stripsGrid->pointsPerStory()); m_ui->chartPerStory->setPoints(m_ui->stripsGrid->pointsPerStory());
m_ui->chartPerUser->setPoints(m_ui->stripsGrid->pointsPerUser());
for (QDockWidget *dockWidget : findChildren<QDockWidget*>()) for (QDockWidget *dockWidget : findChildren<QDockWidget*>())
{ {

View File

@@ -22,8 +22,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>739</width> <width>734</width>
<height>558</height> <height>544</height>
</rect> </rect>
</property> </property>
</widget> </widget>
@@ -34,7 +34,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>18</height> <height>27</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menu_File"> <widget class="QMenu" name="menu_File">
@@ -61,6 +61,12 @@
</attribute> </attribute>
<widget class="ChartPerStory" name="chartPerStory"/> <widget class="ChartPerStory" name="chartPerStory"/>
</widget> </widget>
<widget class="QDockWidget" name="dockWidget_2">
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="ChartPerUser" name="chartPerUser"/>
</widget>
<action name="action_Quit"> <action name="action_Quit">
<property name="text"> <property name="text">
<string>&amp;Quit</string> <string>&amp;Quit</string>
@@ -79,6 +85,12 @@
<header>chartperstory.h</header> <header>chartperstory.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>ChartPerUser</class>
<extends>QWidget</extends>
<header>chartperuser.h</header>
<container>1</container>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections> <connections>

View File

@@ -93,6 +93,7 @@ StripsGrid::StripsGrid(QWidget *parent) :
widget->setPoints(std::array<int, 5>{1,3,5,8,13}[random.bounded(5)]); 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->setOwner(std::array<const char *, 5>{"DB", "KW", "BK", "MS", "AS"}[random.bounded(5)]);
connect(widget, &StripWidget::pointsChanged, this, &StripsGrid::updatePoints); connect(widget, &StripWidget::pointsChanged, this, &StripsGrid::updatePoints);
connect(widget, &StripWidget::ownerChanged, this, &StripsGrid::updatePoints);
test.layout->addWidget(widget); test.layout->addWidget(widget);
test.widgets.push_back(widget); test.widgets.push_back(widget);
}); });
@@ -211,6 +212,7 @@ void StripsGrid::updatePoints()
{ {
std::array<int, 5> sumsPerColumn{0,0,0,0,0}; std::array<int, 5> sumsPerColumn{0,0,0,0,0};
m_pointsPerStory.clear(); m_pointsPerStory.clear();
m_pointsPerUser.clear();
for (const auto &story : m_stories) for (const auto &story : m_stories)
{ {
@@ -225,6 +227,8 @@ void StripsGrid::updatePoints()
{ {
columnSum += widget->points(); columnSum += widget->points();
test[widget->title()] = widget->points(); test[widget->title()] = widget->points();
m_pointsPerUser[widget->owner()] += widget->points();
} }
sumsPerColumn[i+1] += columnSum; sumsPerColumn[i+1] += columnSum;
storyPoints += columnSum; storyPoints += columnSum;
@@ -245,4 +249,5 @@ void StripsGrid::updatePoints()
m_tableHeader[i]->setText(texts[i].arg(sumsPerColumn[i])); m_tableHeader[i]->setText(texts[i].arg(sumsPerColumn[i]));
emit pointsPerStoryChanged(m_pointsPerStory); emit pointsPerStoryChanged(m_pointsPerStory);
emit pointsPerUserChanged(m_pointsPerUser);
} }

View File

@@ -19,9 +19,11 @@ public:
explicit StripsGrid(QWidget *parent = nullptr); explicit StripsGrid(QWidget *parent = nullptr);
const auto &pointsPerStory() const { return m_pointsPerStory; } const auto &pointsPerStory() const { return m_pointsPerStory; }
const auto &pointsPerUser() const { return m_pointsPerUser; }
signals: signals:
void pointsPerStoryChanged(const QMap<QString, QMap<QString, int> > &pointsPerStory); void pointsPerStoryChanged(const QMap<QString, QMap<QString, int> > &pointsPerStory);
void pointsPerUserChanged(const QMap<QString, int> &pointsPerUser);
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
@@ -54,4 +56,5 @@ private:
std::vector<Story> m_stories; std::vector<Story> m_stories;
QMap<QString, QMap<QString, int> > m_pointsPerStory; QMap<QString, QMap<QString, int> > m_pointsPerStory;
QMap<QString, int> m_pointsPerUser;
}; };

View File

@@ -15,6 +15,7 @@ StripWidget::StripWidget(QWidget *parent) :
setFixedSize(size()); setFixedSize(size());
connect(m_ui->points, &QSpinBox::valueChanged, this, &StripWidget::pointsChanged); connect(m_ui->points, &QSpinBox::valueChanged, this, &StripWidget::pointsChanged);
connect(m_ui->owner, &QComboBox::currentText, this, &StripWidget::ownerChanged);
} }
StripWidget::StripWidget(StripWidget::Story_t, QWidget *parent) : StripWidget::StripWidget(StripWidget::Story_t, QWidget *parent) :

View File

@@ -46,6 +46,7 @@ public:
signals: signals:
void pointsChanged(int points); void pointsChanged(int points);
void ownerChanged(const QString &owner);
private: private:
std::unique_ptr<Ui::StripWidget> m_ui; std::unique_ptr<Ui::StripWidget> m_ui;