@@ -471,7 +471,7 @@ void NodeView::mousePressEvent(QMouseEvent *event)
|
||||
// See if we're dragging the arrow of a node
|
||||
for (NodeViewItem *node_item : scene_.item_map()) {
|
||||
if (node_item->GetOutputTriangle().boundingRect().translated(node_item->pos()).contains(scene_pt)) {
|
||||
CreateNewEdge(node_item);
|
||||
CreateNewEdge(node_item, event->pos());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -496,7 +496,7 @@ void NodeView::mousePressEvent(QMouseEvent *event)
|
||||
if (event->modifiers() & Qt::ControlModifier) {
|
||||
NodeViewItem* node_item = dynamic_cast<NodeViewItem*>(item);
|
||||
if (node_item) {
|
||||
CreateNewEdge(node_item);
|
||||
CreateNewEdge(node_item, event->pos());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -509,68 +509,7 @@ void NodeView::mouseMoveEvent(QMouseEvent *event)
|
||||
if (HandMove(event)) return;
|
||||
|
||||
if (create_edge_) {
|
||||
// Determine scene coordinate
|
||||
QPointF scene_pt = mapToScene(event->pos());
|
||||
|
||||
// Find if the cursor is currently inside an item
|
||||
NodeViewItem* item_at_cursor = dynamic_cast<NodeViewItem*>(itemAt(event->pos()));
|
||||
|
||||
// Filter out connecting to self
|
||||
if (item_at_cursor == create_edge_src_) {
|
||||
item_at_cursor = nullptr;
|
||||
}
|
||||
|
||||
// Filter out connecting to a node that connects to us
|
||||
if (item_at_cursor && item_at_cursor->GetNode()->OutputsTo(create_edge_src_->GetNode(), true)) {
|
||||
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
|
||||
if (create_edge_dst_) {
|
||||
create_edge_dst_->SetHighlightedIndex(-1);
|
||||
|
||||
if (create_edge_dst_temp_expanded_) {
|
||||
// We expanded this item, so we can un-expand it
|
||||
create_edge_dst_->SetExpanded(false);
|
||||
create_edge_dst_->setZValue(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Set destination
|
||||
create_edge_dst_ = item_at_cursor;
|
||||
|
||||
// If our destination is an item, ensure it's expanded
|
||||
if (create_edge_dst_) {
|
||||
if ((create_edge_dst_temp_expanded_ = (!create_edge_dst_->IsExpanded()))) {
|
||||
create_edge_dst_->SetExpanded(true, true);
|
||||
create_edge_dst_->setZValue(100); // Ensure item is in front
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we have a destination, highlight the appropriate input
|
||||
int highlight_index = -1;
|
||||
if (create_edge_dst_) {
|
||||
highlight_index = create_edge_dst_->GetIndexAt(scene_pt);
|
||||
create_edge_dst_->SetHighlightedIndex(highlight_index);
|
||||
}
|
||||
|
||||
if (highlight_index >= 0) {
|
||||
create_edge_dst_input_ = create_edge_dst_->GetInputAtIndex(highlight_index);
|
||||
create_edge_->SetPoints(create_edge_src_->GetOutputPoint(Node::kDefaultOutput),
|
||||
create_edge_dst_->GetInputPoint(create_edge_dst_input_.input(), create_edge_dst_input_.element(), create_edge_src_->pos()),
|
||||
true);
|
||||
} else {
|
||||
create_edge_dst_input_.Reset();
|
||||
create_edge_->SetPoints(create_edge_src_->GetOutputPoint(Node::kDefaultOutput),
|
||||
scene_pt,
|
||||
false);
|
||||
}
|
||||
|
||||
// Set connected to whether we have a valid input destination
|
||||
create_edge_->SetConnected(create_edge_dst_input_.IsValid());
|
||||
PositionNewEdge(event->pos());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1494,7 +1433,7 @@ Menu *NodeView::CreateAddMenu(Menu *parent)
|
||||
return add_menu;
|
||||
}
|
||||
|
||||
void NodeView::CreateNewEdge(NodeViewItem *output_item)
|
||||
void NodeView::CreateNewEdge(NodeViewItem *output_item, const QPoint &mouse_pos)
|
||||
{
|
||||
create_edge_ = new NodeViewEdge();
|
||||
create_edge_src_ = output_item;
|
||||
@@ -1505,6 +1444,74 @@ void NodeView::CreateNewEdge(NodeViewItem *output_item)
|
||||
create_edge_->SetFlowDirection(scene_.GetFlowDirection());
|
||||
|
||||
scene_.addItem(create_edge_);
|
||||
|
||||
PositionNewEdge(mouse_pos);
|
||||
}
|
||||
|
||||
void NodeView::PositionNewEdge(const QPoint &pos)
|
||||
{
|
||||
// Determine scene coordinate
|
||||
QPointF scene_pt = mapToScene(pos);
|
||||
|
||||
// Find if the cursor is currently inside an item
|
||||
NodeViewItem* item_at_cursor = dynamic_cast<NodeViewItem*>(itemAt(pos));
|
||||
|
||||
// Filter out connecting to self
|
||||
if (item_at_cursor == create_edge_src_) {
|
||||
item_at_cursor = nullptr;
|
||||
}
|
||||
|
||||
// Filter out connecting to a node that connects to us
|
||||
if (item_at_cursor && item_at_cursor->GetNode()->OutputsTo(create_edge_src_->GetNode(), true)) {
|
||||
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
|
||||
if (create_edge_dst_) {
|
||||
create_edge_dst_->SetHighlightedIndex(-1);
|
||||
|
||||
if (create_edge_dst_temp_expanded_) {
|
||||
// We expanded this item, so we can un-expand it
|
||||
create_edge_dst_->SetExpanded(false);
|
||||
create_edge_dst_->setZValue(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Set destination
|
||||
create_edge_dst_ = item_at_cursor;
|
||||
|
||||
// If our destination is an item, ensure it's expanded
|
||||
if (create_edge_dst_) {
|
||||
if ((create_edge_dst_temp_expanded_ = (!create_edge_dst_->IsExpanded()))) {
|
||||
create_edge_dst_->SetExpanded(true, true);
|
||||
create_edge_dst_->setZValue(100); // Ensure item is in front
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we have a destination, highlight the appropriate input
|
||||
int highlight_index = -1;
|
||||
if (create_edge_dst_) {
|
||||
highlight_index = create_edge_dst_->GetIndexAt(scene_pt);
|
||||
create_edge_dst_->SetHighlightedIndex(highlight_index);
|
||||
}
|
||||
|
||||
if (highlight_index >= 0) {
|
||||
create_edge_dst_input_ = create_edge_dst_->GetInputAtIndex(highlight_index);
|
||||
create_edge_->SetPoints(create_edge_src_->GetOutputPoint(Node::kDefaultOutput),
|
||||
create_edge_dst_->GetInputPoint(create_edge_dst_input_.input(), create_edge_dst_input_.element(), create_edge_src_->pos()),
|
||||
true);
|
||||
} else {
|
||||
create_edge_dst_input_.Reset();
|
||||
create_edge_->SetPoints(create_edge_src_->GetOutputPoint(Node::kDefaultOutput),
|
||||
scene_pt,
|
||||
false);
|
||||
}
|
||||
|
||||
// Set connected to whether we have a valid input destination
|
||||
create_edge_->SetConnected(create_edge_dst_input_.IsValid());
|
||||
}
|
||||
|
||||
void NodeView::RepositionContexts()
|
||||
|
||||
Reference in New Issue
Block a user