- 构造时以设备 SN 走演示认证,kConfig->kAuthenticating->kDesktopList 同步完成,开机不再显示登录页 - 列表页移除"退出登录"按钮(无登录概念无去向);管理菜单"退出终端"保留 - 登录页与认证代码保留,接平台正式认证后由 DesktopService 驱动恢复登录流程 - 已部署盒子并抓屏验证;文档与 MEMORY 同步
89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
// 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
|