Skip to content

Commit

Permalink
sizeHint calculations moved to the skinlet
Browse files Browse the repository at this point in the history
  • Loading branch information
uwerat committed Dec 29, 2020
1 parent 98343de commit 0eadfa8
Show file tree
Hide file tree
Showing 55 changed files with 452 additions and 398 deletions.
11 changes: 0 additions & 11 deletions examples/gallery/slider/CustomSlider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,6 @@ CustomSlider::CustomSlider( QQuickItem* parentItem )
this, &QskControl::focusIndicatorRectChanged );
}

QSizeF CustomSlider::contentsSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
auto size = Inherited::contentsSizeHint( which, constraint );

if ( which == Qt::PreferredSize && size.height() >= 0 )
size.setHeight( size.height() + 40 );

return size;
}

QRectF CustomSlider::focusIndicatorRect() const
{
return subControlRect( Handle );
Expand Down
3 changes: 0 additions & 3 deletions examples/gallery/slider/CustomSlider.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ class CustomSlider : public QskSlider
CustomSlider( QQuickItem* parent = nullptr );

QRectF focusIndicatorRect() const override;

protected:
QSizeF contentsSizeHint( Qt::SizeHint, const QSizeF& ) const override;
};

#endif
11 changes: 11 additions & 0 deletions examples/gallery/slider/CustomSliderSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -370,3 +370,14 @@ QSGNode* CustomSliderSkinlet::updateHandleNode(

return handleNode;
}

QSizeF CustomSliderSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
auto size = Inherited::sizeHint( skinnable, which, constraint );

if ( which == Qt::PreferredSize && size.height() >= 0 )
size.rheight() += 40;

return size;
}
3 changes: 3 additions & 0 deletions examples/gallery/slider/CustomSliderSkinlet.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ class CustomSliderSkinlet : public QskSliderSkinlet
QRectF subControlRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol ) const override;

QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

protected:
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;
Expand Down
4 changes: 2 additions & 2 deletions examples/layouts/DynamicConstraintsPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace
void transpose();

protected:
QSizeF contentsSizeHint( Qt::SizeHint, const QSizeF& ) const override;
QSizeF layoutSizeHint( Qt::SizeHint, const QSizeF& ) const override;

private:
qreal m_aspectRatio;
Expand Down Expand Up @@ -65,7 +65,7 @@ Control::Control( const char* colorName, qreal aspectRatio, QQuickItem* parent )
setPreferredHeight( 100 );
}

QSizeF Control::contentsSizeHint(
QSizeF Control::layoutSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which == Qt::PreferredSize )
Expand Down
27 changes: 0 additions & 27 deletions examples/mycontrols/MyToggleButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,33 +179,6 @@ QskGraphic MyToggleButton::graphicAt( int index ) const
return data.icon;
}

QSizeF MyToggleButton::contentsSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which != Qt::PreferredSize )
return QSizeF();

QSizeF hint;

// better use Minimum Width/Height hints TODO ...
constexpr qreal aspectRatio = 4.0 / 3.0;

if ( constraint.width() >= 0.0 )
{
hint.rheight() = constraint.width() / aspectRatio;
}
else if ( constraint.height() >= 0.0 )
{
hint.rwidth() = constraint.height() * aspectRatio;
}
else
{
hint = strutSizeHint( Panel );
}

return hint;
}

void MyToggleButton::updateResources()
{
for( int i = 0; i < 2; i++ )
Expand Down
1 change: 0 additions & 1 deletion examples/mycontrols/MyToggleButton.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ class MyToggleButton : public QskAbstractButton

protected:
void updateResources() override;
QSizeF contentsSizeHint( Qt::SizeHint, const QSizeF& ) const override;

private:
class PrivateData;
Expand Down
26 changes: 26 additions & 0 deletions examples/mycontrols/MyToggleButtonSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,30 @@ QSGNode* MyToggleButtonSkinlet::updateSubNode(
}
}

QSizeF MyToggleButtonSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which != Qt::PreferredSize )
return QSizeF();

QSizeF hint;

constexpr qreal aspectRatio = 4.0 / 3.0;

