diff --git a/SprintPlanningTool.pro b/SprintPlanningTool.pro index cdeadd1..1342669 100644 --- a/SprintPlanningTool.pro +++ b/SprintPlanningTool.pro @@ -6,6 +6,7 @@ DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 SOURCES += main.cpp \ chartperstory.cpp \ + chartperuser.cpp \ donutbreakdownchart.cpp \ flowlayout.cpp \ mainslice.cpp \ @@ -19,6 +20,7 @@ FORMS += \ HEADERS += \ chartperstory.h \ + chartperuser.h \ donutbreakdownchart.h \ flowlayout.h \ mainslice.h \ diff --git a/chartperuser.cpp b/chartperuser.cpp new file mode 100644 index 0000000..8a2f243 --- /dev/null +++ b/chartperuser.cpp @@ -0,0 +1,35 @@ +#include "chartperuser.h" + +#include +#include +#include + +QT_CHARTS_USE_NAMESPACE + +ChartPerUser::ChartPerUser(QWidget *parent) : + QChartView{parent} +{ + setRenderHint(QPainter::Antialiasing); +} + +void ChartPerUser::setPoints(const QMap &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; +} diff --git a/chartperuser.h b/chartperuser.h new file mode 100644 index 0000000..73e64bf --- /dev/null +++ b/chartperuser.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +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 &points); + +private: + QtCharts::QChart *m_chart{}; +}; diff --git a/mainwindow.cpp b/mainwindow.cpp index 3b002ea..6e85d55 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -8,7 +8,10 @@ MainWindow::MainWindow(QWidget *parent) : m_ui->setupUi(this); 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->chartPerUser->setPoints(m_ui->stripsGrid->pointsPerUser()); for (QDockWidget *dockWidget : findChildren()) { diff --git a/mainwindow.ui b/mainwindow.ui index 5064c26..7169a93 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -22,8 +22,8 @@ 0 0 - 739 - 558 + 734 + 544 @@ -34,7 +34,7 @@ 0 0 800 - 18 + 27 @@ -61,6 +61,12 @@ + + + 1 + + + &Quit @@ -79,6 +85,12 @@
chartperstory.h
1 + + ChartPerUser + QWidget +
chartperuser.h
+ 1 +
diff --git a/stripsgrid.cpp b/stripsgrid.cpp index 285e9b6..691e326 100644 --- a/stripsgrid.cpp +++ b/stripsgrid.cpp @@ -93,6 +93,7 @@ StripsGrid::StripsGrid(QWidget *parent) : widget->setPoints(std::array{1,3,5,8,13}[random.bounded(5)]); widget->setOwner(std::array{"DB", "KW", "BK", "MS", "AS"}[random.bounded(5)]); connect(widget, &StripWidget::pointsChanged, this, &StripsGrid::updatePoints); + connect(widget, &StripWidget::ownerChanged, this, &StripsGrid::updatePoints); test.layout->addWidget(widget); test.widgets.push_back(widget); }); @@ -211,6 +212,7 @@ void StripsGrid::updatePoints() { std::array sumsPerColumn{0,0,0,0,0}; m_pointsPerStory.clear(); + m_pointsPerUser.clear(); for (const auto &story : m_stories) { @@ -225,6 +227,8 @@ void StripsGrid::updatePoints() { columnSum += widget->points(); test[widget->title()] = widget->points(); + + m_pointsPerUser[widget->owner()] += widget->points(); } sumsPerColumn[i+1] += columnSum; storyPoints += columnSum; @@ -245,4 +249,5 @@ void StripsGrid::updatePoints() m_tableHeader[i]->setText(texts[i].arg(sumsPerColumn[i])); emit pointsPerStoryChanged(m_pointsPerStory); + emit pointsPerUserChanged(m_pointsPerUser); } diff --git a/stripsgrid.h b/stripsgrid.h index b56d95f..3c3d951 100644 --- a/stripsgrid.h +++ b/stripsgrid.h @@ -19,9 +19,11 @@ public: explicit StripsGrid(QWidget *parent = nullptr); const auto &pointsPerStory() const { return m_pointsPerStory; } + const auto &pointsPerUser() const { return m_pointsPerUser; } signals: void pointsPerStoryChanged(const QMap > &pointsPerStory); + void pointsPerUserChanged(const QMap &pointsPerUser); protected: void mousePressEvent(QMouseEvent *event) override; @@ -54,4 +56,5 @@ private: std::vector m_stories; QMap > m_pointsPerStory; + QMap m_pointsPerUser; }; diff --git a/stripwidget.cpp b/stripwidget.cpp index e171b24..8ce4e79 100644 --- a/stripwidget.cpp +++ b/stripwidget.cpp @@ -15,6 +15,7 @@ StripWidget::StripWidget(QWidget *parent) : setFixedSize(size()); 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) : diff --git a/stripwidget.h b/stripwidget.h index 204458e..b9ab642 100644 --- a/stripwidget.h +++ b/stripwidget.h @@ -46,6 +46,7 @@ public: signals: void pointsChanged(int points); + void ownerChanged(const QString &owner); private: std::unique_ptr m_ui;