QGraphicsAnchorLayout: port to QHVContainer [1/4]: local QHVContainer

This part of the patch changes the definitons of the member variables
from 'C arrays of extent 2' to QHVContainer and fixes the code where
ints were used to index into the array.

To not drown in renames, keep the locally-defined enum 'Orientation',
and create a local version of QHVContainer whose index operator is
overloaded for both Qt::Orientation and the local 'Orientation'.

Follow-up patches will remove these, then, completely.

After this patch, NOrientations is no longer used, and consequently
removed.

Change-Id: I2a241520fce4beeb87fc0e26cd6ab18f324a956a
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
This commit is contained in:
Marc Mutz 2020-05-05 15:28:46 +02:00
parent fc65683e65
commit 2f8cfc2c60
3 changed files with 47 additions and 41 deletions

View File

@ -238,8 +238,8 @@ QGraphicsAnchorLayout::~QGraphicsAnchorLayout()
d->removeCenterConstraints(this, QGraphicsAnchorLayoutPrivate::Vertical);
d->deleteLayoutEdges();
Q_ASSERT(d->itemCenterConstraints[0].isEmpty());
Q_ASSERT(d->itemCenterConstraints[1].isEmpty());
Q_ASSERT(d->itemCenterConstraints[Qt::Horizontal].isEmpty());
Q_ASSERT(d->itemCenterConstraints[Qt::Vertical].isEmpty());
Q_ASSERT(d->items.isEmpty());
Q_ASSERT(d->m_vertexList.isEmpty());
}
@ -372,7 +372,7 @@ void QGraphicsAnchorLayout::setHorizontalSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
d->spacings[0] = spacing;
d->spacings[Qt::Horizontal] = spacing;
invalidate();
}
@ -385,7 +385,7 @@ void QGraphicsAnchorLayout::setVerticalSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
d->spacings[1] = spacing;
d->spacings[Qt::Vertical] = spacing;
invalidate();
}
@ -404,7 +404,7 @@ void QGraphicsAnchorLayout::setSpacing(qreal spacing)
{
Q_D(QGraphicsAnchorLayout);
d->spacings[0] = d->spacings[1] = spacing;
d->spacings = {spacing, spacing};
invalidate();
}

View File

@ -621,19 +621,6 @@ QString GraphPath::toString() const
QGraphicsAnchorLayoutPrivate::QGraphicsAnchorLayoutPrivate()
: calculateGraphCacheDirty(true), styleInfoDirty(true)
{
for (int i = 0; i < NOrientations; ++i) {
for (int j = 0; j < 3; ++j) {
sizeHints[i][j] = -1;
}
interpolationProgress[i] = -1;
spacings[i] = -1;
graphHasConflicts[i] = false;
layoutFirstVertex[i] = nullptr;
layoutCentralVertex[i] = nullptr;
layoutLastVertex[i] = nullptr;
}
}
Qt::AnchorPoint QGraphicsAnchorLayoutPrivate::oppositeEdge(Qt::AnchorPoint edge)
@ -2032,8 +2019,8 @@ QLayoutStyleInfo &QGraphicsAnchorLayoutPrivate::styleInfo() const
QStyle *style = w ? w->style() : QApplication::style();
cachedStyleInfo = QLayoutStyleInfo(style, wid);
cachedStyleInfo.setDefaultSpacing(Qt::Horizontal, spacings[0]);
cachedStyleInfo.setDefaultSpacing(Qt::Vertical, spacings[1]);
cachedStyleInfo.setDefaultSpacing(Qt::Horizontal, spacings[Qt::Horizontal]);
cachedStyleInfo.setDefaultSpacing(Qt::Vertical, spacings[Qt::Vertical]);
styleInfoDirty = false;
}
@ -2953,9 +2940,9 @@ bool QGraphicsAnchorLayoutPrivate::hasConflicts() const
QGraphicsAnchorLayoutPrivate *that = const_cast<QGraphicsAnchorLayoutPrivate*>(this);
that->calculateGraphs();
bool floatConflict = !m_floatItems[0].isEmpty() || !m_floatItems[1].isEmpty();
bool floatConflict = !m_floatItems[Qt::Horizontal].isEmpty() || !m_floatItems[Qt::Vertical].isEmpty();
return graphHasConflicts[0] || graphHasConflicts[1] || floatConflict;
return graphHasConflicts[Qt::Horizontal] || graphHasConflicts[Qt::Vertical] || floatConflict;
}
#ifdef QT_DEBUG
@ -2966,8 +2953,8 @@ void QGraphicsAnchorLayoutPrivate::dumpGraph(const QString &name)
qWarning("Could not write to %ls", qUtf16Printable(file.fileName()));
QString str = QString::fromLatin1("digraph anchorlayout {\nnode [shape=\"rect\"]\n%1}");
QString dotContents = graph[0].serializeToDot();
dotContents += graph[1].serializeToDot();
QString dotContents = graph[Qt::Horizontal].serializeToDot();
dotContents += graph[Qt::Vertical].serializeToDot();
file.write(str.arg(dotContents).toLocal8Bit());
file.close();

