diff --git a/app/panel/node/node.cpp b/app/panel/node/node.cpp index 04516e272..d9be8e307 100644 --- a/app/panel/node/node.cpp +++ b/app/panel/node/node.cpp @@ -59,6 +59,16 @@ void NodePanel::DeleteSelected() node_view_->DeleteSelected(); } +void NodePanel::Select(const QList &nodes) +{ + node_view_->Select(nodes); +} + +void NodePanel::SelectWithDependencies(const QList &nodes) +{ + node_view_->SelectWithDependencies(nodes); +} + void NodePanel::Retranslate() { SetTitle(tr("Node Editor")); diff --git a/app/panel/node/node.h b/app/panel/node/node.h index e603ea73d..e84d9c7c8 100644 --- a/app/panel/node/node.h +++ b/app/panel/node/node.h @@ -40,6 +40,10 @@ public: virtual void DeleteSelected() override; +public slots: + void Select(const QList& nodes); + void SelectWithDependencies(const QList& nodes); + signals: /** * @brief Wrapper for NodeView::SelectionChanged() @@ -50,6 +54,7 @@ private: virtual void Retranslate() override; NodeView* node_view_; + }; #endif // NODEPANEL_H diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 348ed27f8..f995a9fcc 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -26,9 +26,12 @@ TimelinePanel::TimelinePanel(QWidget *parent) : // FIXME: This won't work if there's ever more than one of this panel setObjectName("TimelinePanel"); - SetTimeBasedWidget(new TimelineWidget()); + TimelineWidget* tw = new TimelineWidget(); + SetTimeBasedWidget(tw); Retranslate(); + + connect(tw, &TimelineWidget::SelectionChanged, this, &TimelinePanel::SelectionChanged); } void TimelinePanel::Clear() diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index df3a74bca..2cfcec671 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -58,6 +58,9 @@ public: protected: virtual void Retranslate() override; +signals: + void SelectionChanged(const QList& selected_blocks); + }; #endif // TIMELINE_PANEL_H diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 70780f27e..ff8d121ac 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -171,6 +171,44 @@ void NodeView::DeselectAll() } } +void NodeView::Select(const QList &nodes) +{ + DeselectAll(); + + foreach (Node* n, nodes) { + NodeViewItem* item = NodeToUIObject(n); + + if (item) { + item->setSelected(true); + } + } +} + +void NodeView::SelectWithDependencies(const QList &nodes) +{ + DeselectAll(); + + QList nodes_with_deps; + + foreach (Node* n, nodes) { + NodeViewItem* item = NodeToUIObject(n); + + if (item) { + item->setSelected(true); + } + + QList deps = n->GetDependencies(); + + foreach (Node* d, deps) { + item = NodeToUIObject(d); + + if (item) { + item->setSelected(true); + } + } + } +} + void NodeView::AddNode(Node* node) { NodeViewItem* item = new NodeViewItem(); diff --git a/app/widget/nodeview/nodeview.h b/app/widget/nodeview/nodeview.h index efc568fb9..6f4fc3ab2 100644 --- a/app/widget/nodeview/nodeview.h +++ b/app/widget/nodeview/nodeview.h @@ -85,6 +85,9 @@ public: void SelectAll(); void DeselectAll(); + void Select(const QList& nodes); + void SelectWithDependencies(const QList& nodes); + signals: /** * @brief Signal emitted when the selected nodes have changed diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 31c46adf1..fface9274 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -98,6 +98,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : connect(view, &TimelineView::DragMoved, this, &TimelineWidget::ViewDragMoved); connect(view, &TimelineView::DragLeft, this, &TimelineWidget::ViewDragLeft); connect(view, &TimelineView::DragDropped, this, &TimelineWidget::ViewDragDropped); + connect(view, &TimelineView::SelectionChanged, this, &TimelineWidget::ViewSelectionChanged); connect(tview->splitter(), &QSplitter::splitterMoved, this, &TimelineWidget::UpdateHorizontalSplitters); @@ -684,6 +685,18 @@ void TimelineWidget::RemoveTrack(TrackOutput *track) } } +void TimelineWidget::ViewSelectionChanged() +{ + QList selected_items = GetSelectedBlocks(); + QList selected_blocks; + + foreach (TimelineViewBlockItem* item, selected_items) { + selected_blocks.append(item->block()); + } + + emit SelectionChanged(selected_blocks); +} + void TimelineWidget::BlockChanged() { TimelineViewRect* rect = block_items_[static_cast(sender())]; diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 5db5dfca1..9c43b1d46 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -55,6 +55,9 @@ public: QList GetSelectedBlocks(); +signals: + void SelectionChanged(const QList& selected_blocks); + protected: virtual void resizeEvent(QResizeEvent *event) override; @@ -394,6 +397,8 @@ private slots: void AddTrack(TrackOutput* track, Timeline::TrackType type); void RemoveTrack(TrackOutput* track); + void ViewSelectionChanged(); + /** * @brief Slot for when a Block node changes its parameters and the graphics need to update * diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 0c2678714..17d78283c 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -45,6 +45,8 @@ TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : setContextMenuPolicy(Qt::CustomContextMenu); SetLimitYAxis(true); viewport()->setMouseTracking(true); + + connect(scene(), &QGraphicsScene::selectionChanged, this, &TimelineView::SelectionChanged); } void TimelineView::SelectAll() diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index e8ae80ad6..3f8517edc 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -70,6 +70,8 @@ signals: void DragLeft(QDragLeaveEvent* event); void DragDropped(TimelineViewMouseEvent* event); + void SelectionChanged(); + protected: virtual void mousePressEvent(QMouseEvent *event) override; virtual void mouseMoveEvent(QMouseEvent *event) override; diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 2c63dc655..3541dbd45 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -81,6 +81,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(timeline_panel_, &TimelinePanel::TimeChanged, param_panel_, &ParamPanel::SetTime); connect(timeline_panel_, &TimelinePanel::TimeChanged, viewer_panel_, &ViewerPanel::SetTime); connect(timeline_panel_, &TimelinePanel::TimeChanged, curve_panel_, &CurvePanel::SetTime); + connect(timeline_panel_, &TimelinePanel::SelectionChanged, node_panel_, &NodePanel::SelectWithDependencies); connect(viewer_panel_, &ViewerPanel::TimeChanged, param_panel_, &ParamPanel::SetTime); connect(viewer_panel_, &ViewerPanel::TimeChanged, timeline_panel_, &TimelinePanel::SetTime); connect(viewer_panel_, &ViewerPanel::TimeChanged, curve_panel_, &CurvePanel::SetTime);