QskSkinlet::itemIndexAt introduced

This commit is contained in:
Uwe Rathmann 2021-12-26 09:15:15 +01:00
parent 34641e4860
commit 1930810070
6 changed files with 58 additions and 17 deletions

View File

@ -238,18 +238,6 @@ void QskMenu::traverse( int steps )
Q_EMIT currentIndexChanged( index );
}
int QskMenu::indexAtPosition( const QPointF& pos ) const
{
for ( int i = 0; i < count(); i++ )
{
// A menu never has many cells and we can simply iterate
if ( cellRect( i ).contains( pos ) )
return i;
}
return -1;
}
QskColorFilter QskMenu::graphicFilterAt( int index ) const
{
Q_UNUSED( index );
@ -314,4 +302,10 @@ QRectF QskMenu::cellRect( int index ) const
this, contentsRect(), QskMenu::Cell, index );
}
int QskMenu::indexAtPosition( const QPointF& pos ) const
{
return effectiveSkinlet()->itemIndexAt(
this, contentsRect(), QskMenu::Cell, pos );
}
#include "moc_QskMenu.cpp"

View File

@ -50,7 +50,6 @@ class QSK_EXPORT QskMenu : public QskPopup
void addSeparator();
int indexAtPosition( const QPointF& ) const;
Entry entryAt( int index ) const;
QskGraphic graphicAt( int index ) const;
@ -65,6 +64,7 @@ class QSK_EXPORT QskMenu : public QskPopup
QRectF focusIndicatorRect() const override;
QRectF cellRect( int index ) const;
int indexAtPosition( const QPointF& ) const;
Q_SIGNALS:
void triggered( int index );

View File

@ -271,6 +271,41 @@ QRectF QskMenuSkinlet::itemRect(
skinnable, contentsRect, subControl, index );
}
int QskMenuSkinlet::itemIndexAt( const QskSkinnable* skinnable,
const QRectF& rect, QskAspect::Subcontrol subControl, const QPointF& pos ) const
{
if ( subControl == QskMenu::Cell )
{
const auto menu = static_cast< const QskMenu* >( skinnable );
const auto panelRect = menu->subControlContentsRect( QskMenu::Panel );
if ( !panelRect.contains( pos ) )
return -1;
/*
A menu never has many items and we can simply iterate
without being concerned about performance issues
*/
const auto h = qskCellHeight( menu );
auto r = panelRect;
r.setHeight( h );
for ( int i = 0; i < menu->count(); i++ )
{
if ( r.contains( pos ) )
return i;
r.moveTop( r.bottom() );
}
return -1;
}
return Inherited::itemIndexAt( skinnable, rect, subControl, pos );
}
QSGNode* QskMenuSkinlet::updateContentsNode(
const QskPopup* popup, QSGNode* contentsNode ) const
{

View File

@ -24,7 +24,10 @@ class QSK_EXPORT QskMenuSkinlet : public QskPopupSkinlet
const QRectF&, QskAspect::Subcontrol ) const override;
QRectF itemRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, int index ) const override;
const QRectF&, QskAspect::Subcontrol, int itemIndex ) const override;
int itemIndexAt( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, const QPointF& ) const override;
QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const override;

View File

@ -581,6 +581,12 @@ QSizeF QskSkinlet::hintWithoutConstraint(
return h;
}
int QskSkinlet::itemIndexAt( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, const QPointF& ) const
{
return -1;
}
QRectF QskSkinlet::itemRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, int index ) const
{

View File

@ -36,14 +36,17 @@ class QSK_EXPORT QskSkinlet
virtual void updateNode( QskSkinnable*, QSGNode* parent ) const;
virtual QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const;
virtual QRectF subControlRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol ) const;
virtual QRectF itemRect( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, int index ) const;
const QRectF&, QskAspect::Subcontrol, int itemIndex ) const;
virtual QSizeF sizeHint( const QskSkinnable*,
Qt::SizeHint, const QSizeF& ) const;
virtual int itemIndexAt( const QskSkinnable*,
const QRectF&, QskAspect::Subcontrol, const QPointF& ) const;
const QVector< quint8 >& nodeRoles() const;