if ( constraint.width() >= 0.0 )
{
hint.rheight() = constraint.width() / aspectRatio;
}
else if ( constraint.height() >= 0.0 )
{
hint.rwidth() = constraint.height() * aspectRatio;
}
else
{
hint = skinnable->strutSizeHint( MyToggleButton::Panel );
}

return hint;
}

#include "moc_MyToggleButtonSkinlet.cpp"
6 changes: 5 additions & 1 deletion examples/mycontrols/MyToggleButtonSkinlet.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,12 @@ class MyToggleButtonSkinlet : public QskSkinlet
QRectF subControlRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol ) const override;

QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

protected:
QSGNode* updateSubNode( const QskSkinnable*, quint8 nodeRole, QSGNode* ) const override;
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;

private:
QRectF innerRect( const QskSkinnable*,
Expand Down
9 changes: 0 additions & 9 deletions src/controls/QskBox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,4 @@ QRectF QskBox::layoutRectForSize( const QSizeF& size ) const
return innerBox( Panel, subControlRect( size, Panel ) );
}

QSizeF QskBox::contentsSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( m_hasPanel && which == Qt::PreferredSize )
return strutSizeHint( Panel );

return Inherited::contentsSizeHint( which, constraint );
}

#include "moc_QskBox.cpp"
3 changes: 0 additions & 3 deletions src/controls/QskBox.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,6 @@ class QSK_EXPORT QskBox : public QskControl
void panelChanged( bool );
void paddingChanged( const QMarginsF& );

protected:
QSizeF contentsSizeHint( Qt::SizeHint, const QSizeF& ) const override;

private:
bool m_hasPanel;
};
Expand Down
11 changes: 11 additions & 0 deletions src/controls/QskBoxSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,15 @@ QSGNode* QskBoxSkinlet::updateSubNode(
return Inherited::updateSubNode( skinnable, nodeRole, node );
}

QSizeF QskBoxSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
const auto box = static_cast< const QskBox* >( skinnable );

if ( box->hasPanel() && which == Qt::PreferredSize )
return box->strutSizeHint( QskBox::Panel );

return Inherited::sizeHint( skinnable, which, constraint );
}

#include "moc_QskBoxSkinlet.cpp"
3 changes: 3 additions & 0 deletions src/controls/QskBoxSkinlet.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class QSK_EXPORT QskBoxSkinlet : public QskSkinlet
QRectF subControlRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol ) const override;

QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

protected:
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;
Expand Down
5 changes: 3 additions & 2 deletions src/controls/QskControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -951,9 +951,10 @@ void QskControl::updateResources()
{
}

QSizeF QskControl::contentsSizeHint( Qt::SizeHint, const QSizeF& ) const
QSizeF QskControl::contentsSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
return QSizeF();
return effectiveSkinlet()->sizeHint( this, which, constraint );
}

QSizeF QskControl::layoutSizeHint(
Expand Down
27 changes: 1 addition & 26 deletions src/controls/QskGraphicLabel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,34 +248,9 @@ void QskGraphicLabel::updateResources()
m_data->isSourceDirty = false;
}

QSizeF QskGraphicLabel::contentsSizeHint(
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which != Qt::PreferredSize )
return QSizeF();

auto sz = effectiveSourceSize();

if ( !sz.isEmpty() )
{
if ( constraint.width() >= 0.0 )
{
sz.setHeight( sz.height() * constraint.width() / sz.width() );
sz.setWidth( -1.0 );
}
else if ( constraint.height() >= 0.0 )
{
sz.setWidth( sz.width() * constraint.height() / sz.height() );
sz.setHeight( -1.0 );
}
}

return sz;
}

