From edd52dd811dfe277bee54c17bfe0e648a17f5dff Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 26 May 2021 14:22:10 +1000 Subject: [PATCH] projectpanel: select nodes when items are selected in the project explorer --- app/panel/project/project.cpp | 1 + app/panel/project/project.h | 2 ++ .../projectexplorer/projectexplorer.cpp | 23 +++++++++++++++++++ app/widget/projectexplorer/projectexplorer.h | 4 ++++ app/window/mainwindow/mainwindow.cpp | 10 ++++++++ app/window/mainwindow/mainwindow.h | 2 ++ 6 files changed, 42 insertions(+) diff --git a/app/panel/project/project.cpp b/app/panel/project/project.cpp index e0f6fcfa3..dd0b2ced9 100644 --- a/app/panel/project/project.cpp +++ b/app/panel/project/project.cpp @@ -57,6 +57,7 @@ ProjectPanel::ProjectPanel(QWidget *parent) : explorer_ = new ProjectExplorer(this); layout->addWidget(explorer_); connect(explorer_, &ProjectExplorer::DoubleClickedItem, this, &ProjectPanel::ItemDoubleClickSlot); + connect(explorer_, &ProjectExplorer::SelectionChanged, this, &ProjectPanel::SelectionChanged); // Set toolbar's view to the explorer's view toolbar->SetView(explorer_->view_type()); diff --git a/app/panel/project/project.h b/app/panel/project/project.h index 2fb36ce8c..bfa23c455 100644 --- a/app/panel/project/project.h +++ b/app/panel/project/project.h @@ -66,6 +66,8 @@ public slots: signals: void ProjectNameChanged(); + void SelectionChanged(const QVector &selected); + private: virtual void Retranslate() override; diff --git a/app/widget/projectexplorer/projectexplorer.cpp b/app/widget/projectexplorer/projectexplorer.cpp index 49720bb0a..d653384f5 100644 --- a/app/widget/projectexplorer/projectexplorer.cpp +++ b/app/widget/projectexplorer/projectexplorer.cpp @@ -134,6 +134,7 @@ void ProjectExplorer::AddView(QAbstractItemView *view) view->setEditTriggers(QAbstractItemView::NoEditTriggers); connect(view, &QAbstractItemView::clicked, this, &ProjectExplorer::ItemClickedSlot); connect(view, &QAbstractItemView::doubleClicked, this, &ProjectExplorer::ItemDoubleClickedSlot); + connect(view->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ProjectExplorer::ViewSelectionChanged); connect(view, SIGNAL(DoubleClickedEmptyArea()), this, SLOT(ViewEmptyAreaDoubleClickedSlot())); stacked_widget_->addWidget(view); } @@ -509,6 +510,28 @@ void ProjectExplorer::ContextMenuStartProxy(QAction *a) } } +void ProjectExplorer::ViewSelectionChanged() +{ + QItemSelectionModel *model = static_cast(sender()); + + QModelIndexList selection = model->selectedIndexes(); + + QVector nodes; + + foreach (const QModelIndex &index, selection) { + Node *sel = static_cast(sort_model_.mapToSource(index).internalPointer()); + if (!nodes.contains(sel)) { + nodes.append(sel); + } + } + + if (nodes.isEmpty()) { + nodes.append(get_root()); + } + + emit SelectionChanged(nodes); +} + Project *ProjectExplorer::project() const { return model_.project(); diff --git a/app/widget/projectexplorer/projectexplorer.h b/app/widget/projectexplorer/projectexplorer.h index c9e7caf61..83010ea94 100644 --- a/app/widget/projectexplorer/projectexplorer.h +++ b/app/widget/projectexplorer/projectexplorer.h @@ -100,6 +100,8 @@ signals: */ void DoubleClickedItem(Node* item); + void SelectionChanged(const QVector &selected); + private: /** * @brief Get all the blocks that solely rely on an input node @@ -185,6 +187,8 @@ private slots: void ContextMenuStartProxy(QAction* a); + void ViewSelectionChanged(); + }; } diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 8de1ae101..49f109fc0 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -475,6 +475,15 @@ void MainWindow::TimelinePanelSelectionChanged(const QVector &blocks) } } +void MainWindow::ProjectPanelSelectionChanged(const QVector &nodes) +{ + ProjectPanel *panel = static_cast(sender()); + + if (PanelManager::instance()->CurrentlyFocused(false) == panel) { + node_panel_->Select(nodes); + } +} + #ifdef Q_OS_LINUX void MainWindow::ShowNouveauWarning() { @@ -564,6 +573,7 @@ ProjectPanel *MainWindow::AppendProjectPanel() connect(panel, &PanelWidget::CloseRequested, this, &MainWindow::ProjectCloseRequested); connect(panel, &ProjectPanel::ProjectNameChanged, this, &MainWindow::UpdateTitle); + connect(panel, &ProjectPanel::SelectionChanged, this, &MainWindow::ProjectPanelSelectionChanged); return panel; } diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index fdead62a9..0e292571c 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -194,6 +194,8 @@ private slots: void TimelinePanelSelectionChanged(const QVector &blocks); + void ProjectPanelSelectionChanged(const QVector &nodes); + }; }