From dc56dc1d602a852acc0005b8af440296e94c372a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Sep 2020 21:50:55 +1000 Subject: [PATCH] nodeparamview: implemented pinning --- app/widget/nodeparamview/nodeparamview.cpp | 122 ++++++++++++++---- app/widget/nodeparamview/nodeparamview.h | 12 ++ .../nodeparamview/nodeparamviewitem.cpp | 41 +++--- app/widget/nodeparamview/nodeparamviewitem.h | 21 ++- 4 files changed, 150 insertions(+), 46 deletions(-) diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 5a9c50c64..a8c6f8d3b 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -108,8 +108,6 @@ NodeParamView::NodeParamView(QWidget *parent) : layout->addWidget(vertical_scrollbar_); // Connect scrollbars together - //connect(scroll_area->verticalScrollBar(), &QScrollBar::rangeChanged, vertical_scrollbar_, &QScrollBar::setRange); - //connect(scroll_area->verticalScrollBar(), &QScrollBar::rangeChanged, this, &NodeParamView::ForceKeyframeViewToScroll); connect(keyframe_view_->verticalScrollBar(), &QScrollBar::valueChanged, vertical_scrollbar_, &QScrollBar::setValue); connect(keyframe_view_->verticalScrollBar(), &QScrollBar::valueChanged, scroll_area->verticalScrollBar(), &QScrollBar::setValue); connect(scroll_area->verticalScrollBar(), &QScrollBar::valueChanged, vertical_scrollbar_, &QScrollBar::setValue); @@ -131,44 +129,68 @@ NodeParamView::NodeParamView(QWidget *parent) : void NodeParamView::SelectNodes(const QList &nodes) { + active_nodes_.append(nodes); + + bool changes_made = false; + foreach (Node* n, nodes) { - NodeParamViewItem* item = new NodeParamViewItem(n, param_widget_area_); + if (!pinned_nodes_.contains(n)) { + NodeParamViewItem* item = new NodeParamViewItem(n, param_widget_area_); - item->setAllowedAreas(Qt::LeftDockWidgetArea); - item->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); + item->setAllowedAreas(Qt::LeftDockWidgetArea); + item->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable); - connect(item, &NodeParamViewItem::KeyframeAdded, keyframe_view_, &KeyframeView::AddKeyframe); - connect(item, &NodeParamViewItem::KeyframeRemoved, keyframe_view_, &KeyframeView::RemoveKeyframe); - connect(item, &NodeParamViewItem::RequestSetTime, this, &NodeParamView::ItemRequestedTimeChanged); - connect(item, &NodeParamViewItem::InputDoubleClicked, this, &NodeParamView::InputDoubleClicked); - connect(item, &NodeParamViewItem::RequestSelectNode, this, &NodeParamView::RequestSelectNode); - connect(item, &NodeParamViewItem::dockLocationChanged, this, &NodeParamView::QueueKeyframePositionUpdate); + connect(item, &NodeParamViewItem::KeyframeAdded, keyframe_view_, &KeyframeView::AddKeyframe); + connect(item, &NodeParamViewItem::KeyframeRemoved, keyframe_view_, &KeyframeView::RemoveKeyframe); + connect(item, &NodeParamViewItem::RequestSetTime, this, &NodeParamView::ItemRequestedTimeChanged); + connect(item, &NodeParamViewItem::InputDoubleClicked, this, &NodeParamView::InputDoubleClicked); + connect(item, &NodeParamViewItem::RequestSelectNode, this, &NodeParamView::RequestSelectNode); + connect(item, &NodeParamViewItem::dockLocationChanged, this, &NodeParamView::QueueKeyframePositionUpdate); + connect(item, &NodeParamViewItem::dockLocationChanged, this, &NodeParamView::SignalNodeOrder); + connect(item, &NodeParamViewItem::PinToggled, this, &NodeParamView::PinNode); - // Set time target - item->SetTimeTarget(GetTimeTarget()); + // Set time target + item->SetTimeTarget(GetTimeTarget()); - items_.insert(n, item); - param_widget_area_->addDockWidget(Qt::LeftDockWidgetArea, item); + items_.insert(n, item); + param_widget_area_->addDockWidget(Qt::LeftDockWidgetArea, item); + + changes_made = true; + } } - UpdateItemTime(GetTimestamp()); + if (changes_made) { + UpdateItemTime(GetTimestamp()); - // Re-arrange keyframes - QueueKeyframePositionUpdate(); + // Re-arrange keyframes + QueueKeyframePositionUpdate(); + + SignalNodeOrder(); + } } void NodeParamView::DeselectNodes(const QList &nodes) { // Remove item from map and delete the widget - foreach (Node* n, nodes) { - // Remove all keyframes from this node - keyframe_view_->RemoveKeyframesOfNode(n); + bool changes_made = false; - delete items_.take(n); + foreach (Node* n, nodes) { + if (!pinned_nodes_.contains(n)) { + // Remove all keyframes from this node + RemoveNode(n); + + changes_made = true; + } + + active_nodes_.removeOne(n); } - // Re-arrange keyframes - QueueKeyframePositionUpdate(); + if (changes_made) { + // Re-arrange keyframes + QueueKeyframePositionUpdate(); + + SignalNodeOrder(); + } } void NodeParamView::resizeEvent(QResizeEvent *event) @@ -239,6 +261,42 @@ void NodeParamView::QueueKeyframePositionUpdate() QMetaObject::invokeMethod(this, "PlaceKeyframesOnView", Qt::QueuedConnection); } +void NodeParamView::SignalNodeOrder() +{ + // Sort by item Y (apparently there's no way in Qt to get the order of dock widgets) + QList nodes; + QList item_ys; + + for (auto it=items_.cbegin(); it!=items_.cend(); it++) { + int item_y = it.value()->pos().y(); + + bool inserted = false; + + for (int i=0; i item_y) { + item_ys.insert(i, item_y); + nodes.insert(i, it.key()); + inserted = true; + break; + } + } + + if (!inserted) { + item_ys.append(item_y); + nodes.append(it.key()); + } + } + + emit NodeOrderChanged(nodes); +} + +void NodeParamView::RemoveNode(Node *n) +{ + keyframe_view_->RemoveKeyframesOfNode(n); + + delete items_.take(n); +} + void NodeParamView::ItemRequestedTimeChanged(const rational &time) { SetTimeAndSignal(Timecode::time_to_timestamp(time, keyframe_view_->timebase())); @@ -259,4 +317,20 @@ void NodeParamView::PlaceKeyframesOnView() } } +void NodeParamView::PinNode(bool pin) +{ + NodeParamViewItem* item = static_cast(sender()); + Node* node = item->GetNode(); + + if (pin) { + pinned_nodes_.append(node); + } else { + pinned_nodes_.removeOne(node); + + if (!active_nodes_.contains(node)) { + RemoveNode(node); + } + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index 6abc18235..537482b4c 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -77,6 +77,8 @@ signals: void RequestSelectNode(const QList& target); + void NodeOrderChanged(const QList& nodes); + protected: virtual void resizeEvent(QResizeEvent *event) override; @@ -91,6 +93,10 @@ private: void QueueKeyframePositionUpdate(); + void SignalNodeOrder(); + + void RemoveNode(Node* n); + KeyframeView* keyframe_view_; QMap items_; @@ -105,6 +111,10 @@ private: // docking windows QMainWindow* param_widget_area_; + QList pinned_nodes_; + + QList active_nodes_; + private slots: void ItemRequestedTimeChanged(const rational& time); @@ -112,6 +122,8 @@ private slots: void PlaceKeyframesOnView(); + void PinNode(bool pin); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index 2c436f305..6fcb95b91 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -38,14 +38,6 @@ NodeParamViewItem::NodeParamViewItem(Node *node, QWidget *parent) : // Create title bar widget title_bar_ = new NodeParamViewItemTitleBar(this); - QHBoxLayout* title_bar_layout = new QHBoxLayout(title_bar_); - - title_bar_collapse_btn_ = new CollapseButton(); - title_bar_layout->addWidget(title_bar_collapse_btn_); - - title_bar_lbl_ = new QLabel(title_bar_); - title_bar_layout->addWidget(title_bar_lbl_); - // Add title bar to widget this->setTitleBarWidget(title_bar_); @@ -65,8 +57,8 @@ NodeParamViewItem::NodeParamViewItem(Node *node, QWidget *parent) : connect(body_, &NodeParamViewItemBody::RequestSetTime, this, &NodeParamViewItem::RequestSetTime); connect(body_, &NodeParamViewItemBody::KeyframeAdded, this, &NodeParamViewItem::KeyframeAdded); connect(body_, &NodeParamViewItemBody::KeyframeRemoved, this, &NodeParamViewItem::KeyframeRemoved); - connect(title_bar_collapse_btn_, &QPushButton::toggled, this, &NodeParamViewItem::SetExpanded); - connect(title_bar_, &NodeParamViewItemTitleBar::DoubleClicked, this, &NodeParamViewItem::ToggleExpanded); + connect(title_bar_, &NodeParamViewItemTitleBar::ExpandedStateChanged, this, &NodeParamViewItem::SetExpanded); + connect(title_bar_, &NodeParamViewItemTitleBar::PinToggled, this, &NodeParamViewItem::PinToggled); QWidget* body_container = new QWidget(); body_container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); @@ -122,9 +114,9 @@ void NodeParamViewItem::Retranslate() node_->Retranslate(); if (node_->GetLabel().isEmpty()) { - title_bar_lbl_->setText(node_->Name()); + title_bar_->SetText(node_->Name()); } else { - title_bar_lbl_->setText(tr("%1 (%2)").arg(node_->GetLabel(), node_->Name())); + title_bar_->SetText(tr("%1 (%2)").arg(node_->GetLabel(), node_->Name())); } body_->Retranslate(); @@ -133,8 +125,7 @@ void NodeParamViewItem::Retranslate() void NodeParamViewItem::SetExpanded(bool e) { body_->setVisible(e); - title_bar_->SetBorderVisible(e); - title_bar_collapse_btn_->setChecked(e); + title_bar_->SetExpanded(e); } bool NodeParamViewItem::IsExpanded() const @@ -151,11 +142,29 @@ NodeParamViewItemTitleBar::NodeParamViewItemTitleBar(QWidget *parent) : QWidget(parent), draw_border_(true) { + QHBoxLayout* layout = new QHBoxLayout(this); + + collapse_btn_ = new CollapseButton(); + connect(collapse_btn_, &QPushButton::clicked, this, &NodeParamViewItemTitleBar::ExpandedStateChanged); + layout->addWidget(collapse_btn_); + + lbl_ = new QLabel(); + layout->addWidget(lbl_); + + // Place next buttons on the far side + layout->addStretch(); + + QPushButton* pin_btn = new QPushButton(QStringLiteral("P")); + pin_btn->setCheckable(true); + pin_btn->setFixedSize(pin_btn->sizeHint().height(), pin_btn->sizeHint().height()); + layout->addWidget(pin_btn); + connect(pin_btn, &QPushButton::clicked, this, &NodeParamViewItemTitleBar::PinToggled); } -void NodeParamViewItemTitleBar::SetBorderVisible(bool e) +void NodeParamViewItemTitleBar::SetExpanded(bool e) { draw_border_ = e; + collapse_btn_->setChecked(e); update(); } @@ -178,7 +187,7 @@ void NodeParamViewItemTitleBar::mouseDoubleClickEvent(QMouseEvent *event) { QWidget::mouseDoubleClickEvent(event); - emit DoubleClicked(); + collapse_btn_->click(); } NodeParamViewItemBody::NodeParamViewItemBody(const QVector &inputs, QWidget *parent) : diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index e19fc0867..e97a150fd 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -43,10 +43,17 @@ class NodeParamViewItemTitleBar : public QWidget public: NodeParamViewItemTitleBar(QWidget* parent = nullptr); - void SetBorderVisible(bool e); + void SetExpanded(bool e); + + void SetText(const QString& s) + { + lbl_->setText(s); + } signals: - void DoubleClicked(); + void ExpandedStateChanged(bool e); + + void PinToggled(bool e); protected: virtual void paintEvent(QPaintEvent *event) override; @@ -56,6 +63,10 @@ protected: private: bool draw_border_; + QLabel* lbl_; + + CollapseButton* collapse_btn_; + }; class NodeParamViewItemBody : public QWidget { @@ -141,6 +152,8 @@ signals: void RequestSelectNode(const QList& node); + void PinToggled(bool e); + public slots: void SetExpanded(bool e); @@ -152,10 +165,6 @@ protected: private: NodeParamViewItemTitleBar* title_bar_; - QLabel* title_bar_lbl_; - - CollapseButton* title_bar_collapse_btn_; - NodeParamViewItemBody* body_; Node* node_;