Files
utun2/tools/chatgui/src/animtimer.h
T

43 lines
2.8 KiB
C++

/* Общий GUI-таймер анимированных emoji: регистрирует LottieIcon и выдаёт ticked.
* Все операции в GUI-потоке с живым QCoreApplication. Singleton владеет только QTimer;
* значки заимствованы: до их удаления вызвать unregisterIcon или shutdown.
* Один общий tick каждые 33 мс двигает каждый значок на кадр независимо от metadata FPS.
* play запускает минимум PlaybackMs; после дедлайна каждый значок останавливается
* отдельно на кадре 0, затем таймер останавливается. shutdown не удаляет значки. */
#pragma once
#include <QObject>
#include <QTimer>
#include <QHash>
#include <QElapsedTimer>
class LottieIcon;
class AnimTimer : public QObject {
Q_OBJECT
public:
static AnimTimer *instance(); // статический объект на весь процесс, вызывающий не удаляет
void registerIcon(const QString &key, LottieIcon *icon); // только валидный icon; существующий key заменяет указатель без delete
void unregisterIcon(const QString &key); // отсутствующий key допустим, объект не удаляется
LottieIcon *icon(const QString &key) const; // заимствованный до замены/удаления владельцем; NULL при отсутствии
void logRegisteredIcons() const; // накопленные parser WARN и DEBUG-метаданные в general
// Наведение запускает минимум две секунды воспроизведения, затем каждый значок завершает свой цикл.
static constexpr int PlaybackMs = 2000;
void play(); // каждый вызов заново отсчитывает PlaybackMs, без сброса текущих кадров; пустой реестр даёт WARN
static void shutdown(); // stop, сброс дедлайна/реестра; следующий registerIcon/play допустим
signals:
void ticked(); // после изменения кадров, включая последний tick с остановкой всех на 0
private slots:
void onTimer();
private:
AnimTimer();
QTimer m_timer; // период 33 мс; закончивший цикл icon после дедлайна больше не продвигается
QHash<QString, LottieIcon *> m_icons; // не владеет значками, доступ только в GUI
QElapsedTimer m_playback; // время с последнего play, invalid после shutdown/завершения
};