forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
@@ -157,8 +157,6 @@ Project {
|
||||
"sidebarwidget.h",
|
||||
"statusbarmanager.cpp",
|
||||
"statusbarmanager.h",
|
||||
"styleanimator.cpp",
|
||||
"styleanimator.h",
|
||||
"systemsettings.cpp",
|
||||
"systemsettings.h",
|
||||
"textdocument.cpp",
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
Reference in New Issue
Block a user