summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2014-12-17 16:19:27 +0100
committerMarc Mutz <marc.mutz@kdab.com>2017-01-28 07:46:27 +0000
commit8b9b27bced5227fae0f44a92a24183f38c944c02 (patch)
tree22ae2dfdb993ed237ffab8dedce7bb348896e4eb /src
parentce3402b5efc929b99d6ecb27f47e671cdcfae393 (diff)
QSizePolicy: add a transposed() method
In some situations, this allows for nicer code. It's also possible to make this constexpr in C++11, whereas the mutable transpose() would require C++14-style constexpr. The new function should also be faster, since it just swaps the member variables. Because of constexpr-function limitations, the way the return value is constructed needs to depend on the level of the compiler's C++11 support. This is not the only class that requires uniform init to provide a fully constexpr interface (QUuid and QBasicAtomic come to mind), so this should probably be generalized across Qt at some point. Added tests. [ChangeLog][QtWidgets][QSizePolicy] Added transposed() method. Change-Id: Ic1077a0d5a861e7c63bd1daeeb42b97c3a2f71ef Reviewed-by: Sérgio Martins <sergio.martins@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/widgets/kernel/qsizepolicy.cpp12
-rw-r--r--src/widgets/kernel/qsizepolicy.h38
2 files changed, 50 insertions, 0 deletions
diff --git a/src/widgets/kernel/qsizepolicy.cpp b/src/widgets/kernel/qsizepolicy.cpp
index e902bb522c..34ad64217b 100644
--- a/src/widgets/kernel/qsizepolicy.cpp
+++ b/src/widgets/kernel/qsizepolicy.cpp
@@ -395,6 +395,18 @@ void QSizePolicy::setControlType(ControlType type)
\fn void QSizePolicy::transpose()
Swaps the horizontal and vertical policies and stretches.
+
+ \sa transposed()
+*/
+
+/*!
+ \fn QSizePolicy QSizePolicy::transposed()
+ \since 5.9
+
+ Returns a size policy object with the horizontal and vertical
+ policies and stretches swapped.
+
+ \sa transpose()
*/
/*!
diff --git a/src/widgets/kernel/qsizepolicy.h b/src/widgets/kernel/qsizepolicy.h
index a0098cfd74..80bc8eacdb 100644
--- a/src/widgets/kernel/qsizepolicy.h
+++ b/src/widgets/kernel/qsizepolicy.h
@@ -49,11 +49,25 @@ QT_BEGIN_NAMESPACE
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54922
#if !defined(Q_CC_GNU) || defined(Q_CC_INTEL) || defined(Q_CC_CLANG) || Q_CC_GNU >= 408
# define QT_SIZEPOLICY_CONSTEXPR Q_DECL_CONSTEXPR
+# if defined(Q_COMPILER_UNIFORM_INIT)
+# define QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT Q_DECL_CONSTEXPR
+# if defined(Q_COMPILER_CONSTEXPR)
+# define QT_SIZEPOLICY_RETURN_BITS(E1, E2, E3, E4, E5, E6, E7, E8) \
+ return Bits{ E1, E2, E3, E4, E5, E6, E7, E8 }
+# endif // constexpr && uniform-init
+# endif // uniform-init
#endif
#ifndef QT_SIZEPOLICY_CONSTEXPR
# define QT_SIZEPOLICY_CONSTEXPR
#endif
+#ifndef QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT
+# define QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT
+#endif
+#ifndef QT_SIZEPOLICY_RETURN_BITS
+# define QT_SIZEPOLICY_RETURN_BITS(E1, E2, E3, E4, E5, E6, E7, E8) \
+ const Bits result = { E1, E2, E3, E4, E5, E6, E7, E8 }; return result
+#endif
class QVariant;
class QSizePolicy;
@@ -145,6 +159,13 @@ public:
void setRetainSizeWhenHidden(bool retainSize) { bits.retainSizeWhenHidden = retainSize; }
void transpose();
+#ifndef Q_QDOC
+ QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT
+#endif
+ QSizePolicy transposed() const Q_DECL_NOTHROW Q_REQUIRED_RESULT
+ {
+ return QSizePolicy(bits.transposed());
+ }
private:
#ifndef QT_NO_DATASTREAM
@@ -152,6 +173,8 @@ private:
friend Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &, QSizePolicy &);
#endif
QT_SIZEPOLICY_CONSTEXPR QSizePolicy(int i) : data(i) { }
+ struct Bits;
+ QT_SIZEPOLICY_CONSTEXPR explicit QSizePolicy(Bits b) Q_DECL_NOTHROW : bits(b) { }
struct Bits {
quint32 horStretch : 8;
@@ -162,6 +185,19 @@ private:
quint32 hfw : 1;
quint32 wfh : 1;
quint32 retainSizeWhenHidden : 1;
+
+ QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT
+ Bits transposed() const Q_DECL_NOTHROW
+ {
+ QT_SIZEPOLICY_RETURN_BITS(verStretch, // \ swap
+ horStretch, // /
+ verPolicy, // \ swap
+ horPolicy, // /
+ ctype,
+ hfw, // \ don't swap (historic behavior)
+ wfh, // /
+ retainSizeWhenHidden);
+ }
};
union {
Bits bits;
@@ -196,6 +232,8 @@ inline void QSizePolicy::transpose() {
}
#undef QT_SIZEPOLICY_CONSTEXPR
+#undef QT_SIZEPOLICY_CONSTEXPR_AND_UNIFORM_INIT
+#undef QT_SIZEPOLICY_RETURN_BITS
QT_END_NAMESPACE