QmlDesigner: Move StyleAnimator to Utils

StyleAnimator moved to Utils in order to be used by other modules and
styles.
Since Utils is the most common dependency, it's chosen as the right
place of StyleAnimator.

Task-number: QDS-9522
Change-Id: Idbf55875e0c320ccfa21e1c479bf5997ea7d150d
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Ali Kianian
2023-03-24 15:24:58 +02:00
parent 4612fb20b5
commit 5644fa1b9c
7 changed files with 23 additions and 16 deletions

View File

@@ -150,7 +150,6 @@ add_qtc_plugin(Core
sidebar.cpp sidebar.h
sidebarwidget.cpp sidebarwidget.h
statusbarmanager.cpp statusbarmanager.h
styleanimator.cpp styleanimator.h
systemsettings.cpp systemsettings.h
textdocument.cpp textdocument.h
themechooser.cpp themechooser.h

View File

@@ -157,8 +157,6 @@ Project {
"sidebarwidget.h",
"statusbarmanager.cpp",
"statusbarmanager.h",
"styleanimator.cpp",
"styleanimator.h",
"systemsettings.cpp",
"systemsettings.h",
"textdocument.cpp",

View File

@@ -3,16 +3,14 @@
#include "manhattanstyle.h"
#include "styleanimator.h"
#include <utils/algorithm.h>
#include <utils/hostosinfo.h>
#include <utils/stylehelper.h>
#include <utils/fancymainwindow.h>
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
#include <utils/styleanimator.h>
#include <utils/stylehelper.h>
#include <utils/theme/theme.h>
#include <utils/utilsicons.h>
#include <utils/qtcassert.h>
#include <QApplication>
#include <QCheckBox>

View File

@@ -1,123 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "styleanimator.h"
#include <utils/algorithm.h>
#include <QStyleOption>
Animation * StyleAnimator::widgetAnimation(const QWidget *widget) const
{
if (!widget)
return nullptr;
return Utils::findOrDefault(animations, Utils::equal(&Animation::widget, widget));
}
void Animation::paint(QPainter *painter, const QStyleOption *option)
{
Q_UNUSED(option)
Q_UNUSED(painter)
}
void Animation::drawBlendedImage(QPainter *painter, const QRect &rect, float alpha)
{
if (m_secondaryImage.isNull() || m_primaryImage.isNull())
return;
if (m_tempImage.isNull())
m_tempImage = m_secondaryImage;
const int a = qRound(alpha*256);
const int ia = 256 - a;
const int sw = m_primaryImage.width();
const int sh = m_primaryImage.height();
const int bpl = m_primaryImage.bytesPerLine();
switch (m_primaryImage.depth()) {
case 32:
{
uchar *mixed_data = m_tempImage.bits();
const uchar *back_data = m_primaryImage.constBits();
const uchar *front_data = m_secondaryImage.constBits();
for (int sy = 0; sy < sh; sy++) {
quint32 *mixed = (quint32*)mixed_data;
const quint32* back = (const quint32*)back_data;
const quint32* front = (const quint32*)front_data;
for (int sx = 0; sx < sw; sx++) {
quint32 bp = back[sx];
quint32 fp = front[sx];
mixed[sx] = qRgba ((qRed(bp)*ia + qRed(fp)*a)>>8,
(qGreen(bp)*ia + qGreen(fp)*a)>>8,
(qBlue(bp)*ia + qBlue(fp)*a)>>8,
(qAlpha(bp)*ia + qAlpha(fp)*a)>>8);
}
mixed_data += bpl;
back_data += bpl;
front_data += bpl;
}
}
default:
break;
}
painter->drawImage(rect, m_tempImage);
}
void Transition::paint(QPainter *painter, const QStyleOption *option)
{
float alpha = 1.0;
if (m_duration > 0) {
QTime current = QTime::currentTime();
if (m_startTime > current)
m_startTime = current;
int timeDiff = m_startTime.msecsTo(current);
alpha = timeDiff/(float)m_duration;
if (timeDiff > m_duration) {
m_running = false;
alpha = 1.0;
}
} else {
m_running = false;
}
drawBlendedImage(painter, option->rect, alpha);
}
void StyleAnimator::timerEvent(QTimerEvent *)
{
for (int i = animations.size() - 1 ; i >= 0 ; --i) {
if (animations[i]->widget())
animations[i]->widget()->update();
if (!animations[i]->widget() ||
!animations[i]->widget()->isEnabled() ||
!animations[i]->widget()->isVisible() ||
animations[i]->widget()->window()->isMinimized() ||
!animations[i]->running())
{
Animation *a = animations.takeAt(i);
delete a;
}
}
if (animations.size() == 0 && animationTimer.isActive())
animationTimer.stop();
}
void StyleAnimator::stopAnimation(const QWidget *w)
{
for (int i = animations.size() - 1 ; i >= 0 ; --i) {
if (animations[i]->widget() == w) {
Animation *a = animations.takeAt(i);
delete a;
break;
}
}
}
void StyleAnimator::startAnimation(Animation *t)
{
stopAnimation(t->widget());
animations.append(t);
if (animations.size() > 0 && !animationTimer.isActive())
animationTimer.start(35, this);
}

View File

@@ -1,72 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <QPointer>
#include <QTime>
#include <QBasicTimer>
#include <QStyle>
#include <QPainter>
#include <QWidget>
/*
* This is a set of helper classes to allow for widget animations in
* the style. Its mostly taken from Vista style so it should be fully documented
* there.
*
*/
class Animation
{
public :
Animation() = default;
virtual ~Animation() = default;
QWidget * widget() const { return m_widget; }
bool running() const { return m_running; }
const QTime &startTime() const { return m_startTime; }
void setRunning(bool val) { m_running = val; }
void setWidget(QWidget *widget) { m_widget = widget; }
void setStartTime(const QTime &startTime) { m_startTime = startTime; }
virtual void paint(QPainter *painter, const QStyleOption *option);
protected:
void drawBlendedImage(QPainter *painter, const QRect &rect, float value);
QTime m_startTime;
QPointer<QWidget> m_widget;
QImage m_primaryImage;
QImage m_secondaryImage;
QImage m_tempImage;
bool m_running = true;
};
// Handles state transition animations
class Transition : public Animation
{
public :
Transition() = default;
~Transition() override = default;
void setDuration(int duration) { m_duration = duration; }
void setStartImage(const QImage &image) { m_primaryImage = image; }
void setEndImage(const QImage &image) { m_secondaryImage = image; }
void paint(QPainter *painter, const QStyleOption *option) override;
int duration() const { return m_duration; }
int m_duration = 100; //set time in ms to complete a state transition
};
class StyleAnimator : public QObject
{
Q_OBJECT
public:
StyleAnimator(QObject *parent = nullptr) : QObject(parent) {}
void timerEvent(QTimerEvent *) override;
void startAnimation(Animation *);
void stopAnimation(const QWidget *);
Animation* widgetAnimation(const QWidget *) const;
private:
QBasicTimer animationTimer;
QList <Animation*> animations;
};