Blame style/animations/adwaitascrollbardata.cpp

Packit 8e9c33
/*************************************************************************
Packit 8e9c33
 * Copyright (C) 2014 by Hugo Pereira Da Costa <hugo.pereira@free.fr>    *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is free software; you can redistribute it and/or modify  *
Packit 8e9c33
 * it under the terms of the GNU General Public License as published by  *
Packit 8e9c33
 * the Free Software Foundation; either version 2 of the License, or     *
Packit 8e9c33
 * (at your option) any later version.                                   *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * This program is distributed in the hope that it will be useful,       *
Packit 8e9c33
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
Packit 8e9c33
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
Packit 8e9c33
 * GNU General Public License for more details.                          *
Packit 8e9c33
 *                                                                       *
Packit 8e9c33
 * You should have received a copy of the GNU General Public License     *
Packit 8e9c33
 * along with this program; if not, write to the                         *
Packit 8e9c33
 * Free Software Foundation, Inc.,                                       *
Packit 8e9c33
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
Packit 8e9c33
 *************************************************************************/
Packit 8e9c33
Packit 8e9c33
#include "adwaitascrollbardata.h"
Packit 8e9c33
Packit 8e9c33
#include <QHoverEvent>
Packit 8e9c33
#include <QScrollBar>
Packit 8e9c33
#include <QStyleOptionSlider>
Packit 8e9c33
Packit 8e9c33
Q_GUI_EXPORT QStyleOptionSlider qt_qscrollbarStyleOption(QScrollBar*);
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    ScrollBarData::ScrollBarData( QObject* parent, QWidget* target, int duration ):
Packit 8e9c33
        WidgetStateData( parent, target, duration ),
Packit 8e9c33
        _position( -1, -1 )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        target->installEventFilter( this );
Packit 8e9c33
Packit 8e9c33
        _addLineData._animation = new Animation( duration, this );
Packit 8e9c33
        _subLineData._animation = new Animation( duration, this );
Packit 8e9c33
        _grooveData._animation = new Animation( duration, this );
Packit 8e9c33
Packit 8e9c33
        connect( addLineAnimation().data(), SIGNAL(finished()), SLOT(clearAddLineRect()) );
Packit 8e9c33
        connect( subLineAnimation().data(), SIGNAL(finished()), SLOT(clearSubLineRect()) );
Packit 8e9c33
Packit 8e9c33
        // setup animation
Packit 8e9c33
        setupAnimation( addLineAnimation(), "addLineOpacity" );
Packit 8e9c33
        setupAnimation( subLineAnimation(), "subLineOpacity" );
