更新
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
"""Render the clinical reading surfaces with demo data and production fonts."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
from PySide6.QtCore import Qt, QThreadPool
|
||||
from PySide6.QtGui import QFontInfo, QGuiApplication, QPalette
|
||||
from PySide6.QtTest import QTest
|
||||
from PySide6.QtWidgets import QApplication
|
||||
|
||||
from doctor_workstation.services import DemoDoctorRepository
|
||||
from doctor_workstation.ui import ShellWindow, apply_theme
|
||||
|
||||
|
||||
def _settle(app: QApplication) -> None:
|
||||
for _ in range(4):
|
||||
QThreadPool.globalInstance().waitForDone(3000)
|
||||
app.processEvents()
|
||||
QTest.qWait(100)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--output", type=Path, default=Path("artifacts/ui_comfort"))
|
||||
parser.add_argument("--width", type=int, default=1536)
|
||||
parser.add_argument("--height", type=int, default=912)
|
||||
args = parser.parse_args()
|
||||
args.output.mkdir(parents=True, exist_ok=True)
|
||||
QGuiApplication.setHighDpiScaleFactorRoundingPolicy(
|
||||
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough
|
||||
)
|
||||
app = QApplication.instance() or QApplication([])
|
||||
apply_theme(app)
|
||||
repo = DemoDoctorRepository()
|
||||
session = repo.login(repo.DEMO_ACCOUNT, repo.DEMO_PASSWORD)
|
||||
shell = ShellWindow(
|
||||
repo, {"session": session, "demo_mode": True}, permissions=session.permissions
|
||||
)
|
||||
shell.resize(args.width, args.height)
|
||||
shell.show()
|
||||
try:
|
||||
shell.navigate("reception")
|
||||
_settle(app)
|
||||
page = shell.pages["reception"]
|
||||
page._set_queue_filter(None)
|
||||
_settle(app)
|
||||
# A synthetic multiline case tests paragraph rhythm without capturing
|
||||
# a live patient or connecting to a production service.
|
||||
page.case_labels["present"].setText(
|
||||
"患者自述近期口干,睡眠较浅,日常饮食与作息较规律。\n"
|
||||
"近一周已记录空腹血糖,复诊时携带记录与既往检查报告。\n"
|
||||
"问诊记录包含当前不适、变化时间、生活习惯与既往用药,供医生核对。"
|
||||
)
|
||||
app.processEvents()
|
||||
if not shell.grab().save(str(args.output / "reception.png")):
|
||||
raise RuntimeError("Could not save reception preview")
|
||||
daily = next(
|
||||
index
|
||||
for index in range(page.detail_tabs.count())
|
||||
if page.detail_tabs.tabText(index) == "日常记录"
|
||||
)
|
||||
page.detail_tabs.setCurrentIndex(daily)
|
||||
_settle(app)
|
||||
if not shell.grab().save(str(args.output / "daily_records.png")):
|
||||
raise RuntimeError("Could not save daily-record preview")
|
||||
metrics = {
|
||||
"family": QFontInfo(app.font()).family(),
|
||||
"pixel_size": app.font().pixelSize(),
|
||||
"font_strategy": app.font().styleStrategy().value,
|
||||
"font_hinting": app.font().hintingPreference().name,
|
||||
"text_color": app.palette().color(QPalette.ColorRole.Text).name(),
|
||||
"device_pixel_ratio": shell.devicePixelRatioF(),
|
||||
"window": [shell.width(), shell.height()],
|
||||
"daily_table_font": QFontInfo(page.daily_panel.matrix.font()).family(),
|
||||
"daily_table_size": page.daily_panel.matrix.font().pixelSize(),
|
||||
}
|
||||
(args.output / "render.json").write_text(
|
||||
json.dumps(metrics, ensure_ascii=False, indent=2), encoding="utf-8"
|
||||
)
|
||||
print(args.output)
|
||||
finally:
|
||||
_settle(app)
|
||||
shell.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user