From 9c30f13a2e5ef21e03ec85fb8ae3819145daf520 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 May 2020 04:33:37 +1000 Subject: [PATCH] nodeview: added setting for curved/straight edges --- app/config/config.cpp | 1 - app/widget/nodeview/nodeview.cpp | 7 +++++ app/widget/nodeview/nodeviewedge.cpp | 44 ++++++++++++++++++--------- app/widget/nodeview/nodeviewedge.h | 7 +++++ app/widget/nodeview/nodeviewscene.cpp | 18 ++++++++++- app/widget/nodeview/nodeviewscene.h | 9 ++++++ 6 files changed, 70 insertions(+), 16 deletions(-) diff --git a/app/config/config.cpp b/app/config/config.cpp index 9d872ee9a..7f866a8ff 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -83,7 +83,6 @@ void Config::SetDefaults() config_map_["DropWithoutSequenceBehavior"] = TimelineWidget::kDWSAsk; config_map_["Loop"] = false; - config_map_["NodeCatColor0"] = QVariant::fromValue(Color(0.75f, 0.75f, 0.75f)); config_map_["NodeCatColor1"] = QVariant::fromValue(Color(0.25f, 0.25f, 0.25f)); config_map_["NodeCatColor2"] = QVariant::fromValue(Color(0.75f, 0.75f, 0.25f)); diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index b8485f45a..88fc74040 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -452,6 +452,13 @@ void NodeView::ShowContextMenu(const QPoint &pos) } else { + QAction* curved_action = m.addAction(tr("Smooth Edges")); + curved_action->setCheckable(true); + curved_action->setChecked(scene_.GetEdgesAreCurved()); + connect(curved_action, &QAction::triggered, &scene_, &NodeViewScene::SetEdgesAreCurved); + + m.addSeparator(); + Menu* filter_menu = new Menu(tr("Filter"), &m); filter_menu->addAction(tr("Show All"))->setData(NodeViewScene::kFilterShowAll); diff --git a/app/widget/nodeview/nodeviewedge.cpp b/app/widget/nodeview/nodeviewedge.cpp index 205785cbf..e07470fdc 100644 --- a/app/widget/nodeview/nodeviewedge.cpp +++ b/app/widget/nodeview/nodeviewedge.cpp @@ -37,7 +37,8 @@ NodeViewEdge::NodeViewEdge(QGraphicsItem *parent) : edge_(nullptr), connected_(false), highlighted_(false), - flow_dir_(NodeViewCommon::kLeftToRight) + flow_dir_(NodeViewCommon::kLeftToRight), + curved_(true) { setFlag(QGraphicsItem::ItemIsSelectable); @@ -103,24 +104,32 @@ void NodeViewEdge::SetPoints(const QPointF &start, const QPointF &end, bool inpu QPainterPath path; path.moveTo(start); - double half_x = lerp(start.x(), end.x(), 0.5); - double half_y = lerp(start.y(), end.y(), 0.5); + if (curved_) { - QPointF cp1, cp2; + double half_x = lerp(start.x(), end.x(), 0.5); + double half_y = lerp(start.y(), end.y(), 0.5); + + QPointF cp1, cp2; + + if (NodeViewCommon::GetFlowOrientation(flow_dir_) == Qt::Horizontal) { + cp1 = QPointF(half_x, start.y()); + } else { + cp1 = QPointF(start.x(), half_y); + } + + if (NodeViewCommon::GetFlowOrientation(flow_dir_) == Qt::Horizontal || input_is_expanded) { + cp2 = QPointF(half_x, end.y()); + } else { + cp2 = QPointF(end.x(), half_y); + } + + path.cubicTo(cp1, cp2, end); - if (NodeViewCommon::GetFlowOrientation(flow_dir_) == Qt::Horizontal) { - cp1 = QPointF(half_x, start.y()); } else { - cp1 = QPointF(start.x(), half_y); - } - if (NodeViewCommon::GetFlowOrientation(flow_dir_) == Qt::Horizontal || input_is_expanded) { - cp2 = QPointF(half_x, end.y()); - } else { - cp2 = QPointF(end.x(), half_y); - } + path.lineTo(end); - path.cubicTo(cp1, cp2, end); + } setPath(path); } @@ -132,6 +141,13 @@ void NodeViewEdge::SetFlowDirection(NodeViewCommon::FlowDirection dir) Adjust(); } +void NodeViewEdge::SetCurved(bool e) +{ + curved_ = e; + + update(); +} + void NodeViewEdge::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) { QPalette::ColorGroup group; diff --git a/app/widget/nodeview/nodeviewedge.h b/app/widget/nodeview/nodeviewedge.h index 045955a05..be1f6a666 100644 --- a/app/widget/nodeview/nodeviewedge.h +++ b/app/widget/nodeview/nodeviewedge.h @@ -89,6 +89,11 @@ public: */ void SetFlowDirection(NodeViewCommon::FlowDirection dir); + /** + * @brief Set whether edges should be drawn as curved or as straight lines + */ + void SetCurved(bool e); + protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; @@ -103,6 +108,8 @@ private: NodeViewCommon::FlowDirection flow_dir_; + bool curved_; + }; OLIVE_NAMESPACE_EXIT diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index 20e4d48aa..daa38428c 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -30,7 +30,8 @@ OLIVE_NAMESPACE_ENTER NodeViewScene::NodeViewScene(QObject *parent) : QGraphicsScene(parent), graph_(nullptr), - direction_(NodeViewCommon::kLeftToRight) + direction_(NodeViewCommon::kLeftToRight), + curved_edges_(true) { } @@ -214,6 +215,7 @@ void NodeViewScene::AddEdge(NodeEdgePtr edge) edge_ui->SetEdge(edge); edge_ui->SetFlowDirection(direction_); + edge_ui->SetCurved(curved_edges_); addItem(edge_ui); edge_map_.insert(edge.get(), edge_ui); @@ -293,6 +295,20 @@ void NodeViewScene::SetFilterMode(const NodeViewScene::FilterMode &f) filter_mode_ = f; } +bool NodeViewScene::GetEdgesAreCurved() const +{ + return curved_edges_; +} + +void NodeViewScene::SetEdgesAreCurved(bool curved) +{ + curved_edges_ = curved; + + foreach (NodeViewEdge* e, edge_map_) { + e->SetCurved(curved_edges_); + } +} + void NodeViewScene::NodePositionChanged(const QPointF &pos) { item_map_.value(static_cast(sender()))->SetNodePosition(pos); diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index f2482cb4a..a27d41a8c 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -87,6 +87,8 @@ public: void SetFilterMode(const FilterMode& f); + bool GetEdgesAreCurved() const; + public slots: /** * @brief Slot when a Node is added to a graph (SetGraph() connects this) @@ -120,6 +122,11 @@ public slots: */ void RemoveEdge(NodeEdgePtr edge); + /** + * @brief Set whether edges in this scene should be curved or not + */ + void SetEdgesAreCurved(bool curved); + private: static int DetermineWeight(Node* n); @@ -133,6 +140,8 @@ private: FilterMode filter_mode_; + bool curved_edges_; + private slots: /** * @brief Receiver for whenever a node position changes