segmented bar: support hovered state
This commit is contained in:
parent
636f548fed
commit
acb225bb82
|
@ -530,8 +530,25 @@ void Editor::setupSegmentedBar()
|
|||
setStrutSize( Q::Segment | A::Horizontal, segmentStrutSize );
|
||||
setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() );
|
||||
setGradient( Q::Segment, Qt::transparent );
|
||||
setGradient( Q::Segment | Q::Hovered, m_pal.onSurface12,
|
||||
{ QskStateCombination::CombinationNoState, Q::Minimum | Q::Maximum | Q::Selected } );
|
||||
setPadding( Q::Segment | A::Horizontal, 12_dp, 0, 12_dp, 0 );
|
||||
setPadding( Q::Segment | A::Vertical, 0, 12_dp, 0, 12_dp );
|
||||
|
||||
setBoxShape( Q::Segment, 0 );
|
||||
setBoxShape( Q::Segment | Q::Minimum | A::Horizontal,
|
||||
{ 100, 0, 100, 0, Qt::RelativeSize },
|
||||
{ QskStateCombination::CombinationNoState, Q::Disabled } );
|
||||
setBoxShape( Q::Segment | Q::Maximum | A::Horizontal,
|
||||
{ 0, 100, 0, 100, Qt::RelativeSize },
|
||||
{ QskStateCombination::CombinationNoState, Q::Disabled } );
|
||||
|
||||
setBoxShape( Q::Segment | Q::Minimum | A::Vertical,
|
||||
{ 100, 100, 0, 0, Qt::RelativeSize },
|
||||
{ QskStateCombination::CombinationNoState, Q::Disabled } );
|
||||
setBoxShape( Q::Segment | Q::Maximum | A::Vertical,
|
||||
{ 0, 0, 100, 100, Qt::RelativeSize },
|
||||
{ QskStateCombination::CombinationNoState, Q::Disabled } );
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -56,6 +56,8 @@ QskSegmentedBar::QskSegmentedBar( Qt::Orientation orientation, QQuickItem* paren
|
|||
: Inherited( parent )
|
||||
, m_data( new PrivateData( orientation ) )
|
||||
{
|
||||
setAcceptHoverEvents( true );
|
||||
|
||||
if( orientation == Qt::Horizontal )
|
||||
initSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::Fixed );
|
||||
else
|
||||
|
@ -273,6 +275,30 @@ void QskSegmentedBar::keyReleaseEvent( QKeyEvent* event )
|
|||
Inherited::keyReleaseEvent( event );
|
||||
}
|
||||
|
||||
void QskSegmentedBar::hoverEnterEvent( QHoverEvent* event )
|
||||
{
|
||||
using A = QskAspect;
|
||||
|
||||
setSkinHint( Segment | A::Metric | A::Position, qskHoverPosition( event ) );
|
||||
update();
|
||||
}
|
||||
|
||||
void QskSegmentedBar::hoverMoveEvent( QHoverEvent* event )
|
||||
{
|
||||
using A = QskAspect;
|
||||
|
||||
setSkinHint( Segment | A::Metric | A::Position, qskHoverPosition( event ) );
|
||||
update();
|
||||
}
|
||||
|
||||
void QskSegmentedBar::hoverLeaveEvent( QHoverEvent* event )
|
||||
{
|
||||
using A = QskAspect;
|
||||
|
||||
setSkinHint( Segment | A::Metric | A::Position, QPointF() );
|
||||
update();
|
||||
}
|
||||
|
||||
void QskSegmentedBar::focusInEvent( QFocusEvent* event )
|
||||
{
|
||||
int index = m_data->currentIndex;
|
||||
|
|
|
@ -94,6 +94,10 @@ class QSK_EXPORT QskSegmentedBar : public QskControl
|
|||
void keyPressEvent( QKeyEvent* ) override;
|
||||
void keyReleaseEvent( QKeyEvent* ) override;
|
||||
|
||||
void hoverEnterEvent( QHoverEvent* ) override;
|
||||
void hoverMoveEvent( QHoverEvent* ) override;
|
||||
void hoverLeaveEvent( QHoverEvent* ) override;
|
||||
|
||||
void focusInEvent( QFocusEvent* ) override;
|
||||
|
||||
private:
|
||||
|
|
|
@ -355,13 +355,46 @@ QskAspect::States QskSegmentedBarSkinlet::sampleStates(
|
|||
const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int index ) const
|
||||
{
|
||||
using Q = QskSegmentedBar;
|
||||
using A = QskAspect;
|
||||
|
||||
auto states = Inherited::sampleStates( skinnable, subControl, index );
|
||||
|
||||
if ( subControl == Q::Segment || subControl == Q::Icon || subControl == Q::Text )
|
||||
{
|
||||
const auto bar = static_cast< const QskSegmentedBar* >( skinnable );
|
||||
const auto* bar = static_cast< const QskSegmentedBar* >( skinnable );
|
||||
|
||||
if ( subControl == Q::Segment )
|
||||
{
|
||||
const auto cursorPos = bar->effectiveSkinHint( Q::Segment | A::Metric | A::Position ).toPointF();
|
||||
|
||||
if( !cursorPos.isNull() && bar->indexAtPosition( cursorPos ) == index )
|
||||
{
|
||||
states |= Q::Hovered;
|
||||
}
|
||||
else
|
||||
{
|
||||
states &= ~Q::Hovered;
|
||||
}
|
||||
|
||||
if( bar->count() > 0 )
|
||||
{
|
||||
if( index == 0 )
|
||||
{
|
||||
states &= ~Q::Maximum;
|
||||
states |= Q::Minimum;
|
||||
}
|
||||
else if( index == bar->count() - 1 )
|
||||
{
|
||||
states &= ~Q::Minimum;
|
||||
states |= Q::Maximum;
|
||||
}
|
||||
else
|
||||
{
|
||||
states &= ~Q::Minimum;
|
||||
states &= ~Q::Maximum;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( subControl == Q::Icon || subControl == Q::Text || subControl == Q::Cursor )
|
||||
{
|
||||
if ( bar->isSegmentEnabled( index ) )
|
||||
{
|
||||
if ( bar->selectedIndex() == index )
|
||||
|
|
Loading…
Reference in New Issue