nodeparamview/viewer: improved gizmo selection system

This commit is contained in:
itsmattkc
2020-09-30 00:32:40 +10:00
parent fec9774935
commit b9359ce50d
7 changed files with 96 additions and 8 deletions
+1
View File
@@ -30,6 +30,7 @@ ParamPanel::ParamPanel(QWidget* parent) :
NodeParamView* view = new NodeParamView();
connect(view, &NodeParamView::RequestSelectNode, this, &ParamPanel::RequestSelectNode);
connect(view, &NodeParamView::NodeOrderChanged, this, &ParamPanel::NodeOrderChanged);
connect(view, &NodeParamView::FocusedNodeChanged, this, &ParamPanel::FocusedNodeChanged);
SetTimeBasedWidget(view);
Retranslate();
+2
View File
@@ -44,6 +44,8 @@ signals:
void NodeOrderChanged(const QList<Node*>& nodes);
void FocusedNodeChanged(Node* n);
protected:
virtual void Retranslate() override;
+53 -1
View File
@@ -20,6 +20,7 @@
#include "nodeparamview.h"
#include <QApplication>
#include <QScrollArea>
#include <QScrollBar>
#include <QSplitter>
@@ -31,7 +32,8 @@ OLIVE_NAMESPACE_ENTER
NodeParamView::NodeParamView(QWidget *parent) :
TimeBasedWidget(true, false, parent),
last_scroll_val_(0)
last_scroll_val_(0),
focused_node_(nullptr)
{
// Create horizontal layout to place scroll area in (and keyframe editing eventually)
QHBoxLayout* layout = new QHBoxLayout(this);
@@ -125,6 +127,12 @@ NodeParamView::NodeParamView(QWidget *parent) :
SetScale(120);
SetMaximumScale(TimelineViewBase::kMaximumScale);
// Pickup on widget focus changes
connect(qApp,
&QApplication::focusChanged,
this,
&NodeParamView::FocusChanged);
}
void NodeParamView::SelectNodes(const QList<Node *> &nodes)
@@ -157,6 +165,13 @@ void NodeParamView::SelectNodes(const QList<Node *> &nodes)
param_widget_area_->addDockWidget(Qt::LeftDockWidgetArea, item);
changes_made = true;
if (!focused_node_ && n->HasGizmos()) {
// We'll focus this node now
item->SetHighlighted(true);
focused_node_ = n;
emit FocusedNodeChanged(focused_node_);
}
}
}
@@ -299,6 +314,11 @@ void NodeParamView::RemoveNode(Node *n)
keyframe_view_->RemoveKeyframesOfNode(n);
delete items_.take(n);
if (focused_node_ == n) {
focused_node_ = nullptr;
emit FocusedNodeChanged(nullptr);
}
}
void NodeParamView::ItemRequestedTimeChanged(const rational &time)
@@ -337,4 +357,36 @@ void NodeParamView::PinNode(bool pin)
}
}
void NodeParamView::FocusChanged(QWidget* old, QWidget* now)
{
Q_UNUSED(old)
QObject* parent = now;
NodeParamViewItem* item;
while (parent) {
item = dynamic_cast<NodeParamViewItem*>(parent);
if (item) {
// Found it!
if (item->GetNode() != focused_node_) {
if (focused_node_) {
// De-focus current node
items_.value(focused_node_)->SetHighlighted(false);
}
focused_node_ = item->GetNode();
item->SetHighlighted(true);
emit FocusedNodeChanged(focused_node_);
}
break;
}
parent = parent->parent();
}
}
OLIVE_NAMESPACE_EXIT
+6
View File
@@ -79,6 +79,8 @@ signals:
void NodeOrderChanged(const QList<Node*>& nodes);
void FocusedNodeChanged(Node* n);
protected:
virtual void resizeEvent(QResizeEvent *event) override;
@@ -117,6 +119,8 @@ private:
QMap<Node*, bool> node_expanded_state_;
Node* focused_node_;
private slots:
void ItemRequestedTimeChanged(const rational& time);
@@ -126,6 +130,8 @@ private slots:
void PinNode(bool pin);
void FocusChanged(QWidget *old, QWidget *now);
};
OLIVE_NAMESPACE_EXIT
+17 -1
View File
@@ -33,7 +33,8 @@ OLIVE_NAMESPACE_ENTER
NodeParamViewItem::NodeParamViewItem(Node *node, QWidget *parent) :
QDockWidget(parent),
node_(node)
node_(node),
highlighted_(false)
{
// Create title bar widget
title_bar_ = new NodeParamViewItemTitleBar(this);
@@ -75,6 +76,8 @@ NodeParamViewItem::NodeParamViewItem(Node *node, QWidget *parent) :
setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
setFocusPolicy(Qt::ClickFocus);
Retranslate();
}
@@ -109,6 +112,19 @@ void NodeParamViewItem::changeEvent(QEvent *e)
QWidget::changeEvent(e);
}
void NodeParamViewItem::paintEvent(QPaintEvent *event)
{
QDockWidget::paintEvent(event);
// Draw border if focused
if (highlighted_) {
QPainter p(this);
p.setBrush(Qt::NoBrush);
p.setPen(palette().highlight().color());
p.drawRect(rect().adjusted(0, 0, -1, -1));
}
}
void NodeParamViewItem::Retranslate()
{
node_->Retranslate();
+15 -5
View File
@@ -138,9 +138,20 @@ public:
bool IsExpanded() const;
void SetHighlighted(bool e)
{
highlighted_ = e;
update();
}
public slots:
void SignalAllKeyframes();
void SetExpanded(bool e);
void ToggleExpanded();
signals:
void KeyframeAdded(NodeKeyframePtr key, int y);
@@ -154,14 +165,11 @@ signals:
void PinToggled(bool e);
public slots:
void SetExpanded(bool e);
void ToggleExpanded();
protected:
virtual void changeEvent(QEvent *e) override;
virtual void paintEvent(QPaintEvent *event) override;
private:
NodeParamViewItemTitleBar* title_bar_;
@@ -171,6 +179,8 @@ private:
rational time_;
bool highlighted_;
private slots:
void Retranslate();
+2 -1
View File
@@ -82,12 +82,13 @@ MainWindow::MainWindow(QWidget *parent) :
AppendTimelinePanel();
audio_monitor_panel_ = PanelManager::instance()->CreatePanel<AudioMonitorPanel>(this);
// Make connections to sequence viewer
// Make node-related connections
connect(node_panel_, &NodePanel::NodesSelected, param_panel_, &ParamPanel::SelectNodes);
connect(node_panel_, &NodePanel::NodesDeselected, param_panel_, &ParamPanel::DeselectNodes);
connect(node_panel_, &NodePanel::NodesSelected, table_panel_, &NodeTablePanel::SelectNodes);
connect(node_panel_, &NodePanel::NodesDeselected, table_panel_, &NodeTablePanel::DeselectNodes);
connect(param_panel_, &ParamPanel::RequestSelectNode, node_panel_, &NodePanel::Select);
connect(param_panel_, &ParamPanel::FocusedNodeChanged, sequence_viewer_panel_, &ViewerPanel::SetGizmos);
// Connect time signals together
connect(sequence_viewer_panel_, &SequenceViewerPanel::TimeChanged, param_panel_, &ParamPanel::SetTimestamp);