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::Horizontal, segmentStrutSize );
|
||||||
setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() );
|
setStrutSize( Q::Segment | A::Vertical, segmentStrutSize.transposed() );
|
||||||
setGradient( Q::Segment, Qt::transparent );
|
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::Horizontal, 12_dp, 0, 12_dp, 0 );
|
||||||
setPadding( Q::Segment | A::Vertical, 0, 12_dp, 0, 12_dp );
|
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 )
|
: Inherited( parent )
|
||||||
, m_data( new PrivateData( orientation ) )
|
, m_data( new PrivateData( orientation ) )
|
||||||
{
|
{
|
||||||
|
setAcceptHoverEvents( true );
|
||||||
|
|
||||||
if( orientation == Qt::Horizontal )
|
if( orientation == Qt::Horizontal )
|
||||||
initSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::Fixed );
|
initSizePolicy( QskSizePolicy::MinimumExpanding, QskSizePolicy::Fixed );
|
||||||
else
|
else
|
||||||
|
@ -273,6 +275,30 @@ void QskSegmentedBar::keyReleaseEvent( QKeyEvent* event )
|
||||||
Inherited::keyReleaseEvent( 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 )
|
void QskSegmentedBar::focusInEvent( QFocusEvent* event )
|
||||||
{
|
{
|
||||||
int index = m_data->currentIndex;
|
int index = m_data->currentIndex;
|
||||||
|
|
|
@ -94,6 +94,10 @@ class QSK_EXPORT QskSegmentedBar : public QskControl
|
||||||
void keyPressEvent( QKeyEvent* ) override;
|
void keyPressEvent( QKeyEvent* ) override;
|
||||||
void keyReleaseEvent( QKeyEvent* ) override;
|
void keyReleaseEvent( QKeyEvent* ) override;
|
||||||
|
|
||||||
|
void hoverEnterEvent( QHoverEvent* ) override;
|
||||||
|
void hoverMoveEvent( QHoverEvent* ) override;
|
||||||
|
void hoverLeaveEvent( QHoverEvent* ) override;
|
||||||
|
|
||||||
void focusInEvent( QFocusEvent* ) override;
|
void focusInEvent( QFocusEvent* ) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -355,13 +355,46 @@ QskAspect::States QskSegmentedBarSkinlet::sampleStates(
|
||||||
const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int index ) const
|
const QskSkinnable* skinnable, QskAspect::Subcontrol subControl, int index ) const
|
||||||
{
|
{
|
||||||
using Q = QskSegmentedBar;
|
using Q = QskSegmentedBar;
|
||||||
|
using A = QskAspect;
|
||||||
|
|
||||||
auto states = Inherited::sampleStates( skinnable, subControl, index );
|
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->isSegmentEnabled( index ) )
|
||||||
{
|
{
|
||||||
if ( bar->selectedIndex() == index )
|
if ( bar->selectedIndex() == index )
|
||||||
|
|
Loading…
Reference in New Issue