nodeparamview: implemented pinning
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) :
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user