diff --git a/app/panel/timebased/timebased.cpp b/app/panel/timebased/timebased.cpp index 44cc51281..b2fabbec9 100644 --- a/app/panel/timebased/timebased.cpp +++ b/app/panel/timebased/timebased.cpp @@ -211,4 +211,9 @@ void TimeBasedPanel::GoToOut() GetTimeBasedWidget()->GoToOut(); } +void TimeBasedPanel::DeleteSelected() +{ + GetTimeBasedWidget()->DeleteSelected(); +} + } diff --git a/app/panel/timebased/timebased.h b/app/panel/timebased/timebased.h index b85657e4d..380420bbc 100644 --- a/app/panel/timebased/timebased.h +++ b/app/panel/timebased/timebased.h @@ -98,6 +98,8 @@ public: virtual void GoToOut() override; + virtual void DeleteSelected() override; + public slots: void SetTimebase(const rational& timebase); diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 461d94f16..155ab050d 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -20,6 +20,8 @@ #include "timeline.h" +#include + #include "panel/panelmanager.h" #include "panel/project/footagemanagementpanel.h" diff --git a/app/widget/marker/marker.cpp b/app/widget/marker/marker.cpp index e7316d30f..1824578ca 100644 --- a/app/widget/marker/marker.cpp +++ b/app/widget/marker/marker.cpp @@ -31,7 +31,8 @@ namespace olive { Marker::Marker(QWidget *parent) : QWidget(parent), - marker_color_(7) //green FIXME: add default color to config + marker_color_(7), //green FIXME: add default color to config + active_(false) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setMinimumSize(20, 20); @@ -40,6 +41,16 @@ Marker::Marker(QWidget *parent) : connect(this, &Marker::customContextMenuRequested, this, &Marker::ShowContextMenu); } +void Marker::set_active(bool active) +{ + active_ = active; +} + +bool Marker::active() +{ + return active_; +} + void Marker::paintEvent(QPaintEvent *event) { QFontMetrics fm = fontMetrics(); @@ -54,7 +65,11 @@ void Marker::paintEvent(QPaintEvent *event) int x = half_width; //3 QPainter p(this); - p.setPen(Qt::black); + if (active_) { + p.setPen(Qt::white); + } else { + p.setPen(Qt::black); + } p.setBrush(ColorCoding::GetColor(marker_color_).toQColor()); p.setRenderHint(QPainter::Antialiasing); @@ -73,6 +88,15 @@ void Marker::paintEvent(QPaintEvent *event) p.drawPolygon(points, 6); } +void Marker::mousePressEvent(QMouseEvent* e) +{ + if (e->button() == Qt::LeftButton) { + active_ = !active_; + update(); + emit markerSelected(this); + } +} + void Marker::ShowContextMenu() { Menu m(this); @@ -81,6 +105,9 @@ void Marker::ShowContextMenu() { connect(&color_coding_menu, &ColorLabelMenu::ColorSelected, this, &Marker::ColorChanged); m.addMenu(&color_coding_menu); + m.addSeparator(); + MenuShared::instance()->AddItemsForEditMenu(&m, false); + m.exec(QCursor::pos()); } diff --git a/app/widget/marker/marker.h b/app/widget/marker/marker.h index cdb13b829..8d73e6a2a 100644 --- a/app/widget/marker/marker.h +++ b/app/widget/marker/marker.h @@ -22,6 +22,7 @@ #define MARKER_H #include +#include #include #include "common/define.h" @@ -34,11 +35,15 @@ class Marker : public QWidget { public: Marker(QWidget* parent = nullptr); + void set_active(bool active); + bool active(); + public slots: void SetColor(int c); protected: void paintEvent(QPaintEvent* event) override; + virtual void mousePressEvent(QMouseEvent* event) override; //virtual void mouseReleaseEvent(QMouseEvent* event) override; //virtual void mouseDoubleClickEvent(QMouseEvent* event) override; @@ -46,11 +51,14 @@ class Marker : public QWidget { //void MouseClicked(); //void MouseDoubleClicked(); void ColorChanged(int c); + void markerSelected(Marker* marker); private: int marker_color_; + bool active_; + private slots: void ShowContextMenu(); }; diff --git a/app/widget/timebased/timebasedwidget.cpp b/app/widget/timebased/timebasedwidget.cpp index d294ef466..7357b46c4 100644 --- a/app/widget/timebased/timebasedwidget.cpp +++ b/app/widget/timebased/timebasedwidget.cpp @@ -658,6 +658,13 @@ void TimeBasedWidget::GoToOut() } } +void TimeBasedWidget::DeleteSelected() +{ + if (ruler_->underMouse()) { + ruler_->DeleteSelected(); + } +} + TimeBasedWidget::MarkerAddCommand::MarkerAddCommand(Project *project, TimelineMarkerList *marker_list, const TimeRange &range, const QString &name) : project_(project), marker_list_(marker_list), diff --git a/app/widget/timebased/timebasedwidget.h b/app/widget/timebased/timebasedwidget.h index 2e479d84b..9e588dfe0 100644 --- a/app/widget/timebased/timebasedwidget.h +++ b/app/widget/timebased/timebasedwidget.h @@ -91,6 +91,8 @@ public slots: void GoToOut(); + void DeleteSelected(); + protected slots: void SetTimeAndSignal(const rational& t); diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index 297bf6558..1d72926f3 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -150,6 +150,18 @@ 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)); + } + } + + return active_markers; +} + void SeekableWidget::addMarker(TimelineMarker* marker) { if (!marker_map_.contains(marker)) { @@ -158,6 +170,7 @@ void SeekableWidget::addMarker(TimelineMarker* marker) connect(marker_widget, &Marker::ColorChanged, marker, &TimelineMarker::set_color); connect(marker, &TimelineMarker::ColorChanged, marker_widget, &Marker::SetColor); + connect(marker_widget, &Marker::markerSelected, this, &SeekableWidget::markerSelected); marker_widget->move(TimeToScreen(marker->time().in()), 20); marker_widget->SetColor(marker->color()); @@ -173,6 +186,16 @@ 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 949345df5..aa708a97c 100644 --- a/app/widget/timeruler/seekablewidget.h +++ b/app/widget/timeruler/seekablewidget.h @@ -53,6 +53,10 @@ public: return dragging_; } + virtual void DeleteSelected(){}; + + QMap GetActiveMarkers(); + public slots: void SetTime(const rational &r); @@ -62,6 +66,8 @@ public slots: void updateMarkerPositions(); + void markerSelected(Marker* marker); + protected: void SeekToScreenPoint(int screen); diff --git a/app/widget/timeruler/timeruler.cpp b/app/widget/timeruler/timeruler.cpp index db887fe7e..25ca69e82 100644 --- a/app/widget/timeruler/timeruler.cpp +++ b/app/widget/timeruler/timeruler.cpp @@ -83,6 +83,14 @@ void TimeRuler::SetPlaybackCache(PlaybackCache *cache) update(); } +void TimeRuler::DeleteSelected() +{ + foreach(TimelineMarker* marker, GetActiveMarkers().keys()) { + timeline_points()->markers()->RemoveMarker(marker); + GetActiveMarkers().value(marker)->deleteLater(); + } +} + void TimeRuler::paintEvent(QPaintEvent *) { // Nothing to paint if the timebase is invalid diff --git a/app/widget/timeruler/timeruler.h b/app/widget/timeruler/timeruler.h index 77a7b3b82..3c96df559 100644 --- a/app/widget/timeruler/timeruler.h +++ b/app/widget/timeruler/timeruler.h @@ -41,6 +41,8 @@ public: void SetPlaybackCache(PlaybackCache* cache); + virtual void DeleteSelected() override; + protected: virtual void paintEvent(QPaintEvent* e) override;