fixed arrays in nodeparamview
This commit is contained in:
@@ -79,14 +79,15 @@ void NodeView::SetGraph(NodeGraph *graph)
|
||||
disconnect(graph_, &NodeGraph::NodeRemoved, &scene_, &NodeViewScene::RemoveNode);
|
||||
disconnect(graph_, &NodeGraph::InputConnected, &scene_, &NodeViewScene::AddEdge);
|
||||
disconnect(graph_, &NodeGraph::InputDisconnected, &scene_, &NodeViewScene::RemoveEdge);
|
||||
}
|
||||
|
||||
// Clear the scene of all UI objects
|
||||
scene_.clear();
|
||||
DeselectAll();
|
||||
|
||||
// Clear the scene of all UI objects
|
||||
scene_.clear();
|
||||
}
|
||||
|
||||
// Set reference to the graph
|
||||
graph_ = graph;
|
||||
scene_.SetGraph(graph_);
|
||||
|
||||
// If the graph is valid, add UI objects for each of its Nodes
|
||||
if (graph_) {
|
||||
@@ -148,6 +149,10 @@ void NodeView::DeleteSelected()
|
||||
|
||||
void NodeView::SelectAll()
|
||||
{
|
||||
if (!graph_) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Optimization: rather than respond to every single item being selected, ignore the signal and
|
||||
// then handle them all at the end.
|
||||
DisconnectSelectionChangedSignal();
|
||||
@@ -155,24 +160,29 @@ void NodeView::SelectAll()
|
||||
scene_.SelectAll();
|
||||
|
||||
ConnectSelectionChangedSignal();
|
||||
SceneSelectionChangedSlot();
|
||||
|
||||
if (selected_nodes_.isEmpty()) {
|
||||
// No nodes were selected before so we can just emit them all
|
||||
emit NodesSelected(graph_->nodes());
|
||||
} else {
|
||||
// We have to determine the difference
|
||||
QVector<Node*> new_selection;
|
||||
foreach (Node* n, graph_->nodes()) {
|
||||
if (!selected_nodes_.contains(n)) {
|
||||
new_selection.append(n);
|
||||
}
|
||||
}
|
||||
|
||||
emit NodesSelected(new_selection);
|
||||
}
|
||||
|
||||
// Just add everything to the selected nodes list
|
||||
selected_nodes_ = graph_->nodes();
|
||||
}
|
||||
|
||||
void NodeView::DeselectAll()
|
||||
{
|
||||
// Optimization: rather than respond to every single item being selected, ignore the signal and
|
||||
// then handle them all at the end.
|
||||
DisconnectSelectionChangedSignal();
|
||||
|
||||
scene_.DeselectAll();
|
||||
|
||||
ConnectSelectionChangedSignal();
|
||||
SceneSelectionChangedSlot();
|
||||
}
|
||||
|
||||
void NodeView::Select(const QVector<Node *> &nodes)
|
||||
{
|
||||
if (!graph_) {
|
||||
if (!graph_ || selected_nodes_.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -182,14 +192,63 @@ void NodeView::Select(const QVector<Node *> &nodes)
|
||||
|
||||
scene_.DeselectAll();
|
||||
|
||||
ConnectSelectionChangedSignal();
|
||||
|
||||
// Just emit all the nodes that are currently selected as no longer selected
|
||||
emit NodesDeselected(selected_nodes_);
|
||||
selected_nodes_.clear();
|
||||
}
|
||||
|
||||
void NodeView::Select(QVector<Node *> nodes)
|
||||
{
|
||||
if (!graph_) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Optimization: rather than respond to every single item being selected, ignore the signal and
|
||||
// then handle them all at the end.
|
||||
DisconnectSelectionChangedSignal();
|
||||
|
||||
QVector<Node*> deselections_ = selected_nodes_;
|
||||
QVector<Node*> new_selections_;
|
||||
|
||||
scene_.DeselectAll();
|
||||
|
||||
// Remove any duplicates
|
||||
QVector<Node*> processed;
|
||||
|
||||
foreach (Node* n, nodes) {
|
||||
if (processed.contains(n)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
processed.append(n);
|
||||
|
||||
NodeViewItem* item = scene_.NodeToUIObject(n);
|
||||
|
||||
item->setSelected(true);
|
||||
|
||||
if (deselections_.contains(n)) {
|
||||
deselections_.removeOne(n);
|
||||
} else {
|
||||
new_selections_.append(n);
|
||||
}
|
||||
}
|
||||
|
||||
ConnectSelectionChangedSignal();
|
||||
SceneSelectionChangedSlot();
|
||||
|
||||
// Emit deselect signal for any nodes that weren't in the list
|
||||
if (!deselections_.isEmpty()) {
|
||||
emit NodesDeselected(deselections_);
|
||||
}
|
||||
|
||||
// Emit select signal for any nodes that weren't in the list
|
||||
if (!new_selections_.isEmpty()) {
|
||||
emit NodesSelected(new_selections_);
|
||||
}
|
||||
|
||||
// Update selected list to the list we received
|
||||
selected_nodes_ = nodes;
|
||||
}
|
||||
|
||||
void NodeView::SelectWithDependencies(QVector<Node *> nodes)
|
||||
@@ -325,6 +384,11 @@ void NodeView::mouseMoveEvent(QMouseEvent *event)
|
||||
// Find if the cursor is currently inside an item
|
||||
NodeViewItem* item_at_cursor = dynamic_cast<NodeViewItem*>(itemAt(event->pos()));
|
||||
|
||||
// Filter out connecting to self1
|
||||
if (item_at_cursor == create_edge_src_) {
|
||||
item_at_cursor = nullptr;
|
||||
}
|
||||
|
||||
// If the item has changed
|
||||
if (item_at_cursor != create_edge_dst_) {
|
||||
// If we had a destination active, disconnect from it since the item has changed
|
||||
@@ -505,7 +569,7 @@ void NodeView::wheelEvent(QWheelEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
void NodeView::SceneSelectionChangedSlot()
|
||||
void NodeView::UpdateSelectionCache()
|
||||
{
|
||||
QVector<Node*> current_selection = scene_.GetSelectedNodes();
|
||||
|
||||
@@ -714,12 +778,12 @@ void NodeView::MoveAttachedNodesToCursor(const QPoint& p)
|
||||
|
||||
void NodeView::ConnectSelectionChangedSignal()
|
||||
{
|
||||
connect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::SceneSelectionChangedSlot);
|
||||
connect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::UpdateSelectionCache);
|
||||
}
|
||||
|
||||
void NodeView::DisconnectSelectionChangedSignal()
|
||||
{
|
||||
disconnect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::SceneSelectionChangedSlot);
|
||||
disconnect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::UpdateSelectionCache);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
void SelectAll();
|
||||
void DeselectAll();
|
||||
|
||||
void Select(const QVector<Node*>& nodes);
|
||||
void Select(QVector<Node *> nodes);
|
||||
void SelectWithDependencies(QVector<Node *> nodes);
|
||||
|
||||
void CopySelected(bool cut);
|
||||
@@ -134,7 +134,7 @@ private slots:
|
||||
/**
|
||||
* @brief Receiver for when the scene's selected items change
|
||||
*/
|
||||
void SceneSelectionChangedSlot();
|
||||
void UpdateSelectionCache();
|
||||
|
||||
/**
|
||||
* @brief Receiver for when the user right clicks (or otherwise requests a context menu)
|
||||
|
||||
@@ -29,7 +29,6 @@ namespace olive {
|
||||
|
||||
NodeViewScene::NodeViewScene(QObject *parent) :
|
||||
QGraphicsScene(parent),
|
||||
graph_(nullptr),
|
||||
direction_(NodeViewCommon::kLeftToRight),
|
||||
curved_edges_(true)
|
||||
{
|
||||
@@ -110,11 +109,6 @@ NodeViewEdge *NodeViewScene::EdgeToUIObject(Node* output, NodeInput* input, int
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void NodeViewScene::SetGraph(NodeGraph *graph)
|
||||
{
|
||||
graph_ = graph;
|
||||
}
|
||||
|
||||
QVector<Node *> NodeViewScene::GetSelectedNodes() const
|
||||
{
|
||||
QHash<Node*, NodeViewItem*>::const_iterator iterator;
|
||||
@@ -266,11 +260,6 @@ void NodeViewScene::ReorganizeFrom(Node* n)
|
||||
}
|
||||
}
|
||||
|
||||
bool NodeViewScene::GetEdgesAreCurved() const
|
||||
{
|
||||
return curved_edges_;
|
||||
}
|
||||
|
||||
void NodeViewScene::SetEdgesAreCurved(bool curved)
|
||||
{
|
||||
if (curved_edges_ != curved) {
|
||||
|
||||
@@ -55,8 +55,6 @@ public:
|
||||
NodeViewItem* NodeToUIObject(Node* n);
|
||||
NodeViewEdge *EdgeToUIObject(Node* output, NodeInput *input, int element);
|
||||
|
||||
void SetGraph(NodeGraph* graph);
|
||||
|
||||
QVector<Node *> GetSelectedNodes() const;
|
||||
QVector<NodeViewItem*> GetSelectedItems() const;
|
||||
QVector<NodeViewEdge*> GetSelectedEdges() const;
|
||||
@@ -76,7 +74,10 @@ public:
|
||||
NodeViewCommon::FlowDirection GetFlowDirection() const;
|
||||
void SetFlowDirection(NodeViewCommon::FlowDirection direction);
|
||||
|
||||
bool GetEdgesAreCurved() const;
|
||||
bool GetEdgesAreCurved() const
|
||||
{
|
||||
return curved_edges_;
|
||||
}
|
||||
|
||||
void ReorganizeFrom(Node* n);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user