You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.2 KiB
133 lines
4.2 KiB
/* |
|
* SPDX-FileCopyrightText: 2009, 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr> |
|
* |
|
* SPDX-License-Identifier: GPL-2.0-or-later OR MIT |
|
*/ |
|
|
|
#include "breezeheaderviewdata.h" |
|
|
|
#include <QHoverEvent> |
|
#include <QTextStream> |
|
|
|
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<const QHeaderView*>( 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<const QHeaderView*>( 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<const QHeaderView*>( 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<QHeaderView*>( 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 ); |
|
|
|
} |
|
|
|
}
|
|
|