View File

@ -60,6 +60,10 @@
#include "qgraph_p.h"
#include "qsimplex_p.h"
#include <QtGui/private/qgridlayoutengine_p.h>
#include <array>
QT_REQUIRE_CONFIG(graphicsview);
QT_BEGIN_NAMESPACE
@ -395,7 +399,22 @@ public:
enum Orientation {
Horizontal = 0,
Vertical,
NOrientations
};
template <typename T>
class QHVContainer : public QT_PREPEND_NAMESPACE(QHVContainer)<T>
{
using Base = QT_PREPEND_NAMESPACE(QHVContainer)<T>;
static constexpr Qt::Orientation map(Orientation o) noexcept
{ return static_cast<Qt::Orientation>(int(o) + 1); }
public:
using Base::Base;
using Base::operator[];
constexpr const T &operator[](Orientation o) const noexcept
{ return this->operator[](map(o)); }
constexpr T &operator[](Orientation o) noexcept
{ return this->operator[](map(o)); }
};
QGraphicsAnchorLayoutPrivate();
@ -552,9 +571,9 @@ public:
#endif
qreal spacings[NOrientations];
QHVContainer<qreal> spacings = {-1, -1};
// Size hints from simplex engine
qreal sizeHints[2][3];
QHVContainer<std::array<qreal, 3>> sizeHints = {{-1, -1, -1}, {-1, -1, -1}};
// Items
QVector<QGraphicsLayoutItem *> items;
@ -565,31 +584,31 @@ public:
QHash<QPair<QGraphicsLayoutItem*, Qt::AnchorPoint>, QPair<AnchorVertex *, int> > m_vertexList;
// Internal graph of anchorage points and anchors, for both orientations
Graph<AnchorVertex, AnchorData> graph[2];
QHVContainer<Graph<AnchorVertex, AnchorData>> graph;
AnchorVertex *layoutFirstVertex[2];
AnchorVertex *layoutCentralVertex[2];
AnchorVertex *layoutLastVertex[2];
QHVContainer<AnchorVertex *> layoutFirstVertex = {};
QHVContainer<AnchorVertex *> layoutCentralVertex = {};
QHVContainer<AnchorVertex *> layoutLastVertex = {};
// Combined anchors in order of creation
QList<AnchorVertexPair *> simplifiedVertices[2];
QList<AnchorData *> anchorsFromSimplifiedVertices[2];
QHVContainer<QList<AnchorVertexPair *>> simplifiedVertices;
QHVContainer<QList<AnchorData *>> anchorsFromSimplifiedVertices;
// Graph paths and constraints, for both orientations
QMultiHash<AnchorVertex *, GraphPath> graphPaths[2];
QList<QSimplexConstraint *> constraints[2];
QList<QSimplexConstraint *> itemCenterConstraints[2];
QHVContainer<QMultiHash<AnchorVertex *, GraphPath>> graphPaths;
QHVContainer<QList<QSimplexConstraint *>> constraints;
QHVContainer<QList<QSimplexConstraint *>> itemCenterConstraints;
// The interpolation interval and progress based on the current size
// as well as the key values (minimum, preferred and maximum)
Interval interpolationInterval[2];
qreal interpolationProgress[2];
QHVContainer<Interval> interpolationInterval;
QHVContainer<qreal> interpolationProgress = {-1, -1};
bool graphHasConflicts[2];
QSet<QGraphicsLayoutItem *> m_floatItems[2];
QHVContainer<bool> graphHasConflicts = {};
QHVContainer<QSet<QGraphicsLayoutItem *>> m_floatItems;
#if defined(QT_DEBUG) || defined(QT_BUILD_INTERNAL)
bool lastCalculationUsedSimplex[2];
QHVContainer<bool> lastCalculationUsedSimplex;
#endif
uint calculateGraphCacheDirty : 1;