From 5ecc7b514ad156ac4bb75527568f446ad2703fe1 Mon Sep 17 00:00:00 2001 From: Msystech Date: Wed, 19 Aug 2026 10:47:24 +0900 Subject: [PATCH] =?UTF-8?q?=ED=99=98=EC=9E=90=20=EC=84=A0=ED=83=9D?= =?UTF-8?q?=EC=9D=84=20=EC=A0=9C=EB=AA=A9=EC=A4=84=EB=A1=9C=20=EC=98=AC?= =?UTF-8?q?=EB=A6=B0=EB=8B=A4=20=E2=80=94=20=ED=95=9C=20=EB=B2=88=20?= =?UTF-8?q?=EA=B3=A0=EB=A5=B4=EB=A9=B4=20=EC=95=B1=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=EA=B0=80=20=EA=B7=B8=20=ED=99=98=EC=9E=90=EB=A5=BC=20=EB=B3=B8?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테마 버튼 오른쪽에 user 아이콘. 전에는 미리보기 창 안에만 있어서 쿼리 편집처럼 환자 값이 필요한 다른 화면에서는 고를 방법이 없었다. ## 방향을 뒤집었다 전에는 미리보기 창이 환자를 들고 있고 세션에 밀어 올렸다. 그러면 제목줄에서 바꿀 때 창이 모르고, 세션과 창이 어긋나는 경로가 생긴다. 이제 모든 진입점이 PatientSession 에만 쓰고, 창들은 Changed 를 듣는다. 제목줄·미리보기·쿼리 편집 어디서 바꿔도 나머지가 따라온다. 미리보기 창은 열 때 세션의 환자를 물려받는다 — 창을 열 때마다 초기화하면 "앱 전체 적용"이 거짓이 된다. ## 아이콘이라 상태를 색으로 알린다 늘 보이는 자리라 글자를 둘 폭이 없다. 고르면 강조색, 이름은 툴팁에 둔다 — 제목줄에 환자 이름을 상시 노출하지 않는다. 이미 고른 상태에서 누르면 메뉴가 뜬다(바꾸기 / 해제). "누르면 해제"로 두면 늘 보이는 아이콘이라 실수로 지운다. ## 말뿐인지 값인지 확인했다 제목줄 아이콘은 세션만 건드린다. 열려 있는 창이 그것을 듣지 않으면 아이콘은 켜지는데 종이는 그대로다 — "설정했는데 안 먹는다"가 된다. 그래서 판정은 창의 메서드를 부르지 않고 세션에만 써서 종이가 따라오는지 본다. 구독을 떼는지도 본다. 정적 이벤트라 안 떼면 창이 회수되지 않고 죽은 창이 계속 그리려 든다 — 닫은 뒤 세션을 흔들어 예외 없이 지나가는지 확인한다. ## 게이트 - 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 --- src/SheetMe.Designer/Diagnostics/EditSmoke.cs | 25 +++++++ src/SheetMe.Designer/Views/MainView.xaml | 8 +++ src/SheetMe.Designer/Views/MainView.xaml.cs | 69 +++++++++++++++++++ .../Views/PreviewWindow.xaml.cs | 24 ++++--- .../Views/QueryEditorWindow.xaml.cs | 9 ++- 5 files changed, 125 insertions(+), 10 deletions(-) diff --git a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs index 32d5f35..bfe3eb8 100644 --- a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs +++ b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs @@ -705,7 +705,32 @@ public static class EditSmoke !previewCleared.Contains("C-9003", StringComparison.Ordinal) && previewCleared.Contains("[PAT_차트번호", StringComparison.Ordinal), previewCleared); + + // ── "앱 전체 적용" 이 말뿐인지 값인지 ── + // 제목줄 아이콘은 PatientSession 만 건드린다. 열려 있는 창들이 그것을 듣지 않으면 + // 아이콘은 켜지는데 종이는 그대로다 — 사용자에게는 "설정했는데 안 먹는다"가 된다. + // 세션에만 쓰고 종이가 따라오는지 본다(창의 메서드를 직접 부르지 않는다). + Services.PatientSession.Set(Fake("C-9004", "세션환자"), "표본"); + var afterSession = PreviewPaper(); + Check("전체 적용: 세션에 넣으면 열린 미리보기가 따라온다", + afterSession.Contains("C-9004", StringComparison.Ordinal) + && afterSession.Contains("세션환자", StringComparison.Ordinal), + afterSession); + + Services.PatientSession.Set(null, string.Empty); + var afterSessionClear = PreviewPaper(); + Check("전체 적용: 세션에서 떼면 열린 미리보기도 따라 뗀다", + !afterSessionClear.Contains("C-9004", StringComparison.Ordinal) + && afterSessionClear.Contains("[PAT_차트번호", StringComparison.Ordinal), + afterSessionClear); + + // 창을 닫은 뒤에도 이벤트가 남아 있으면 회수되지 않고, 죽은 창이 계속 그린다. + // 닫고 다시 세션을 건드려 예외 없이 지나가는지 본다(구독이 남아 있으면 + // 죽은 창의 PagesHost 를 만지다 터진다). patientPreview.Close(); + Services.PatientSession.Set(Fake("C-9005", "닫힌뒤"), "표본"); + Services.PatientSession.Set(null, string.Empty); + Check("전체 적용: 창을 닫으면 구독이 떨어진다", true, "예외 없이 통과"); var emptyName = PatientPaper( new Services.PatientTagResolver(Fake("C-9002", string.Empty), new StubTagResolver())); diff --git a/src/SheetMe.Designer/Views/MainView.xaml b/src/SheetMe.Designer/Views/MainView.xaml index 935e86f..fef7bb3 100644 --- a/src/SheetMe.Designer/Views/MainView.xaml +++ b/src/SheetMe.Designer/Views/MainView.xaml @@ -294,6 +294,14 @@