19#include <QtWidgets/private/qtwidgetsglobal_p.h>
20#include <QtCore/QHash>
21#include <QtCore/QQueue>
22#include <QtCore/QString>
33template <
typename Vertex,
typename EdgeData>
39 class const_iterator {
41 const_iterator(
const Graph *graph,
bool begin) : g(graph){
43 row = g->m_graph.constBegin();
45 if (row != g->m_graph.constEnd())
46 column = row->cbegin();
48 row = g->m_graph.constEnd();
52 inline Vertex *operator*() {
56 inline Vertex *from()
const {
60 inline Vertex *to()
const {
64 inline bool operator==(
const const_iterator &o)
const {
return !(*
this != o); }
65 inline bool operator!=(
const const_iterator &o)
const {
66 if (row == g->m_graph.end()) {
69 return row != o.row || column != o.column;
74 const_iterator &operator++() {
75 if (row != g->m_graph.constEnd()) {
77 if (column == row->cend()) {
79 if (row != g->m_graph.constEnd()) {
80 column = row->cbegin();
89 typename QHash<Vertex *, QHash<Vertex *, EdgeData *> >::const_iterator row;
90 typename QHash<Vertex *, EdgeData *>::const_iterator column;
93 const_iterator constBegin()
const {
94 return const_iterator(
this,
true);
97 const_iterator constEnd()
const {
98 return const_iterator(
this,
false);
102
103
104
105
106
107
108 EdgeData *edgeData(Vertex* first, Vertex* second) {
109 const auto it = m_graph.constFind(first);
110 if (it == m_graph.cend())
112 const auto jt = it->constFind(second);
113 if (jt == it->cend())
118 void createEdge(Vertex *first, Vertex *second, EdgeData *data)
121#if defined(QT_DEBUG) && 0
122 qDebug(
"Graph::createEdge(): %s",
123 qPrintable(QString::fromLatin1(
"%1-%2")
124 .arg(first->toString()).arg(second->toString())));
126 if (edgeData(first, second)) {
128 qWarning(
"%s-%s already has an edge", qPrintable(first->toString()), qPrintable(second->toString()));
131 createDirectedEdge(first, second, data);
132 createDirectedEdge(second, first, data);
135 void removeEdge(Vertex *first, Vertex *second)
138#if defined(QT_DEBUG) && 0
139 qDebug(
"Graph::removeEdge(): %s",
140 qPrintable(QString::fromLatin1(
"%1-%2")
141 .arg(first->toString()).arg(second->toString())));
143 EdgeData *data = edgeData(first, second);
144 removeDirectedEdge(first, second);
145 removeDirectedEdge(second, first);
146 if (data)
delete data;
149 EdgeData *takeEdge(Vertex* first, Vertex* second)
151#if defined(QT_DEBUG) && 0
152 qDebug(
"Graph::takeEdge(): %s",
153 qPrintable(QString::fromLatin1(
"%1-%2")
154 .arg(first->toString()).arg(second->toString())));
157 EdgeData *data = edgeData(first, second);
159 removeDirectedEdge(first, second);
160 removeDirectedEdge(second, first);
165 QList<Vertex *> adjacentVertices(Vertex *vertex)
const
167 const auto it = m_graph.constFind(vertex);
168 if (it == m_graph.cend())
169 return QList<Vertex *>();
174 QSet<Vertex*> vertices()
const {
175 QSet<Vertex *> setOfVertices;
176 for (const_iterator it = constBegin(); it != constEnd(); ++it) {
177 setOfVertices.insert(*it);
179 return setOfVertices;
182 QList<std::pair<Vertex *, Vertex *>> connections()
const
184 QList<std::pair<Vertex *, Vertex *>> conns;
185 for (const_iterator it = constBegin(); it != constEnd(); ++it) {
186 Vertex *from = it.from();
187 Vertex *to = it.to();
189 if (std::less<Vertex*>()(from, to))
190 conns.emplace_back(from, to);
196 QString serializeToDot() {
200 QSet<Vertex *> setOfVertices = vertices();
201 for (
typename QSet<Vertex*>::const_iterator it = setOfVertices.begin(); it != setOfVertices.end(); ++it) {
203 const QList<Vertex*> adjacents = adjacentVertices(v);
204 for (
auto *v1 : adjacents) {
205 EdgeData *data = edgeData(v, v1);
206 bool forward = data->from == v;
208 edges += QString::fromLatin1(
"\"%1\"->\"%2\" [label=\"[%3,%4,%5,%6,%7]\" color=\"#000000\"] \n")
212 .arg(data->minPrefSize)
214 .arg(data->maxPrefSize)
219 strVertices += QString::fromLatin1(
"\"%1\" [label=\"%2\"]\n").arg(v->toString()).arg(v->toString());
221 return QString::fromLatin1(
"%1\n%2\n").arg(strVertices, edges);
226 void createDirectedEdge(Vertex *from, Vertex *to, EdgeData *data)
228 m_graph[from][to] = data;
231 void removeDirectedEdge(Vertex *from, Vertex *to)
233 const auto it = m_graph.find(from);
234 Q_ASSERT(it != m_graph.end());
244 QHash<Vertex *, QHash<Vertex *, EdgeData *> > m_graph;
The QGraphicsAnchorLayout class provides a layout where one can anchor widgets together in Graphics V...
void setSizePolicy(QSizePolicy::Policy policy)
~QGraphicsAnchorPrivate()
QSizePolicy::Policy sizePolicy
static QGraphicsAnchorPrivate * get(QGraphicsAnchor *q)
QGraphicsAnchorLayoutPrivate * layoutPrivate
void setSpacing(qreal value)
The QGraphicsAnchor class represents an anchor between two items in a QGraphicsAnchorLayout.
The QGraphicsLayout class provides the base class for all layouts in Graphics View.
void setDefaultSpacing(Qt::Orientation o, qreal spacing)
bool operator==(const QLayoutStyleInfo &other) const
bool operator!=(const QLayoutStyleInfo &other) const
qreal perItemSpacing(QSizePolicy::ControlType control1, QSizePolicy::ControlType control2, Qt::Orientation orientation) const
qreal defaultSpacing(Qt::Orientation o) const
QLayoutStyleInfo(QStyle *style, QWidget *widget)
QSet< AnchorData * > negatives
QSet< AnchorData * > positives
QSimplexConstraint * constraint(const GraphPath &path) const
QT_REQUIRE_CONFIG(animation)
Q_DECLARE_TYPEINFO(GraphPath, Q_RELOCATABLE_TYPE)
QT_REQUIRE_CONFIG(graphicsview)
Q_DECLARE_INTERFACE(QNetworkAccessBackendFactory, QNetworkAccessBackendFactory_iid)
virtual void updateChildrenSizes()
void refreshSizeHints(const QLayoutStyleInfo *styleInfo=nullptr)
QGraphicsLayoutItem * item
QGraphicsAnchor * graphicsAnchor
AnchorVertexPair(AnchorVertex *v1, AnchorVertex *v2, AnchorData *data)
AnchorData * m_removedAnchor
QList< AnchorData * > m_secondAnchors
QList< AnchorData * > m_firstAnchors
AnchorVertex(QGraphicsLayoutItem *item, Qt::AnchorPoint edge)
virtual ~AnchorVertex()=default
QGraphicsLayoutItem * m_item
virtual void updateChildrenSizes() override
ParallelAnchorData(AnchorData *first, AnchorData *second)
QList< QSimplexConstraint * > m_secondConstraints
bool calculateSizeHints()
QList< QSimplexConstraint * > m_firstConstraints
bool secondForward() const
virtual void updateChildrenSizes() override
const QList< AnchorData * > m_edges
SequentialAnchorData(const QList< AnchorVertex * > &vertices, const QList< AnchorData * > &edges)
void calculateSizeHints()