#ifndef adwaitascrollbar_data_h #define adwaitascrollbar_data_h /************************************************************************* * Copyright (C) 2014 by Hugo Pereira Da Costa * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * *************************************************************************/ #include "adwaitawidgetstatedata.h" #include namespace Adwaita { //* scrollbar data class ScrollBarData: public WidgetStateData { Q_OBJECT Q_PROPERTY( qreal addLineOpacity READ addLineOpacity WRITE setAddLineOpacity ) Q_PROPERTY( qreal subLineOpacity READ subLineOpacity WRITE setSubLineOpacity ) Q_PROPERTY( qreal grooveOpacity READ grooveOpacity WRITE setGrooveOpacity ) public: //* constructor ScrollBarData( QObject* parent, QWidget* target, int ); //* destructor virtual ~ScrollBarData( void ) {} //* event filter virtual bool eventFilter( QObject*, QEvent* ); //* needed to avoid warning about virtual function being hidden using WidgetStateData::animation; using WidgetStateData::opacity; //* return animation for a given subcontrol virtual const Animation::Pointer& animation( QStyle::SubControl ) const; //* return default opacity for a given subcontrol virtual qreal opacity( QStyle::SubControl ) const; //* return default opacity for a given subcontrol virtual bool isHovered( QStyle::SubControl control ) const { switch( control ) { case QStyle::SC_ScrollBarAddLine: return addLineArrowHovered(); case QStyle::SC_ScrollBarSubLine: return subLineArrowHovered(); case QStyle::SC_ScrollBarGroove: return grooveHovered(); default: return false; } } //* subControlRect virtual QRect subControlRect( QStyle::SubControl control ) const { switch( control ) { case QStyle::SC_ScrollBarAddLine: return _addLineData._rect; case QStyle::SC_ScrollBarSubLine: return _subLineData._rect; default: return QRect(); } } //* subcontrol rect virtual void setSubControlRect( QStyle::SubControl control, const QRect& rect ) { switch( control ) { case QStyle::SC_ScrollBarAddLine: _addLineData._rect = rect; break; case QStyle::SC_ScrollBarSubLine: _subLineData._rect = rect; break; default: break; } } //* duration virtual void setDuration( int duration ) { WidgetStateData::setDuration( duration ); addLineAnimation().data()->setDuration( duration ); subLineAnimation().data()->setDuration( duration ); grooveAnimation().data()->setDuration( duration ); } //* addLine opacity virtual void setAddLineOpacity( qreal value ) { value = digitize( value ); if( _addLineData._opacity == value ) return; _addLineData._opacity = value; setDirty(); } //* addLine opacity virtual qreal addLineOpacity( void ) const { return _addLineData._opacity; } //* subLine opacity virtual void setSubLineOpacity( qreal value ) { value = digitize( value ); if( _subLineData._opacity == value ) return; _subLineData._opacity = value; setDirty(); } //* subLine opacity virtual qreal subLineOpacity( void ) const { return _subLineData._opacity; } //* groove opacity virtual void setGrooveOpacity( qreal value ) { value = digitize( value ); if( _grooveData._opacity == value ) return; _grooveData._opacity = value; setDirty(); } //* groove opacity virtual qreal grooveOpacity( void ) const { return _grooveData._opacity; } //* mouse position QPoint position( void ) const { return _position; } protected Q_SLOTS: //* clear addLineRect void clearAddLineRect( void ) { if( addLineAnimation().data()->direction() == Animation::Backward ) { _addLineData._rect = QRect(); } } //* clear subLineRect void clearSubLineRect( void ) { if( subLineAnimation().data()->direction() == Animation::Backward ) { _subLineData._rect = QRect(); } } protected: //* hoverMoveEvent virtual void hoverMoveEvent( QObject*, QEvent* ); //* hoverMoveEvent virtual void hoverLeaveEvent( QObject*, QEvent* ); //*@name hover flags //@{ virtual bool addLineArrowHovered( void ) const { return _addLineData._hovered; } virtual void setAddLineArrowHovered( bool value ) { _addLineData._hovered = value; } virtual bool subLineArrowHovered( void ) const { return _subLineData._hovered; } virtual void setSubLineArrowHovered( bool value ) { _subLineData._hovered = value; } virtual bool grooveHovered( void ) const { return _grooveData._hovered; } virtual void setGrooveHovered( bool value ) { _grooveData._hovered = value; } //@} //* update add line arrow virtual void updateAddLineArrow( QStyle::SubControl ); //* update sub line arrow virtual void updateSubLineArrow( QStyle::SubControl ); //*@name timelines //@{ virtual const Animation::Pointer& addLineAnimation( void ) const { return _addLineData._animation; } virtual const Animation::Pointer& subLineAnimation( void ) const { return _subLineData._animation; } virtual const Animation::Pointer& grooveAnimation( void ) const { return _grooveData._animation; } private: //* stores sub control data class Data { public: //* constructor Data( void ): _hovered( false ), _opacity( AnimationData::OpacityInvalid ) {} //* true if hovered bool _hovered; //* animation Animation::Pointer _animation; //* opacity qreal _opacity; //* rect QRect _rect; }; //* add line data (down arrow) Data _addLineData; //* subtract line data (up arrow) Data _subLineData; //* groove data Data _grooveData; //* mouse position QPoint _position; }; } #endif