From d8101869b9cf784e2be78fcf6b01eb019524f182 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Mon, 16 Aug 2021 20:47:59 +0100 Subject: [PATCH] Redo marker selection code --- app/timeline/timelinemarker.cpp | 12 +++++++ app/timeline/timelinemarker.h | 7 ++++ app/widget/marker/marker.cpp | 23 ++++++++++--- app/widget/marker/marker.h | 3 +- app/widget/timeruler/seekablewidget.cpp | 46 +++++++++++++++---------- app/widget/timeruler/seekablewidget.h | 11 ++++-- app/widget/timeruler/timeruler.cpp | 4 +-- 7 files changed, 76 insertions(+), 30 deletions(-) diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index 11e5303dc..047afc779 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -66,6 +66,18 @@ void TimelineMarker::set_color(int c) emit ColorChanged(color_); } +bool TimelineMarker::active() +{ + return active_; +} + +void TimelineMarker::set_active(bool active) +{ + active_ = active; + + emit ActiveChanged(active_); +} + void TimelineMarkerList::Save(QXmlStreamWriter *writer) const { foreach (TimelineMarker* marker, markers_) { diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index be1c62b77..1c921a311 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -44,6 +44,9 @@ public: int color(); void set_color(int c); + bool active(); + void set_active(bool active); + signals: void TimeChanged(const TimeRange& time); @@ -51,6 +54,8 @@ signals: void ColorChanged(int c); + void ActiveChanged(bool active); + private: TimeRange time_; @@ -58,6 +63,8 @@ private: int color_; + bool active_; + }; class TimelineMarkerList : public QObject diff --git a/app/widget/marker/marker.cpp b/app/widget/marker/marker.cpp index 1824578ca..985d15b94 100644 --- a/app/widget/marker/marker.cpp +++ b/app/widget/marker/marker.cpp @@ -26,6 +26,7 @@ #include "ui/colorcoding.h" #include "widget/menu/menu.h" #include "widget/menu/menushared.h" +#include "widget/timeruler/seekablewidget.h" namespace olive { @@ -34,16 +35,18 @@ Marker::Marker(QWidget *parent) : marker_color_(7), //green FIXME: add default color to config active_(false) { - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - setMinimumSize(20, 20); + //setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + setMaximumSize(8, 20); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &Marker::customContextMenuRequested, this, &Marker::ShowContextMenu); } -void Marker::set_active(bool active) +void Marker::SetActive(bool active) { active_ = active; + + update(); } bool Marker::active() @@ -91,9 +94,19 @@ void Marker::paintEvent(QPaintEvent *event) void Marker::mousePressEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) { - active_ = !active_; + static_cast(parent())->SeekToScreenPoint(e->pos().x() + this->x()); + if (!active_) { + if (e->modifiers() != Qt::ShiftModifier) { + static_cast(parent())->DeselectAllMarkers(); + } + emit ActiveChanged(true); + } else { + if (e->modifiers() == Qt::ShiftModifier) { + emit ActiveChanged(false); + } + } + update(); - emit markerSelected(this); } } diff --git a/app/widget/marker/marker.h b/app/widget/marker/marker.h index 8d73e6a2a..cb23cc39a 100644 --- a/app/widget/marker/marker.h +++ b/app/widget/marker/marker.h @@ -35,11 +35,11 @@ class Marker : public QWidget { public: Marker(QWidget* parent = nullptr); - void set_active(bool active); bool active(); public slots: void SetColor(int c); + void SetActive(bool active); protected: void paintEvent(QPaintEvent* event) override; @@ -52,6 +52,7 @@ class Marker : public QWidget { //void MouseDoubleClicked(); void ColorChanged(int c); void markerSelected(Marker* marker); + void ActiveChanged(bool active); private: diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 1d72926f3..8b0eff063 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -99,6 +99,8 @@ void SeekableWidget::mousePressEvent(QMouseEvent *event) if (event->button() == Qt::LeftButton) { SeekToScreenPoint(event->pos().x()); dragging_ = true; + + DeselectAllMarkers(); } } @@ -150,16 +152,23 @@ void SeekableWidget::SetScroll(int s) update(); } -QMap SeekableWidget::GetActiveMarkers() { - QMap active_markers; - - foreach(TimelineMarker* marker, marker_map_.keys()) { - if (marker_map_.value(marker)->active()) { - active_markers.insert(marker, marker_map_.value(marker)); +QVector SeekableWidget::GetActiveTimelineMarkers() { + QVector active_timelineMarkers; + foreach (TimelineMarker *marker, timeline_points()->markers()->list()) { + if (marker->active()) { + active_timelineMarkers.append(marker); } } - return active_markers; + return active_timelineMarkers; +} + + +void SeekableWidget::DeselectAllMarkers() +{ + foreach(TimelineMarker* marker, timeline_points()->markers()->list()) { + marker->set_active(false); + } } void SeekableWidget::addMarker(TimelineMarker* marker) @@ -168,9 +177,11 @@ void SeekableWidget::addMarker(TimelineMarker* marker) Marker *marker_widget = new Marker(this); marker_map_.insert(marker, marker_widget); - connect(marker_widget, &Marker::ColorChanged, marker, &TimelineMarker::set_color); + connect(marker_widget, &Marker::ColorChanged, this, &SeekableWidget::SetMarkerColor); connect(marker, &TimelineMarker::ColorChanged, marker_widget, &Marker::SetColor); - connect(marker_widget, &Marker::markerSelected, this, &SeekableWidget::markerSelected); + + connect(marker_widget, &Marker::ActiveChanged, marker, &TimelineMarker::set_active); + connect(marker, &TimelineMarker::ActiveChanged, marker_widget, &Marker::SetActive); marker_widget->move(TimeToScreen(marker->time().in()), 20); marker_widget->SetColor(marker->color()); @@ -178,6 +189,13 @@ void SeekableWidget::addMarker(TimelineMarker* marker) } } +void SeekableWidget::SetMarkerColor(int c) +{ + foreach(TimelineMarker* marker, GetActiveTimelineMarkers()) { + marker->set_color(c); + } +} + void SeekableWidget::updateMarkerPositions() { foreach (TimelineMarker* marker, marker_map_.keys()) { @@ -186,16 +204,6 @@ void SeekableWidget::updateMarkerPositions() } } -void SeekableWidget::markerSelected(Marker* marker) -{ - foreach(Marker * marker_widget, marker_map_.values()) { - if (marker_widget != marker) { - marker_widget->set_active(false); - marker_widget->update(); - } - } -} - int SeekableWidget::TimeToScreen(const rational &time) const { return qFloor(TimeToScene(time)) - scroll_; diff --git a/app/widget/timeruler/seekablewidget.h b/app/widget/timeruler/seekablewidget.h index aa708a97c..ae0664d62 100644 --- a/app/widget/timeruler/seekablewidget.h +++ b/app/widget/timeruler/seekablewidget.h @@ -55,7 +55,11 @@ public: virtual void DeleteSelected(){}; - QMap GetActiveMarkers(); + QVector SeekableWidget::GetActiveTimelineMarkers(); + + void DeselectAllMarkers(); + + void SeekToScreenPoint(int screen); public slots: void SetTime(const rational &r); @@ -66,10 +70,9 @@ public slots: void updateMarkerPositions(); - void markerSelected(Marker* marker); + void SetMarkerColor(int c); protected: - void SeekToScreenPoint(int screen); virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; @@ -117,6 +120,8 @@ private: QMap marker_map_; + QMap active_markers_map_; + }; } diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index 25ca69e82..52b9c7891 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -85,9 +85,9 @@ void TimeRuler::SetPlaybackCache(PlaybackCache *cache) void TimeRuler::DeleteSelected() { - foreach(TimelineMarker* marker, GetActiveMarkers().keys()) { + foreach(TimelineMarker* marker, GetActiveTimelineMarkers()) { timeline_points()->markers()->RemoveMarker(marker); - GetActiveMarkers().value(marker)->deleteLater(); + //GetActiveMarkers().value(marker)->deleteLater(); } }