vdi-cloud/terminal/kiosk-shell/src/main_window.h
songyiming 27edbe2d82 功能:开机直进桌面列表——设备身份自动登录,移除登录页与退出登录入口
- 构造时以设备 SN 走演示认证,kConfig->kAuthenticating->kDesktopList 同步完成,开机不再显示登录页
- 列表页移除"退出登录"按钮(无登录概念无去向);管理菜单"退出终端"保留
- 登录页与认证代码保留,接平台正式认证后由 DesktopService 驱动恢复登录流程
- 已部署盒子并抓屏验证;文档与 MEMORY 同步
2026-10-30 09:19:17 +08:00

89 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Kiosk 主窗口
//
// 产品流程编排:
// 开机 -> 登录页 -> 认证 -> 桌面列表 -> 选择桌面
// -> 获取连接票据 -> Moonlight 串流会话(外部进程 moonlight-qt)
// -> 会话结束回桌面列表;退出登录回登录页
//
// 对应《VDI 云桌面软件开发方案》3.2 节的状态机,
// 并按产品流程扩展 AUTHENTICATING / DESKTOP_LIST 两个状态。
// 全局热键 Ctrl+Alt+Shift+M 呼出管理菜单(含退出终端);
// Ctrl+Alt+Shift+Q 退出串流:moonlight-qt 自带同名快捷键,
// kiosk 侧保留一份兜底,串流未建立或焦点仍在 kiosk 时也能退出。
#ifndef KIOSK_SHELL_MAIN_WINDOW_H
#define KIOSK_SHELL_MAIN_WINDOW_H
#include <QElapsedTimer>
#include <QMainWindow>
#include <QPointer>
#include <memory>
#include "config.h"
#include "desktop_service.h"
#include "desktop_session.h"
#include "moonlight_session.h"
#include "state_machine.h"
class QStackedWidget;
class QStatusBar;
class QTimer;
class QEvent;
namespace vdi {
class LoginPage;
class DesktopListPage;
class TransitionOverlay;
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow() override;
private slots:
void onLoginRequested(const QString& username, const QString& password);
void onDesktopSelected(const QString& desktopId);
void onEditDesktopRequested(const QString& desktopId);
void onQuitRequested();
void onMoonlightState(bool running, const QString& message);
void onMenuAction(int action);
private:
void setupUi();
void setupHotkey();
void setupHeartbeat();
void onStateChanged(vdi::State from, vdi::State to, const QString& detail);
void refreshDesktopList();
void startMoonlightSession(const ConnectionTicket& ticket);
void stopSessions();
void showLogin();
void showDesktopList();
void updateStatusBar(const QString& text);
void watchFirstFrame();
void onFirstFrameDetected();
StateMachine fsm_;
DesktopService desktopService_;
std::unique_ptr<MoonlightSession> moonlightSession_;
ConnectionTicket activeTicket_;
QString currentUser_;
std::vector<DesktopInfo> desktops_;
QPointer<LoginPage> loginPage_;
QPointer<DesktopListPage> desktopListPage_;
QStackedWidget* stack_ = nullptr;
QStatusBar* statusBar_ = nullptr;
TransitionOverlay* overlay_ = nullptr;
QTimer* firstFrameTimer_ = nullptr;
QTimer* heartbeatTimer_ = nullptr;
QElapsedTimer firstFrameClock_;
TerminalConfig config_;
};
} // namespace vdi
#endif // KIOSK_SHELL_MAIN_WINDOW_H