kde-workspace/plasma/applets/folderview/animator.cpp
Ivailo Monev 186a7702e8 generic: adjust to KGlobalSettings changes
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2023-08-22 04:29:13 +03:00

139 lines
3.8 KiB
C++

/*
* Copyright © 2009 Fredrik Höglund <fredrik@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "animator.h"
#include "abstractitemview.h"
HoverAnimation::HoverAnimation(AbstractItemView *view, const QModelIndex &index)
: QAbstractAnimation(view), m_index(index), m_curve(QEasingCurve::InQuad)
{
}
void HoverAnimation::setEasingCurve(QEasingCurve::Type type)
{
m_curve.setType(type);
}
qreal HoverAnimation::progress() const
{
return m_curve.valueForProgress(m_progress);
}
void HoverAnimation::updateCurrentTime(int currentTime)
{
m_progress = qreal(currentTime) / duration();
AbstractItemView *view = static_cast<AbstractItemView*>(parent());
view->markAreaDirty(view->visualRect(m_index));
}
// --------------------------------------------------------
Animator::Animator(AbstractItemView *view)
: QObject(view)
{
m_effectsOn = (KGlobalSettings::graphicEffectsLevel() != KGlobalSettings::NoEffects); //do not animate if the graphics effects are set to Low CPU
connect(KGlobalSettings::self(), SIGNAL(kdisplayStyleChanged()), SLOT(graphicsEffectsToggled()));
connect(view, SIGNAL(entered(QModelIndex)), SLOT(entered(QModelIndex)));
connect(view, SIGNAL(left(QModelIndex)), SLOT(left(QModelIndex)));
}
Animator::~Animator()
{
}
HoverAnimation *Animator::findHoverAnimation(const QModelIndex &index) const
{
foreach (HoverAnimation *animation, m_list) {
if (animation->index() == index) {
return animation;
}
}
return 0;
}
void Animator::animate(Type type, const QModelIndex &index)
{
AbstractItemView *view = static_cast<AbstractItemView*>(parent());
HoverAnimation *animation = findHoverAnimation(index);
if (!animation) {
animation = new HoverAnimation(view, index);
connect(animation, SIGNAL(destroyed(QObject*)), SLOT(animationDestroyed(QObject*)));
m_list.append(animation);
}
if (type == HoverEnter) {
animation->setDirection(QAbstractAnimation::Forward);
} else {
animation->setDirection(QAbstractAnimation::Backward);
}
if (animation->state() != QAbstractAnimation::Running) {
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
}
qreal Animator::hoverProgress(const QModelIndex &index) const
{
if (HoverAnimation *animation = findHoverAnimation(index)) {
return animation->progress();
}
return (index == m_hoveredIndex) ? 1.0 : 0.0;
}
void Animator::animationDestroyed(QObject *obj)
{
m_list.removeOne(static_cast<HoverAnimation*>(obj));
}
void Animator::entered(const QModelIndex &index)
{
m_hoveredIndex = index;
if (m_effectsOn) {
animate(HoverEnter, index);
}
}
void Animator::left(const QModelIndex &index)
{
m_hoveredIndex = QModelIndex();
if (m_effectsOn) {
animate(HoverLeave, index);
}
}
void Animator::graphicsEffectsToggled()
{
if (KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects) {
m_effectsOn = true;
} else {
m_effectsOn = false;
}
}
#include "moc_animator.cpp"