Removed oxygentimeline (was not working). Use qtimeline directly, to handle animations. It is simpler, and it is actually working. Also changed 'repaint' into 'update' for the slot connected to the timeLine FrameChanged signal. More efficient.

svn path=/trunk/KDE/kdebase/workspace/; revision=1024648
icc-effect-5.14.5
Hugo Pereira Da Costa 2009-09-17 03:43:55 +00:00
parent ae06efee25
commit 45f5f00f9f
5 changed files with 22 additions and 202 deletions

View File

@ -14,7 +14,6 @@ set(kwin_oxygen_SRCS
oxygenexceptionlist.cpp
oxygenshadowconfiguration.cpp
oxygensizegrip.cpp
oxygentimeline.cpp
x11util.cpp
)

View File

@ -65,8 +65,8 @@ namespace Oxygen
timeLine_.setFrameRange( 0, 1000 );
timeLine_.setCurveShape( QTimeLine::EaseInOutCurve );
connect( &timeLine_, SIGNAL( currentIndexChanged( int ) ), SLOT( repaint() ) );
connect( &timeLine_, SIGNAL( finished() ), SLOT( repaint() ) );
connect( &timeLine_, SIGNAL( frameChanged( int ) ), SLOT( update() ) );
connect( &timeLine_, SIGNAL( finished() ), SLOT( update() ) );
}
@ -111,9 +111,13 @@ namespace Oxygen
{
KCommonDecorationButton::enterEvent(e);
if (status_ != Oxygen::Pressed) status_ = Oxygen::Hovered;
if( timeLine_.state() != OxygenTimeLine::NotRunning ) timeLine_.stop();
timeLine_.setDirection( OxygenTimeLine::Forward );
timeLine_.start();
if( timeLine_.state() == QTimeLine::NotRunning )
{
timeLine_.setDirection( QTimeLine::Forward );
timeLine_.start();
} else if( timeLine_.direction() == QTimeLine::Backward ) {
timeLine_.toggleDirection();
}
update();
}
@ -123,9 +127,13 @@ namespace Oxygen
KCommonDecorationButton::leaveEvent(e);
status_ = Oxygen::Normal;
if( timeLine_.state() != OxygenTimeLine::NotRunning ) timeLine_.stop();
timeLine_.setDirection( OxygenTimeLine::Backward );
timeLine_.start();
if( timeLine_.state() == QTimeLine::NotRunning )
{
timeLine_.setDirection( QTimeLine::Backward );
timeLine_.start();
} else if( timeLine_.direction() == QTimeLine::Forward ) {
timeLine_.toggleDirection();
}
update();
@ -199,9 +207,9 @@ namespace Oxygen
KColorScheme(palette.currentColorGroup()).foreground(KColorScheme::NegativeText).color():
KColorScheme(palette.currentColorGroup()).decoration(KColorScheme::HoverColor).color();
if( timeLine_.state() == OxygenTimeLine::Running )
if( timeLine_.state() == QTimeLine::Running )
{
qreal ratio( qreal( timeLine_.currentIndex() )/qreal( timeLine_.maxIndex() ) );
qreal ratio( qreal( timeLine_.currentFrame() )/qreal( timeLine_.endFrame() ) );
color = KColorUtils::mix( color, glow, ratio );
} else if( status_ == Oxygen::Hovered ) color = glow;
@ -216,10 +224,10 @@ namespace Oxygen
painter.drawPixmap(0, 0, helper_.windecoButton(bt, status_ == Oxygen::Pressed, (21.0*client_.configuration().buttonSize())/22 ) );
// draw glow on hover
if( timeLine_.state() == OxygenTimeLine::Running )
if( timeLine_.state() == QTimeLine::Running )
{
qreal ratio( qreal( timeLine_.currentIndex() )/qreal( timeLine_.maxIndex() ) );
qreal ratio( qreal( timeLine_.currentFrame() )/qreal( timeLine_.endFrame() ) );
painter.save();
painter.setOpacity( ratio );
painter.drawPixmap(0, 0, helper_.windecoButtonGlow(glow, (21.0*client_.configuration().buttonSize())/22));

View File

@ -29,10 +29,10 @@
//////////////////////////////////////////////////////////////////////////////
#include <kcommondecoration.h>
#include <QTimeLine>
#include "oxygen.h"
#include "oxygenclient.h"
#include "oxygentimeline.h"
namespace Oxygen
{
@ -112,7 +112,7 @@ namespace Oxygen
QColor cachedButtonDetailColor_;
//! timeline used for smooth transitions
OxygenTimeLine timeLine_;
QTimeLine timeLine_;
};

View File

@ -1,94 +0,0 @@
//////////////////////////////////////////////////////////////////////////////
// OxygenTimeLine.h
// derive from QTimeLine and is used to perform smooth transitions
// -------------------
//
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//////////////////////////////////////////////////////////////////////////////
#include "oxygentimeline.h"
#include "oxygentimeline.moc"
#include <cassert>
#include <KDebug>
namespace Oxygen
{
//______________________________________________________
OxygenTimeLine::OxygenTimeLine( int duration, QObject* parent ):
QTimeLine( duration, parent ),
direction_( Forward ),
currentIndex_( 0 ),
maxIndex_( 255 ),
lastFrame_( 0 )
{
// connections
connect( this, SIGNAL( frameChanged( int ) ), SLOT( updateCurrentIndex( int ) ) );
}
//______________________________________________________
void OxygenTimeLine::start( void )
{
assert( state() == NotRunning );
lastFrame_ = 0;
QTimeLine::start();
}
//______________________________________________________
void OxygenTimeLine::updateCurrentIndex( int currentFrame )
{
// check interval
if( currentFrame <= lastFrame_ ) lastFrame_ = 0;
// calculate step
int step = (maxIndex()*( currentFrame - lastFrame_ ))/endFrame();
if( direction_ == Backward ) step *= -1;
// update lastFrame
lastFrame_ = currentFrame;
// check end conditions
if( currentIndex_ + step <= 0 )
{
currentIndex_ = 0;
emit currentIndexChanged( currentIndex_ );
stop();
} else if( currentIndex_ + step >= maxIndex_ ) {
currentIndex_ = maxIndex_;
emit currentIndexChanged( currentIndex_ );
stop();
} else {
currentIndex_ += step;
emit currentIndexChanged( currentIndex_ );
}
}
}

View File

@ -1,93 +0,0 @@
#ifndef oxygentimeline_h
#define oxygentimeline_h
//////////////////////////////////////////////////////////////////////////////
// OxygenTimeLine.h
// derive from QTimeLine and is used to perform smooth transitions
// -------------------
//
// Copyright (c) 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//////////////////////////////////////////////////////////////////////////////
#include <QTimeLine>
namespace Oxygen
{
class OxygenTimeLine: public QTimeLine
{
Q_OBJECT
public:
//! constructor
OxygenTimeLine( int duration, QObject* parent );
//! max number of Index
void setMaxIndex( int value )
{ maxIndex_ = value; }
//! max number of Index
int maxIndex( void ) const
{ return maxIndex_; }
//! current Index
int currentIndex( void ) const
{ return currentIndex_; }
//! direction used to update Index
void setDirection( QTimeLine::Direction value )
{ direction_ = value; }
//! start
void start( void );
signals:
//! emitted whenever the current Index changed
void currentIndexChanged( int );
protected slots:
//! connected to timeLine frameChanged
void updateCurrentIndex( int );
private:
//! direction
Direction direction_;
//! current Index
int currentIndex_;
//! max Index
int maxIndex_;
//! frame at last update
int lastFrame_;
};
}
#endif