QSizeF QskGraphicLabel::effectiveSourceSize() const
{
const QSizeF& sourceSize = m_data->sourceSize;
const auto& sourceSize = m_data->sourceSize;

if ( sourceSize.width() >= 0 && sourceSize.height() >= 0 )
{
Expand Down
3 changes: 0 additions & 3 deletions src/controls/QskGraphicLabel.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,6 @@ class QSK_EXPORT QskGraphicLabel : public QskControl
void updateResources() override;
virtual QskGraphic loadSource( const QUrl& ) const;

QSizeF contentsSizeHint(
Qt::SizeHint, const QSizeF& constraint ) const override;

private:
class PrivateData;
std::unique_ptr< PrivateData > m_data;
Expand Down
27 changes: 27 additions & 0 deletions src/controls/QskGraphicLabelSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,31 @@ QSGNode* QskGraphicLabelSkinlet::updateGraphicNode(
return node;
}

QSizeF QskGraphicLabelSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& constraint ) const
{
if ( which != Qt::PreferredSize )
return QSizeF();

const auto label = static_cast< const QskGraphicLabel* >( skinnable );

auto sz = label->effectiveSourceSize();

if ( !sz.isEmpty() )
{
if ( constraint.width() >= 0.0 )
{
sz.setHeight( sz.height() * constraint.width() / sz.width() );
sz.setWidth( -1.0 );
}
else if ( constraint.height() >= 0.0 )
{
sz.setWidth( sz.width() * constraint.height() / sz.height() );
sz.setHeight( -1.0 );
}
}

return sz;
}

#include "moc_QskGraphicLabelSkinlet.cpp"
3 changes: 3 additions & 0 deletions src/controls/QskGraphicLabelSkinlet.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ class QSK_EXPORT QskGraphicLabelSkinlet : public QskSkinlet
QRectF subControlRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol ) const override;

QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

protected:
QSGNode* updateSubNode( const QskSkinnable*,
quint8 nodeRole, QSGNode* ) const override;
Expand Down
17 changes: 0 additions & 17 deletions src/controls/QskListView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,23 +153,6 @@ QskAspect::Subcontrol QskListView::textSubControlAt( int row, int col ) const
return ( row == selectedRow() ) ? TextSelected : Text;
}

QSizeF QskListView::contentsSizeHint(
Qt::SizeHint which, const QSizeF& ) const
{
qreal w = -1.0; // shouldn't we return something ???

if ( which != Qt::MaximumSize )
{
if ( m_data->preferredWidthFromColumns )
{
w = scrollableSize().width();
w += metric( QskScrollView::VerticalScrollBar | QskAspect::Size );
}
}

return QSizeF( w, -1.0 );
}

void QskListView::keyPressEvent( QKeyEvent* event )
{
if ( m_data->selectionMode == NoSelection )
Expand Down
1 change: 0 additions & 1 deletion src/controls/QskListView.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ class QSK_EXPORT QskListView : public QskScrollView

void updateScrollableSize();

QSizeF contentsSizeHint( Qt::SizeHint, const QSizeF& ) const override;
void componentComplete() override;

private:
Expand Down
21 changes: 20 additions & 1 deletion src/controls/QskListViewSkinlet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ QskListViewSkinlet::~QskListViewSkinlet() = default;
QSGNode* QskListViewSkinlet::updateContentsNode(
const QskScrollView* scrollView, QSGNode* node ) const
{
const auto* listView = static_cast< const QskListView* >( scrollView );
const auto listView = static_cast< const QskListView* >( scrollView );

auto* listViewNode = static_cast< QskListViewNode* >( node );
if ( listViewNode == nullptr )
Expand Down Expand Up @@ -482,4 +482,23 @@ QSGNode* QskListViewSkinlet::updateCellNode( const QskListView* listView,
return newNode;
}

QSizeF QskListViewSkinlet::sizeHint( const QskSkinnable* skinnable,
Qt::SizeHint which, const QSizeF& ) const
{
const auto listView = static_cast< const QskListView* >( skinnable );

qreal w = -1.0; // shouldn't we return something ???

if ( which != Qt::MaximumSize )
{
if ( listView->preferredWidthFromColumns() )
{
w = listView->scrollableSize().width();
w += listView->metric( QskScrollView::VerticalScrollBar | QskAspect::Size );
}
}

return QSizeF( w, -1.0 );
}

#include "moc_QskListViewSkinlet.cpp"
3 changes: 3 additions & 0 deletions src/controls/QskListViewSkinlet.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ class QSK_EXPORT QskListViewSkinlet : public QskScrollViewSkinlet
Q_INVOKABLE QskListViewSkinlet( QskSkin* = nullptr );
~QskListViewSkinlet() override;

QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

protected:
enum NodeRole
{
Expand Down
Loading

0 comments on commit 0eadfa8

Please sign in to comment.