/****************************************************************************** * QSkinny - Copyright (C) 2016 Uwe Rathmann * This file may be used under the terms of the QSkinny License, Version 1.0 *****************************************************************************/ #ifndef QSK_LAYOUT_CHAIN_H #define QSK_LAYOUT_CHAIN_H #include #include #include class QDebug; class QskLayoutChain { public: class Segment { public: inline qreal end() const { return start + length; } qreal start = 0.0; qreal length = 0.0; }; typedef QVector< Segment > Segments; class CellData { public: inline bool operator==( const CellData& other ) const { return ( isValid == other.isValid ) && ( canGrow == other.canGrow ) && ( stretch == other.stretch ) && ( hint == other.hint ); } inline bool operator!=( const CellData& other ) const { return !( *this == other ); } inline qreal size( int which ) const { return hint.size( which ); } inline void setSize( int which, qreal size ) { hint.setSize( which, size ); } QskLayoutHint hint; int stretch = 0; bool canGrow = false; bool isValid = false; }; enum ExtraSpacing { Leading = 1 << 0, Trailing = 1 << 1 }; QskLayoutChain(); ~QskLayoutChain(); void invalidate(); void reset( int count, qreal constraint ); void expandCell( int index, const CellData& ); void expandCells( int start, int end, const CellData& ); void narrowCell( int index, const CellData& ); void finish(); const CellData& cell( int index ) const { return m_cells[ index ]; } bool setSpacing( qreal spacing ); qreal spacing() const { return m_spacing; } void setExtraSpacingAt( int extraSpacingAt ) { m_extraSpacingAt = extraSpacingAt; } Segments segments( qreal size ) const; QskLayoutHint boundingHint() const { return m_boundingHint; } inline qreal constraint() const { return m_constraint; } inline int count() const { return m_cells.size(); } private: Segments distributed( int which, qreal offset, qreal extra ) const; Segments minimumExpanded( qreal size ) const; Segments preferredStretched( qreal size ) const; QskLayoutHint m_boundingHint; qreal m_constraint = -2.0; qreal m_spacing = 0; int m_extraSpacingAt; int m_sumStretches = 0; int m_validCells = 0; QVector< CellData > m_cells; }; #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug, const QskLayoutChain::Segment& ); QDebug operator<<( QDebug, const QskLayoutChain::CellData& ); #endif Q_DECLARE_TYPEINFO( QskLayoutChain::Segment, Q_MOVABLE_TYPE ); Q_DECLARE_TYPEINFO( QskLayoutChain::CellData, Q_MOVABLE_TYPE ); #endif