Files
MARTe-Integrated-Components/Client/streamhub-qt/HistoryBar.cpp
2026-06-26 09:11:10 +02:00

105 lines
3.1 KiB
C++

/**
* @file HistoryBar.cpp
*/
#include "HistoryBar.h"
#include "Hub.h"
#include "PlotGrid.h"
#include "Theme.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QDateTime>
namespace shq {
static double nowSec() {
return QDateTime::currentMSecsSinceEpoch() / 1000.0;
}
HistoryBar::HistoryBar(Hub* hub, PlotGrid* grid, QWidget* parent)
: QWidget(parent), hub_(hub), grid_(grid) {
auto* lay = new QHBoxLayout(this);
lay->setContentsMargins(6, 2, 6, 2);
lay->setSpacing(4);
auto* title = new QLabel("History", this);
title->setStyleSheet("color:#fab387; font-weight:bold;");
lay->addWidget(title);
auto* liveBtn = new QPushButton("Live", this);
connect(liveBtn, &QPushButton::clicked, this, [this]() {
grid_->goLive();
Q_EMIT liveRequested();
});
lay->addWidget(liveBtn);
rangeLbl_ = new QLabel("No range", this);
rangeLbl_->setStyleSheet("color:#a6adc8;");
rangeLbl_->setMinimumWidth(170);
lay->addWidget(rangeLbl_);
auto* left = new QPushButton("\u25c0", this); /* pan left */
left->setMaximumWidth(32);
connect(left, &QPushButton::clicked, this, [this]() { grid_->panAll(-0.75); });
lay->addWidget(left);
auto* right = new QPushButton("\u25b6", this); /* pan right */
right->setMaximumWidth(32);
connect(right, &QPushButton::clicked, this, [this]() { grid_->panAll(0.75); });
lay->addWidget(right);
/* Jump presets. */
static const double kJumpSec[] = {10, 30, 60, 300, 600, 1800, 3600};
static const char* kJumpLabel[] = {"10s","30s","1m","5m","10m","30m","1h"};
for (int j = 0; j < 7; j++) {
double sec = kJumpSec[j];
auto* b = new QPushButton(kJumpLabel[j], this);
b->setMaximumWidth(40);
connect(b, &QPushButton::clicked, this, [this, sec]() {
grid_->jumpAllAgo(sec);
});
lay->addWidget(b);
}
auto* allBtn = new QPushButton("All", this);
allBtn->setMaximumWidth(40);
connect(allBtn, &QPushButton::clicked, this, &HistoryBar::showAll);
lay->addWidget(allBtn);
lay->addStretch(1);
}
void HistoryBar::showAll() {
const auto& hi = hub_->historyInfo();
double t0 = 1e300, t1 = -1e300;
for (const auto& hs : hi.signals) {
if (hs.t0 < t0) { t0 = hs.t0; }
if (hs.t1 > t1) { t1 = hs.t1; }
}
if (t1 > t0) { grid_->setAllStoredX(t0, t1); }
}
void HistoryBar::updateReadout() {
double t0, t1;
if (!grid_->currentRange(t0, t1)) {
rangeLbl_->setText("Live");
return;
}
double span = t1 - t0;
double ago = nowSec() - t1;
QString s;
if (ago < 1.0) {
s = QString("%1 s span | now").arg(span, 0, 'g', 3);
} else if (ago < 60.0) {
s = QString("%1 s span | %2 s ago").arg(span, 0, 'g', 3).arg(ago, 0, 'f', 0);
} else if (ago < 3600.0) {
s = QString("%1 s span | %2 min ago").arg(span, 0, 'g', 3).arg(ago / 60.0, 0, 'f', 1);
} else {
s = QString("%1 s span | %2 h ago").arg(span, 0, 'g', 3).arg(ago / 3600.0, 0, 'f', 1);
}
rangeLbl_->setText(s);
}
} /* namespace shq */