diff --git a/app/widget/CMakeLists.txt b/app/widget/CMakeLists.txt
index 597a15b4c..50b200b1c 100644
--- a/app/widget/CMakeLists.txt
+++ b/app/widget/CMakeLists.txt
@@ -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)
diff --git a/app/widget/timelinewidget/CMakeLists.txt b/app/widget/timelinewidget/CMakeLists.txt
index a966cbb00..a5a54425c 100644
--- a/app/widget/timelinewidget/CMakeLists.txt
+++ b/app/widget/timelinewidget/CMakeLists.txt
@@ -14,9 +14,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+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
diff --git a/app/widget/timelineview/timelinescaledobject.cpp b/app/widget/timelinewidget/timelinescaledobject.cpp
similarity index 100%
rename from app/widget/timelineview/timelinescaledobject.cpp
rename to app/widget/timelinewidget/timelinescaledobject.cpp
diff --git a/app/widget/timelineview/timelinescaledobject.h b/app/widget/timelinewidget/timelinescaledobject.h
similarity index 100%
rename from app/widget/timelineview/timelinescaledobject.h
rename to app/widget/timelinewidget/timelinescaledobject.h
diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp
index 58eef54e1..eaf3374b5 100644
--- a/app/widget/timelinewidget/timelinewidget.cpp
+++ b/app/widget/timelinewidget/timelinewidget.cpp
@@ -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 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();
+}
diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h
index 00ba170c4..ad8068eb8 100644
--- a/app/widget/timelinewidget/timelinewidget.h
+++ b/app/widget/timelinewidget/timelinewidget.h
@@ -2,10 +2,11 @@
#define TIMELINEWIDGET_H
#include
+#include
#include
-#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 rubberband_already_selected_;
+
Tool* GetActiveTool();
QVector< std::shared_ptr > tools_;
diff --git a/app/widget/timelineview/tool/CMakeLists.txt b/app/widget/timelinewidget/tool/CMakeLists.txt
similarity index 65%
rename from app/widget/timelineview/tool/CMakeLists.txt
rename to app/widget/timelinewidget/tool/CMakeLists.txt
index 93d42e09d..88fd9e6e7 100644
--- a/app/widget/timelineview/tool/CMakeLists.txt
+++ b/app/widget/timelinewidget/tool/CMakeLists.txt
@@ -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
)
diff --git a/app/widget/timelineview/tool/hand.cpp b/app/widget/timelinewidget/tool/hand.cpp
similarity index 100%
rename from app/widget/timelineview/tool/hand.cpp
rename to app/widget/timelinewidget/tool/hand.cpp
diff --git a/app/widget/timelineview/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp
similarity index 100%
rename from app/widget/timelineview/tool/import.cpp
rename to app/widget/timelinewidget/tool/import.cpp
diff --git a/app/widget/timelineview/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp
similarity index 92%
rename from app/widget/timelineview/tool/pointer.cpp
rename to app/widget/timelinewidget/tool/pointer.cpp
index 8ddba61cb..2c1ded014 100644
--- a/app/widget/timelineview/tool/pointer.cpp
+++ b/app/widget/timelinewidget/tool/pointer.cpp
@@ -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);
}
diff --git a/app/widget/timelineview/tool/razor.cpp b/app/widget/timelinewidget/tool/razor.cpp
similarity index 100%
rename from app/widget/timelineview/tool/razor.cpp
rename to app/widget/timelinewidget/tool/razor.cpp
diff --git a/app/widget/timelineview/tool/ripple.cpp b/app/widget/timelinewidget/tool/ripple.cpp
similarity index 100%
rename from app/widget/timelineview/tool/ripple.cpp
rename to app/widget/timelinewidget/tool/ripple.cpp
diff --git a/app/widget/timelineview/tool/rolling.cpp b/app/widget/timelinewidget/tool/rolling.cpp
similarity index 100%
rename from app/widget/timelineview/tool/rolling.cpp
rename to app/widget/timelinewidget/tool/rolling.cpp
diff --git a/app/widget/timelineview/tool/slide.cpp b/app/widget/timelinewidget/tool/slide.cpp
similarity index 100%
rename from app/widget/timelineview/tool/slide.cpp
rename to app/widget/timelinewidget/tool/slide.cpp
diff --git a/app/widget/timelineview/tool/slip.cpp b/app/widget/timelinewidget/tool/slip.cpp
similarity index 100%
rename from app/widget/timelineview/tool/slip.cpp
rename to app/widget/timelinewidget/tool/slip.cpp
diff --git a/app/widget/timelineview/tool/tool.cpp b/app/widget/timelinewidget/tool/tool.cpp
similarity index 94%
rename from app/widget/timelineview/tool/tool.cpp
rename to app/widget/timelinewidget/tool/tool.cpp
index c7602a45a..dcf6db8f2 100644
--- a/app/widget/timelineview/tool/tool.cpp
+++ b/app/widget/timelinewidget/tool/tool.cpp
@@ -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 iterator(parent()->block_items_);
diff --git a/app/widget/timelineview/tool/zoom.cpp b/app/widget/timelinewidget/tool/zoom.cpp
similarity index 100%
rename from app/widget/timelineview/tool/zoom.cpp
rename to app/widget/timelinewidget/tool/zoom.cpp
diff --git a/app/widget/timelineview/undo/CMakeLists.txt b/app/widget/timelinewidget/undo/CMakeLists.txt
similarity index 91%
rename from app/widget/timelineview/undo/CMakeLists.txt
rename to app/widget/timelinewidget/undo/CMakeLists.txt
index 6232b7a44..e88f2279e 100644
--- a/app/widget/timelineview/undo/CMakeLists.txt
+++ b/app/widget/timelinewidget/undo/CMakeLists.txt
@@ -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
)
diff --git a/app/widget/timelineview/undo/undo.cpp b/app/widget/timelinewidget/undo/undo.cpp
similarity index 100%
rename from app/widget/timelineview/undo/undo.cpp
rename to app/widget/timelinewidget/undo/undo.cpp
diff --git a/app/widget/timelineview/undo/undo.h b/app/widget/timelinewidget/undo/undo.h
similarity index 100%
rename from app/widget/timelineview/undo/undo.h
rename to app/widget/timelinewidget/undo/undo.h
diff --git a/app/widget/timelineview/CMakeLists.txt b/app/widget/timelinewidget/view/CMakeLists.txt
similarity index 50%
rename from app/widget/timelineview/CMakeLists.txt
rename to app/widget/timelinewidget/view/CMakeLists.txt
index 2eb9e609f..fa09dae9f 100644
--- a/app/widget/timelineview/CMakeLists.txt
+++ b/app/widget/timelinewidget/view/CMakeLists.txt
@@ -14,26 +14,21 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-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
)
diff --git a/app/widget/timelineview/timelineplayhead.cpp b/app/widget/timelinewidget/view/timelineplayhead.cpp
similarity index 100%
rename from app/widget/timelineview/timelineplayhead.cpp
rename to app/widget/timelinewidget/view/timelineplayhead.cpp
diff --git a/app/widget/timelineview/timelineplayhead.h b/app/widget/timelinewidget/view/timelineplayhead.h
similarity index 100%
rename from app/widget/timelineview/timelineplayhead.h
rename to app/widget/timelinewidget/view/timelineplayhead.h
diff --git a/app/widget/timelineview/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp
similarity index 100%
rename from app/widget/timelineview/timelineview.cpp
rename to app/widget/timelinewidget/view/timelineview.cpp
diff --git a/app/widget/timelineview/timelineview.h b/app/widget/timelinewidget/view/timelineview.h
similarity index 98%
rename from app/widget/timelineview/timelineview.h
rename to app/widget/timelinewidget/view/timelineview.h
index 6e69f7b3c..0e8062e7b 100644
--- a/app/widget/timelineview/timelineview.h
+++ b/app/widget/timelinewidget/view/timelineview.h
@@ -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"
/**
diff --git a/app/widget/timelineview/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp
similarity index 97%
rename from app/widget/timelineview/timelineviewblockitem.cpp
rename to app/widget/timelinewidget/view/timelineviewblockitem.cpp
index 260dff321..854971598 100644
--- a/app/widget/timelineview/timelineviewblockitem.cpp
+++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp
@@ -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();
}
diff --git a/app/widget/timelineview/timelineviewblockitem.h b/app/widget/timelinewidget/view/timelineviewblockitem.h
similarity index 100%
rename from app/widget/timelineview/timelineviewblockitem.h
rename to app/widget/timelinewidget/view/timelineviewblockitem.h
diff --git a/app/widget/timelineview/timelineviewenditem.cpp b/app/widget/timelinewidget/view/timelineviewenditem.cpp
similarity index 100%
rename from app/widget/timelineview/timelineviewenditem.cpp
rename to app/widget/timelinewidget/view/timelineviewenditem.cpp
diff --git a/app/widget/timelineview/timelineviewenditem.h b/app/widget/timelinewidget/view/timelineviewenditem.h
similarity index 100%
rename from app/widget/timelineview/timelineviewenditem.h
rename to app/widget/timelinewidget/view/timelineviewenditem.h
diff --git a/app/widget/timelineview/timelineviewghostitem.cpp b/app/widget/timelinewidget/view/timelineviewghostitem.cpp
similarity index 100%
rename from app/widget/timelineview/timelineviewghostitem.cpp
rename to app/widget/timelinewidget/view/timelineviewghostitem.cpp
diff --git a/app/widget/timelineview/timelineviewghostitem.h b/app/widget/timelinewidget/view/timelineviewghostitem.h
similarity index 100%
rename from app/widget/timelineview/timelineviewghostitem.h
rename to app/widget/timelinewidget/view/timelineviewghostitem.h
diff --git a/app/widget/timelineview/timelineviewmouseevent.cpp b/app/widget/timelinewidget/view/timelineviewmouseevent.cpp
similarity index 100%
rename from app/widget/timelineview/timelineviewmouseevent.cpp
rename to app/widget/timelinewidget/view/timelineviewmouseevent.cpp
diff --git a/app/widget/timelineview/timelineviewmouseevent.h b/app/widget/timelinewidget/view/timelineviewmouseevent.h
similarity index 100%
rename from app/widget/timelineview/timelineviewmouseevent.h
rename to app/widget/timelinewidget/view/timelineviewmouseevent.h
diff --git a/app/widget/timelineview/timelineviewrect.cpp b/app/widget/timelinewidget/view/timelineviewrect.cpp
similarity index 100%
rename from app/widget/timelineview/timelineviewrect.cpp
rename to app/widget/timelinewidget/view/timelineviewrect.cpp
diff --git a/app/widget/timelineview/timelineviewrect.h b/app/widget/timelinewidget/view/timelineviewrect.h
similarity index 97%
rename from app/widget/timelineview/timelineviewrect.h
rename to app/widget/timelinewidget/view/timelineviewrect.h
index 4e891f10b..3916676e0 100644
--- a/app/widget/timelineview/timelineviewrect.h
+++ b/app/widget/timelinewidget/view/timelineviewrect.h
@@ -24,7 +24,7 @@
#include
#include "timeline/timelinecoordinate.h"
-#include "timelinescaledobject.h"
+#include "../timelinescaledobject.h"
/**
* @brief A base class for graphical representations of Block nodes
diff --git a/app/widget/timeruler/timeruler.h b/app/widget/timeruler/timeruler.h
index ebe0f9752..a68610c1a 100644
--- a/app/widget/timeruler/timeruler.h
+++ b/app/widget/timeruler/timeruler.h
@@ -25,7 +25,7 @@
#include
#include "common/rational.h"
-#include "widget/timelineview/timelineplayhead.h"
+#include "widget/timelinewidget/view/timelineplayhead.h"
class TimeRuler : public QWidget
{