From 6dda16a24dfe7cbd0d90b77c57f1cf789210feb5 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Mon, 13 Apr 2020 14:40:07 +0100 Subject: ability to make paths from edges --- src/gui/tikzscene.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/gui/tikzscene.h') diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index 2e7baa5..5996263 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -81,6 +81,8 @@ public: void reverseSelectedEdges(); + void makePath(); + void splitPath(); void getSelection(QSet &selNodes, QSet &selEdges) const; QSet getSelectedNodes() const; -- cgit v1.2.3 From 732499eead71b23a7ba551fe788b47a4cf45124e Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Mon, 13 Apr 2020 16:21:39 +0100 Subject: adding and drawing paths works --- src/gui/edgeitem.cpp | 87 +++++++++++++++++++++++++----------------------- src/gui/pathitem.cpp | 65 ++++++++++++++++++++++++++++++++++++ src/gui/pathitem.h | 28 ++++++++++++++++ src/gui/tikzscene.cpp | 36 +++++++++++++++++++- src/gui/tikzscene.h | 3 ++ src/gui/undocommands.cpp | 25 ++++++++++++++ tikzit.pro | 2 ++ 7 files changed, 203 insertions(+), 43 deletions(-) create mode 100644 src/gui/pathitem.cpp create mode 100644 src/gui/pathitem.h (limited to 'src/gui/tikzscene.h') diff --git a/src/gui/edgeitem.cpp b/src/gui/edgeitem.cpp index 45ae159..675ddd7 100644 --- a/src/gui/edgeitem.cpp +++ b/src/gui/edgeitem.cpp @@ -71,7 +71,8 @@ void EdgeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidge QPen pen = _edge->style()->pen(); painter->setPen(pen); painter->setBrush(Qt::NoBrush); - painter->drawPath(path()); + + if (!_edge->path()) painter->drawPath(path()); QPointF ht = _edge->headTangent(); QPointF hLeft(-ht.y(), ht.x()); @@ -83,27 +84,27 @@ void EdgeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidge pen.setStyle(Qt::SolidLine); painter->setPen(pen); - - - switch (_edge->style()->arrowHead()) { - case Style::Flat: - { - painter->drawLine( - toScreen(_edge->head() + hLeft), - toScreen(_edge->head() + hRight)); - break; - } - case Style::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; - } - case Style::NoTip: - break; + if (!_edge->path() || _edge->path()->edges().last() == _edge) { + switch (_edge->style()->arrowHead()) { + case Style::Flat: + { + painter->drawLine( + toScreen(_edge->head() + hLeft), + toScreen(_edge->head() + hRight)); + break; + } + case Style::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; + } + case Style::NoTip: + break; + } } //QPen outline = QPen(Qt::red); @@ -111,26 +112,28 @@ void EdgeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidge //painter->drawPath(_expPath); //painter->setPen(pen); - switch (_edge->style()->arrowTail()) { - case Style::Flat: - { - painter->drawLine( - toScreen(_edge->tail() + tLeft), - toScreen(_edge->tail() + tRight)); - break; - } - case Style::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; - } - case Style::NoTip: - break; - } + if (!_edge->path() || _edge->path()->edges().first() == _edge) { + switch (_edge->style()->arrowTail()) { + case Style::Flat: + { + painter->drawLine( + toScreen(_edge->tail() + tLeft), + toScreen(_edge->tail() + tRight)); + break; + } + case Style::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; + } + case Style::NoTip: + break; + } + } if (isSelected()) { QColor draw; diff --git a/src/gui/pathitem.cpp b/src/gui/pathitem.cpp new file mode 100644 index 0000000..107281f --- /dev/null +++ b/src/gui/pathitem.cpp @@ -0,0 +1,65 @@ +#include "pathitem.h" +#include "tikzit.h" + +PathItem::PathItem(Path *path) +{ + _path = path; + readPos(); +} + +void PathItem::readPos() +{ + QPainterPath painterPath; + + foreach (Edge *e, _path->edges()) { + e->updateControls(); + + if (e == _path->edges().first()) + painterPath.moveTo (toScreen(e->tail())); + + if (e->bend() != 0 || !e->basicBendMode()) { + painterPath.cubicTo(toScreen(e->cp1()), + toScreen(e->cp2()), + toScreen(e->head())); + } else { + painterPath.lineTo(toScreen(e->head())); + } + } + + setPainterPath(painterPath); +} + +void PathItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + Style *st = _path->edges().first()->style(); + QPen pen = st->pen(); + painter->setPen(st->pen()); + painter->setBrush(st->brush()); + painter->drawPath(painterPath()); +} + +Path *PathItem::path() const +{ + return _path; +} + +QPainterPath PathItem::painterPath() const +{ + return _painterPath; +} + +void PathItem::setPainterPath(const QPainterPath &painterPath) +{ + prepareGeometryChange(); + + _painterPath = painterPath; + float r = GLOBAL_SCALEF * 0.1; + _boundingRect = _painterPath.boundingRect().adjusted(-r,-r,r,r); + + update(); +} + +QRectF PathItem::boundingRect() const +{ + return _boundingRect; +} diff --git a/src/gui/pathitem.h b/src/gui/pathitem.h new file mode 100644 index 0000000..7dc9c80 --- /dev/null +++ b/src/gui/pathitem.h @@ -0,0 +1,28 @@ +#ifndef PATHITEM_H +#define PATHITEM_H + +#include "path.h" + +#include + +class PathItem : public QGraphicsItem +{ +public: + PathItem(Path *path); + void readPos(); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override; + + Path *path() const; + + QPainterPath painterPath() const; + void setPainterPath(const QPainterPath &painterPath); + + QRectF boundingRect() const override; + +private: + Path *_path; + QPainterPath _painterPath; + QRectF _boundingRect; +}; + +#endif // PATHITEM_H diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index cebf5be..da52277 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -97,12 +97,25 @@ void TikzScene::graphReplaced() } _edgeItems.clear(); + foreach (PathItem *pi, _pathItems) { + removeItem(pi); + delete pi; + } + _pathItems.clear(); + foreach (Edge *e, graph()->edges()) { //e->attachStyle(); //e->updateControls(); EdgeItem *ei = new EdgeItem(e); _edgeItems.insert(e, ei); addItem(ei); + + Path *p = e->path(); + if (p && p->edges().first() == e) { + PathItem *pi = new PathItem(p); + _pathItems.insert(p, pi); + addItem(pi); + } } foreach (Node *n, graph()->nodes()) { @@ -393,7 +406,12 @@ void TikzScene::refreshZIndices() { qreal z = 0.0; foreach (Edge *e, graph()->edges()) { - edgeItems()[e]->setZValue(z); + if (e->path() && e == e->path()->edges().first()) { + pathItems()[e->path()]->setZValue(z); + edgeItems()[e]->setZValue(z + 0.1); + } else { + edgeItems()[e]->setZValue(z); + } z += 1.0; } @@ -606,6 +624,8 @@ void TikzScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) } _modifyEdgeItem->readPos(); + Path *p = _modifyEdgeItem->edge()->path(); + if (p) pathItems()[p]->readPos(); } else if (_draggingNodes) { // nodes being dragged QGraphicsScene::mouseMoveEvent(event); @@ -1253,6 +1273,8 @@ void TikzScene::refreshSceneBounds() { void TikzScene::refreshAdjacentEdges(QList nodes) { if (nodes.empty()) return; + + QSet paths; foreach (Edge *e, _edgeItems.keys()) { EdgeItem *ei = _edgeItems[e]; @@ -1263,6 +1285,13 @@ void TikzScene::refreshAdjacentEdges(QList nodes) ei->readPos(); } } + + // only update paths once + Path *p = ei->edge()->path(); + if (p && !paths.contains(p)) { + pathItems()[p]->readPos(); + paths << p; + } } } @@ -1289,3 +1318,8 @@ QMap &TikzScene::edgeItems() { return _edgeItems; } + +QMap &TikzScene::pathItems() +{ + return _pathItems; +} diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index 5996263..2e72faf 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -27,6 +27,7 @@ #include "graph.h" #include "nodeitem.h" #include "edgeitem.h" +#include "pathitem.h" #include "tikzdocument.h" #include "toolpalette.h" #include "stylepalette.h" @@ -48,6 +49,7 @@ public: Graph *graph(); QMap &nodeItems(); QMap &edgeItems(); + QMap &pathItems(); void refreshAdjacentEdges(QList nodes); // void setBounds(QRectF bounds); @@ -112,6 +114,7 @@ private: StylePalette *_styles; QMap _nodeItems; QMap _edgeItems; + QMap _pathItems; QGraphicsLineItem *_drawEdgeItem; QGraphicsRectItem *_rubberBandItem; EdgeItem *_modifyEdgeItem; diff --git a/src/gui/undocommands.cpp b/src/gui/undocommands.cpp index a07f251..87d5a13 100644 --- a/src/gui/undocommands.cpp +++ b/src/gui/undocommands.cpp @@ -102,6 +102,9 @@ void EdgeBendCommand::undo() foreach(EdgeItem *ei, _scene->edgeItems()) { if (ei->edge() == _edge) { ei->readPos(); + + Path *p = ei->edge()->path(); + if (p) _scene->pathItems()[p]->readPos(); break; } } @@ -118,6 +121,9 @@ void EdgeBendCommand::redo() foreach(EdgeItem *ei, _scene->edgeItems()) { if (ei->edge() == _edge) { ei->readPos(); + + Path *p = ei->edge()->path(); + if (p) _scene->pathItems()[p]->readPos(); break; } } @@ -287,6 +293,9 @@ void ChangeEdgeModeCommand::undo() // FIXME: this act strangely sometimes _edge->setBasicBendMode(!_edge->basicBendMode()); _scene->edgeItems()[_edge]->readPos(); + Path *p = _edge->path(); + if (p) _scene->pathItems()[p]->readPos(); + GraphUpdateCommand::undo(); } @@ -294,6 +303,9 @@ void ChangeEdgeModeCommand::redo() { _edge->setBasicBendMode(!_edge->basicBendMode()); _scene->edgeItems()[_edge]->readPos(); + Path *p = _edge->path(); + if (p) _scene->pathItems()[p]->readPos(); + GraphUpdateCommand::redo(); } @@ -607,6 +619,12 @@ MakePathCommand::MakePathCommand(TikzScene *scene, void MakePathCommand::undo() { Path *p = _edgeList.first()->path(); + + PathItem *pi = _scene->pathItems()[p]; + _scene->removeItem(pi); + _scene->pathItems().remove(p); + delete pi; + p->removeEdges(); _scene->graph()->removePath(p); @@ -617,6 +635,7 @@ void MakePathCommand::undo() } } + _scene->refreshZIndices(); GraphUpdateCommand::undo(); } @@ -640,5 +659,11 @@ void MakePathCommand::redo() _scene->graph()->addPath(p); + PathItem *pi = new PathItem(p); + _scene->addItem(pi); + _scene->pathItems().insert(p, pi); + pi->readPos(); + + _scene->refreshZIndices(); GraphUpdateCommand::redo(); } diff --git a/tikzit.pro b/tikzit.pro index 878caaa..46a411a 100644 --- a/tikzit.pro +++ b/tikzit.pro @@ -54,6 +54,7 @@ include(bison.pri) SOURCES += src/gui/mainwindow.cpp \ src/data/path.cpp \ + src/gui/pathitem.cpp \ src/gui/toolpalette.cpp \ src/gui/tikzscene.cpp \ src/data/graph.cpp \ @@ -87,6 +88,7 @@ SOURCES += src/gui/mainwindow.cpp \ HEADERS += src/gui/mainwindow.h \ src/data/path.h \ + src/gui/pathitem.h \ src/gui/toolpalette.h \ src/gui/tikzscene.h \ src/data/graph.h \ -- cgit v1.2.3 From 5ca0a2e48d0198102dabad4af5048a53e6938fe8 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Mon, 13 Apr 2020 22:30:51 +0100 Subject: automatically expact selection to path --- src/data/style.cpp | 4 +++- src/gui/tikzscene.cpp | 34 ++++++++++++++++++++++++++++++---- src/gui/tikzscene.h | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) (limited to 'src/gui/tikzscene.h') diff --git a/src/data/style.cpp b/src/data/style.cpp index d0f011d..fe33ee0 100644 --- a/src/data/style.cpp +++ b/src/data/style.cpp @@ -62,7 +62,9 @@ QColor Style::fillColor(bool tikzitOverride) const QBrush Style::brush() const { - return QBrush(fillColor()); + QString col = propertyWithDefault("fill", "none", true); + if (col == "none") return Qt::NoBrush; + else return QBrush(tikzit->colorByName(col)); } QString Style::shape(bool tikzitOverride) const diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index 57ddb48..e510931 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -389,7 +389,6 @@ void TikzScene::makePath() foreach (Edge *e, p) { if (e != p.first()) oldEdgeData[e] = e->data()->copy(); } - qDebug() << oldEdgeData; _tikzDocument->undoStack()->beginMacro("Make Path"); _tikzDocument->undoStack()->push(new ReverseEdgesCommand(this, flip)); @@ -448,6 +447,7 @@ void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) _mouseDownPos = event->scenePos(); _draggingNodes = false; + _selectingEdge = nullptr; // radius of a control point for bezier edges, in scene coordinates qreal cpR = GLOBAL_SCALEF * (0.1); @@ -528,9 +528,19 @@ void TikzScene::mousePressEvent(QGraphicsSceneMouseEvent *event) } } - auto its = items(_mouseDownPos); - if (!its.isEmpty() && dynamic_cast(its[0])) - _draggingNodes = true; + QList its = items(_mouseDownPos); + if (!its.isEmpty()) { + if (dynamic_cast(its[0])) { + _draggingNodes = true; + } else { + foreach (QGraphicsItem *gi, its) { + if (EdgeItem *ei = dynamic_cast(gi)) { + _selectingEdge = ei->edge(); + break; + } + } + } + } } break; @@ -730,6 +740,22 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) // otherwise, process mouse move normally QGraphicsScene::mouseReleaseEvent(event); + if (_selectingEdge) { + bool sel = edgeItems()[_selectingEdge]->isSelected(); + Path *p = _selectingEdge->path(); + if (p) { + foreach (Edge *e, p->edges()) { + if (e != _selectingEdge) + edgeItems()[e]->setSelected(sel); + nodeItems()[e->source()]->setSelected(sel); + nodeItems()[e->target()]->setSelected(sel); + } + } else { + nodeItems()[_selectingEdge->source()]->setSelected(sel); + nodeItems()[_selectingEdge->target()]->setSelected(sel); + } + } + if (_rubberBandItem->isVisible()) { QPainterPath sel; sel.addRect(_rubberBandItem->rect()); diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index 2e72faf..3f035e2 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -118,6 +118,7 @@ private: QGraphicsLineItem *_drawEdgeItem; QGraphicsRectItem *_rubberBandItem; EdgeItem *_modifyEdgeItem; + Edge *_selectingEdge; NodeItem *_edgeStartNodeItem; NodeItem *_edgeEndNodeItem; bool _firstControlPoint; -- cgit v1.2.3 From 8f3f804990387607b7e52b5550ebce52e36aa619 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Sun, 19 Apr 2020 18:15:26 +0100 Subject: add path as background --- src/gui/mainmenu.cpp | 8 +++++++- src/gui/mainmenu.h | 1 + src/gui/mainmenu.ui | 9 ++++++++ src/gui/tikzscene.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++--------- src/gui/tikzscene.h | 2 +- tex/logo.tikzstyles | 5 ++++- 6 files changed, 69 insertions(+), 13 deletions(-) (limited to 'src/gui/tikzscene.h') diff --git a/src/gui/mainmenu.cpp b/src/gui/mainmenu.cpp index 092d8b4..efd453d 100644 --- a/src/gui/mainmenu.cpp +++ b/src/gui/mainmenu.cpp @@ -242,7 +242,13 @@ void MainMenu::on_actionMerge_Nodes_triggered() void MainMenu::on_actionMake_Path_triggered() { if (tikzit->activeWindow() != 0) - tikzit->activeWindow()->tikzScene()->makePath(); + tikzit->activeWindow()->tikzScene()->makePath(false); +} + +void MainMenu::on_actionMake_Path_as_Background_triggered() +{ + if (tikzit->activeWindow() != 0) + tikzit->activeWindow()->tikzScene()->makePath(true); } void MainMenu::on_actionSplit_Path_triggered() diff --git a/src/gui/mainmenu.h b/src/gui/mainmenu.h index 431e43a..d0d73e9 100644 --- a/src/gui/mainmenu.h +++ b/src/gui/mainmenu.h @@ -68,6 +68,7 @@ public slots: void on_actionReverse_Edge_Direction_triggered(); void on_actionMerge_Nodes_triggered(); void on_actionMake_Path_triggered(); + void on_actionMake_Path_as_Background_triggered(); void on_actionSplit_Path_triggered(); // Tools diff --git a/src/gui/mainmenu.ui b/src/gui/mainmenu.ui index 2e390f9..11778db 100644 --- a/src/gui/mainmenu.ui +++ b/src/gui/mainmenu.ui @@ -64,6 +64,7 @@ + @@ -485,6 +486,14 @@ Ctrl+Shift+P + + + Make Path as Background + + + Ctrl+B + + diff --git a/src/gui/tikzscene.cpp b/src/gui/tikzscene.cpp index 9da8639..33e4710 100644 --- a/src/gui/tikzscene.cpp +++ b/src/gui/tikzscene.cpp @@ -314,11 +314,14 @@ void TikzScene::reverseSelectedEdges() _tikzDocument->undoStack()->push(cmd); } -void TikzScene::makePath() +void TikzScene::makePath(bool duplicateEdges) { QSet selNodes; + QSet selEdges; QSet edges; - getSelection(selNodes, edges); + getSelection(selNodes, selEdges); + + edges = selEdges; // if no edges are selected, try to infer edges from nodes if (edges.isEmpty()) { @@ -334,13 +337,29 @@ void TikzScene::makePath() } foreach (Edge *e, edges) { - if (e->path() != nullptr) { + if (e->path() != nullptr && !duplicateEdges) { //QMessageBox::warning(nullptr, "Error", "Edges must not already be in another path."); // TODO: maybe we want to automatically split paths if edges are in a path already? return; } } + _tikzDocument->undoStack()->beginMacro("Make Path"); + + QVector oldEdgeOrder = graph()->edges(); + QSet oldEdges, newEdges; + oldEdges = edges; + + if (duplicateEdges) { + foreach (Edge *e, edges) { + Edge *e1 = e->copy(); + _tikzDocument->undoStack()->push(new AddEdgeCommand(this, e1, false, selNodes, selEdges)); + newEdges << e1; + oldEdgeOrder << e1; + } + edges = newEdges; + } + // try to turn selected edges into one contiguous chain or cycle, recording // which edges need to be flipped. @@ -387,16 +406,33 @@ void TikzScene::makePath() return; } - //qDebug() << p; - //qDebug() << flip; + _tikzDocument->undoStack()->push(new ReverseEdgesCommand(this, flip)); + + // order all of the edges together, and in the case of + // duplicate edges, just below the first original. + QVector newEdgeOrder; + bool firstEdge = true; + foreach (Edge *e, oldEdgeOrder) { + if (oldEdges.contains(e)) { + if (firstEdge) { + newEdgeOrder += p; + firstEdge = false; + } + + if (duplicateEdges) newEdgeOrder << e; + } else if (!newEdges.contains(e)) { + newEdgeOrder << e; + } + } + + _tikzDocument->undoStack()->push(new ReorderCommand(this, + graph()->nodes(), graph()->nodes(), oldEdgeOrder, newEdgeOrder)); QMap oldEdgeData; foreach (Edge *e, p) { if (e != p.first()) oldEdgeData[e] = e->data()->copy(); } - _tikzDocument->undoStack()->beginMacro("Make Path"); - _tikzDocument->undoStack()->push(new ReverseEdgesCommand(this, flip)); _tikzDocument->undoStack()->push(new MakePathCommand(this, p, oldEdgeData)); _tikzDocument->undoStack()->endMacro(); } @@ -754,10 +790,11 @@ void TikzScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) nodeItems()[e->source()]->setSelected(sel); nodeItems()[e->target()]->setSelected(sel); } - } else { - nodeItems()[_selectingEdge->source()]->setSelected(sel); - nodeItems()[_selectingEdge->target()]->setSelected(sel); } +// else { +// nodeItems()[_selectingEdge->source()]->setSelected(sel); +// nodeItems()[_selectingEdge->target()]->setSelected(sel); +// } } if (_rubberBandItem->isVisible()) { diff --git a/src/gui/tikzscene.h b/src/gui/tikzscene.h index 3f035e2..e1d30d2 100644 --- a/src/gui/tikzscene.h +++ b/src/gui/tikzscene.h @@ -83,7 +83,7 @@ public: void reverseSelectedEdges(); - void makePath(); + void makePath(bool duplicateEdges); void splitPath(); void getSelection(QSet &selNodes, QSet &selEdges) const; diff --git a/tex/logo.tikzstyles b/tex/logo.tikzstyles index 3419ee3..1103b0b 100644 --- a/tex/logo.tikzstyles +++ b/tex/logo.tikzstyles @@ -4,9 +4,12 @@ % \tikzstyle{NAME}=[PROPERTY LIST] % Node styles -\tikzstyle{test}=[fill=none, draw=black, shape=circle] +\tikzstyle{white dot}=[fill=white, draw=black, shape=circle] % Edge styles \tikzstyle{bg}=[-, line width=0.5mm, fill={rgb,255: red,217; green,217; blue,217}] \tikzstyle{fg}=[-, fill=black] \tikzstyle{dir}=[->] +\tikzstyle{region A}=[-, draw=none, fill={rgb,255: red,255; green,160; blue,162}, opacity=0.8] +\tikzstyle{region B}=[-, draw=none, fill={rgb,255: red,190; green,185; blue,255}, opacity=0.8] +\tikzstyle{region C}=[-, fill={rgb,255: red,179; green,255; blue,192}, draw=none, opacity=0.8] -- cgit v1.2.3