93 lines
1.6 KiB
C++
93 lines
1.6 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#pragma once
|
|
|
|
namespace style {
|
|
struct InfiniteRadialAnimation;
|
|
} // namespace style
|
|
|
|
namespace Ui {
|
|
|
|
class RadialAnimation {
|
|
public:
|
|
RadialAnimation(AnimationCallbacks &&callbacks);
|
|
|
|
float64 opacity() const {
|
|
return _opacity;
|
|
}
|
|
bool animating() const {
|
|
return _animation.animating();
|
|
}
|
|
|
|
void start(float64 prg);
|
|
bool update(float64 prg, bool finished, TimeMs ms);
|
|
void stop();
|
|
|
|
void step(TimeMs ms);
|
|
void step() {
|
|
step(getms());
|
|
}
|
|
|
|
void draw(Painter &p, const QRect &inner, int32 thickness, style::color color);
|
|
|
|
private:
|
|
TimeMs _firstStart = 0;
|
|
TimeMs _lastStart = 0;
|
|
TimeMs _lastTime = 0;
|
|
float64 _opacity = 0.;
|
|
anim::value a_arcEnd;
|
|
anim::value a_arcStart;
|
|
BasicAnimation _animation;
|
|
|
|
};
|
|
|
|
class InfiniteRadialAnimation {
|
|
public:
|
|
struct State {
|
|
float64 shown = 0.;
|
|
int arcFrom = 0;
|
|
int arcLength = FullArcLength;
|
|
};
|
|
InfiniteRadialAnimation(
|
|
AnimationCallbacks &&callbacks,
|
|
const style::InfiniteRadialAnimation &st);
|
|
|
|
bool animating() const {
|
|
return _animation.animating();
|
|
}
|
|
|
|
void start();
|
|
void stop();
|
|
|
|
void step(TimeMs ms);
|
|
void step() {
|
|
step(getms());
|
|
}
|
|
|
|
void draw(
|
|
Painter &p,
|
|
QPoint position,
|
|
int outerWidth);
|
|
void draw(
|
|
Painter &p,
|
|
QPoint position,
|
|
QSize size,
|
|
int outerWidth);
|
|
|
|
State computeState();
|
|
|
|
private:
|
|
const style::InfiniteRadialAnimation &_st;
|
|
TimeMs _workStarted = 0;
|
|
TimeMs _workFinished = 0;
|
|
BasicAnimation _animation;
|
|
|
|
};
|
|
|
|
} // namespace Ui
|