Packit 8e9c33
        setupAnimation( grooveAnimation(), "grooveOpacity" );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    bool ScrollBarData::eventFilter( QObject* object, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        if( object != target().data() )
Packit 8e9c33
        { return WidgetStateData::eventFilter( object, event ); }
Packit 8e9c33
Packit 8e9c33
        // check event type
Packit 8e9c33
        switch( event->type() )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            case QEvent::HoverEnter:
Packit 8e9c33
            setGrooveHovered(true);
Packit 8e9c33
            grooveAnimation().data()->setDirection( Animation::Forward );
Packit 8e9c33
            if( !grooveAnimation().data()->isRunning() ) grooveAnimation().data()->start();
Packit 8e9c33
Packit 8e9c33
            case QEvent::HoverMove:
Packit 8e9c33
            hoverMoveEvent( object, event );
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            case QEvent::HoverLeave:
Packit 8e9c33
            setGrooveHovered(false);
Packit 8e9c33
            grooveAnimation().data()->setDirection( Animation::Backward );
Packit 8e9c33
            if( !grooveAnimation().data()->isRunning() ) grooveAnimation().data()->start();
Packit 8e9c33
            hoverLeaveEvent( object, event );
Packit 8e9c33
Packit 8e9c33
            break;
Packit 8e9c33
Packit 8e9c33
            default: break;
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        return WidgetStateData::eventFilter( object, event );
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    const Animation::Pointer& ScrollBarData::animation( QStyle::SubControl subcontrol ) const
Packit 8e9c33
    {
Packit 8e9c33
        switch( subcontrol )
Packit 8e9c33
        {
Packit 8e9c33
            default:
Packit 8e9c33
            case QStyle::SC_ScrollBarSlider:
Packit 8e9c33
            return animation();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarAddLine:
Packit 8e9c33
            return addLineAnimation();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarSubLine:
Packit 8e9c33
            return subLineAnimation();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarGroove:
Packit 8e9c33
            return grooveAnimation();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    qreal ScrollBarData::opacity( QStyle::SubControl subcontrol ) const
Packit 8e9c33
    {
Packit 8e9c33
        switch( subcontrol )
Packit 8e9c33
        {
Packit 8e9c33
            default:
Packit 8e9c33
            case QStyle::SC_ScrollBarSlider:
Packit 8e9c33
            return opacity();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarAddLine:
Packit 8e9c33
            return addLineOpacity();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarSubLine:
Packit 8e9c33
            return subLineOpacity();
Packit 8e9c33
Packit 8e9c33
            case QStyle::SC_ScrollBarGroove:
Packit 8e9c33
            return grooveOpacity();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    void ScrollBarData::hoverMoveEvent(  QObject* object, QEvent* event )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // try cast object to scrollbar
Packit 8e9c33
        QScrollBar* scrollBar( qobject_cast<QScrollBar*>( object ) );
Packit 8e9c33
        if( !scrollBar || scrollBar->isSliderDown() ) return;
Packit 8e9c33
Packit 8e9c33
        // retrieve scrollbar option
Packit 8e9c33
        QStyleOptionSlider opt( qt_qscrollbarStyleOption( scrollBar ) );
Packit 8e9c33
Packit 8e9c33
        // cast event
Packit 8e9c33
        QHoverEvent *hoverEvent = static_cast<QHoverEvent*>(event);
Packit 8e9c33
        QStyle::SubControl hoverControl = scrollBar->style()->hitTestComplexControl(QStyle::CC_ScrollBar, &opt, hoverEvent->pos(), scrollBar);
Packit 8e9c33
Packit 8e9c33
        // update hover state
Packit 8e9c33
        updateAddLineArrow( hoverControl );
Packit 8e9c33
        updateSubLineArrow( hoverControl );
Packit 8e9c33
Packit 8e9c33
        // store position
Packit 8e9c33
        _position = hoverEvent->pos();
Packit 8e9c33
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
Packit 8e9c33
    //______________________________________________
Packit 8e9c33
    void ScrollBarData::hoverLeaveEvent(  QObject*, QEvent* )
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        // reset hover state
Packit 8e9c33
        updateSubLineArrow( QStyle::SC_None );
Packit 8e9c33
        updateAddLineArrow( QStyle::SC_None );
Packit 8e9c33
Packit 8e9c33
        // reset mouse position
Packit 8e9c33
        _position = QPoint( -1, -1 );
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_____________________________________________________________________
Packit 8e9c33
    void ScrollBarData::updateSubLineArrow( QStyle::SubControl hoverControl )
Packit 8e9c33
    {
Packit 8e9c33
        if( hoverControl == QStyle::SC_ScrollBarSubLine )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if( !subLineArrowHovered() )
Packit 8e9c33
            {
Packit 8e9c33
                setSubLineArrowHovered( true );
Packit 8e9c33
                if( enabled() )
Packit 8e9c33
                {
Packit 8e9c33
                    subLineAnimation().data()->setDirection( Animation::Forward );
Packit 8e9c33
                    if( !subLineAnimation().data()->isRunning() ) subLineAnimation().data()->start();
Packit 8e9c33
                } else setDirty();
Packit 8e9c33
             }
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            if( subLineArrowHovered() )
Packit 8e9c33
            {
Packit 8e9c33
                setSubLineArrowHovered( false );
Packit 8e9c33
                if( enabled() )
Packit 8e9c33
                {
Packit 8e9c33
                    subLineAnimation().data()->setDirection( Animation::Backward );
Packit 8e9c33
                    if( !subLineAnimation().data()->isRunning() ) subLineAnimation().data()->start();
Packit 8e9c33
                } else setDirty();
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
    //_____________________________________________________________________
Packit 8e9c33
    void ScrollBarData::updateAddLineArrow( QStyle::SubControl hoverControl )
Packit 8e9c33
    {
Packit 8e9c33
        if( hoverControl == QStyle::SC_ScrollBarAddLine )
Packit 8e9c33
        {
Packit 8e9c33
Packit 8e9c33
            if( !addLineArrowHovered() )
Packit 8e9c33
            {
Packit 8e9c33
                setAddLineArrowHovered( true );
Packit 8e9c33
                if( enabled() )
Packit 8e9c33
                {
Packit 8e9c33
                    addLineAnimation().data()->setDirection( Animation::Forward );
Packit 8e9c33
                    if( !addLineAnimation().data()->isRunning() ) addLineAnimation().data()->start();
Packit 8e9c33
                } else setDirty();
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        } else {
Packit 8e9c33
Packit 8e9c33
            if( addLineArrowHovered() )
Packit 8e9c33
            {
Packit 8e9c33
                setAddLineArrowHovered( false );
Packit 8e9c33
                if( enabled() )
Packit 8e9c33
                {
Packit 8e9c33
                    addLineAnimation().data()->setDirection( Animation::Backward );
Packit 8e9c33
                    if( !addLineAnimation().data()->isRunning() ) addLineAnimation().data()->start();
Packit 8e9c33
                } else setDirty();
Packit 8e9c33
            }
Packit 8e9c33
Packit 8e9c33
        }
Packit 8e9c33
    }
Packit 8e9c33
Packit 8e9c33
}