reimplemented pointer default functionality

This commit is contained in:
itsmattkc
2019-10-12 06:37:53 +11:00
parent 937acd4c8c
commit 6f4e5a04e4
36 changed files with 146 additions and 63 deletions
-1
View File
@@ -26,7 +26,6 @@ add_subdirectory(projectexplorer)
add_subdirectory(projecttoolbar)
add_subdirectory(slider)
add_subdirectory(taskview)
add_subdirectory(timelineview)
add_subdirectory(timelinewidget)
add_subdirectory(timeruler)
add_subdirectory(toolbar)
+5
View File
@@ -14,9 +14,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(tool)
add_subdirectory(undo)
add_subdirectory(view)
set(OLIVE_SOURCES
${OLIVE_SOURCES}
widget/timelinewidget/timelinescaledobject.h
widget/timelinewidget/timelinescaledobject.cpp
widget/timelinewidget/timelinewidget.h
widget/timelinewidget/timelinewidget.cpp
PARENT_SCOPE
@@ -10,6 +10,7 @@
TimelineWidget::TimelineWidget(QWidget *parent) :
QWidget(parent),
rubberband_(QRubberBand::Rectangle, this),
timeline_node_(nullptr),
playhead_(0)
{
@@ -584,3 +585,52 @@ void TimelineWidget::AddGhost(TimelineViewGhostItem *ghost)
ghost_items_.append(ghost);
views_.at(ghost->Track().type())->scene()->addItem(ghost);
}
void TimelineWidget::StartRubberBandSelect(bool clear_current_selection)
{
rubberband_origin_ = QCursor::pos();
rubberband_.show();
if (!clear_current_selection) {
foreach (TimelineView* view, views_) {
rubberband_already_selected_.append(view->scene()->selectedItems());
}
}
MoveRubberBandSelect();
}
void TimelineWidget::MoveRubberBandSelect()
{
QPoint rubberband_now = QCursor::pos();
rubberband_.setGeometry(QRect(mapFromGlobal(rubberband_origin_), mapFromGlobal(rubberband_now)).normalized());
foreach (TimelineView* view, views_) {
view->DeselectAll();
// Map global mouse coordinates to viewport
QRect mapped_rect(view->viewport()->mapFromGlobal(rubberband_origin_),
view->viewport()->mapFromGlobal(rubberband_now));
// Normalize and get items in rect
QList<QGraphicsItem*> rubberband_items = view->items(mapped_rect.normalized());
// Select them all
foreach (QGraphicsItem* item, rubberband_items) {
item->setSelected(true);
}
}
foreach (QGraphicsItem* item, rubberband_already_selected_) {
item->setSelected(true);
}
}
void TimelineWidget::EndRubberBandSelect()
{
MoveRubberBandSelect();
rubberband_.hide();
rubberband_already_selected_.clear();
}
+11 -8
View File
@@ -2,10 +2,11 @@
#define TIMELINEWIDGET_H
#include <QScrollBar>
#include <QRubberBand>
#include <QWidget>
#include "widget/timelineview/timelinescaledobject.h"
#include "widget/timelineview/timelineview.h"
#include "widget/timelinewidget/timelinescaledobject.h"
#include "widget/timelinewidget/view/timelineview.h"
#include "widget/timeruler/timeruler.h"
/**
@@ -81,13 +82,9 @@ private:
const QGraphicsView::DragMode& drag_mode();
bool enable_default_behavior();
protected:
void set_drag_mode(const QGraphicsView::DragMode& mode);
void set_enable_default_behavior(bool enable);
/**
* @brief Retrieve the QGraphicsItem at a particular scene position
*
@@ -133,8 +130,6 @@ private:
QGraphicsView::DragMode drag_mode_;
bool enable_default_behavior_;
};
class PointerTool : public Tool
@@ -190,6 +185,7 @@ private:
bool movement_allowed_;
bool trimming_allowed_;
bool track_movement_allowed_;
bool rubberband_selecting_;
};
class ImportTool : public Tool
@@ -288,6 +284,13 @@ private:
virtual void MouseRelease(TimelineViewMouseEvent *event);
};
void StartRubberBandSelect(bool clear_current_selection);
void MoveRubberBandSelect();
void EndRubberBandSelect();
QRubberBand rubberband_;
QPoint rubberband_origin_;
QList<QGraphicsItem*> rubberband_already_selected_;
Tool* GetActiveTool();
QVector< std::shared_ptr<Tool> > tools_;
@@ -16,15 +16,15 @@
set(OLIVE_SOURCES
${OLIVE_SOURCES}
widget/timelineview/tool/hand.cpp
widget/timelineview/tool/import.cpp
widget/timelineview/tool/pointer.cpp
widget/timelineview/tool/razor.cpp
widget/timelineview/tool/ripple.cpp
widget/timelineview/tool/rolling.cpp
widget/timelineview/tool/slide.cpp
widget/timelineview/tool/slip.cpp
widget/timelineview/tool/tool.cpp
widget/timelineview/tool/zoom.cpp
widget/timelinewidget/tool/hand.cpp
widget/timelinewidget/tool/import.cpp
widget/timelinewidget/tool/pointer.cpp
widget/timelinewidget/tool/razor.cpp
widget/timelinewidget/tool/ripple.cpp
widget/timelinewidget/tool/rolling.cpp
widget/timelinewidget/tool/slide.cpp
widget/timelinewidget/tool/slip.cpp
widget/timelinewidget/tool/tool.cpp
widget/timelinewidget/tool/zoom.cpp
PARENT_SCOPE
)
@@ -35,24 +35,58 @@ TimelineWidget::PointerTool::PointerTool(TimelineWidget *parent) :
Tool(parent),
movement_allowed_(true),
trimming_allowed_(true),
track_movement_allowed_(true)
track_movement_allowed_(true),
rubberband_selecting_(false)
{
set_drag_mode(QGraphicsView::RubberBandDrag);
set_enable_default_behavior(true);
}
void TimelineWidget::PointerTool::MousePress(TimelineViewMouseEvent *event)
{
// We don't initiate dragging here since clicking could easily be just for selecting
Q_UNUSED(event)
// Main selection code
TimelineViewBlockItem* item = GetItemAtScenePos(event->GetCoordinates());
bool selectable_item = (item != nullptr && item->flags() & QGraphicsItem::ItemIsSelectable);
// If this item is already selected
if (selectable_item
&& item->isSelected()) {
// If shift is held, deselect it
if (event->GetModifiers() & Qt::ShiftModifier) {
item->setSelected(false);
}
// Otherwise do nothing
return;
}
// If not holding shift, deselect all clips
if (!(event->GetModifiers() & Qt::ShiftModifier)) {
parent()->DeselectAll();
}
if (selectable_item) {
// Select this item
item->setSelected(true);
} else {
// Start rubberband drag
parent()->StartRubberBandSelect(!(event->GetModifiers() & Qt::ShiftModifier));
rubberband_selecting_ = true;
}
}
void TimelineWidget::PointerTool::MouseMove(TimelineViewMouseEvent *event)
{
qDebug() << dragging_ << parent()->ghost_items_.isEmpty();
if (rubberband_selecting_) {
// Now that the cursor has moved, we will assume the intention is to drag
if (!dragging_) {
// Process rubberband select
parent()->MoveRubberBandSelect();
} else if (!dragging_) {
// Now that the cursor has moved, we will assume the intention is to drag
// If we haven't started dragging yet, we'll initiate a drag here
InitiateDrag(event->GetCoordinates());
@@ -70,6 +104,13 @@ void TimelineWidget::PointerTool::MouseMove(TimelineViewMouseEvent *event)
void TimelineWidget::PointerTool::MouseRelease(TimelineViewMouseEvent *event)
{
if (rubberband_selecting_) {
parent()->EndRubberBandSelect();
rubberband_selecting_ = false;
return;
}
if (!parent()->ghost_items_.isEmpty()) {
MouseReleaseInternal(event);
}
@@ -27,8 +27,7 @@
TimelineWidget::Tool::Tool(TimelineWidget *parent) :
dragging_(false),
parent_(parent),
drag_mode_(QGraphicsView::NoDrag),
enable_default_behavior_(false)
drag_mode_(QGraphicsView::NoDrag)
{
}
@@ -59,21 +58,11 @@ const QGraphicsView::DragMode &TimelineWidget::Tool::drag_mode()
return drag_mode_;
}
bool TimelineWidget::Tool::enable_default_behavior()
{
return enable_default_behavior_;
}
void TimelineWidget::Tool::set_drag_mode(const QGraphicsView::DragMode &mode)
{
drag_mode_ = mode;
}
void TimelineWidget::Tool::set_enable_default_behavior(bool enable)
{
enable_default_behavior_ = enable;
}
TimelineViewBlockItem *TimelineWidget::Tool::GetItemAtScenePos(const TimelineCoordinate& coord)
{
QMapIterator<Block*, TimelineViewBlockItem*> iterator(parent()->block_items_);
@@ -16,7 +16,7 @@
set(OLIVE_SOURCES
${OLIVE_SOURCES}
widget/timelineview/undo/undo.h
widget/timelineview/undo/undo.cpp
widget/timelinewidget/undo/undo.h
widget/timelinewidget/undo/undo.cpp
PARENT_SCOPE
)
@@ -14,26 +14,21 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(tool)
add_subdirectory(undo)
set(OLIVE_SOURCES
${OLIVE_SOURCES}
widget/timelineview/timelineplayhead.h
widget/timelineview/timelineplayhead.cpp
widget/timelineview/timelinescaledobject.h
widget/timelineview/timelinescaledobject.cpp
widget/timelineview/timelineview.h
widget/timelineview/timelineview.cpp
widget/timelineview/timelineviewmouseevent.h
widget/timelineview/timelineviewmouseevent.cpp
widget/timelineview/timelineviewrect.h
widget/timelineview/timelineviewrect.cpp
widget/timelineview/timelineviewblockitem.h
widget/timelineview/timelineviewblockitem.cpp
widget/timelineview/timelineviewenditem.h
widget/timelineview/timelineviewenditem.cpp
widget/timelineview/timelineviewghostitem.h
widget/timelineview/timelineviewghostitem.cpp
widget/timelinewidget/view/timelineplayhead.h
widget/timelinewidget/view/timelineplayhead.cpp
widget/timelinewidget/view/timelineview.h
widget/timelinewidget/view/timelineview.cpp
widget/timelinewidget/view/timelineviewmouseevent.h
widget/timelinewidget/view/timelineviewmouseevent.cpp
widget/timelinewidget/view/timelineviewrect.h
widget/timelinewidget/view/timelineviewrect.cpp
widget/timelinewidget/view/timelineviewblockitem.h
widget/timelinewidget/view/timelineviewblockitem.cpp
widget/timelinewidget/view/timelineviewenditem.h
widget/timelinewidget/view/timelineviewenditem.cpp
widget/timelinewidget/view/timelineviewghostitem.h
widget/timelinewidget/view/timelineviewghostitem.cpp
PARENT_SCOPE
)
@@ -34,7 +34,7 @@
#include "timelineviewmouseevent.h"
#include "timelineviewenditem.h"
#include "timelineviewghostitem.h"
#include "widget/timelineview/undo/undo.h"
#include "widget/timelinewidget/undo/undo.h"
#include "undo/undostack.h"
/**
@@ -31,7 +31,6 @@ TimelineViewBlockItem::TimelineViewBlockItem(QGraphicsItem* parent) :
block_(nullptr)
{
setBrush(Qt::white);
setFlag(QGraphicsItem::ItemIsSelectable, true);
}
Block *TimelineViewBlockItem::block()
@@ -43,6 +42,8 @@ void TimelineViewBlockItem::SetBlock(Block *block)
{
block_ = block;
setFlag(QGraphicsItem::ItemIsSelectable, block_->type() == Block::kClip);
UpdateRect();
}
@@ -24,7 +24,7 @@
#include <QGraphicsRectItem>
#include "timeline/timelinecoordinate.h"
#include "timelinescaledobject.h"
#include "../timelinescaledobject.h"
/**
* @brief A base class for graphical representations of Block nodes
+1 -1
View File
@@ -25,7 +25,7 @@
#include <QWidget>
#include "common/rational.h"
#include "widget/timelineview/timelineplayhead.h"
#include "widget/timelinewidget/view/timelineplayhead.h"
class TimeRuler : public QWidget
{