qskinny/src/common/QskSizePolicy.h

177 lines
5.0 KiB
C
Raw Normal View History

2017-07-21 18:21:34 +02:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
2020-05-03 13:47:10 +02:00
#ifndef QSK_SIZE_POLICY_H
#define QSK_SIZE_POLICY_H
2017-07-21 18:21:34 +02:00
#include "QskGlobal.h"
#include <qnamespace.h>
2018-07-19 14:10:48 +02:00
#include <qmetatype.h>
2017-07-21 18:21:34 +02:00
class QSK_EXPORT QskSizePolicy
{
Q_GADGET
2018-08-03 08:15:28 +02:00
Q_PROPERTY( Policy horizontalPolicy
READ horizontalPolicy WRITE setHorizontalPolicy )
Q_PROPERTY( Policy verticalPolicy
READ verticalPolicy WRITE setVerticalPolicy )
2017-07-21 18:21:34 +02:00
2018-08-03 08:15:28 +02:00
public:
2017-07-21 18:21:34 +02:00
enum Flag
{
GrowFlag = 1 << 0,
ExpandFlag = 1 << 1,
ShrinkFlag = 1 << 2,
IgnoreFlag = 1 << 3,
ConstrainedFlag = 1 << 4
2017-07-21 18:21:34 +02:00
};
enum Policy
{
Fixed = 0,
Minimum = GrowFlag,
Maximum = ShrinkFlag,
Preferred = GrowFlag | ShrinkFlag,
2017-07-21 18:21:34 +02:00
MinimumExpanding = GrowFlag | ExpandFlag,
Expanding = GrowFlag | ShrinkFlag | ExpandFlag,
Ignored = ShrinkFlag | GrowFlag | IgnoreFlag,
Constrained = ConstrainedFlag,
ConstrainedMinimum = ConstrainedFlag | Minimum,
ConstrainedMaximum = ConstrainedFlag | Maximum,
ConstrainedPreferred = ConstrainedFlag | Preferred,
ConstrainedMinimumExpanding = ConstrainedFlag | MinimumExpanding,
ConstrainedExpanding = ConstrainedFlag | Expanding
2017-07-21 18:21:34 +02:00
};
enum ConstraintType
{
Unconstrained = 0,
WidthForHeight = 1 << 0,
HeightForWidth = 1 << 1
};
2017-07-21 18:21:34 +02:00
Q_ENUM( Flag )
Q_ENUM( Policy )
Q_ENUM( ConstraintType )
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
constexpr QskSizePolicy() noexcept;
constexpr QskSizePolicy( Policy horizontalPolicy, Policy verticalPolicy ) noexcept;
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
constexpr bool operator==( const QskSizePolicy& ) const noexcept;
constexpr bool operator!=( const QskSizePolicy& ) const noexcept;
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
void setHorizontalPolicy( Policy ) noexcept;
constexpr Policy horizontalPolicy() const noexcept;
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
void setVerticalPolicy( Policy ) noexcept;
constexpr Policy verticalPolicy() const noexcept;
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
void setPolicy( Qt::Orientation, Policy ) noexcept;
constexpr Policy policy( Qt::Orientation ) const noexcept;
2017-07-21 18:21:34 +02:00
2020-05-03 13:47:10 +02:00
ConstraintType constraintType() const noexcept;
constexpr bool isConstrained( Qt::Orientation ) const noexcept;
Qt::SizeHint effectiveSizeHintType(
2020-05-03 13:47:10 +02:00
Qt::SizeHint, Qt::Orientation ) const noexcept;
2020-05-03 13:47:10 +02:00
constexpr QskSizePolicy transposed() const noexcept;
void transpose() noexcept;
2020-03-13 13:57:56 +01:00
2018-08-03 08:15:28 +02:00
private:
unsigned char m_horizontalPolicy;
unsigned char m_verticalPolicy;
2017-07-21 18:21:34 +02:00
};
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy::QskSizePolicy() noexcept
2018-08-03 08:15:28 +02:00
: m_horizontalPolicy( Ignored )
, m_verticalPolicy( Ignored )
2017-07-21 18:21:34 +02:00
{
}
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy::QskSizePolicy(
Policy horizontalPolicy, Policy verticalPolicy ) noexcept
2018-08-03 08:15:28 +02:00
: m_horizontalPolicy( horizontalPolicy )
, m_verticalPolicy( verticalPolicy )
2017-07-21 18:21:34 +02:00
{
}
2020-05-03 13:47:10 +02:00
inline constexpr bool QskSizePolicy::operator==(
const QskSizePolicy& other ) const noexcept
2017-07-21 18:21:34 +02:00
{
2018-08-03 08:15:28 +02:00
return ( other.m_horizontalPolicy == m_horizontalPolicy ) &&
( other.m_verticalPolicy == m_verticalPolicy );
2017-07-21 18:21:34 +02:00
}
2020-05-03 13:47:10 +02:00
inline constexpr bool QskSizePolicy::operator!=(
const QskSizePolicy& other ) const noexcept
2017-07-21 18:21:34 +02:00
{
return !( *this == other );
}
2020-05-03 13:47:10 +02:00
inline void QskSizePolicy::setHorizontalPolicy( Policy policy ) noexcept
2017-07-21 18:21:34 +02:00
{
2020-05-04 12:20:20 +02:00
m_horizontalPolicy = static_cast< unsigned char >( policy );
2017-07-21 18:21:34 +02:00
}
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy::Policy QskSizePolicy::horizontalPolicy() const noexcept
2017-07-21 18:21:34 +02:00
{
return static_cast< Policy >( m_horizontalPolicy );
}
2020-05-03 13:47:10 +02:00
inline void QskSizePolicy::setVerticalPolicy( Policy policy ) noexcept
2017-07-21 18:21:34 +02:00
{
2020-05-04 12:20:20 +02:00
m_verticalPolicy = static_cast< unsigned char >( policy );
2017-07-21 18:21:34 +02:00
}
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy::Policy QskSizePolicy::verticalPolicy() const noexcept
2017-07-21 18:21:34 +02:00
{
return static_cast< Policy >( m_verticalPolicy );
}
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy::Policy QskSizePolicy::policy(
Qt::Orientation orientation ) const noexcept
{
return static_cast< Policy >(
( orientation == Qt::Horizontal ) ? m_horizontalPolicy : m_verticalPolicy );
}
inline void QskSizePolicy::setPolicy(
Qt::Orientation orientation, Policy policy ) noexcept
{
if ( orientation == Qt::Horizontal )
2020-05-04 12:20:20 +02:00
m_horizontalPolicy = static_cast< unsigned char >( policy );
2020-05-03 13:47:10 +02:00
else
2020-05-04 12:20:20 +02:00
m_verticalPolicy = static_cast< unsigned char >( policy );
2020-05-03 13:47:10 +02:00
}
inline constexpr bool QskSizePolicy::isConstrained(
Qt::Orientation orientation ) const noexcept
{
return ( policy( orientation ) & ConstrainedFlag );
}
2020-05-03 13:47:10 +02:00
inline constexpr QskSizePolicy QskSizePolicy::transposed() const noexcept
{
return QskSizePolicy( verticalPolicy(), horizontalPolicy() );
}
2017-07-21 18:21:34 +02:00
#ifndef QT_NO_DEBUG_STREAM
2020-05-03 13:47:10 +02:00
class QDebug;
2017-07-21 18:21:34 +02:00
QSK_EXPORT QDebug operator<<( QDebug, const QskSizePolicy& );
#endif
Q_DECLARE_TYPEINFO( QskSizePolicy, Q_MOVABLE_TYPE );
Q_DECLARE_METATYPE( QskSizePolicy )
#endif