From 1a7f821d82f42a87ee85f914baacf2ee83eb8fe2 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Tue, 19 Oct 2021 17:40:01 +0100 Subject: [PATCH] Make markers movable --- app/widget/marker/marker.cpp | 38 ++++++++++++++++++++++++- app/widget/marker/marker.h | 12 +++++++- app/widget/timeruler/seekablewidget.cpp | 3 ++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/app/widget/marker/marker.cpp b/app/widget/marker/marker.cpp index 1e3bb1269..ad571339f 100644 --- a/app/widget/marker/marker.cpp +++ b/app/widget/marker/marker.cpp @@ -35,7 +35,8 @@ namespace olive { Marker::Marker(QWidget *parent) : QWidget(parent), - active_(false) + active_(false), + dragging_(false) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); resize(7, 14); @@ -129,6 +130,36 @@ void Marker::mousePressEvent(QMouseEvent* e) update(); } + + click_position_ = e->globalPos(); + marker_start_x_ = x(); +} + +void Marker::mouseMoveEvent(QMouseEvent* e) +{ + if (active_) { + dragging_ = true; + + QPoint old_pos = mapToGlobal(pos()); + + int new_pos = marker_start_x_ + e->globalPos().x() - click_position_.x(); + + if (new_pos > -3 && new_pos < static_cast(parent())->width() - 3) { + this->move(new_pos-2, this->pos().y()); + repaint(); + } + } +} + +void Marker::mouseReleaseEvent(QMouseEvent* e) +{ + if (dragging_) { + rational time = static_cast(parent())->SceneToTime(this->x()+4); + time = time < 0.0 ? 0.0 : time; + emit TimeChanged(TimeRange(time, time)); + + dragging_ = false; + } } void Marker::ShowContextMenu() @@ -181,4 +212,9 @@ void Marker::SetName(QString s) update(); } +void Marker::SetTime(TimeRange time) +{ + move(static_cast(parent())->TimeToScene(time.in())-2, y()); +} + } // namespace olive diff --git a/app/widget/marker/marker.h b/app/widget/marker/marker.h index f86528450..b4b17ed67 100644 --- a/app/widget/marker/marker.h +++ b/app/widget/marker/marker.h @@ -26,6 +26,7 @@ #include #include "common/define.h" +#include "common/timerange.h" #include "widget/colorlabelmenu/colorlabelmenu.h" namespace olive { @@ -43,11 +44,13 @@ class Marker : public QWidget { void SetColor(int c); void SetActive(bool active); void SetName(QString s); + void SetTime(TimeRange t); protected: void paintEvent(QPaintEvent* event) override; virtual void mousePressEvent(QMouseEvent* event) override; - //virtual void mouseReleaseEvent(QMouseEvent* event) override; + virtual void mouseMoveEvent(QMouseEvent* event) override; + virtual void mouseReleaseEvent(QMouseEvent* event) override; //virtual void mouseDoubleClickEvent(QMouseEvent* event) override; signals: @@ -57,6 +60,7 @@ class Marker : public QWidget { void markerSelected(Marker* marker); void ActiveChanged(bool active); void NameChanged(QString name); + void TimeChanged(TimeRange time); private: @@ -66,6 +70,12 @@ class Marker : public QWidget { QString name_; + QPointF click_position_; + + int marker_start_x_; + + bool dragging_; + private slots: void ShowContextMenu(); }; diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 37b9cc823..3b052b842 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -213,6 +213,9 @@ void SeekableWidget::addMarker(TimelineMarker* marker) connect(marker_widget, &Marker::NameChanged, marker, &TimelineMarker::set_name); connect(marker, &TimelineMarker::NameChanged, marker_widget, &Marker::SetName); + connect(marker_widget, &Marker::TimeChanged, marker, &TimelineMarker::set_time); + connect(marker, &TimelineMarker::TimeChanged, marker_widget, &Marker::SetTime); + marker_widget->move(TimeToScreen(marker->time().in())-2, text_height_); marker_widget->SetColor(marker->color()); marker_widget->SetName(marker->name());