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(projecttoolbar)
add_subdirectory(slider) add_subdirectory(slider)
add_subdirectory(taskview) add_subdirectory(taskview)
add_subdirectory(timelineview)
add_subdirectory(timelinewidget) add_subdirectory(timelinewidget)
add_subdirectory(timeruler) add_subdirectory(timeruler)
add_subdirectory(toolbar) add_subdirectory(toolbar)
+5
View File
@@ -14,9 +14,14 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(tool)
add_subdirectory(undo)
add_subdirectory(view)
set(OLIVE_SOURCES set(OLIVE_SOURCES
${OLIVE_SOURCES} ${OLIVE_SOURCES}
widget/timelinewidget/timelinescaledobject.h
widget/timelinewidget/timelinescaledobject.cpp
widget/timelinewidget/timelinewidget.h widget/timelinewidget/timelinewidget.h
widget/timelinewidget/timelinewidget.cpp widget/timelinewidget/timelinewidget.cpp
PARENT_SCOPE PARENT_SCOPE
@@ -10,6 +10,7 @@
TimelineWidget::TimelineWidget(QWidget *parent) : TimelineWidget::TimelineWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
rubberband_(QRubberBand::Rectangle, this),
timeline_node_(nullptr), timeline_node_(nullptr),
playhead_(0) playhead_(0)
{ {
@@ -584,3 +585,52 @@ void TimelineWidget::AddGhost(TimelineViewGhostItem *ghost)
ghost_items_.append(ghost); ghost_items_.append(ghost);
views_.at(ghost->Track().type())->scene()->addItem(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 #define TIMELINEWIDGET_H
#include <QScrollBar> #include <QScrollBar>
#include <QRubberBand>
#include <QWidget> #include <QWidget>
#include "widget/timelineview/timelinescaledobject.h" #include "widget/timelinewidget/timelinescaledobject.h"
#include "widget/timelineview/timelineview.h" #include "widget/timelinewidget/view/timelineview.h"
#include "widget/timeruler/timeruler.h" #include "widget/timeruler/timeruler.h"
/** /**
@@ -81,13 +82,9 @@ private:
const QGraphicsView::DragMode& drag_mode(); const QGraphicsView::DragMode& drag_mode();
bool enable_default_behavior();
protected: protected:
void set_drag_mode(const QGraphicsView::DragMode& mode); void set_drag_mode(const QGraphicsView::DragMode& mode);
void set_enable_default_behavior(bool enable);
/** /**
* @brief Retrieve the QGraphicsItem at a particular scene position * @brief Retrieve the QGraphicsItem at a particular scene position
* *
@@ -133,8 +130,6 @@ private:
QGraphicsView::DragMode drag_mode_; QGraphicsView::DragMode drag_mode_;
bool enable_default_behavior_;
}; };
class PointerTool : public Tool class PointerTool : public Tool
@@ -190,6 +185,7 @@ private:
bool movement_allowed_; bool movement_allowed_;
bool trimming_allowed_; bool trimming_allowed_;
bool track_movement_allowed_; bool track_movement_allowed_;
bool rubberband_selecting_;
}; };
class ImportTool : public Tool class ImportTool : public Tool
@@ -288,6 +284,13 @@ private:
virtual void MouseRelease(TimelineViewMouseEvent *event); 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(); Tool* GetActiveTool();
QVector< std::shared_ptr<Tool> > tools_; QVector< std::shared_ptr<Tool> > tools_;
@@ -16,15 +16,15 @@
set(OLIVE_SOURCES set(OLIVE_SOURCES
${OLIVE_SOURCES} ${OLIVE_SOURCES}
widget/timelineview/tool/hand.cpp widget/timelinewidget/tool/hand.cpp
widget/timelineview/tool/import.cpp widget/timelinewidget/tool/import.cpp
widget/timelineview/tool/pointer.cpp widget/timelinewidget/tool/pointer.cpp
widget/timelineview/tool/razor.cpp widget/timelinewidget/tool/razor.cpp
widget/timelineview/tool/ripple.cpp widget/timelinewidget/tool/ripple.cpp
widget/timelineview/tool/rolling.cpp widget/timelinewidget/tool/rolling.cpp
widget/timelineview/tool/slide.cpp widget/timelinewidget/tool/slide.cpp
widget/timelineview/tool/slip.cpp widget/timelinewidget/tool/slip.cpp
widget/timelineview/tool/tool.cpp widget/timelinewidget/tool/tool.cpp
widget/timelineview/tool/zoom.cpp widget/timelinewidget/tool/zoom.cpp
PARENT_SCOPE PARENT_SCOPE
) )
@@ -35,24 +35,58 @@ TimelineWidget::PointerTool::PointerTool(TimelineWidget *parent) :
Tool(parent), Tool(parent),
movement_allowed_(true), movement_allowed_(true),
trimming_allowed_(true), trimming_allowed_(true),
track_movement_allowed_(true) track_movement_allowed_(true),
rubberband_selecting_(false)
{ {
set_drag_mode(QGraphicsView::RubberBandDrag); set_drag_mode(QGraphicsView::RubberBandDrag);
set_enable_default_behavior(true);
} }
void TimelineWidget::PointerTool::MousePress(TimelineViewMouseEvent *event) void TimelineWidget::PointerTool::MousePress(TimelineViewMouseEvent *event)
{ {
// We don't initiate dragging here since clicking could easily be just for selecting // Main selection code
Q_UNUSED(event)
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) 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 // Process rubberband select
if (!dragging_) { 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 // If we haven't started dragging yet, we'll initiate a drag here
InitiateDrag(event->GetCoordinates()); InitiateDrag(event->GetCoordinates());
@@ -70,6 +104,13 @@ void TimelineWidget::PointerTool::MouseMove(TimelineViewMouseEvent *event)
void TimelineWidget::PointerTool::MouseRelease(TimelineViewMouseEvent *event) void TimelineWidget::PointerTool::MouseRelease(TimelineViewMouseEvent *event)
{ {
if (rubberband_selecting_) {
parent()->EndRubberBandSelect();
rubberband_selecting_ = false;
return;
}
if (!parent()->ghost_items_.isEmpty()) { if (!parent()->ghost_items_.isEmpty()) {
MouseReleaseInternal(event); MouseReleaseInternal(event);
} }
@@ -27,8 +27,7 @@
TimelineWidget::Tool::Tool(TimelineWidget *parent) : TimelineWidget::Tool::Tool(TimelineWidget *parent) :
dragging_(false), dragging_(false),
parent_(parent), parent_(parent),
drag_mode_(QGraphicsView::NoDrag), drag_mode_(QGraphicsView::NoDrag)
enable_default_behavior_(false)
{ {
} }
@@ -59,21 +58,11 @@ const QGraphicsView::DragMode &TimelineWidget::Tool::drag_mode()
return 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) void TimelineWidget::Tool::set_drag_mode(const QGraphicsView::DragMode &mode)
{ {
drag_mode_ = mode; drag_mode_ = mode;
} }
void TimelineWidget::Tool::set_enable_default_behavior(bool enable)
{
enable_default_behavior_ = enable;
}
TimelineViewBlockItem *TimelineWidget::Tool::GetItemAtScenePos(const TimelineCoordinate& coord) TimelineViewBlockItem *TimelineWidget::Tool::GetItemAtScenePos(const TimelineCoordinate& coord)
{ {
QMapIterator<Block*, TimelineViewBlockItem*> iterator(parent()->block_items_); QMapIterator<Block*, TimelineViewBlockItem*> iterator(parent()->block_items_);
@@ -16,7 +16,7 @@
set(OLIVE_SOURCES set(OLIVE_SOURCES
${OLIVE_SOURCES} ${OLIVE_SOURCES}
widget/timelineview/undo/undo.h widget/timelinewidget/undo/undo.h
widget/timelineview/undo/undo.cpp widget/timelinewidget/undo/undo.cpp
PARENT_SCOPE PARENT_SCOPE
) )
@@ -14,26 +14,21 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
add_subdirectory(tool)
add_subdirectory(undo)
set(OLIVE_SOURCES set(OLIVE_SOURCES
${OLIVE_SOURCES} ${OLIVE_SOURCES}
widget/timelineview/timelineplayhead.h widget/timelinewidget/view/timelineplayhead.h
widget/timelineview/timelineplayhead.cpp widget/timelinewidget/view/timelineplayhead.cpp
widget/timelineview/timelinescaledobject.h widget/timelinewidget/view/timelineview.h
widget/timelineview/timelinescaledobject.cpp widget/timelinewidget/view/timelineview.cpp
widget/timelineview/timelineview.h widget/timelinewidget/view/timelineviewmouseevent.h
widget/timelineview/timelineview.cpp widget/timelinewidget/view/timelineviewmouseevent.cpp
widget/timelineview/timelineviewmouseevent.h widget/timelinewidget/view/timelineviewrect.h
widget/timelineview/timelineviewmouseevent.cpp widget/timelinewidget/view/timelineviewrect.cpp
widget/timelineview/timelineviewrect.h widget/timelinewidget/view/timelineviewblockitem.h
widget/timelineview/timelineviewrect.cpp widget/timelinewidget/view/timelineviewblockitem.cpp
widget/timelineview/timelineviewblockitem.h widget/timelinewidget/view/timelineviewenditem.h
widget/timelineview/timelineviewblockitem.cpp widget/timelinewidget/view/timelineviewenditem.cpp
widget/timelineview/timelineviewenditem.h widget/timelinewidget/view/timelineviewghostitem.h
widget/timelineview/timelineviewenditem.cpp widget/timelinewidget/view/timelineviewghostitem.cpp
widget/timelineview/timelineviewghostitem.h
widget/timelineview/timelineviewghostitem.cpp
PARENT_SCOPE PARENT_SCOPE
) )
@@ -34,7 +34,7 @@
#include "timelineviewmouseevent.h" #include "timelineviewmouseevent.h"
#include "timelineviewenditem.h" #include "timelineviewenditem.h"
#include "timelineviewghostitem.h" #include "timelineviewghostitem.h"
#include "widget/timelineview/undo/undo.h" #include "widget/timelinewidget/undo/undo.h"
#include "undo/undostack.h" #include "undo/undostack.h"
/** /**
@@ -31,7 +31,6 @@ TimelineViewBlockItem::TimelineViewBlockItem(QGraphicsItem* parent) :
block_(nullptr) block_(nullptr)
{ {
setBrush(Qt::white); setBrush(Qt::white);
setFlag(QGraphicsItem::ItemIsSelectable, true);
} }
Block *TimelineViewBlockItem::block() Block *TimelineViewBlockItem::block()
@@ -43,6 +42,8 @@ void TimelineViewBlockItem::SetBlock(Block *block)
{ {
block_ = block; block_ = block;
setFlag(QGraphicsItem::ItemIsSelectable, block_->type() == Block::kClip);
UpdateRect(); UpdateRect();
} }
@@ -24,7 +24,7 @@
#include <QGraphicsRectItem> #include <QGraphicsRectItem>
#include "timeline/timelinecoordinate.h" #include "timeline/timelinecoordinate.h"
#include "timelinescaledobject.h" #include "../timelinescaledobject.h"
/** /**
* @brief A base class for graphical representations of Block nodes * @brief A base class for graphical representations of Block nodes
+1 -1
View File
@@ -25,7 +25,7 @@
#include <QWidget> #include <QWidget>
#include "common/rational.h" #include "common/rational.h"
#include "widget/timelineview/timelineplayhead.h" #include "widget/timelinewidget/view/timelineplayhead.h"
class TimeRuler : public QWidget class TimeRuler : public QWidget
{ {