|
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
|