diff options
author | Aleks Kissinger <aleks0@gmail.com> | 2018-04-21 22:53:05 +0200 |
---|---|---|
committer | Aleks Kissinger <aleks0@gmail.com> | 2018-04-21 22:53:05 +0200 |
commit | b00c5250d7a56b6d20980d89cf331a114fdfdee0 (patch) | |
tree | 5fef5c2a534cf150f9ae57cd20a90d6789bd3789 /src/gui | |
parent | 9dd19037afd93d879ec32c5191314196f7f50592 (diff) |
edge styles 90 percent
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/edgeitem.cpp | 56 | ||||
-rw-r--r-- | src/gui/edgeitem.h | 2 | ||||
-rw-r--r-- | src/gui/stylepalette.cpp | 11 | ||||
-rw-r--r-- | src/gui/stylepalette.h | 1 | ||||
-rw-r--r-- | src/gui/tikzscene.cpp | 7 | ||||
-rw-r--r-- | src/gui/undocommands.cpp | 39 | ||||
-rw-r--r-- | src/gui/undocommands.h | 11 |
7 files changed, 121 insertions, 6 deletions
diff --git a/src/gui/edgeitem.cpp b/src/gui/edgeitem.cpp index 88a4e85..de51db3 100644 --- a/src/gui/edgeitem.cpp +++ b/src/gui/edgeitem.cpp @@ -50,12 +50,61 @@ void EdgeItem::readPos() void EdgeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { //QGraphicsPathItem::paint(painter, option, widget); - QPen pen(Qt::black); - pen.setWidth(2); - painter->setPen(pen); + QPen pen = _edge->style()->pen(); + painter->setPen(pen); painter->setBrush(Qt::NoBrush); painter->drawPath(path()); + QPointF ht = _edge->headTangent(); + QPointF hLeft(-ht.y(), ht.x()); + QPointF hRight(ht.y(), -ht.x()); + QPointF tt = _edge->tailTangent(); + QPointF tLeft(-ht.y(), ht.x()); + QPointF tRight(ht.y(), -ht.x()); + + pen.setStyle(Qt::SolidLine); + painter->setPen(pen); + + + + switch (_edge->style()->arrowHead()) { + case EdgeStyle::Flat: + { + painter->drawLine( + toScreen(_edge->head() + hLeft), + toScreen(_edge->head() + hRight)); + break; + } + case EdgeStyle::Pointer: + { + QPainterPath pth; + pth.moveTo(toScreen(_edge->head() + ht + hLeft)); + pth.lineTo(toScreen(_edge->head())); + pth.lineTo(toScreen(_edge->head() + ht + hRight)); + painter->drawPath(pth); + break; + } + } + + switch (_edge->style()->arrowTail()) { + case EdgeStyle::Flat: + { + painter->drawLine( + toScreen(_edge->tail() + tLeft), + toScreen(_edge->tail() + tRight)); + break; + } + case EdgeStyle::Pointer: + { + QPainterPath pth; + pth.moveTo(toScreen(_edge->tail() + tt + tLeft)); + pth.lineTo(toScreen(_edge->tail())); + pth.lineTo(toScreen(_edge->tail() + tt + tRight)); + painter->drawPath(pth); + break; + } + } + if (isSelected()) { QColor draw; QColor draw1; @@ -151,3 +200,4 @@ void EdgeItem::setPath(const QPainterPath &path) update(); } + diff --git a/src/gui/edgeitem.h b/src/gui/edgeitem.h index 5641912..948f137 100644 --- a/src/gui/edgeitem.h +++ b/src/gui/edgeitem.h @@ -13,6 +13,7 @@ #include <QStyleOptionGraphicsItem> #include <QWidget> #include <QGraphicsEllipseItem> +#include <QString> class EdgeItem : public QGraphicsItem { @@ -30,6 +31,7 @@ public: QPainterPath path() const; void setPath(const QPainterPath &path); + private: Edge *_edge; QPainterPath _path; diff --git a/src/gui/stylepalette.cpp b/src/gui/stylepalette.cpp index f7c17c0..f1462df 100644 --- a/src/gui/stylepalette.cpp +++ b/src/gui/stylepalette.cpp @@ -114,6 +114,17 @@ QString StylePalette::activeNodeStyleName() } } +QString StylePalette::activeEdgeStyleName() +{ + const QModelIndexList i = ui->edgeStyleListView->selectionModel()->selectedIndexes(); + + if (i.isEmpty()) { + return "none"; + } else { + return i[0].data().toString(); + } +} + void StylePalette::nodeStyleDoubleClicked(const QModelIndex &index) { tikzit->activeWindow()->tikzScene()->applyActiveStyleToNodes(); diff --git a/src/gui/stylepalette.h b/src/gui/stylepalette.h index 8663cc4..cc8fb73 100644 --- a/src/gui/stylepalette.h +++ b/src/gui/stylepalette.h @@ -19,6 +19,7 @@ public: void nextNodeStyle(); void previousNodeStyle(); QString activeNodeStyleName(); + QString activeEdgeStyleName(); public slots: diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index bc55ada..3c8fb71 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -71,6 +71,7 @@ void TikzScene::graphReplaced() _edgeItems.clear(); foreach (Edge *e, graph()->edges()) { + e->attachStyle(); EdgeItem *ei = new EdgeItem(e); _edgeItems.insert(e, ei); addItem(ei); @@ -420,6 +421,7 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) case ToolPalette::EDGE: if (_edgeStartNodeItem != 0 && _edgeEndNodeItem != 0) { Edge *e = new Edge(_edgeStartNodeItem->node(), _edgeEndNodeItem->node(), _tikzDocument); + e->setStyleName(_styles->activeEdgeStyleName()); AddEdgeCommand *cmd = new AddEdgeCommand(this, e); _tikzDocument->undoStack()->push(cmd); } @@ -687,6 +689,11 @@ void TikzScene::setTikzDocument(TikzDocument *tikzDocument) void TikzScene::reloadStyles() { _styles->reloadStyles(); + foreach(EdgeItem *ei, _edgeItems) { + ei->edge()->attachStyle(); + ei->readPos(); // trigger a repaint + } + foreach (NodeItem *ni, _nodeItems) { ni->node()->attachStyle(); ni->readPos(); // trigger a repaint diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp index baa8c0e..5ce6941 100644 --- a/src/gui/undocommands.cpp +++ b/src/gui/undocommands.cpp @@ -130,6 +130,7 @@ void DeleteCommand::undo() for (auto it = _deleteEdges.begin(); it != _deleteEdges.end(); ++it) { Edge *e = it.value(); + e->attachStyle(); _scene->graph()->addEdge(e, it.key()); EdgeItem *ei = new EdgeItem(e); _scene->edgeItems().insert(e, ei); @@ -185,7 +186,7 @@ void AddNodeCommand::undo() void AddNodeCommand::redo() { - _node->attachStyle(); // in case styles have changed + _node->attachStyle(); // do for every redo, in case styles have changed _scene->graph()->addNode(_node); NodeItem *ni = new NodeItem(_node); _scene->nodeItems().insert(_node, ni); @@ -214,12 +215,13 @@ void AddEdgeCommand::undo() void AddEdgeCommand::redo() { - // TODO: get the current style + _edge->attachStyle(); // do for every redo, in case styles have changed _scene->graph()->addEdge(_edge); EdgeItem *ei = new EdgeItem(_edge); _scene->edgeItems().insert(_edge, ei); _scene->addItem(ei); + // TODO: deal consistently with stacking order // edges should always be stacked below nodes if (!_scene->graph()->nodes().isEmpty()) { ei->stackBefore(_scene->nodeItems()[_scene->graph()->nodes().first()]); @@ -235,7 +237,8 @@ ChangeEdgeModeCommand::ChangeEdgeModeCommand(TikzScene *scene, Edge *edge, QUndo void ChangeEdgeModeCommand::undo() { - _edge->setBasicBendMode(!_edge->basicBendMode()); + // FIXME: this act strangely sometimes + _edge->setBasicBendMode(!_edge->basicBendMode()); _scene->edgeItems()[_edge]->readPos(); GraphUpdateCommand::undo(); } @@ -276,6 +279,35 @@ void ApplyStyleToNodesCommand::redo() GraphUpdateCommand::redo(); } +ApplyStyleToEdgesCommand::ApplyStyleToEdgesCommand(TikzScene *scene, QString style, QUndoCommand *parent) : + GraphUpdateCommand(scene, parent), _style(style), _oldStyles() +{ + foreach(QGraphicsItem *it, scene->selectedItems()) { + if (EdgeItem *ei = dynamic_cast<EdgeItem*>(it)) { + _oldStyles.insert(ei->edge(), ei->edge()->styleName()); + } + } +} + +void ApplyStyleToEdgesCommand::undo() +{ + foreach(Edge *e, _oldStyles.keys()) { + e->setStyleName(_oldStyles[e]); + e->attachStyle(); + } + + GraphUpdateCommand::undo(); +} + +void ApplyStyleToEdgesCommand::redo() +{ + foreach(Edge *e, _oldStyles.keys()) { + e->setStyleName(_style); + e->attachStyle(); + } + GraphUpdateCommand::redo(); +} + PasteCommand::PasteCommand(TikzScene *scene, Graph *graph, QUndoCommand *parent) : GraphUpdateCommand(scene, parent), _graph(graph) { @@ -316,6 +348,7 @@ void PasteCommand::redo() _scene->graph()->insertGraph(_graph); foreach (Edge *e, _graph->edges()) { + e->attachStyle(); // in case styles have changed EdgeItem *ei = new EdgeItem(e); _scene->edgeItems().insert(e, ei); _scene->addItem(ei); diff --git a/src/gui/undocommands.h b/src/gui/undocommands.h index 3f74afb..ad76479 100644 --- a/src/gui/undocommands.h +++ b/src/gui/undocommands.h @@ -120,6 +120,17 @@ private: QMap<Node*,QString> _oldStyles; }; +class ApplyStyleToEdgesCommand : public GraphUpdateCommand +{ +public: + explicit ApplyStyleToEdgesCommand(TikzScene *scene, QString style, QUndoCommand *parent = 0); + void undo() override; + void redo() override; +private: + QString _style; + QMap<Edge*, QString> _oldStyles; +}; + class PasteCommand : public GraphUpdateCommand { public: |