From 29d56a15830ec31762b799a1bb0315d3d86da34d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 16 Jun 2020 18:30:00 +1000 Subject: [PATCH] timeline: implemented UI indicator for tools like razor and edit --- app/widget/timelinewidget/timelinewidget.cpp | 7 ++ app/widget/timelinewidget/timelinewidget.h | 15 +++- app/widget/timelinewidget/tool/CMakeLists.txt | 1 + app/widget/timelinewidget/tool/beam.cpp | 35 ++++++++ app/widget/timelinewidget/tool/edit.cpp | 2 +- app/widget/timelinewidget/tool/razor.cpp | 2 +- .../timelinewidget/view/timelineview.cpp | 88 ++++++++++++++----- app/widget/timelinewidget/view/timelineview.h | 7 ++ 8 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 app/widget/timelinewidget/tool/beam.cpp diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index c011fa558..97f186cca 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -1241,6 +1241,13 @@ void TimelineWidget::UpdateViewTimebases() } } +void TimelineWidget::SetViewBeamCursor(const TimelineCoordinate &coord) +{ + foreach (TimelineAndTrackView* tview, views_) { + tview->view()->SetBeamCursor(coord); + } +} + void TimelineWidget::SetBlockLinksSelected(Block* block, bool selected) { TimelineViewBlockItem* link_item; diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index d8a6c0dc5..fad1da588 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -209,6 +209,15 @@ private: }; + class BeamTool : public Tool + { + public: + BeamTool(TimelineWidget *parent); + + virtual void HoverMove(TimelineViewMouseEvent *event) override; + + }; + class PointerTool : public Tool { public: @@ -327,7 +336,7 @@ private: }; - class EditTool : public Tool + class EditTool : public BeamTool { public: EditTool(TimelineWidget* parent); @@ -337,7 +346,7 @@ private: virtual void MouseRelease(TimelineViewMouseEvent *event) override; }; - class RazorTool : public Tool + class RazorTool : public BeamTool { public: RazorTool(TimelineWidget* parent); @@ -498,6 +507,8 @@ private: void UpdateViewTimebases(); + void SetViewBeamCursor(const TimelineCoordinate& coord); + private slots: void ViewMousePressed(TimelineViewMouseEvent* event); void ViewMouseMoved(TimelineViewMouseEvent* event); diff --git a/app/widget/timelinewidget/tool/CMakeLists.txt b/app/widget/timelinewidget/tool/CMakeLists.txt index 53b862a84..f14d4a8de 100644 --- a/app/widget/timelinewidget/tool/CMakeLists.txt +++ b/app/widget/timelinewidget/tool/CMakeLists.txt @@ -17,6 +17,7 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} widget/timelinewidget/tool/add.cpp + widget/timelinewidget/tool/beam.cpp widget/timelinewidget/tool/edit.cpp widget/timelinewidget/tool/import.cpp widget/timelinewidget/tool/pointer.cpp diff --git a/app/widget/timelinewidget/tool/beam.cpp b/app/widget/timelinewidget/tool/beam.cpp new file mode 100644 index 000000000..a04d14b9e --- /dev/null +++ b/app/widget/timelinewidget/tool/beam.cpp @@ -0,0 +1,35 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "widget/timelinewidget/timelinewidget.h" + +OLIVE_NAMESPACE_ENTER + +TimelineWidget::BeamTool::BeamTool(TimelineWidget *parent) : + Tool(parent) +{ +} + +void TimelineWidget::BeamTool::HoverMove(TimelineViewMouseEvent *event) +{ + parent()->SetViewBeamCursor(event->GetCoordinates(true)); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/widget/timelinewidget/tool/edit.cpp b/app/widget/timelinewidget/tool/edit.cpp index d7940f0c4..cb804bebc 100644 --- a/app/widget/timelinewidget/tool/edit.cpp +++ b/app/widget/timelinewidget/tool/edit.cpp @@ -23,7 +23,7 @@ OLIVE_NAMESPACE_ENTER TimelineWidget::EditTool::EditTool(TimelineWidget* parent) : - Tool(parent) + BeamTool(parent) { } diff --git a/app/widget/timelinewidget/tool/razor.cpp b/app/widget/timelinewidget/tool/razor.cpp index d89e9125d..298a36b3b 100644 --- a/app/widget/timelinewidget/tool/razor.cpp +++ b/app/widget/timelinewidget/tool/razor.cpp @@ -23,7 +23,7 @@ OLIVE_NAMESPACE_ENTER TimelineWidget::RazorTool::RazorTool(TimelineWidget* parent) : - Tool(parent) + BeamTool(parent) { } diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 91409bf94..2d3cc4511 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -141,21 +141,21 @@ void TimelineView::wheelEvent(QWheelEvent *event) } QWheelEvent e( -#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) - event->position(), - event->globalPosition(), -#else - event->pos(), - event->globalPos(), -#endif - event->pixelDelta(), - angle_delta, - event->buttons(), - event->modifiers(), - event->phase(), - event->inverted(), - event->source() - ); + #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + event->position(), + event->globalPosition(), + #else + event->pos(), + event->globalPos(), + #endif + event->pixelDelta(), + angle_delta, + event->buttons(), + event->modifiers(), + event->phase(), + event->inverted(), + event->source() + ); #else @@ -166,15 +166,15 @@ void TimelineView::wheelEvent(QWheelEvent *event) } QWheelEvent e( - event->pos(), - event->globalPos(), - event->pixelDelta(), - event->angleDelta(), - event->delta(), - orientation, - event->buttons(), - event->modifiers() - ); + event->pos(), + event->globalPos(), + event->pixelDelta(), + event->angleDelta(), + event->delta(), + orientation, + event->buttons(), + event->modifiers() + ); #endif QGraphicsView::wheelEvent(&e); @@ -244,6 +244,26 @@ void TimelineView::drawBackground(QPainter *painter, const QRectF &rect) } } +void TimelineView::drawForeground(QPainter *painter, const QRectF &rect) +{ + TimelineViewBase::drawForeground(painter, rect); + + if (show_beam_cursor_ + && connected_track_list_ + && cursor_coord_.GetTrack().type() == connected_track_list_->type() + && cursor_coord_.GetTrack().index() < connected_track_list_->GetTrackCount()) { + painter->setPen(Qt::gray); + + double cursor_x = TimeToScene(cursor_coord_.GetFrame()); + int track_index = cursor_coord_.GetTrack().index(); + + painter->drawLine(cursor_x, + GetTrackY(track_index), + cursor_x, + GetTrackHeight(track_index)); + } +} + void TimelineView::ToolChangedEvent(Tool::Item tool) { switch (tool) { @@ -261,6 +281,12 @@ void TimelineView::ToolChangedEvent(Tool::Item tool) default: unsetCursor(); } + + // Hide/show cursor if necessary + if (show_beam_cursor_) { + show_beam_cursor_ = false; + viewport()->update(); + } } void TimelineView::SceneRectUpdateEvent(QRectF &rect) @@ -399,6 +425,20 @@ void TimelineView::ConnectTrackList(TrackList *list) } } +void TimelineView::SetBeamCursor(const TimelineCoordinate &coord) +{ + bool update_required = true;/*(coord.GetTrack().type() == connected_track_list_->type() + || cursor_coord_.GetTrack().type() == connected_track_list_->type() + || !show_beam_cursor_);*/ + + show_beam_cursor_ = true; + cursor_coord_ = coord; + + if (update_required) { + viewport()->update(); + } +} + int TimelineView::SceneToTrack(double y) { int track = -1; diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index 53daceca0..4bacad401 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -61,6 +61,8 @@ public: void ConnectTrackList(TrackList* list); + void SetBeamCursor(const TimelineCoordinate& coord); + signals: void MousePressed(TimelineViewMouseEvent* event); void MouseMoved(TimelineViewMouseEvent* event); @@ -88,6 +90,7 @@ protected: virtual void dropEvent(QDropEvent *event) override; virtual void drawBackground(QPainter *painter, const QRectF &rect) override; + virtual void drawForeground(QPainter *painter, const QRectF &rect) override; virtual void ToolChangedEvent(Tool::Item tool) override; @@ -111,6 +114,10 @@ private: void UpdatePlayheadRect(); + bool show_beam_cursor_; + + TimelineCoordinate cursor_coord_; + TrackList* connected_track_list_; };