Blame style/animations/adwaitatransitionwidget.h

Packit 8e9c33
#ifndef adwaitatransitionwidget_h
Packit 8e9c33
#define adwaitatransitionwidget_h
Packit 8e9c33
//////////////////////////////////////////////////////////////////////////////
Packit 8e9c33
// adwaitatransitionwidget.h
Packit 8e9c33
// stores event filters and maps widgets to transitions for transitions
Packit 8e9c33
// -------------------
Packit 8e9c33
//
Packit 8e9c33
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
Packit 8e9c33
//
Packit 8e9c33
// Permission is hereby granted, free of charge, to any person obtaining a copy
Packit 8e9c33
// of this software and associated documentation files (the "Software"), to
Packit 8e9c33
// deal in the Software without restriction, including without limitation the
Packit 8e9c33
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit 8e9c33
// sell copies of the Software, and to permit persons to whom the Software is
Packit 8e9c33
// furnished to do so, subject to the following conditions:
Packit 8e9c33
//
Packit 8e9c33
// The above copyright notice and this permission notice shall be included in
Packit 8e9c33
// all copies or substantial portions of the Software.
Packit 8e9c33
//
Packit 8e9c33
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit 8e9c33
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit 8e9c33
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit 8e9c33
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit 8e9c33
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit 8e9c33
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
Packit 8e9c33
// IN THE SOFTWARE.
Packit 8e9c33
//////////////////////////////////////////////////////////////////////////////
Packit 8e9c33
Packit 8e9c33
#include "adwaitaanimation.h"
Packit 8e9c33
#include "adwaita.h"
Packit 8e9c33
Packit 8e9c33
#include <QWidget>
Packit 8e9c33
Packit 8e9c33
#include <cmath>
Packit 8e9c33
Packit 8e9c33
namespace Adwaita
Packit 8e9c33
{
Packit 8e9c33
Packit 8e9c33
    //* temporary widget used to perform smooth transition between one widget state and another
Packit 8e9c33
    class TransitionWidget: public QWidget
Packit 8e9c33
    {
Packit 8e9c33
Packit 8e9c33
        Q_OBJECT
Packit 8e9c33
Packit 8e9c33
        //* declare opacity property
Packit 8e9c33
        Q_PROPERTY( qreal opacity READ opacity WRITE setOpacity )
Packit 8e9c33
Packit 8e9c33
        public:
Packit 8e9c33
Packit 8e9c33
        //* shortcut to painter
Packit 8e9c33
        typedef WeakPointer<TransitionWidget> Pointer;
Packit 8e9c33
Packit 8e9c33
        //* constructor
Packit 8e9c33
        TransitionWidget( QWidget* parent, int duration );
Packit 8e9c33
Packit 8e9c33
        //* destructor
Packit 8e9c33
        virtual ~TransitionWidget( void ) = default;
Packit 8e9c33
Packit 8e9c33
        //*@name flags
Packit 8e9c33
        //@{
Packit 8e9c33
        enum Flag
Packit 8e9c33
        {
Packit 8e9c33
            None = 0,
Packit 8e9c33
            GrabFromWindow = 1<<0,
Packit 8e9c33
            Transparent = 1<<1,
Packit 8e9c33
            PaintOnWidget = 1<<2
Packit 8e9c33
        };
Packit 8e9c33
Packit 8e9c33
        Q_DECLARE_FLAGS(Flags, Flag)
Packit 8e9c33
Packit 8e9c33
        void setFlags( Flags value )
Packit 8e9c33
        { _flags = value; }
Packit 8e9c33
Packit 8e9c33
        void setFlag( Flag flag, bool value = true )
Packit 8e9c33
        {
Packit 8e9c33
            if( value ) _flags |= flag;
Packit 8e9c33
            else _flags &= (~flag);
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        bool testFlag( Flag flag ) const
Packit 8e9c33
        { return _flags.testFlag( flag ); }
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //* duration
Packit 8e9c33
        void setDuration( int duration )
Packit 8e9c33
        {
Packit 8e9c33
            if( _animation )
Packit 8e9c33
            { _animation.data()->setDuration( duration ); }
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //* duration
Packit 8e9c33
        int duration( void ) const
Packit 8e9c33
        { return ( _animation ) ? _animation.data()->duration() : 0; }
Packit 8e9c33
Packit 8e9c33
        //* steps
Packit 8e9c33
        static void setSteps( int value )
Packit 8e9c33
        { _steps = value; }
Packit 8e9c33
Packit 8e9c33
        //*@name opacity
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        virtual qreal opacity( void ) const
Packit 8e9c33
        { return _opacity; }
Packit 8e9c33
Packit 8e9c33
        virtual void setOpacity( qreal value )
Packit 8e9c33
        {
Packit 8e9c33
            value = digitize( value );
Packit 8e9c33
            if( _opacity == value ) return;
Packit 8e9c33
            _opacity = value;
Packit 8e9c33
            update();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //@name pixmaps handling
Packit 8e9c33
        //@{
Packit 8e9c33
Packit 8e9c33
        //* start
Packit 8e9c33
        void resetStartPixmap( void )
Packit 8e9c33
        { setStartPixmap( QPixmap() ); }
Packit 8e9c33
Packit 8e9c33
        //* start
Packit 8e9c33
        void setStartPixmap( QPixmap pixmap )
Packit 8e9c33
        { _startPixmap = pixmap; }
Packit 8e9c33
Packit 8e9c33
        //* start
Packit 8e9c33
        const QPixmap& startPixmap( void ) const
Packit 8e9c33
        { return _startPixmap; }
Packit 8e9c33
Packit 8e9c33
        //* end
Packit 8e9c33
        void resetEndPixmap( void )
Packit 8e9c33
        { setEndPixmap( QPixmap() ); }
Packit 8e9c33
Packit 8e9c33
        //* end
Packit 8e9c33
        void setEndPixmap( QPixmap pixmap )
Packit 8e9c33
        {
Packit 8e9c33
            _endPixmap = pixmap;
Packit 8e9c33
            _currentPixmap = pixmap;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //* start
Packit 8e9c33
        const QPixmap& endPixmap( void ) const
Packit 8e9c33
        { return _endPixmap; }
Packit 8e9c33
Packit 8e9c33
        //* current
Packit 8e9c33
        const QPixmap& currentPixmap( void ) const
Packit 8e9c33
        { return _currentPixmap; }
Packit 8e9c33
Packit 8e9c33
        //@}
Packit 8e9c33
Packit 8e9c33
        //* grap pixmap
Packit 8e9c33
        QPixmap grab( QWidget* = 0, QRect = QRect() );
Packit 8e9c33
Packit 8e9c33
        //* true if animated
Packit 8e9c33
        virtual bool isAnimated( void ) const
Packit 8e9c33
        { return _animation.data()->isRunning(); }
Packit 8e9c33
Packit 8e9c33
        //* end animation
Packit 8e9c33
        virtual void endAnimation( void )
Packit 8e9c33
        { if( _animation.data()->isRunning() ) _animation.data()->stop(); }
Packit 8e9c33
Packit 8e9c33
        //* animate transition
Packit 8e9c33
        virtual void animate( void )
Packit 8e9c33
        {
Packit 8e9c33
            if( _animation.data()->isRunning() ) _animation.data()->stop();
Packit 8e9c33
            _animation.data()->start();
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        //* true if paint is enabled
Packit 8e9c33
        static bool paintEnabled( void );
Packit 8e9c33
Packit 8e9c33
        protected:
Packit 8e9c33
Packit 8e9c33
        //* generic event filter
Packit 8e9c33
        virtual bool event( QEvent* );
Packit 8e9c33
Packit 8e9c33
        //* paint event
Packit 8e9c33
        virtual void paintEvent( QPaintEvent* );
Packit 8e9c33
Packit 8e9c33
        //* grab widget background
Packit 8e9c33
        /*!
Packit 8e9c33
        Background is not rendered properly using QWidget::render.
Packit 8e9c33
        Use home-made grabber instead. This is directly inspired from bespin.
Packit 8e9c33
        Copyright (C) 2007 Thomas Luebking <thomas.luebking@web.de>
Packit 8e9c33
        */
Packit 8e9c33
        virtual void grabBackground( QPixmap&, QWidget*, QRect& ) const;
Packit 8e9c33
Packit 8e9c33
        //* grab widget
Packit 8e9c33
        virtual void grabWidget( QPixmap&, QWidget*, QRect& ) const;
Packit 8e9c33
Packit 8e9c33
        //* fade pixmap
Packit 8e9c33
        virtual void fade( const QPixmap& source, QPixmap& target, qreal opacity, const QRect& ) const;
Packit 8e9c33
Packit 8e9c33
        //* apply step
Packit 8e9c33
        virtual qreal digitize( const qreal& value ) const
Packit 8e9c33
        {
Packit 8e9c33
            if( _steps > 0 ) return std::floor( value*_steps )/_steps;
Packit 8e9c33
            else return value;
Packit 8e9c33
        }
Packit 8e9c33
Packit 8e9c33
        private:
Packit 8e9c33
Packit 8e9c33
        //* Flags
Packit 8e9c33
        Flags _flags = None;
Packit 8e9c33
Packit 8e9c33
        //* paint enabled
Packit 8e9c33
        static bool _paintEnabled;
Packit 8e9c33
Packit 8e9c33
        //* internal transition animation
Packit 8e9c33
        Animation::Pointer _animation;
Packit 8e9c33
Packit 8e9c33
        //* animation starting pixmap
Packit 8e9c33
        QPixmap _startPixmap;
Packit 8e9c33
Packit 8e9c33
        //* animation starting pixmap
Packit 8e9c33
        QPixmap _localStartPixmap;
Packit 8e9c33
Packit 8e9c33
        //* animation starting pixmap
Packit 8e9c33
        QPixmap _endPixmap;
Packit 8e9c33
Packit 8e9c33
        //* current pixmap
Packit 8e9c33
        QPixmap _currentPixmap;
Packit 8e9c33
Packit 8e9c33
        //* current state opacity
Packit 8e9c33
        qreal _opacity = 0;
Packit 8e9c33
Packit 8e9c33
        //* steps
Packit 8e9c33
        static int _steps;
Packit 8e9c33
Packit 8e9c33
    };
Packit 8e9c33
Packit 8e9c33
}
Packit 8e9c33
Packit 8e9c33
#endif