diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 4c8c9733a..3e9653bd1 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -97,21 +97,33 @@ void NodeView::DeleteSelected() return; } - QList selected_nodes = scene_.GetSelectedNodes(); + QUndoCommand* command = new QUndoCommand(); - // Ensure no nodes are "undeletable" - for (int i=0;iCanBeDeleted()) { - selected_nodes.removeAt(i); - i--; + { + QList selected_edges = scene_.GetSelectedEdges(); + + foreach (NodeEdge* edge, selected_edges) { + new NodeEdgeRemoveCommand(edge->output(), edge->input(), command); } } - if (selected_nodes.isEmpty()) { - return; + { + QList selected_nodes = scene_.GetSelectedNodes(); + + // Ensure no nodes are "undeletable" + for (int i=0;iCanBeDeleted()) { + selected_nodes.removeAt(i); + i--; + } + } + + if (!selected_nodes.isEmpty()) { + new NodeRemoveCommand(graph_, selected_nodes, command); + } } - Core::instance()->undo_stack()->push(new NodeRemoveCommand(graph_, selected_nodes)); + Core::instance()->undo_stack()->pushIfHasChildren(command); } void NodeView::SelectAll() @@ -269,8 +281,6 @@ void NodeView::mousePressEvent(QMouseEvent *event) if (HandPress(event)) return; if (!attached_items_.isEmpty()) { - DetachItemsFromCursor(); - if (attached_items_.size() == 1) { Node* dropping_node = attached_items_.first().item->GetNode(); @@ -292,6 +302,8 @@ void NodeView::mousePressEvent(QMouseEvent *event) drop_edge_ = nullptr; } + + DetachItemsFromCursor(); } super::mousePressEvent(event); @@ -400,19 +412,26 @@ void NodeView::ShowContextMenu(const QPoint &pos) m.addSeparator(); - if (itemAt(pos)) { - QList selected = scene_.GetSelectedItems(); + QList selected = scene_.GetSelectedItems(); + + if (itemAt(pos) && !selected.isEmpty()) { if (selected.size() == 1) { + + // Label node action QAction* label_action = m.addAction(tr("Label")); connect(label_action, &QAction::triggered, this, &NodeView::ContextMenuLabelNode); m.addSeparator(); + } + // Auto-position action QAction* autopos = m.addAction(tr("Auto-Position")); connect(autopos, &QAction::triggered, this, &NodeView::AutoPositionDescendents); + } else { + Menu* direction_menu = new Menu(tr("Direction"), &m); m.addMenu(direction_menu); @@ -440,6 +459,7 @@ void NodeView::ShowContextMenu(const QPoint &pos) add_menu->setTitle(tr("Add")); connect(add_menu, &Menu::triggered, this, &NodeView::CreateNodeSlot); m.addMenu(add_menu); + } m.exec(mapToGlobal(pos)); diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index a00439613..205785cbf 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "common/clamp.h" #include "common/lerp.h" @@ -34,10 +35,12 @@ OLIVE_NAMESPACE_ENTER NodeViewEdge::NodeViewEdge(QGraphicsItem *parent) : QGraphicsPathItem(parent), edge_(nullptr), - color_group_(QPalette::Active), - color_role_(QPalette::Text), + connected_(false), + highlighted_(false), flow_dir_(NodeViewCommon::kLeftToRight) { + setFlag(QGraphicsItem::ItemIsSelectable); + // Ensures this UI object is drawn behind other objects setZValue(-1); @@ -83,24 +86,16 @@ void NodeViewEdge::Adjust() void NodeViewEdge::SetConnected(bool c) { - if (c) { - color_group_ = QPalette::Active; - } else { - color_group_ = QPalette::Disabled; - } + connected_ = c; - UpdatePen(); + update(); } void NodeViewEdge::SetHighlighted(bool e) { - if (e) { - color_role_ = QPalette::Highlight; - } else { - color_role_ = QPalette::Text; - } + highlighted_ = e; - UpdatePen(); + update(); } void NodeViewEdge::SetPoints(const QPointF &start, const QPointF &end, bool input_is_expanded) @@ -137,9 +132,26 @@ void NodeViewEdge::SetFlowDirection(NodeViewCommon::FlowDirection dir) Adjust(); } -void NodeViewEdge::UpdatePen() +void NodeViewEdge::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) { - setPen(QPen(qApp->palette().color(color_group_, color_role_), edge_width_)); + QPalette::ColorGroup group; + QPalette::ColorRole role; + + if (connected_) { + group = QPalette::Active; + } else { + group = QPalette::Disabled; + } + + if (highlighted_ != bool(option->state & QStyle::State_Selected)) { + role = QPalette::Highlight; + } else { + role = QPalette::Text; + } + + painter->setPen(QPen(qApp->palette().color(group, role), edge_width_)); + painter->setBrush(Qt::NoBrush); + painter->drawPath(path()); } OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeview/nodeviewedge.h b/app/widget/nodeview/nodeviewedge.h index 89a14d546..045955a05 100644 --- a/app/widget/nodeview/nodeviewedge.h +++ b/app/widget/nodeview/nodeviewedge.h @@ -89,16 +89,17 @@ public: */ void SetFlowDirection(NodeViewCommon::FlowDirection dir); -private: - void UpdatePen(); +protected: + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; +private: NodeEdgePtr edge_; int edge_width_; - QPalette::ColorGroup color_group_; + bool connected_; - QPalette::ColorRole color_role_; + bool highlighted_; NodeViewCommon::FlowDirection flow_dir_; diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index b7e848996..4b11dd423 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -145,6 +145,21 @@ QList NodeViewScene::GetSelectedItems() const return selected; } +QList NodeViewScene::GetSelectedEdges() const +{ + QList edges; + + QHash::const_iterator i; + + for (i=edge_map_.constBegin(); i!=edge_map_.constEnd(); i++) { + if (i.value()->isSelected()) { + edges.append(i.key()); + } + } + + return edges; +} + const QHash &NodeViewScene::item_map() const { return item_map_; diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index 0aa7b67ca..d512278e1 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -65,6 +65,7 @@ public: QList GetSelectedNodes() const; QList GetSelectedItems() const; + QList GetSelectedEdges() const; const QHash& item_map() const; const QHash& edge_map() const;