|
|
|
@ -4,7 +4,9 @@ |
|
|
|
|
#include <QDateTime> |
|
|
|
|
#include <QHBoxLayout> |
|
|
|
|
#include <QMouseEvent> |
|
|
|
|
#include <QPainter> |
|
|
|
|
#include <QPushButton> |
|
|
|
|
#include <QTimer> |
|
|
|
|
#include <QVBoxLayout> |
|
|
|
|
|
|
|
|
|
#include "tools/cabana/parser.h" |
|
|
|
@ -98,8 +100,50 @@ void VideoWidget::updateState() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Slider
|
|
|
|
|
// TODO: show timeline bar like what replay did.
|
|
|
|
|
Slider::Slider(QWidget *parent) : QSlider(Qt::Horizontal, parent) { |
|
|
|
|
QTimer *timer = new QTimer(this); |
|
|
|
|
timer->setInterval(2000); |
|
|
|
|
timer->callOnTimeout([this]() { timeline = parser->replay->getTimeline(); }); |
|
|
|
|
timer->start(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Slider::paintEvent(QPaintEvent *ev) { |
|
|
|
|
auto getPaintRange = [this](double begin, double end) -> std::pair<double, double> { |
|
|
|
|
double total_sec = maximum() - minimum(); |
|
|
|
|
int start_pos = ((std::max((double)minimum(), (double)begin) - minimum()) / total_sec) * width(); |
|
|
|
|
int end_pos = ((std::min((double)maximum(), (double)end) - minimum()) / total_sec) * width(); |
|
|
|
|
return {start_pos, end_pos}; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
QPainter p(this); |
|
|
|
|
const int v_margin = 2; |
|
|
|
|
p.fillRect(rect().adjusted(0, v_margin, 0, -v_margin), QColor(0, 0, 128)); |
|
|
|
|
|
|
|
|
|
for (auto [begin, end, type] : timeline) { |
|
|
|
|
if (begin > maximum() || end < minimum()) continue; |
|
|
|
|
|
|
|
|
|
if (type == TimelineType::Engaged) { |
|
|
|
|
auto [start_pos, end_pos] = getPaintRange(begin, end); |
|
|
|
|
p.fillRect(QRect(start_pos, v_margin, end_pos - start_pos, height() - v_margin * 2), QColor(0, 135, 0)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (auto [begin, end, type] : timeline) { |
|
|
|
|
if (type == TimelineType::Engaged || begin > maximum() || end < minimum()) continue; |
|
|
|
|
|
|
|
|
|
auto [start_pos, end_pos] = getPaintRange(begin, end); |
|
|
|
|
if (type == TimelineType::UserFlag) { |
|
|
|
|
p.fillRect(QRect(start_pos, height() - v_margin - 3, end_pos - start_pos, 3), Qt::white); |
|
|
|
|
} else { |
|
|
|
|
QColor color(Qt::green); |
|
|
|
|
if (type != TimelineType::AlertInfo) |
|
|
|
|
color = type == TimelineType::AlertWarning ? Qt::yellow : Qt::red; |
|
|
|
|
|
|
|
|
|
p.fillRect(QRect(start_pos, height() - v_margin - 3, end_pos - start_pos, 3), color); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
p.setPen(QPen(Qt::black, 2)); |
|
|
|
|
qreal x = width() * ((value() - minimum()) / double(maximum() - minimum())); |
|
|
|
|
p.drawLine(QPointF{x, 0.}, QPointF{x, (qreal)height()}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Slider::mousePressEvent(QMouseEvent *e) { |
|
|
|
|