qt6-bb10/src/gui/util/qlayoutpolicy_p.h

161 lines
4.9 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QLAYOUTPOLICY_H
#define QLAYOUTPOLICY_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtGui/private/qtguiglobal_p.h>
#include <QtCore/qobject.h>
#include <QtCore/qnamespace.h>
#ifndef QT_NO_DATASTREAM
# include <QtCore/qdatastream.h>
#endif
QT_BEGIN_NAMESPACE
class QVariant;
class QLayoutPolicy
{
Q_GADGET_EXPORT(Q_GUI_EXPORT)
public:
enum PolicyFlag {
GrowFlag = 1,
ExpandFlag = 2,
ShrinkFlag = 4,
IgnoreFlag = 8
};
Q_DECLARE_FLAGS(Policy, PolicyFlag)
Q_FLAG(Policy)
static constexpr inline Policy Fixed = {};
static constexpr inline Policy Minimum = GrowFlag;
static constexpr inline Policy Maximum = ShrinkFlag;
static constexpr inline Policy Preferred = Minimum | Maximum;
static constexpr inline Policy MinimumExpanding = Minimum | ExpandFlag;
static constexpr inline Policy Expanding = Preferred | ExpandFlag;
static constexpr inline Policy Ignored = Preferred | IgnoreFlag;
enum ControlType {
DefaultType = 0x00000001,
ButtonBox = 0x00000002,
CheckBox = 0x00000004,
ComboBox = 0x00000008,
Frame = 0x00000010,
GroupBox = 0x00000020,
Label = 0x00000040,
Line = 0x00000080,
LineEdit = 0x00000100,
PushButton = 0x00000200,
RadioButton = 0x00000400,
Slider = 0x00000800,
SpinBox = 0x00001000,
TabWidget = 0x00002000,
ToolButton = 0x00004000
};
Q_DECLARE_FLAGS(ControlTypes, ControlType)
QLayoutPolicy() : data(0) { }
QLayoutPolicy(Policy horizontal, Policy vertical, ControlType type = DefaultType)
: data(0) {
bits.horPolicy = horizontal;
bits.verPolicy = vertical;
setControlType(type);
}
Policy horizontalPolicy() const { return static_cast<Policy>(bits.horPolicy); }
Policy verticalPolicy() const { return static_cast<Policy>(bits.verPolicy); }
Q_GUI_EXPORT ControlType controlType() const;
void setHorizontalPolicy(Policy d) { bits.horPolicy = d; }
void setVerticalPolicy(Policy d) { bits.verPolicy = d; }
Q_GUI_EXPORT void setControlType(ControlType type);
Qt::Orientations expandingDirections() const {
Qt::Orientations result;
if (verticalPolicy() & ExpandFlag)
result |= Qt::Vertical;
if (horizontalPolicy() & ExpandFlag)
result |= Qt::Horizontal;
return result;
}
void setHeightForWidth(bool b) { bits.hfw = b; }
bool hasHeightForWidth() const { return bits.hfw; }
void setWidthForHeight(bool b) { bits.wfh = b; }
bool hasWidthForHeight() const { return bits.wfh; }
bool operator==(const QLayoutPolicy& s) const { return data == s.data; }
bool operator!=(const QLayoutPolicy& s) const { return data != s.data; }
int horizontalStretch() const { return static_cast<int>(bits.horStretch); }
int verticalStretch() const { return static_cast<int>(bits.verStretch); }
void setHorizontalStretch(int stretchFactor) { bits.horStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
void setVerticalStretch(int stretchFactor) { bits.verStretch = static_cast<quint32>(qBound(0, stretchFactor, 255)); }
inline void transpose();
private:
#ifndef QT_NO_DATASTREAM
friend QDataStream &operator<<(QDataStream &, const QLayoutPolicy &);
friend QDataStream &operator>>(QDataStream &, QLayoutPolicy &);
#endif
QLayoutPolicy(int i) : data(i) { }
union {
struct {
quint32 horStretch : 8;
quint32 verStretch : 8;
quint32 horPolicy : 4;
quint32 verPolicy : 4;
quint32 ctype : 5;
quint32 hfw : 1;
quint32 wfh : 1;
quint32 padding : 1; // feel free to use
} bits;
quint32 data;
};
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QLayoutPolicy::Policy)
Q_DECLARE_OPERATORS_FOR_FLAGS(QLayoutPolicy::ControlTypes)
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &, const QLayoutPolicy &);
QDataStream &operator>>(QDataStream &, QLayoutPolicy &);
#endif
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QLayoutPolicy &);
#endif
inline void QLayoutPolicy::transpose() {
Policy hData = horizontalPolicy();
Policy vData = verticalPolicy();
int hStretch = horizontalStretch();
int vStretch = verticalStretch();
setHorizontalPolicy(vData);
setVerticalPolicy(hData);
setHorizontalStretch(vStretch);
setVerticalStretch(hStretch);
}
QT_END_NAMESPACE
#endif // QLAYOUTPOLICY_H