Skip to content

Commit 0815723

Browse files
committed
refactor: 窗口预览与连接设置
1 parent 4a919b6 commit 0815723

1 file changed

Lines changed: 58 additions & 34 deletions

File tree

aao/ui/settings_page.py

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import json
1010
from typing import TYPE_CHECKING, Any
1111

12-
from PySide6.QtCore import QObject, QThread, Signal
12+
from PySide6.QtCore import QObject, Qt, QThread, Signal
1313
from PySide6.QtWidgets import (
1414
QCheckBox,
1515
QComboBox,
@@ -134,18 +134,57 @@ def __init__(self):
134134
super().__init__()
135135
self._worker: _ResourceWorker | None = None
136136
self._thread: QThread | None = None
137+
self._auto_preview_done = False
137138
self._build_ui()
138139
self._load()
139140

140141
def showEvent(self, event: QShowEvent) -> None: # noqa: D401
141142
# 切到设置页自动刷新窗口列表 + profile 下拉(新校准的立即可见)
142143
self._refresh_windows()
143144
self._load_profiles()
145+
# 默认窗口存在时,首次进入设置页自动截一次预览;后续由用户点“刷新截图”更新
146+
if not self._auto_preview_done and self._selected_window() is not None:
147+
self._auto_preview_done = True
148+
self._preview_window()
144149
super().showEvent(event)
145150

146151
def _build_ui(self) -> None:
147152
root = QVBoxLayout(self)
148153

154+
# --- 游戏窗口选择 ---
155+
win_box = QGroupBox("游戏窗口(多个「明日方舟」窗口时需指定)")
156+
win_layout = QHBoxLayout(win_box)
157+
158+
# 左侧:截图预览
159+
self.lbl_preview = QLabel("未预览")
160+
self.lbl_preview.setAlignment(Qt.AlignmentFlag.AlignCenter)
161+
self.lbl_preview.setMinimumSize(320, 180)
162+
self.lbl_preview.setStyleSheet("background:#1f1f1f; color:#9aa0a6; border:1px solid #444;")
163+
win_layout.addWidget(self.lbl_preview, 1)
164+
165+
# 右侧:窗口列表 + 操作按钮 + 状态
166+
right = QVBoxLayout()
167+
self.list_windows = QListWidget()
168+
self.list_windows.setMinimumWidth(320)
169+
self.list_windows.setMaximumHeight(140)
170+
right.addWidget(self.list_windows)
171+
172+
win_btn_row = QHBoxLayout()
173+
self.btn_refresh_win = QPushButton("🔄 刷新列表")
174+
self.btn_preview = QPushButton("📸 刷新截图")
175+
self.btn_save_win = QPushButton("✓ 设为默认")
176+
for b in (self.btn_refresh_win, self.btn_preview, self.btn_save_win):
177+
win_btn_row.addWidget(b)
178+
win_btn_row.addStretch()
179+
right.addLayout(win_btn_row)
180+
self.lbl_win_status = QLabel("未选择")
181+
self.lbl_win_status.setStyleSheet("color: #9aa0a6;")
182+
right.addWidget(self.lbl_win_status)
183+
right.addStretch()
184+
185+
win_layout.addLayout(right, 2)
186+
root.addWidget(win_box)
187+
149188
# --- 运行设置 ---
150189
run_box = QGroupBox("运行设置")
151190
form = QFormLayout(run_box)
@@ -170,25 +209,6 @@ def _build_ui(self) -> None:
170209
form.addRow(self.btn_save)
171210
root.addWidget(run_box)
172211

173-
# --- 游戏窗口选择 ---
174-
win_box = QGroupBox("游戏窗口(多个「明日方舟」窗口时需指定)")
175-
wl = QVBoxLayout(win_box)
176-
self.list_windows = QListWidget()
177-
self.list_windows.setMaximumHeight(120)
178-
wl.addWidget(self.list_windows)
179-
win_btn_row = QHBoxLayout()
180-
self.btn_refresh_win = QPushButton("🔄 刷新列表")
181-
self.btn_preview = QPushButton("📸 预览截图")
182-
self.btn_save_win = QPushButton("✓ 设为默认")
183-
for b in (self.btn_refresh_win, self.btn_preview, self.btn_save_win):
184-
win_btn_row.addWidget(b)
185-
win_btn_row.addStretch()
186-
wl.addLayout(win_btn_row)
187-
self.lbl_win_status = QLabel("未选择")
188-
self.lbl_win_status.setStyleSheet("color: #9aa0a6;")
189-
wl.addWidget(self.lbl_win_status)
190-
root.addWidget(win_box)
191-
192212
# --- 资源 ---
193213
res_box = QGroupBox("资源(干员名 / 地图)")
194214
rl = QVBoxLayout(res_box)
@@ -269,14 +289,19 @@ def _refresh_windows(self) -> None:
269289
return
270290
saved = load_settings()
271291
saved_name = saved.get("window_name")
272-
for w in wins:
292+
saved_class = saved.get("window_class")
293+
saved_row = -1
294+
for i, w in enumerate(wins):
273295
text = f"{w.window_name} [类: {w.class_name}]"
274296
item = QListWidgetItem(text)
275-
if w.window_name == saved_name:
297+
if w.window_name == saved_name and (not saved_class or w.class_name == saved_class):
276298
# 标记当前默认
277299
item.setText("★ " + text)
300+
saved_row = i
278301
self.list_windows.addItem(item)
279302
self._windows.append(w)
303+
if saved_row >= 0:
304+
self.list_windows.setCurrentRow(saved_row)
280305
self.lbl_win_status.setText(f"找到 {len(wins)} 个窗口,选中后可预览/设为默认")
281306

282307
def _selected_window(self):
@@ -286,7 +311,7 @@ def _selected_window(self):
286311
return self._windows[row]
287312

288313
def _preview_window(self) -> None:
289-
"""对选中窗口截图,弹窗预览(后台线程避免卡 UI)。"""
314+
"""对选中窗口截图,并嵌入显示在游戏窗口设置区(后台线程避免卡 UI)。"""
290315
w = self._selected_window()
291316
if w is None:
292317
self.lbl_win_status.setText("请先在列表选中一个窗口")
@@ -308,21 +333,20 @@ def _preview_window(self) -> None:
308333

309334
def _show_preview(self, qimg: QImage) -> None:
310335
from PySide6.QtGui import QPixmap
311-
from PySide6.QtWidgets import QDialog, QLabel, QVBoxLayout
312336

313-
dlg = QDialog(self)
314-
dlg.setWindowTitle("窗口截图预览")
315-
lbl = QLabel()
316337
pix = QPixmap.fromImage(qimg)
317-
if pix.width() > 800: # 缩放到合理大小预览
318-
pix = pix.scaledToWidth(800)
319-
lbl.setPixmap(pix)
320-
lay = QVBoxLayout(dlg)
321-
lay.addWidget(lbl)
322-
self.lbl_win_status.setText("预览已生成,确认是对的画面后可设为默认")
323-
dlg.exec()
338+
target_w = max(320, self.lbl_preview.width() - 12)
339+
if pix.width() > target_w:
340+
pix = pix.scaledToWidth(target_w, Qt.TransformationMode.SmoothTransformation)
341+
self.lbl_preview.setPixmap(pix)
342+
self.lbl_preview.setText("")
343+
self.lbl_win_status.setText("预览已更新,确认是对的画面后可设为默认")
324344

325345
def _on_preview_failed(self, msg: str) -> None:
346+
from PySide6.QtGui import QPixmap
347+
348+
self.lbl_preview.setPixmap(QPixmap())
349+
self.lbl_preview.setText("预览失败")
326350
self.lbl_win_status.setText(f"预览失败: {msg}")
327351

328352
def _save_window(self) -> None:

0 commit comments

Comments
 (0)