환자 선택을 제목줄로 올린다 — 한 번 고르면 앱 전체가 그 환자를 본다
테마 버튼 오른쪽에 user 아이콘. 전에는 미리보기 창 안에만 있어서 쿼리 편집처럼 환자 값이 필요한 다른 화면에서는 고를 방법이 없었다. ## 방향을 뒤집었다 전에는 미리보기 창이 환자를 들고 있고 세션에 <b>밀어 올렸다</b>. 그러면 제목줄에서 바꿀 때 창이 모르고, 세션과 창이 어긋나는 경로가 생긴다. 이제 모든 진입점이 PatientSession 에만 쓰고, 창들은 Changed 를 <b>듣는다</b>. 제목줄·미리보기·쿼리 편집 어디서 바꿔도 나머지가 따라온다. 미리보기 창은 열 때 세션의 환자를 물려받는다 — 창을 열 때마다 초기화하면 "앱 전체 적용"이 거짓이 된다. ## 아이콘이라 상태를 색으로 알린다 늘 보이는 자리라 글자를 둘 폭이 없다. 고르면 강조색, 이름은 툴팁에 둔다 — 제목줄에 환자 이름을 상시 노출하지 않는다. 이미 고른 상태에서 누르면 <b>메뉴</b>가 뜬다(바꾸기 / 해제). "누르면 해제"로 두면 늘 보이는 아이콘이라 실수로 지운다. ## 말뿐인지 값인지 확인했다 제목줄 아이콘은 세션만 건드린다. 열려 있는 창이 그것을 듣지 않으면 아이콘은 켜지는데 종이는 그대로다 — "설정했는데 안 먹는다"가 된다. 그래서 판정은 <b>창의 메서드를 부르지 않고</b> 세션에만 써서 종이가 따라오는지 본다. 구독을 떼는지도 본다. 정적 이벤트라 안 떼면 창이 회수되지 않고 죽은 창이 계속 그리려 든다 — 닫은 뒤 세션을 흔들어 예외 없이 지나가는지 확인한다. ## 게이트 - dotnet test 323/323 - --edit-smoke 실패 0 (전체 적용 판정 3건 신규) - --dialog-shots FAIL 0 · --query-popup 실패 0 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1baf805f02
commit
5ecc7b514a
@@ -61,18 +61,22 @@ public partial class PreviewWindow : Window
|
||||
tags = session;
|
||||
InitializeComponent();
|
||||
Activated += (_, _) => BuildPages();
|
||||
// 환자는 앱 전체가 하나를 공유한다 — 제목줄 아이콘에서 바꿔도 이 창이 따라와야 한다
|
||||
PatientSession.Changed += OnPatientSessionChanged;
|
||||
Closed += (_, _) =>
|
||||
{
|
||||
Unsubscribe();
|
||||
PatientSession.Changed -= OnPatientSessionChanged;
|
||||
if (ReferenceEquals(open, this))
|
||||
{
|
||||
open = null;
|
||||
}
|
||||
};
|
||||
Subscribe();
|
||||
// 환자 없이도 러너를 만든다 — 데이터소스가 몇 개 있는지는 지금 알 수 있어야 하고,
|
||||
// 그래야 '데이터소스' 버튼이 처음부터 맞는 상태로 뜬다.
|
||||
UsePatient(null, string.Empty);
|
||||
// 이미 다른 화면에서 고른 환자가 있으면 그것을 그대로 물려받는다 —
|
||||
// 창을 열 때마다 초기화하면 "앱 전체 적용"이 거짓이 된다.
|
||||
// 환자가 없어도 러너는 만든다(데이터소스 개수를 알아야 버튼 상태가 맞다).
|
||||
UsePatient(PatientSession.Current, PatientSession.Label);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -190,11 +194,18 @@ public partial class PreviewWindow : Window
|
||||
{
|
||||
return;
|
||||
}
|
||||
UsePatient(picked, label);
|
||||
// 세션에만 쓴다 — 그러면 Changed 가 이 창을 포함한 <b>모든</b> 화면을 갱신한다.
|
||||
// 여기서 직접 UsePatient 도 부르면 두 번 그리고, 더 나쁘게는
|
||||
// 세션과 창이 어긋나는 경로가 하나 더 생긴다.
|
||||
PatientSession.Set(picked, label);
|
||||
}
|
||||
|
||||
/// <summary>환자를 뗀다 — 종이에서 값이 사라지고 사유로 돌아가는 것까지 확인해야 한다</summary>
|
||||
private void OnClearPatient(object sender, RoutedEventArgs e) => UsePatient(null, string.Empty);
|
||||
private void OnClearPatient(object sender, RoutedEventArgs e)
|
||||
=> PatientSession.Set(null, string.Empty);
|
||||
|
||||
private void OnPatientSessionChanged(object? sender, EventArgs e)
|
||||
=> UsePatient(PatientSession.Current, PatientSession.Label);
|
||||
|
||||
/// <summary>
|
||||
/// 환자를 붙이거나 뗀다 — 해석기 교체·표시·다시 그리기를 한 군데에 모은다.
|
||||
@@ -206,9 +217,6 @@ public partial class PreviewWindow : Window
|
||||
internal void UsePatient(SheetMe.Data.Stores.PatientContext? picked, string label)
|
||||
{
|
||||
patient = picked;
|
||||
// 세션에도 올린다 — 쿼리 편집기의 '검증 실행'이 같은 환자로 돌아야 한다.
|
||||
// 창마다 따로 들고 있으면 같은 서식을 두 화면에서 서로 다른 환자로 보게 된다.
|
||||
PatientSession.Set(picked, label);
|
||||
tags = picked is null ? session : new PatientTagResolver(picked, session);
|
||||
// 러너를 <b>새로</b> 만든다. 같은 러너를 재사용하면 옛 환자의 조회 결과가 캐시에 남아
|
||||
// 환자를 바꿨는데 표는 그대로가 된다 — 태그만 바뀌고 표는 안 바뀌면 아무도 눈치채지 못한다.
|
||||
|
||||
Reference in New Issue
Block a user