# KNEO Academy(Innovedus AI Playground)設計規格文件 > **文件性質說明**:本設計規格從既有程式碼反向整理,涵蓋 `src/config.py`、各 View 檔案及 `uxui/` 目錄下的 UI 資源。標注「⚠️ 待確認」的項目為推斷內容或程式碼中資訊不足的部分。 --- ## ① Design Tokens > 以下 Token 直接從 `src/config.py` 及各 View 的 `setStyleSheet()` 提取。 ### 1.1 色彩系統(Color Tokens) #### Reference Tokens(原始值) | Token 名稱 | 色碼 | 說明 | |-----------|------|------| | color.navy.900 | `#143058` | 深海軍藍(MainWindow 背景) | | color.blue.600 | `#005ED7` | 亮藍(SecondaryColor,Popup / 元件背景) | | color.blue.500 | `#3498DB` | 標準藍(UtilitiesScreen 按鈕、表格 Header) | | color.blue.400 | `#2980B9` | 藍 Hover 色 | | color.blue.300 | `#1F618D` | 藍 Pressed 色 | | color.slate.800 | `#2C3E50` | 深石板藍(LoginScreen/UtilitiesScreen Header 背景) | | color.slate.700 | `#34495E` | 石板藍(SelectionScreen Header、按鈕文字) | | color.gray.100 | `#F8F9FA` | 極淺灰(進度區塊背景) | | color.gray.50 | `#F5F7FA` | 淺灰(LoginScreen / UtilitiesScreen 頁面背景) | | color.gray.200 | `#E0E0E0` | 邊框灰(卡片、輸入框邊框) | | color.gray.400 | `#BDC3C7` | 中灰(非選中導航按鈕文字) | | color.gray.500 | `#95A5A6` | 灰(Footer 文字、Back 按鈕) | | color.gray.600 | `#7F8C8D` | 深灰(描述文字、次要標籤) | | color.green.500 | `#2ECC71` | 標準綠(Download 按鈕) | | color.green.600 | `#27AE60` | 綠 Hover | | color.green.700 | `#1E8449` | 綠 Pressed | | color.green.400 | `#4CAF50` | 成功狀態綠(Custom Model 上傳成功) | | color.orange.500 | `#F39C12` | 橘(Firmware Update 按鈕) | | color.orange.600 | `#D35400` | 橘 Hover | | color.orange.700 | `#A04000` | 橘 Pressed | | color.purple.500 | `#9B59B6` | 紫(Install Driver 按鈕) | | color.purple.600 | `#8E44AD` | 紫 Hover | | color.purple.700 | `#7D3C98` | 紫 Pressed | | color.red.500 | `#E74C3C` | 紅(錯誤訊息文字) | | color.red.400 | `#ff6b6b` | 亮紅(Stop 按鈕文字及邊框) | | color.white | `#FFFFFF` | 純白 | | color.black | `#000000` | 純黑(Canvas 背景) | | color.selection | `#F8F9FA` | 選取頁面背景 | #### Semantic Tokens(語義映射) | Semantic Token | Reference Token | 說明 | |---------------|----------------|------| | color.bg.primary | color.navy.900(`#143058`) | MainWindow 頁面背景 | | color.bg.light | color.gray.50(`#F5F7FA`) | Login / Utilities 頁面背景 | | color.bg.selection | color.selection(`#F8F9FA`) | SelectionScreen 頁面背景 | | color.bg.card | color.white | 卡片、表單容器背景 | | color.bg.header.dark | color.slate.800(`#2C3E50`) | Login / Utilities Header 背景 | | color.bg.header.alt | color.slate.700(`#34495E`) | SelectionScreen Header 背景 | | color.bg.component | color.blue.600(`#005ED7`) | 側邊欄元件背景(Device Panel、Custom Model Block、Media Panel、Popup) | | color.bg.canvas | color.black | Camera / 推論顯示區域背景 | | color.bg.mask | `rgba(0, 0, 0, 0.7)` | Device Popup 蒙版 | | color.border.default | color.gray.200(`#E0E0E0`) | 卡片、輸入框、表格邊框 | | color.text.primary | color.slate.700(`#34495E`) | 主要文字(深色背景上) | | color.text.secondary | color.gray.600(`#7F8C8D`) | 次要說明文字 | | color.text.on-dark | color.white | 深色背景上的文字 | | color.text.placeholder | color.gray.500(`#95A5A6`) | 輸入框 Placeholder | | color.text.error | color.red.500(`#E74C3C`) | 錯誤訊息 | | color.text.success | color.green.400(`#4CAF50`) | 成功狀態訊息 | | color.text.footer | color.gray.500(`#95A5A6`) | Footer 版權文字 | | color.action.primary | color.blue.500(`#3498DB`) | 主要 CTA 按鈕(Login、Refresh、Utilities Tab) | | color.action.primary.hover | color.blue.400(`#2980B9`) | | | color.action.primary.pressed | color.blue.300(`#1F618D`) | | | color.action.success | color.green.500(`#2ECC71`) | 下載、Register 按鈕 | | color.action.warning | color.orange.500(`#F39C12`) | Firmware Update 按鈕 | | color.action.danger | color.red.400(`#ff6b6b`) | Stop 按鈕 | | color.action.neutral | color.gray.500(`#95A5A6`) | Back 按鈕(中性) | | color.action.special | color.purple.500(`#9B59B6`) | Install Driver 按鈕 | | color.input.focus-border | color.blue.500(`#3498DB`) | 輸入框 Focus 狀態邊框 | | color.table.header | color.blue.500(`#3498DB`) | 表格 Header 背景 | | color.table.selected | color.blue.500(`#3498DB`) | 表格選中列背景 | --- ### 1.2 尺寸系統(Size Tokens) #### 視窗尺寸 | Token | 數值 | 說明 | |-------|------|------| | window.width | 1200px | 固定視窗寬度(`WINDOW_SIZE`) | | window.height | 900px | 固定視窗高度(`WINDOW_SIZE`) | | popup.ratio | 0.67 | Device Popup 相對視窗的寬高比(`POPUP_SIZE_RATIO`) | | popup.width | ~804px | 計算值(1200 × 0.67) | | popup.height | ~603px | 計算值(900 × 0.67) | #### 佈局尺寸 | Token | 數值 | 說明 | |-------|------|------| | layout.left-panel.width | 260px | MainWindow 左側面板固定寬度 | | layout.canvas.width | 900px | Camera Canvas 固定寬度 | | layout.canvas.height | 750px | Camera Canvas 固定高度 | | layout.canvas.inner.width | 880px | Canvas Label 最小寬度 | | layout.canvas.inner.height | 730px | Canvas Label 最小高度 | | layout.header.height | 60px | UtilitiesScreen Header 固定高度 | | layout.header.height.alt | 100px | LoginScreen / SelectionScreen Header 固定高度 | #### 元件尺寸 | Token | 數值 | 說明 | |-------|------|------| | component.device-panel.width | 240px | Device Panel 固定寬度 | | component.device-panel.height | 200px | Device Panel 固定高度 | | component.custom-model.width | 240px | Custom Model Block 固定寬度 | | component.custom-model.height | 270px | Custom Model Block 固定高度 | | component.media-panel.width | 90px | Media Panel 固定寬度 | | component.media-panel.height | 290px | Media Panel 固定高度 | | component.selection-card.min-width | 300px | SelectionScreen 選項卡片最小寬度 | | component.selection-card.min-height | 250px | SelectionScreen 選項卡片最小高度 | #### 按鈕尺寸 | Token | 數值 | 說明 | |-------|------|------| | button.standard.min-height | 40px | 標準操作按鈕最小高度(UtilitiesScreen) | | button.login.min-height | 45px | 登入頁按鈕最小高度 | | button.icon.size | 50×50px | Media Panel 圖示按鈕尺寸 | | button.icon.inner | 40×40px | Media Panel SVG 圖示尺寸 | | button.popup.size | 150×45px | Popup 中 Refresh / Done 按鈕尺寸 | | button.detail.size | 72×30px | Device Panel 中 Details 按鈕尺寸 | | button.back.size | 40×40px | Header Back 按鈕尺寸 | | button.file-upload.size | 28×22px | Custom Model 上傳按鈕("...")尺寸 | | button.custom-model-action.height | 32px | Custom Model Stop / Run 按鈕高度 | #### 圖示尺寸 | Token | 數值 | 說明 | |-------|------|------| | icon.header.window | 35×35px | Popup 視窗 title 圖示 | | icon.nav | 20×20px | Device Panel title 圖示 | | icon.title.custom-model | 28×28px | Custom Model Block title 圖示 | | icon.card.selection | 64×64px | SelectionScreen 卡片圖示 | | icon.dongle.popup | 30×30px | Device Popup 中裝置圖示 | | icon.dongle.list | 30×30px | Device List 中裝置圖示容器 | | icon.logo.main | 104×40px | MainWindow / UtilitiesScreen 縮小 Logo | | icon.logo.selection | 150×60px | SelectionScreen / LoginScreen 大型 Logo | | icon.combo-arrow | 12×12px | QComboBox 下拉箭頭圖示 | --- ### 1.3 間距系統(Spacing Tokens) | Token | 數值 | 使用場景 | |-------|------|---------| | spacing.xs | 2px | FileUploadRow 上下 margin | | spacing.sm | 5px | List item padding、button spacing(小) | | spacing.md | 10px | 容器內部間距、部分 Padding | | spacing.lg | 15px | 區塊內部間距(Device Panel、Custom Model Block) | | spacing.xl | 20px | 頁面主要 Margin(Popup、MainWindow canvas) | | spacing.xxl | 30px | 表單容器 Padding(Login、SelectionScreen) | | spacing.form | 40px | SelectionScreen 主要 Margin | | spacing.card | 40px | SelectionScreen 兩張卡片之間的間距 | | spacing.nav | 10px | Header 導航按鈕之間的間距 | --- ### 1.4 圓角系統(Border Radius Tokens) | Token | 數值 | 使用場景 | |-------|------|---------| | radius.sm | 3px | 檔案上傳標籤、小型 UI 元素 | | radius.md | 5px | 按鈕(UtilitiesScreen)、輸入框、表格 | | radius.lg | 8px | 卡片區塊(Device Section、Purchased Items、Status Section) | | radius.xl | 10px | 主要卡片容器(SelectionScreen、LoginScreen form) | | radius.xxl | 15px | 選項卡片(SelectionScreen)、側邊欄元件(Device Panel、Custom Model Block) | | radius.pill | 20px | Popup、Media Panel(大圓角) | --- ### 1.5 字型系統(Typography Tokens) > **注意**:程式碼中未定義全域字型 family,使用 PyQt5 系統預設字型(Windows 環境下通常為 Segoe UI)。以下為從程式碼提取的字型大小與字重規格。 | Token | 數值 | 使用場景 | |-------|------|---------| | font.size.xs | 10px | 檔案名稱標籤(FileUploadRow)、ComboBox 箭頭 | | font.size.sm | 11px | Custom Model 小型標籤、狀態訊息、Run 按鈕文字 | | font.size.body | 12px | Footer 文字、Device Popup 狀態標籤 | | font.size.md | 14px | 表單標籤、描述文字、按鈕文字(UtilitiesScreen)、輸入框、KN 號碼標籤 | | font.size.lg | 16px | 選項卡片描述、Device 標題標籤、Device Label(Popup 中)、Custom Model title | | font.size.xl | 18px | 區塊標題(Device Connection、Device Status、Purchased Items) | | font.size.xxl | 20px | Device Panel 標題 | | font.size.xxxl | 22px | 選項卡片標題 | | font.size.display | 24px | Canvas 載入文字、UtilitiesScreen Header title | | font.size.h2 | 28px | LoginScreen title、SelectionScreen APP title | | font.size.h1 | 32px | Device Popup title | | font.weight.normal | normal | 一般文字 | | font.weight.bold | bold | 標題、按鈕文字、重要標籤 | --- ### 1.6 按鈕狀態樣式(Button State Tokens) #### 全域按鈕樣式(`BUTTON_STYLE` — 深色背景通用) ``` 背景:透明(transparent) 文字顏色:白色 邊框:2px solid white 圓角:15px Padding:5px 10px Hover:background-color: rgba(255, 255, 255, 50)(約 20% 白色透明) Pressed:background-color: rgba(255, 255, 255, 100)(約 39% 白色透明) ``` #### 主要 CTA 按鈕(藍色,淺色背景場景) ``` 背景:#3498DB 文字:白色 邊框:none(或 2px solid #2980B9) 圓角:5px MinHeight:40-45px Padding:10px 15px Hover:#2980B9 Pressed:#1F618D Disabled:#3498DB(同 Default,視覺不變)⚠️ ``` #### 成功/下載按鈕(綠色) ``` 背景:#2ECC71 文字:白色 邊框:2px solid #27AE60 圓角:5px Hover:#27AE60 Pressed:#1E8449 ``` #### 警告按鈕(橘色 Firmware Update) ``` 背景:#F39C12 文字:白色 邊框:2px solid #D35400 圓角:5px Hover:#D35400 Pressed:#A04000 ``` #### 特殊功能按鈕(紫色 Install Driver) ``` 背景:#9B59B6 文字:白色 邊框:2px solid #8E44AD 圓角:5px Hover:#8E44AD Pressed:#7D3C98 ``` #### 中性返回按鈕(灰色) ``` 背景:#95A5A6 文字:白色 圓角:5px Hover:#7F8C8D Pressed:#616A6B ``` #### Custom Model — Run 按鈕(綠色半透明) ``` 背景:rgba(76, 175, 80, 0.3) 文字:白色 邊框:1px solid #4CAF50 圓角:8px 高度:32px Hover:rgba(76, 175, 80, 0.5) Disabled:rgba(128, 128, 128, 0.2),文字 #666,邊框 #666 ``` #### Custom Model — Stop 按鈕(紅色透明) ``` 背景:透明 文字:#ff6b6b 邊框:1px solid #ff6b6b 圓角:8px 高度:32px Hover:rgba(255, 107, 107, 0.2) ``` #### Media Panel 圖示按鈕 ``` 背景:透明 邊框:1px transparent 圓角:10px 尺寸:50×50px Hover:rgba(255, 255, 255, 50) Pressed:rgba(255, 255, 255, 100) ``` #### Header Back 按鈕(圖示透明按鈕) ``` 背景:透明 邊框:none 尺寸:40×40px Hover:rgba(255, 255, 255, 0.1),圓角 20px ``` --- ## ② UI 資源清單 > 路徑:`uxui/` ### 2.1 PNG 圖片(`Assets_png/`) | 檔名 | 推斷用途 | 使用位置 | |------|---------|---------| | `kneron_logo.png` | Kneron / Innovedus 品牌 Logo | MainWindow 歡迎畫面、所有頁面 Header、MainWindow 左側面板 | | `ic_dongle_520.png` | KL520 Dongle 裝置圖示 | Device Popup、Device List(裝置列表項) | | `ic_dongle_720.png` | KL720 Dongle 裝置圖示 | Device Popup、Device List(裝置列表項) | > **⚠️ 待確認**:程式碼中 `create_header()` 呼叫 `Assets_png/back_arrow.png` 作為 Back 按鈕圖示,但此檔案**不在 `Assets_png/` 目錄中**。此按鈕目前可能顯示為空白或破圖。 --- ### 2.2 SVG 圖示(`Assets_svg/`) #### 功能按鈕圖示(`bt_function_*`) | 檔名 | 狀態 | 推斷用途 | |------|------|---------| | `bt_function_camera_disabled.svg` | disabled | 相機功能按鈕(停用) | | `bt_function_mic_disabled.svg` | disabled | 麥克風功能按鈕(停用) | | `bt_function_mic_hover.svg` | hover | 麥克風功能按鈕 | | `bt_function_mic_normal.svg` | normal | 麥克風功能按鈕 | | `bt_function_mic_pressed.svg` | pressed | 麥克風功能按鈕 | | `bt_function_recording_hover.svg` | hover | 錄製功能按鈕 | | `bt_function_recording_normal.svg` | normal | 錄製功能按鈕 | | `bt_function_recording_pressed.svg` | pressed | 錄製功能按鈕 | | `bt_function_screencapture_disabled.svg` | disabled | 螢幕截圖按鈕(停用) | | `bt_function_screencapture_hover.svg` | hover | 螢幕截圖按鈕 | | `bt_function_screencapture_normal.svg` | normal | 螢幕截圖按鈕(Media Panel 第一個按鈕) | | `bt_function_screencapture_pressed.svg` | pressed | 螢幕截圖按鈕 | | `bt_function_upload_disabled.svg` | disabled | 上傳檔案按鈕(停用) | | `bt_function_upload_hover.svg` | hover | 上傳檔案按鈕 | | `bt_function_upload_normal.svg` | normal | 上傳檔案按鈕(Media Panel 第二個按鈕) | | `bt_function_upload_pressed.svg` | pressed | 上傳檔案按鈕 | | `bt_function_video_hover.svg` | hover | 影片/恢復播放按鈕(暫停→恢復時切換) | | `bt_function_video_normal.svg` | normal | 影片按鈕 | | `bt_function_video_pressed.svg` | pressed | 影片按鈕 | > **⚠️ 待確認**:目前 Media Panel「暫停/恢復」按鈕使用 `btn_result_image_delete_hover.svg` 作為暫停狀態圖示,切換後顯示 `bt_function_video_hover.svg`。此對應關係看起來不是最終設計,圖示使用可能有誤。 #### 對話框按鈕(`btn_dialog_*`) | 檔名 | 狀態 | 推斷用途 | |------|------|---------| | `btn_dialog_customization_delete_hover.svg` | hover | 自定義對話框刪除按鈕 | | `btn_dialog_customization_delete_normal.svg` | normal | 自定義對話框刪除按鈕 | | `btn_dialog_customization_delete_pressed.svg` | pressed | 自定義對話框刪除按鈕 | | `btn_dialog_customization_upload_hover.svg` | hover | 自定義對話框上傳按鈕 | | `btn_dialog_customization_upload_normal.svg` | normal | 自定義對話框上傳按鈕 | | `btn_dialog_customization_upload_pressed.svg` | pressed | 自定義對話框上傳按鈕 | | `btn_dialog_device_disconnect_hover.svg` | hover | 裝置斷線按鈕 | | `btn_dialog_device_disconnect_normal.svg` | normal | 裝置斷線按鈕 | | `btn_dialog_device_disconnect_pressed.svg` | pressed | 裝置斷線按鈕 | > **⚠️ 待確認**:`btn_dialog_*` 系列圖示在目前的程式碼中**找不到對應的呼叫位置**(自定義對話框的刪除/上傳、裝置斷線按鈕),可能屬於尚未實作的功能 UI,或被移除但資源保留。 #### 結果區域按鈕(`btn_result_*`) | 檔名 | 狀態 | 推斷用途 | |------|------|---------| | `btn_result_edit_hover.svg` | hover | 推論結果編輯按鈕 | | `btn_result_edit_normal.svg` | normal | 推論結果編輯按鈕 | | `btn_result_edit_pressed.svg` | pressed | 推論結果編輯按鈕 | | `btn_result_image_delete_hover.svg` | hover | 推論結果圖片刪除按鈕(目前被借用為暫停圖示) | | `btn_result_image_delete_normal.svg` | normal | 推論結果圖片刪除按鈕 | | `btn_result_image_delete_pressed.svg` | pressed | 推論結果圖片刪除按鈕 | > **⚠️ 待確認**:`btn_result_*` 在程式碼中僅 `btn_result_image_delete_hover.svg` 被使用(且用途有疑問),其他均未見使用。 #### 設定與下載(單一圖示) | 檔名 | 推斷用途 | 使用位置 | |------|---------|---------| | `btn_setting.svg` | 設定按鈕 | ⚠️ 程式碼中未見呼叫 | | `ic_result_download_diabled.svg` | 結果下載(停用) | ⚠️ 程式碼中未見呼叫 | | `ic_result_download_hover.svg` | 結果下載 Hover | ⚠️ 程式碼中未見呼叫 | | `ic_result_download_normal.svg` | 結果下載 Normal | ⚠️ 程式碼中未見呼叫 | | `ic_result_download_pressed.svg` | 結果下載 Pressed | ⚠️ 程式碼中未見呼叫 | | `ic_result_folder_hover.svg` | 結果資料夾 Hover | ⚠️ 程式碼中未見呼叫(除被借用為 ComboBox 下拉箭頭) | | `ic_result_folder_normal.svg` | 結果資料夾 Normal | 被用作 LoginScreen QComboBox 下拉箭頭 | | `ic_result_folder_pressed.svg` | 結果資料夾 Pressed | ⚠️ 程式碼中未見呼叫 | #### 通用圖示(`ic_*`) | 檔名 | 推斷用途 | 使用位置 | |------|---------|---------| | `ic_customization_upload_folder.svg` | 自定義模型上傳資料夾圖示 | ⚠️ 程式碼中未見呼叫 | | `ic_dialog_customization.svg` | 自定義對話框圖示 | ⚠️ 程式碼中未見呼叫 | | `ic_dialog_device.svg` | 裝置對話框圖示 | SelectionScreen Utilities 卡片圖示 | | `ic_dialog_missing_camera.svg` | 找不到攝影機圖示 | ⚠️ 程式碼中未見呼叫(應用於相機找不到的提示) | | `ic_dongle_520.svg` | KL520 Dongle 圖示(SVG 版) | ⚠️ 程式碼中未見呼叫(PNG 版本被使用) | | `ic_recording_camera.svg` | 攝影機/錄影圖示 | SelectionScreen Demo App 卡片圖示;Media Panel 第五個按鈕(錄影) | | `ic_recording_voice.svg` | 錄音圖示 | Media Panel 第四個按鈕(錄音) | | `ic_window_customization.svg` | 自定義視窗圖示 | ⚠️ 程式碼中未見呼叫 | | `ic_window_device.svg` | 裝置視窗圖示 | Device Popup 標題列;Device Panel 標題列 | | `ic_window_toolbox.svg` | 工具箱視窗圖示 | Custom Model Block 標題列 | --- ### 2.3 動態圖(`Assets_gif/`) | 檔名 | 用途 | 使用位置 | |------|------|---------| | `no_device_temp.gif` | 無裝置狀態動態提示圖 | `MainWindow.show_no_device_gif()`(無裝置時在主視窗顯示) | --- ### 2.4 根目錄 SVG 資源 | 檔名 | 推斷用途 | 使用位置 | |------|---------|---------| | `canvas_background.svg` | 攝影機畫布背景 SVG | ⚠️ 程式碼中未見呼叫 | | `usb_dongle.svg` | USB Dongle 圖示 | ⚠️ 程式碼中未見呼叫 | --- ## ③ 頁面元件清單 ### 3.1 SelectionScreen(首頁選擇畫面) **背景色**:`#F8F9FA`(淺灰白) **佈局**:QVBoxLayout,Margin 40px 全周,Spacing 20px | 元件 | Class/類型 | 尺寸/規格 | 樣式摘要 | |------|-----------|---------|---------| | 頁面背景 | QWidget | 1200×900px | `background: #F8F9FA` | | Header Frame | QFrame | 全寬 × 100px 固定高 | `background: #34495E; border-radius: 10px` | | Kneron Logo | QLabel + QPixmap | 縮放至 150×60px | 水平居中 | | 內容容器 | QFrame | 彈性高(填充剩餘空間)| `background: white; border-radius: 10px; border: 1px solid #E0E0E0`,Padding 30px | | APP 名稱標題 | QLabel | — | `font-size: 28px; font-weight: bold; color: #34495E`,水平居中 | | 副標題 | QLabel | — | `font-size: 16px; color: #7F8C8D`,水平居中,文字:「請選擇您要使用的功能」 | | 按鈕容器 | QWidget + QHBoxLayout | — | Margin 20px 左右,Spacing 40px | | **Utilities 卡片** | QFrame | min 300×250px | `background: white; border-radius: 15px; border: 1px solid #E0E0E0`;Hover:`background: #F5F9FF; border: #5DADE2`;cursor: PointingHand | | Utilities 卡片圖示 | QLabel + QPixmap | 64×64px | `ic_dialog_device.svg`,水平居中 | | Utilities 卡片標題 | QLabel | — | `font-size: 22px; font-weight: bold; color: #34495E`,居中 | | Utilities 卡片說明 | QLabel | — | `font-size: 14px; color: #7F8C8D`,居中,換行 | | **Demo App 卡片** | QFrame | min 300×250px | `background: white; border-radius: 15px; border: 1px solid #E0E0E0`;Hover:`background: #F5FFF7; border: #7DCEA0`;cursor: PointingHand | | Demo App 卡片圖示 | QLabel + QPixmap | 64×64px | `ic_recording_camera.svg`,水平居中 | | Demo App 卡片標題 | QLabel | — | `font-size: 22px; font-weight: bold; color: #34495E`,居中 | | Demo App 卡片說明 | QLabel | — | `font-size: 14px; color: #7F8C8D`,居中,換行 | | Footer | QLabel | — | `font-size: 12px; color: #95A5A6`,居中,文字:「© 2025 Innovedus Inc. All rights reserved.」 | --- ### 3.2 LoginScreen(登入畫面) **背景色**:`#F5F7FA`(淺灰) **佈局**:QVBoxLayout,Margin 40px 全周,Spacing 20px | 元件 | Class/類型 | 尺寸/規格 | 樣式摘要 | |------|-----------|---------|---------| | 頁面背景 | QWidget | 1200×900px | `background: #F5F7FA` | | Header Frame | QFrame | 全寬 × 100px 固定高 | `background: #2C3E50; border-radius: 10px` | | Kneron Logo | QLabel + QPixmap | 縮放至 150×60px | 水平居中 | | 表單容器 | QFrame | 彈性高(填充剩餘空間)| `background: white; border-radius: 10px; border: 1px solid #E0E0E0`,Padding 30px | | 登入標題 | QLabel | — | `font-size: 28px; font-weight: bold; color: #2C3E50; margin-bottom: 10px`,居中,文字:"Login" | | Server 驗證標籤 | QLabel | — | `font-size: 14px; font-weight: bold; color: #2C3E50`,文字:"Server Authentication Type" | | **驗證類型 ComboBox** | QComboBox | min-height 40px | `border: 1px solid #E0E0E0; border-radius: 5px; padding: 5px 10px; font-size: 14px; color: #2C3E50`;下拉箭頭使用 `ic_result_folder_normal.svg` 12×12px | | 帳號標籤 | QLabel | — | `font-size: 14px; font-weight: bold; color: #2C3E50`,文字:"Username" | | **帳號輸入框** | QLineEdit | min-height 40px | `border: 1px solid #E0E0E0; border-radius: 5px; padding: 5px 10px; font-size: 14px; color: #2C3E50`;Focus:`border: 1px solid #3498DB`;Placeholder:"Enter your username" | | 密碼標籤 | QLabel | — | `font-size: 14px; font-weight: bold; color: #2C3E50`,文字:"Password" | | **密碼輸入框** | QLineEdit | min-height 40px | 同帳號輸入框;EchoMode: Password;Placeholder:"Enter your password" | | 錯誤訊息 | QLabel | — | `color: #E74C3C; font-size: 14px`;預設隱藏(`hide()`),驗證失敗時顯示 | | Back 按鈕 | QPushButton | min-height 45px | `background: #95A5A6; color: white; border-radius: 5px; font-size: 14px; font-weight: bold`;Hover:`#7F8C8D`;Pressed:`#616A6B` | | Login 按鈕 | QPushButton | min-height 45px | `background: #3498DB; color: white; border-radius: 5px; font-size: 14px; font-weight: bold`;Hover:`#2980B9`;Pressed:`#1F618D` | | Footer | QLabel | — | `font-size: 12px; color: #95A5A6`,居中 | --- ### 3.3 UtilitiesScreen(裝置管理工具) **背景色**:`#F5F7FA`(淺灰) **佈局**:QVBoxLayout,Margin 20px 全周,Spacing 20px #### 3.3.1 Header | 元件 | 類型 | 尺寸/規格 | 樣式摘要 | |------|------|---------|---------| | Header Frame | QFrame | 全寬 × 60px 固定高 | `background: #2C3E50; border-radius: 0px` | | Back 按鈕 | QPushButton | 40×40px | 圖示按鈕(`Assets_png/back_arrow.png`⚠️ 檔案缺失);Hover:`rgba(255,255,255,0.1) border-radius 20px` | | 頁面標題 | QLabel | — | `color: white; font-size: 24px; font-weight: bold`,文字:"Utilities" | | **Utilities 導航按鈕**(選中) | QPushButton | padding 5px 10px | `background: #3498DB; color: white; border: none; border-radius: 5px; font-weight: bold` | | **Purchased Items 導航按鈕**(未選) | QPushButton | padding 5px 10px | `background: transparent; color: #BDC3C7; border: none; border-radius: 5px; font-weight: bold`;Hover:`color: white` | | Kneron Logo | QLabel + QPixmap | 縮放至 104×40px | 靠右對齊 | #### 3.3.2 Utilities 子頁面 — 裝置管理區塊 | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | 區塊容器 | QFrame | — | `background: white; border-radius: 8px; border: 1px solid #E0E0E0`,Padding 15px | | 區塊標題 | QLabel | — | `font-size: 18px; font-weight: bold; color: #2C3E50`,文字:"Device Connection" | | 區塊說明 | QLabel | — | `font-size: 14px; color: #7F8C8D`,文字:"Connect and manage your Kneron devices" | | **裝置資料表** | QTableWidget | min-height 可捲動 | 6 欄:Device Type / Port ID / Firmware Version / KN Number / Link Speed / Status;Header `background: #3498DB; color: white; font-weight: bold; padding: 8px`;Item padding 8px;Selected `background: #3498DB; color: white`;gridline `#E0E0E0` | | Refresh Devices 按鈕 | QPushButton | min-height 40px | `background: #3498DB; border: 2px solid #2980B9; border-radius: 5px; font-size: 14px; font-weight: bold`;狀態色如前 | | Register Device 按鈕 | QPushButton | min-height 40px | `background: #2ECC71; border: 2px solid #27AE60`;狀態色如前 | | Update Firmware 按鈕 | QPushButton | min-height 40px | `background: #F39C12; border: 2px solid #D35400`;狀態色如前 | | Install Driver 按鈕 | QPushButton | min-height 40px | `background: #9B59B6; border: 2px solid #8E44AD`;狀態色如前 | #### 3.3.3 Utilities 子頁面 — 狀態區塊 | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | 區塊容器 | QFrame | — | `background: white; border-radius: 8px; border: 1px solid #E0E0E0`,Padding 15px | | 區塊標題 | QLabel | — | `font-size: 18px; font-weight: bold; color: #2C3E50`,文字:"Device Status" | | 狀態訊息 | QLabel | — | `font-size: 14px; color: #7F8C8D`,預設文字:"No devices found" | | 進度區塊(隱藏) | QFrame | — | `background: #F8F9FA; border-radius: 5px; border: 1px solid #E0E0E0; padding: 10px`;預設 `setVisible(False)` | | 進度標題 | QLabel | — | `font-size: 14px; font-weight: bold; color: #2C3E50` | | **進度條** | QProgressBar | height 20px | `border: 1px solid #E0E0E0; border-radius: 5px; background: white; text-align: center`;Chunk:`background: #3498DB; border-radius: 5px` | #### 3.3.4 Purchased Items 子頁面 | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | 區塊容器 | QFrame | — | `background: white; border-radius: 8px; border: 1px solid #E0E0E0`,Padding 15px | | 區塊標題 | QLabel | — | `font-size: 18px; font-weight: bold; color: #2C3E50`,文字:"Your Purchased Items" | | 區塊說明 | QLabel | — | `font-size: 14px; color: #7F8C8D`,文字:"Select items to download to your device" | | **已購項目表格** | QTableWidget | min-height 300px | 5 欄:Select(Checkbox)/ Product / Model / Current Version / Compatible Dongles;樣式同裝置表格(藍色 Header,選中藍色) | | Refresh Items 按鈕 | QPushButton | min-height 40px | `background: #3498DB; border: none; border-radius: 5px; font-size: 14px; font-weight: bold`;Hover:`#2980B9`;Pressed:`#1F618D` | | Download Selected 按鈕 | QPushButton | min-height 40px | `background: #2ECC71; border: none; border-radius: 5px; font-size: 14px; font-weight: bold`;Hover:`#27AE60`;Pressed:`#1E8449` | --- ### 3.4 MainWindow(AI Demo 推論主視窗) **背景色**:`#143058`(深海軍藍) **佈局**:QVBoxLayout 外層,啟動時先顯示歡迎畫面(Logo),500ms 後切換至主頁面 #### 3.4.1 歡迎畫面(500ms 轉場) | 元件 | 類型 | 規格 | 說明 | |------|------|------|------| | 歡迎 Logo | QLabel + QPixmap | 原始尺寸 | `kneron_logo.png`,水平居中 | #### 3.4.2 主頁面佈局(QHBoxLayout) 左右兩欄佈局: - **左欄**:固定寬度 260px,QVBoxLayout,Margin 10px,Spacing 10px - **右欄**:彈性寬度(stretch factor 2),QGridLayout,Margin 0px #### 3.4.3 左欄元件 | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | Kneron Logo | QLabel + QPixmap | 縮放至 104×40px | — | | **Device Panel** | QFrame | 240×200px 固定 | `background: #005ED7; border-radius: 15px; border: none` | | — Device 圖示 | QSvgWidget | 20×20px | `ic_window_device.svg` | | — Device 標題 | QLabel | — | `color: white; font-size: 20px; font-weight: bold` | | — 裝置列表 | QListWidget | — | 透明背景;Item:padding 5px,Selected:`rgba(255,255,255,0.2)`;無 Scrollbar | | — Details 按鈕 | QPushButton | 72×30px | 全域 `BUTTON_STYLE`(透明背景、白色邊框) | | **Custom Model Block** | QFrame | 240×270px 固定 | `background: #005ED7; border-radius: 15px; border: none` | | — 工具箱圖示 | QSvgWidget | 28×28px | `ic_window_toolbox.svg` | | — Custom Model 標題 | QLabel | — | `color: white; font-size: 16px; font-weight: bold` | | — 分隔線 | QFrame HLine | 1px 高 | `background: rgba(255,255,255,0.2)` | | — Model 上傳列(.nef) | FileUploadRow | — | 標籤 50px 寬;檔案框 22px 高;上傳按鈕 28×22px | | — SCPU 上傳列(.bin) | FileUploadRow | — | 同上 | | — NCPU 上傳列(.bin) | FileUploadRow | — | 同上 | | — Labels 上傳列(.txt) | FileUploadRow | — | 同上 | | — 狀態標籤 | QLabel | — | `color: #4CAF50; font-size: 11px`;成功綠色,錯誤時 `#ff6b6b` | | — Stop 按鈕 | QPushButton | 高 32px | 透明背景,紅色邊框文字(`#ff6b6b`) | | — Run Inference 按鈕 | QPushButton | 高 32px | 半透明綠色(`rgba(76,175,80,0.3)`),綠色邊框 | #### 3.4.4 右欄元件 | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | **Canvas Area** | QFrame | 900×750px 固定 | `border: 1px solid gray; background: black; border-radius: 20px`,Padding 10px | | Canvas Label(顯示區)| QLabel | 880×730px 最小 | 黑色背景,透明邊框;顯示攝影機 QImage 或靜態圖片 | | **Media Panel**(浮動右下)| QFrame | 90×290px 固定 | `background: #005ED7; border-radius: 20px`;使用 `Qt.AlignBottom | Qt.AlignRight` 疊加在 Canvas 右下 | | — 截圖按鈕 | QPushButton | 50×50px | 圖示 `bt_function_screencapture_normal.svg`,40×40px | | — 上傳按鈕 | QPushButton | 50×50px | 圖示 `bt_function_upload_normal.svg`,40×40px | | — 暫停/恢復按鈕 | QPushButton | 50×50px | 暫停時:`btn_result_image_delete_hover.svg`;恢復時:`bt_function_video_hover.svg` | | — 錄音按鈕 | QPushButton | 50×50px | 圖示 `ic_recording_voice.svg`,40×40px | | — 錄影按鈕 | QPushButton | 50×50px | 圖示 `ic_recording_camera.svg`,40×40px | #### 3.4.5 Device Popup(蒙版彈出視窗) | 元件 | 類型 | 規格 | 樣式摘要 | |------|------|------|---------| | 蒙版 Overlay | QWidget | 1200×900px(全視窗) | `background: rgba(0, 0, 0, 0.7)` | | **Device Popup** | QWidget | 804×603px(視窗 × 0.67) | `background: #005ED7; border-radius: 20px; padding: 20px` | | — 裝置圖示 | QSvgWidget | 35×35px | `ic_window_device.svg` | | — 彈窗標題 | QLabel | — | `color: white; font-size: 32px; font-weight: bold`,文字:"Device Connection" | | — 裝置列表(Popup) | QListWidget | min-height 250px | `background: rgba(255,255,255,0.1); border-radius: 10px; color: white`;Item Selected:`rgba(52,152,219,0.5)` | | — 裝置列表項 | 自訂 QWidget | 60px 固定高 | 圖示容器 30×30px(`#182D4B` 背景,border-radius 5px)+ 裝置名(16px bold)+ KN 號碼(14px)+ 狀態(12px 右對齊) | | — Refresh 按鈕 | QPushButton | 150×45px | 全域 `BUTTON_STYLE` | | — Done 按鈕 | QPushButton | 150×45px | 全域 `BUTTON_STYLE` | --- ## ④ 互動規格 ### 4.1 頁面切換方式(Signal/Slot) ``` SelectionScreen.open_utilities → 主程式切換到 LoginScreen SelectionScreen.open_demo_app → 主程式切換到 MainWindow LoginScreen.login_success → 主程式切換到 UtilitiesScreen LoginScreen.back_to_selection → 主程式切換到 SelectionScreen UtilitiesScreen.back_to_selection → 主程式切換到 SelectionScreen ``` > **⚠️ 待確認**:頁面切換的具體實作(是否使用 QStackedWidget,還是直接 hide/show)需查看 `main.py` 或應用程式進入點。 ### 4.2 MainWindow 啟動流程 ``` 1. 顯示歡迎畫面(Kneron Logo) 2. 500ms 後 → 清除歡迎畫面,建立主頁面 3. 100ms 後 → 呼叫 device_controller.refresh_devices() 4. 顯示 Device Popup(蒙版覆蓋主頁面) 5. 500ms 後 → 自動啟動攝影機(auto_start_camera) ``` ### 4.3 按鈕 Enabled/Disabled 條件 | 按鈕 | 停用條件 | 啟用條件 | |------|---------|---------| | Media Panel 圖示按鈕(相機) | 相機功能不可用時(`bt_function_camera_disabled.svg` 存在暗示) | ⚠️ 未在程式碼中找到明確的 setEnabled 邏輯 | | Custom Model — Run Inference | 無(任何時候都可點擊,但點擊後會驗證檔案) | 有效檔案選擇後 | | Custom Model — Stop | 無推論進行時重置檔案選擇 | — | | UtilitiesScreen 操作按鈕 | ⚠️ 未找到明確的停用條件(選取裝置後才應啟用的邏輯有待確認) | — | ### 4.4 對話框觸發條件 | 對話框 | 觸發條件 | 類型 | |--------|---------|------| | Device Popup | MainWindow 啟動時自動顯示 | 自訂 QWidget 蒙版 | | Inference Result | 推論回傳非 Bounding Box 結果(分類等)時 | QMessageBox | | Device 相容性警告 | 選擇不相容裝置的 AI 工具時 | QMessageBox(推斷) | | 無裝置 GIF | 推斷:無裝置連接時 | QLabel + QMovie | | Download Complete | 所有選中項目下載完成 | QMessageBox.information | | No Selection 警告 | 點擊 Download 但未勾選任何項目 | QMessageBox.warning | | 相機失敗提示 | 相機開啟失敗 | ⚠️ 程式碼中有 `ic_dialog_missing_camera.svg` 資源,但未見對應邏輯 | ### 4.5 UtilitiesScreen 頁面切換 | 觸發 | 行為 | |------|------| | 點擊「Utilities」導航按鈕 | `utilities_page.show()`;`purchased_items_page.hide()`;Utilities 按鈕樣式變為選中(`#3498DB`);Purchased 按鈕變為未選中(透明) | | 點擊「Purchased Items」導航按鈕 | `purchased_items_page.show()`;`utilities_page.hide()` | > **⚠️ 待確認**:目前程式碼中未見導航按鈕選中/未選中狀態的動態切換邏輯(按鈕樣式可能沒有在切換時更新)。 ### 4.6 Custom Model 檔案上傳互動 | 步驟 | 互動 | 視覺變化 | |------|------|---------| | 點擊「...」按鈕 | 開啟系統檔案選擇器 | — | | 選擇檔案成功 | 顯示檔案名稱(超過 15 字截斷加「...」) | 標籤顏色從 `#aaa` 變為 `#4CAF50`;邊框 `#4CAF50`;背景 `rgba(76,175,80,0.1)` | | 點擊 Run Inference(缺少必要檔案) | — | 狀態標籤文字更新為錯誤提示,顏色變為 `#ff6b6b` | | 點擊 Run Inference(所有必要檔案已選) | 啟動推論 | 狀態標籤顯示 "Running: {model_name}",顏色 `#4CAF50` | | 點擊 Stop(有推論進行中) | 停止推論 | 狀態標籤顯示 "Stopped & Disconnected",顏色 `#ff6b6b` | | 點擊 Stop(無推論) | 重置所有檔案選擇 | 所有 FileUploadRow 回復到「未選擇」狀態 | --- ## ⑤ 缺失的設計規格 ### 5.1 互動細節(程式碼中看不出) | 項目 | 說明 | |------|------| | Bounding Box 繪製樣式 | 推論結果繪製在 Canvas 上的 Bounding Box 顏色、線條粗細、Label 字型樣式均無 Design Spec;從程式碼僅知座標格式 | | 相機找不到時的 UI | 有 `ic_dialog_missing_camera.svg` 資源,但找不到對應的顯示邏輯 | | 推論進行中的 Loading 狀態 | Canvas 載入文字為 "Starting camera...",但推論進行中是否有 Loading indicator 不清楚 | | UtilitiesScreen 導航按鈕切換動態 | 頁面切換時按鈕選中狀態的樣式切換邏輯不完整 | | 相機暫停後的 Canvas 顯示 | 暫停時 Canvas 顯示最後一幀還是空白?未知 | | MSE 幀差異偵測的視覺提示 | 技術機制存在,但使用者是否看到任何提示?未知 | | 推論 Queue 滿時的提示 | Queue 最大 5 幀,滿時的行為是靜默丟棄,無視覺提示 | ### 5.2 未完整實作的 UI 功能 | 項目 | 說明 | |------|------| | Driver 安裝 UI | `Install Driver` 按鈕存在,但 `install_drivers()` 方法的實際 UI 流程未見完整實作 | | Register Device UI | `Register Device` 按鈕存在,`register_device()` 方法實作未確認 | | Dongle 授權管理 UI | PRD 中有完整描述,但 UtilitiesScreen 中未見對應 UI 元素 | | Toolbox(原始工具箱)| `create_ai_toolbox()` 元件存在但在 MainWindow 中已被 `CustomModelBlock` 取代,Toolbox 功能未整合 | | 購買模型下載(真實 API)| 目前為 Mock 資料,`populate_mock_purchased_items()` 方法,無真實下載邏輯 | | 自定義對話框 UI | `btn_dialog_customization_*` 和 `ic_dialog_customization.svg` 資源存在,但無對應 UI 元件 | | 裝置斷線按鈕 UI | `btn_dialog_device_disconnect_*` 資源存在,但無對應 UI 元件 | | 結果下載/資料夾 UI | `ic_result_download_*`、`ic_result_folder_*`、`btn_result_edit_*` 資源存在,但程式碼中大多未呼叫 | | 設定頁面 | `btn_setting.svg` 存在,但無對應的設定頁面 | ### 5.3 設計一致性問題(觀察到的設計債) | 問題 | 說明 | 嚴重程度 | |------|------|---------| | 兩種截然不同的設計語言 | MainWindow 使用深海軍藍(`#143058`)為主的深色設計;SelectionScreen、LoginScreen、UtilitiesScreen 使用淺色(`#F5F7FA`)設計。同一個應用存在兩套視覺語言,缺乏統一感 | High | | Back 按鈕圖示資源缺失 | UtilitiesScreen Header 使用的 `Assets_png/back_arrow.png` 不存在於 `uxui/Assets_png/` 目錄,按鈕為空白 | High | | 暫停按鈕圖示錯誤 | Media Panel 暫停按鈕使用 `btn_result_image_delete_hover.svg`(刪除圖示)作為暫停狀態,語意不正確 | Medium | | 未定義系統字型 | 無明確的 `font-family` 定義,依賴 Windows 系統預設字型,跨平台(若未來支援)可能不一致 | Low | | Dark Mode 未規劃 | 完全無 Dark Mode 設計 | Low | | Disabled 按鈕視覺未完整定義 | UtilitiesScreen 按鈕幾乎未定義 Disabled 狀態樣式 | Medium | | Focus 狀態不完整 | 大多數按鈕無 Focus ring 設計(僅 LoginScreen QLineEdit 有 Focus 邊框) | Medium | --- *本文件由 Design Agent 從既有程式碼反向整理,版本日期:2026-04-04*