Files
StarPilot/tools/cabana/videowidget.cc
T
Dean Lee f93f4e9f9b canbana: complete basic functions (#25965)
* add chart header

* get all signal val from logs

* loop in selected range

* clear list before append

* automatically zoom on yaxis

* cleanup

* sync charts

* fix event_begin_sec

* set the color of rubber

* add TODO

* sync slider with charts

* keep video aspect ratio

* sync plot buttons

* reduce flickers

* cleanup

* refactor detail view

* clear counters

* more

use qcamera
old-commit-hash: a6ba073231761e06ac6f070a01b434243d9d0693
2022-10-05 21:17:22 -07:00

90 lines
2.9 KiB
C++

#include "tools/cabana/videowidget.h"
#include <QButtonGroup>
#include <QDateTime>
#include <QHBoxLayout>
#include <QPushButton>
#include <QVBoxLayout>
#include "tools/cabana/parser.h"
inline QString formatTime(int seconds) {
return QDateTime::fromTime_t(seconds).toString(seconds > 60 * 60 ? "hh::mm::ss" : "mm::ss");
}
VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent) {
QVBoxLayout *main_layout = new QVBoxLayout(this);
cam_widget = new CameraViewWidget("camerad", VISION_STREAM_ROAD, false, this);
cam_widget->setFixedSize(parent->width(), parent->width() / 1.596);
main_layout->addWidget(cam_widget);
// slider controls
QHBoxLayout *slider_layout = new QHBoxLayout();
time_label = new QLabel("00:00");
slider_layout->addWidget(time_label);
slider = new QSlider(Qt::Horizontal, this);
QObject::connect(slider, &QSlider::sliderMoved, [=]() {
time_label->setText(formatTime(slider->value()));
});
slider->setSingleStep(1);
slider->setMaximum(parser->replay->totalSeconds());
QObject::connect(slider, &QSlider::sliderReleased, [=]() {
time_label->setText(formatTime(slider->value()));
parser->replay->seekTo(slider->value(), false);
});
slider_layout->addWidget(slider);
total_time_label = new QLabel(formatTime(parser->replay->totalSeconds()));
slider_layout->addWidget(total_time_label);
main_layout->addLayout(slider_layout);
// btn controls
QHBoxLayout *control_layout = new QHBoxLayout();
QPushButton *play = new QPushButton("");
play->setStyleSheet("font-weight:bold");
QObject::connect(play, &QPushButton::clicked, [=]() {
bool is_paused = parser->replay->isPaused();
play->setText(is_paused ? "" : "");
parser->replay->pause(!is_paused);
});
control_layout->addWidget(play);
QButtonGroup *group = new QButtonGroup(this);
group->setExclusive(true);
for (float speed : {0.1, 0.5, 1., 2.}) {
QPushButton *btn = new QPushButton(QString("%1x").arg(speed), this);
btn->setCheckable(true);
QObject::connect(btn, &QPushButton::clicked, [=]() { parser->replay->setSpeed(speed); });
control_layout->addWidget(btn);
group->addButton(btn);
if (speed == 1.0) btn->setChecked(true);
}
main_layout->addLayout(control_layout);
QObject::connect(parser, &Parser::rangeChanged, this, &VideoWidget::rangeChanged);
QObject::connect(parser, &Parser::updated, this, &VideoWidget::updateState);
}
void VideoWidget::rangeChanged(double min, double max) {
if (!parser->isZoomed()) {
min = 0;
max = parser->replay->totalSeconds();
}
time_label->setText(formatTime(min));
total_time_label->setText(formatTime(max));
slider->setMaximum(max);
slider->setValue(parser->currentSec());
}
void VideoWidget::updateState() {
if (!slider->isSliderDown()) {
int current_sec = parser->currentSec();
time_label->setText(formatTime(current_sec));
slider->setValue(current_sec);
}
}