50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
// 会话切换过场层
|
||
//
|
||
// 用途:用户点击"连接"后,Moonlight 客户端会先在屏幕左上角创建一个小窗口,
|
||
// 再扩展到全屏并解码首帧,这段时间画面闪烁、体验割裂。
|
||
// 本控件是覆盖在 kiosk 全屏窗口之上的不透明过场层(置顶),
|
||
// 盖住这个过程,直到收到首帧信号后淡出,让用户感知为"一次平滑的转场"。
|
||
|
||
#ifndef KIOSK_SHELL_TRANSITION_OVERLAY_H
|
||
#define KIOSK_SHELL_TRANSITION_OVERLAY_H
|
||
|
||
#include <QWidget>
|
||
|
||
class QLabel;
|
||
class QTimer;
|
||
|
||
namespace vdi {
|
||
|
||
class TransitionOverlay : public QWidget {
|
||
Q_OBJECT
|
||
|
||
public:
|
||
explicit TransitionOverlay(QWidget* parent = nullptr);
|
||
|
||
// 显示过场层并开始动画;title 为提示文字(如"正在进入 Windows 10")
|
||
void start(const QString& title);
|
||
// 隐藏过场层(带淡出)
|
||
void finish();
|
||
|
||
// 首次视频帧已到达
|
||
void onFirstFrame();
|
||
|
||
protected:
|
||
bool eventFilter(QObject* watched, QEvent* event) override;
|
||
|
||
private slots:
|
||
void onTick();
|
||
void onFadeStep();
|
||
|
||
private:
|
||
QLabel* labelTitle_ = nullptr;
|
||
QLabel* labelSpinner_ = nullptr;
|
||
QTimer* tickTimer_ = nullptr;
|
||
QTimer* fadeTimer_ = nullptr;
|
||
int dots_ = 0;
|
||
};
|
||
|
||
} // namespace vdi
|
||
|
||
#endif // KIOSK_SHELL_TRANSITION_OVERLAY_H
|