更新
This commit is contained in:
@@ -758,9 +758,11 @@ class DiagnosisDialog(QDialog):
|
||||
parent: QWidget | None = None,
|
||||
*,
|
||||
permissions: Any = None,
|
||||
embedded: bool = False,
|
||||
) -> None:
|
||||
super().__init__(parent)
|
||||
self.repository = repository
|
||||
self._embedded = bool(embedded)
|
||||
self.permissions = (
|
||||
permissions
|
||||
if permissions is not None
|
||||
@@ -882,11 +884,17 @@ class DiagnosisDialog(QDialog):
|
||||
)
|
||||
|
||||
self.setObjectName("DiagnosisDialogRoot")
|
||||
self.setWindowFlags(Qt.WindowType.Dialog | Qt.WindowType.FramelessWindowHint)
|
||||
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
||||
if self._embedded:
|
||||
self.setWindowFlags(Qt.WindowType.Widget)
|
||||
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, False)
|
||||
self.setMinimumSize(0, 0)
|
||||
self.setSizePolicy(QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Expanding)
|
||||
else:
|
||||
self.setWindowFlags(Qt.WindowType.Dialog | Qt.WindowType.FramelessWindowHint)
|
||||
self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
|
||||
self.setMinimumSize(760, 520)
|
||||
self.resize(1024, 640)
|
||||
self.setWindowTitle("患者信息详情")
|
||||
self.setMinimumSize(760, 520)
|
||||
self.resize(1024, 640)
|
||||
self.setStyleSheet(DIAGNOSIS_QSS)
|
||||
|
||||
self.view_stack = QStackedLayout(self)
|
||||
@@ -911,16 +919,25 @@ class DiagnosisDialog(QDialog):
|
||||
root = QVBoxLayout(page)
|
||||
root.setContentsMargins(0, 0, 0, 0)
|
||||
root.setSpacing(0)
|
||||
self.readonly_header = QWidget(page)
|
||||
self.readonly_header.setObjectName("DiagnosisReadonlyHeader")
|
||||
header_layout = QVBoxLayout(self.readonly_header)
|
||||
header_layout.setContentsMargins(16, 16, 16, 0)
|
||||
header_layout.setSpacing(0)
|
||||
self.readonly_hero = self._build_readonly_hero()
|
||||
header_layout.addWidget(self.readonly_hero)
|
||||
root.addWidget(self.readonly_header)
|
||||
self.readonly_scroll = QScrollArea()
|
||||
self.readonly_scroll.setObjectName("DiagnosisReadonlyScroll")
|
||||
self.readonly_scroll.setWidgetResizable(True)
|
||||
self.readonly_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
self.readonly_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
|
||||
self.readonly_scroll.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
|
||||
self.readonly_scroll.verticalScrollBar().setSingleStep(28)
|
||||
content = QWidget()
|
||||
self.readonly_content_layout = QVBoxLayout(content)
|
||||
self.readonly_content_layout.setContentsMargins(16, 16, 16, 16)
|
||||
self.readonly_content_layout.setSpacing(16)
|
||||
self.readonly_hero = self._build_readonly_hero()
|
||||
self.readonly_content_layout.addWidget(self.readonly_hero)
|
||||
self.readonly_error = QFrame()
|
||||
self.readonly_error.setObjectName("DiagnosisReadonlyErrorCard")
|
||||
self.readonly_error.setProperty("diagnosisReadonlyCard", True)
|
||||
@@ -981,16 +998,16 @@ class DiagnosisDialog(QDialog):
|
||||
left_layout = QHBoxLayout(self.readonly_hero_left)
|
||||
left_layout.setContentsMargins(0, 0, 0, 0)
|
||||
left_layout.setSpacing(12)
|
||||
back = QPushButton("← 返回")
|
||||
back.setObjectName("DiagnosisReadonlyBack")
|
||||
back.setCursor(Qt.CursorShape.PointingHandCursor)
|
||||
back.setStyleSheet(
|
||||
self.readonly_back_button = QPushButton("← 收起资料" if self._embedded else "← 返回")
|
||||
self.readonly_back_button.setObjectName("DiagnosisReadonlyBack")
|
||||
self.readonly_back_button.setCursor(Qt.CursorShape.PointingHandCursor)
|
||||
self.readonly_back_button.setStyleSheet(
|
||||
"QPushButton{height:32px;padding:0 8px;border:0;background:transparent;"
|
||||
"color:#5265F6;font-size:13px;font-weight:500;}"
|
||||
"QPushButton:hover,QPushButton:focus{background:#F0F2FF;border-radius:6px;}"
|
||||
)
|
||||
back.clicked.connect(self.reject)
|
||||
left_layout.addWidget(back)
|
||||
self.readonly_back_button.clicked.connect(self.reject)
|
||||
left_layout.addWidget(self.readonly_back_button)
|
||||
title = QLabel("患者信息详情")
|
||||
title.setObjectName("DiagnosisReadonlyTitle")
|
||||
left_layout.addWidget(title)
|
||||
@@ -1009,6 +1026,13 @@ class DiagnosisDialog(QDialog):
|
||||
self.readonly_status.setObjectName("DiagnosisReadonlyStatus")
|
||||
self.readonly_status.setProperty("severity", "neutral")
|
||||
right_layout.addWidget(self.readonly_status)
|
||||
self.readonly_close_button = QPushButton("×")
|
||||
self.readonly_close_button.setObjectName("DiagnosisCloseButton")
|
||||
self.readonly_close_button.setToolTip("关闭诊单详情")
|
||||
self.readonly_close_button.setAccessibleName("关闭诊单详情")
|
||||
self.readonly_close_button.setCursor(Qt.CursorShape.PointingHandCursor)
|
||||
self.readonly_close_button.clicked.connect(self.reject)
|
||||
right_layout.addWidget(self.readonly_close_button)
|
||||
layout.addWidget(self.readonly_hero_left, 0, 0)
|
||||
layout.addWidget(self.readonly_hero_right, 0, 1, Qt.AlignmentFlag.AlignRight)
|
||||
layout.setColumnStretch(0, 1)
|
||||
@@ -1790,6 +1814,8 @@ class DiagnosisDialog(QDialog):
|
||||
label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
|
||||
|
||||
def _sync_host_geometry(self) -> None:
|
||||
if self._embedded:
|
||||
return
|
||||
owner = self._owner
|
||||
if owner is None:
|
||||
if self.width() < 760 or self.height() < 520:
|
||||
@@ -1823,6 +1849,8 @@ class DiagnosisDialog(QDialog):
|
||||
layout.addWidget(self.readonly_hero_right, 0, 1, Qt.AlignmentFlag.AlignRight)
|
||||
|
||||
def _install_owner_filter(self) -> None:
|
||||
if self._embedded:
|
||||
return
|
||||
if self._owner is not None and not self._owner_filter_installed:
|
||||
self._owner.installEventFilter(self)
|
||||
self._owner_filter_installed = True
|
||||
@@ -1830,6 +1858,10 @@ class DiagnosisDialog(QDialog):
|
||||
def _rebind_owner(self) -> None:
|
||||
"""Resolve the live Shell window for every open/show cycle."""
|
||||
|
||||
if self._embedded:
|
||||
self._owner = None
|
||||
self._owner_filter_installed = False
|
||||
return
|
||||
parent = self.parentWidget()
|
||||
candidate = parent.window() if parent is not None else None
|
||||
if candidate is self:
|
||||
@@ -1852,8 +1884,9 @@ class DiagnosisDialog(QDialog):
|
||||
super().resizeEvent(event)
|
||||
|
||||
def showEvent(self, event: Any) -> None:
|
||||
self._rebind_owner()
|
||||
self._sync_host_geometry()
|
||||
if not self._embedded:
|
||||
self._rebind_owner()
|
||||
self._sync_host_geometry()
|
||||
self._update_drawer_geometry()
|
||||
self._reflow_readonly_hero()
|
||||
super().showEvent(event)
|
||||
@@ -1938,10 +1971,12 @@ class DiagnosisDialog(QDialog):
|
||||
*,
|
||||
editable: bool = False,
|
||||
seed: Any = None,
|
||||
authoritative_detail: Any = None,
|
||||
view_only: bool = False,
|
||||
modeless: bool = False,
|
||||
auto_show: bool = True,
|
||||
) -> None:
|
||||
"""Open immediately, then replace the seed with authoritative server data."""
|
||||
"""Prepare a diagnosis view, optionally showing it immediately."""
|
||||
|
||||
self._rebind_owner()
|
||||
for player in list(self._recording_players):
|
||||
@@ -1986,13 +2021,13 @@ class DiagnosisDialog(QDialog):
|
||||
self._daily_todo_status = None
|
||||
self._orders_page = 1
|
||||
self._orders_total = 0
|
||||
self._detail = seed
|
||||
self._detail = authoritative_detail if authoritative_detail is not None else seed
|
||||
self.save_button.set_state("idle")
|
||||
self.refresh_permissions()
|
||||
self.view_stack.setCurrentWidget(
|
||||
self.readonly_page if self._standalone_readonly else self.drawer_overlay
|
||||
)
|
||||
self.setModal(not modeless and not self._standalone_readonly)
|
||||
self.setModal(False if self._embedded else not modeless and not self._standalone_readonly)
|
||||
self.setWindowTitle(
|
||||
"患者信息详情"
|
||||
if self._standalone_readonly
|
||||
@@ -2018,15 +2053,38 @@ class DiagnosisDialog(QDialog):
|
||||
)
|
||||
self._clear_tables()
|
||||
self._clear_message()
|
||||
if seed is not None:
|
||||
self._render(seed, [], [])
|
||||
if self._detail is not None:
|
||||
self._render(self._detail, [], [])
|
||||
self._sync_form_interactivity()
|
||||
self._sync_save_button()
|
||||
self._sync_host_geometry()
|
||||
if auto_show:
|
||||
self.show()
|
||||
if not self._embedded:
|
||||
self.raise_()
|
||||
if authoritative_detail is not None:
|
||||
diagnosis = get_value(authoritative_detail, "diagnosis", None) or authoritative_detail
|
||||
patient = get_value(authoritative_detail, "patient", None) or {}
|
||||
self._patient_id = _int(
|
||||
first_value(
|
||||
diagnosis,
|
||||
"patient_id",
|
||||
"source_patient_id",
|
||||
default=first_value(patient, "patient_id", "id", default=0),
|
||||
),
|
||||
0,
|
||||
)
|
||||
self._authoritative_detail_loaded = True
|
||||
self._show_authoritative_content(True)
|
||||
self._clear_message()
|
||||
self._set_loading(False)
|
||||
if self._standalone_readonly:
|
||||
self._load_visible_readonly_sections()
|
||||
else:
|
||||
self._ensure_tab_loaded(self._current_tab_key())
|
||||
return
|
||||
self._show_message("正在加载权威诊单详情…", "info")
|
||||
self._set_loading(True)
|
||||
self._sync_host_geometry()
|
||||
self.show()
|
||||
self.raise_()
|
||||
self._start_detail_load()
|
||||
|
||||
def _start_detail_load(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user