nodeparamview: implemented pinning

This commit is contained in:
itsmattkc
2020-09-28 21:50:55 +10:00
parent 4c30773fd4
commit dc56dc1d60
4 changed files with 150 additions and 46 deletions
+98 -24
View File
@@ -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<Node *> &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<Node *> &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<Node*> nodes;
QList<int> 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_ys.size(); i++) {
if (item_ys.at(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<NodeParamViewItem*>(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
+12
View File
@@ -77,6 +77,8 @@ signals:
void RequestSelectNode(const QList<Node*>& target);
void NodeOrderChanged(const QList<Node*>& 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<Node*, NodeParamViewItem*> items_;
@@ -105,6 +111,10 @@ private:
// docking windows
QMainWindow* param_widget_area_;
QList<Node*> pinned_nodes_;
QList<Node*> active_nodes_;
private slots:
void ItemRequestedTimeChanged(const rational& time);
@@ -112,6 +122,8 @@ private slots:
void PlaceKeyframesOnView();
void PinNode(bool pin);
};
OLIVE_NAMESPACE_EXIT
+25 -16
View File
@@ -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<NodeInput *> &inputs, QWidget *parent) :
+15 -6
View File
@@ -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*>& 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_;