/** * @file StatsDialog.h * @brief Per-source statistics table + cycle-time histograms. * * Mirrors the ImGui StatsPanel: a metrics table (rate, lost, frags/bytes per * cycle, cycle ms avg/std/min/max) and a 20-bin cycle-time histogram per * source, drawn with a small QPainter bar widget. */ #pragma once #include "Protocol.h" #include class QTableWidget; class QVBoxLayout; namespace shq { class Hub; /** Small bar-chart widget for a 20-bin cycle-time histogram. */ class HistogramWidget : public QWidget { Q_OBJECT public: explicit HistogramWidget(QWidget* parent = nullptr); void setData(const StreamHubClient::SourceStats& st); QSize sizeHint() const override { return QSize(400, 120); } protected: void paintEvent(QPaintEvent*) override; private: double bins_[20] = {}; double min_ = 0.0, max_ = 0.0; bool valid_ = false; }; class StatsDialog : public QDialog { Q_OBJECT public: explicit StatsDialog(Hub* hub, QWidget* parent = nullptr); public Q_SLOTS: void refresh(); private: Hub* hub_; QTableWidget* table_ = nullptr; QVBoxLayout* histLay_ = nullptr; std::vector hists_; std::vector histBlocks_; }; } /* namespace shq */