/* * SPDX-FileCopyrightText: 2009, 2014 Hugo Pereira Da Costa * * SPDX-License-Identifier: GPL-2.0-or-later OR MIT */ #include "breezeheaderviewdata.h" #include #include namespace Breeze { //______________________________________________ HeaderViewData::HeaderViewData( QObject* parent, QWidget* target, int duration ): AnimationData( parent, target ) { _current._animation = new Animation( duration, this ); setupAnimation( currentIndexAnimation(), "currentOpacity" ); currentIndexAnimation().data()->setDirection( Animation::Forward ); _previous._animation = new Animation( duration, this ); setupAnimation( previousIndexAnimation(), "previousOpacity" ); previousIndexAnimation().data()->setDirection( Animation::Backward ); } //______________________________________________ bool HeaderViewData::updateState( const QPoint& position , bool hovered ) { if( !enabled() ) return false; const QHeaderView* local( qobject_cast( target().data() ) ); if( !local ) return false; const int index( local->logicalIndexAt( position ) ); if( index < 0 ) return false; if( hovered ) { if( index != currentIndex() ) { if( currentIndex() >= 0 ) { setPreviousIndex( currentIndex() ); setCurrentIndex( -1 ); previousIndexAnimation().data()->restart(); } setCurrentIndex( index ); currentIndexAnimation().data()->restart(); return true; } else return false; } else if( index == currentIndex() ) { setPreviousIndex( currentIndex() ); setCurrentIndex( -1 ); previousIndexAnimation().data()->restart(); return true; } else return false; } //______________________________________________ Animation::Pointer HeaderViewData::animation( const QPoint& position ) const { if( !enabled() ) return Animation::Pointer(); const QHeaderView* local( qobject_cast( target().data() ) ); if( !local ) return Animation::Pointer(); int index( local->logicalIndexAt( position ) ); if( index < 0 ) return Animation::Pointer(); else if( index == currentIndex() ) return currentIndexAnimation(); else if( index == previousIndex() ) return previousIndexAnimation(); else return Animation::Pointer(); } //______________________________________________ qreal HeaderViewData::opacity( const QPoint& position ) const { if( !enabled() ) return OpacityInvalid; const QHeaderView* local( qobject_cast( target().data() ) ); if( !local ) return OpacityInvalid; int index( local->logicalIndexAt( position ) ); if( index < 0 ) return OpacityInvalid; else if( index == currentIndex() ) return currentOpacity(); else if( index == previousIndex() ) return previousOpacity(); else return OpacityInvalid; } //__________________________________________________________ void HeaderViewData::setDirty() const { QHeaderView* header = qobject_cast( target().data() ); if( !header ) return; // get first and last index, sorted const int lastIndex( qMax( previousIndex(), currentIndex() ) ); if( lastIndex < 0 ) return; int firstIndex( qMin( previousIndex(), currentIndex() ) ); if( firstIndex < 0 ) firstIndex = lastIndex; // find relevant rectangle to be updated, in viewport coordinate QWidget* viewport( header->viewport() ); const int left = header->sectionViewportPosition( firstIndex ); const int right = header->sectionViewportPosition( lastIndex ) + header->sectionSize( lastIndex ); // trigger update if( header->orientation() == Qt::Horizontal ) viewport->update( left, 0, right-left, header->height() ); else viewport->update( 0, left, header->width(), right-left ); } }