File indexing completed on 2024-05-19 05:44:24

0001 /*
0002     SPDX-FileCopyrightText: 2015-2017 Milian Wolff <mail@milianw.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "histogramwidget.h"
0008 
0009 #include <QSortFilterProxyModel>
0010 #include <QVBoxLayout>
0011 
0012 #include <KChartBarDiagram>
0013 #include <KChartChart>
0014 
0015 #include <KChartBackgroundAttributes>
0016 #include <KChartCartesianCoordinatePlane>
0017 #include <KChartDataValueAttributes>
0018 #include <KChartFrameAttributes.h>
0019 #include <KChartGridAttributes>
0020 #include <KChartHeaderFooter>
0021 #include <KChartLegend>
0022 
0023 #include <KColorScheme>
0024 #include <KLocalizedString>
0025 
0026 #include "histogrammodel.h"
0027 #include "util.h"
0028 
0029 using namespace KChart;
0030 
0031 namespace {
0032 class SizeAxis : public CartesianAxis
0033 {
0034     Q_OBJECT
0035 public:
0036     explicit SizeAxis(AbstractCartesianDiagram* diagram = nullptr)
0037         : CartesianAxis(diagram)
0038     {
0039     }
0040 
0041     const QString customizedLabel(const QString& label) const override
0042     {
0043         return Util::formatBytes(label.toLongLong());
0044     }
0045 };
0046 
0047 class HistogramProxy : public QSortFilterProxyModel
0048 {
0049     Q_OBJECT
0050 public:
0051     explicit HistogramProxy(bool showTotal, QObject* parent = nullptr)
0052         : QSortFilterProxyModel(parent)
0053         , m_showTotal(showTotal)
0054     {
0055     }
0056     virtual ~HistogramProxy() = default;
0057 
0058 protected:
0059     bool filterAcceptsColumn(int sourceColumn, const QModelIndex& /*sourceParent*/) const override
0060     {
0061         if (m_showTotal) {
0062             return sourceColumn == 0;
0063         } else {
0064             return sourceColumn != 0;
0065         }
0066     }
0067 
0068 private:
0069     bool m_showTotal;
0070 };
0071 }
0072 
0073 HistogramWidget::HistogramWidget(QWidget* parent)
0074     : QWidget(parent)
0075     , m_chart(new KChart::Chart(this))
0076     , m_total(new BarDiagram(this))
0077     , m_detailed(new BarDiagram(this))
0078 {
0079     auto layout = new QVBoxLayout(this);
0080     layout->addWidget(m_chart);
0081     setLayout(layout);
0082 
0083     auto* coordinatePlane = dynamic_cast<CartesianCoordinatePlane*>(m_chart->coordinatePlane());
0084     Q_ASSERT(coordinatePlane);
0085 
0086     {
0087         m_total->setAntiAliasing(true);
0088 
0089         KColorScheme scheme(QPalette::Active, KColorScheme::Window);
0090         QPen foreground(scheme.foreground().color());
0091         auto bottomAxis = new CartesianAxis(m_total);
0092         auto axisTextAttributes = bottomAxis->textAttributes();
0093         axisTextAttributes.setPen(foreground);
0094         bottomAxis->setTextAttributes(axisTextAttributes);
0095         auto axisTitleTextAttributes = bottomAxis->titleTextAttributes();
0096         axisTitleTextAttributes.setPen(foreground);
0097         bottomAxis->setTitleTextAttributes(axisTitleTextAttributes);
0098         bottomAxis->setPosition(KChart::CartesianAxis::Bottom);
0099         bottomAxis->setTitleText(i18n("Requested Allocation Size"));
0100         m_total->addAxis(bottomAxis);
0101 
0102         auto* rightAxis = new CartesianAxis(m_total);
0103         rightAxis->setTextAttributes(axisTextAttributes);
0104         rightAxis->setTitleTextAttributes(axisTitleTextAttributes);
0105         rightAxis->setTitleText(i18n("Number of Allocations"));
0106         rightAxis->setPosition(CartesianAxis::Right);
0107         m_total->addAxis(rightAxis);
0108 
0109         coordinatePlane->addDiagram(m_total);
0110 
0111         m_total->setType(BarDiagram::Normal);
0112     }
0113 
0114     {
0115         m_detailed->setAntiAliasing(true);
0116 
0117         coordinatePlane->addDiagram(m_detailed);
0118 
0119         m_detailed->setType(BarDiagram::Stacked);
0120     }
0121 }
0122 
0123 HistogramWidget::~HistogramWidget() = default;
0124 
0125 void HistogramWidget::setModel(QAbstractItemModel* model)
0126 {
0127     {
0128         auto proxy = new HistogramProxy(true, this);
0129         proxy->setSourceModel(model);
0130         m_total->setModel(proxy);
0131     }
0132     {
0133         auto proxy = new HistogramProxy(false, this);
0134         proxy->setSourceModel(model);
0135         m_detailed->setModel(proxy);
0136     }
0137 }
0138 
0139 #include "histogramwidget.moc"
0140 
0141 #include "moc_histogramwidget.cpp"