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"