44 #include "QtHistogramWidget.hh"
51 QtHistogramWidget::QtHistogramWidget(QWidget *parent)
53 color_(QColor::fromRgbF(0.518, 0.573, 0.643, 1.0))
56 QtHistogramWidget::~QtHistogramWidget() =
default;
58 void QtHistogramWidget::setHistogram(std::unique_ptr<Histogram> histogram) {
59 histogram_ = std::move(histogram);
63 void QtHistogramWidget::setColorCoder(std::unique_ptr<IColorCoder> color_coder) {
64 color_coder_ = std::move(color_coder);
68 void QtHistogramWidget::paintEvent(QPaintEvent *event) {
70 QWidget::paintEvent(event);
77 const std::vector<size_t> &bins = histogram_->getBins();
78 const std::vector<double> &bin_widths = histogram_->getBinWidths();
79 const double total_width = histogram_->getTotalWidth();
81 const size_t hist_max = *std::max_element(bins.begin(), bins.end());
86 const qreal labelHeight = 16;
87 QRectF paint_rect = this->contentsRect();
88 QRectF bargraph_rect = paint_rect;
89 bargraph_rect.setBottom(bargraph_rect.bottom() - labelHeight);
90 QRectF label_rect = paint_rect;
91 label_rect.setTop(bargraph_rect.bottom());
92 QPainter painter(
this);
97 painter.setRenderHint(QPainter::Antialiasing);
98 painter.setFont(this->font());
100 const qreal avg_width = bargraph_rect.width() / bins.size();
101 const qreal gap = (avg_width > 8) ? 1.0 : 0.0;
102 const qreal label_gap = 4;
103 const qreal y_scale = bargraph_rect.height() / hist_max;
105 const qreal total_gap = (bins.size() - 1) * gap;
106 const qreal total_barwidth = bargraph_rect.width() - total_gap;
112 double cumulative_width = 0.0;
114 qreal lastLabelX = label_rect.left();
115 const size_t n_bins = bins.size();
116 for (
size_t idx = 0; idx < n_bins; ++idx) {
117 const double bin_width = bin_widths[idx];
118 const qreal bar_width = total_barwidth * (bin_width / total_width);
120 painter.setPen(Qt::NoPen);
122 const double t = (cumulative_width + bin_width/2) / total_width;
123 cumulative_width += bin_width;
125 painter.setBrush(getColor(t));
127 barRect.setWidth(bar_width - gap);
128 barRect.setHeight(y_scale * bins[idx]);
129 barRect.moveBottomLeft(bargraph_rect.bottomLeft() + QPoint(xpos, 0));
132 painter.drawRoundedRect(barRect, 3, 3, Qt::AbsoluteSize);
134 painter.drawRect(barRect);
137 painter.setPen(Qt::black);
140 switch (histogram_->getLabelType()) {
141 case Histogram::LabelType::PerBin:
142 labelX = barRect.center().x();
143 labelText = histogram_->getBinLabel(idx);
145 case Histogram::LabelType::PerBoundary:
146 labelX = barRect.x();
147 labelText = histogram_->getBoundaryLabel(idx);
150 QRectF labelBB = painter.boundingRect(
151 QRectF(labelX - (label_distance_/2), label_rect.y(),
152 label_distance_, label_rect.height()),
153 Qt::AlignHCenter | Qt::AlignBottom, labelText);
155 if (labelBB.left() >= lastLabelX + label_gap) {
156 painter.drawText(labelBB, Qt::AlignHCenter | Qt::AlignBottom,
158 lastLabelX = labelBB.right();
167 QColor QtHistogramWidget::getColor(
double val)
170 return color_coder_->color_qcolor(val);
Namespace providing different geometric functions concerning angles.