diff --git a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs
index bb75faa..c77f4bb 100644
--- a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs
+++ b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs
@@ -298,8 +298,38 @@ public sealed class InspectorViewModel : ViewModelBase
}
}
+ ///
+ /// 행이 통째로 다시 만들어지려는 순간 / 다 만들어진 순간.
+ ///
+ /// 뷰가 포커스와 스크롤을 되돌려 놓는 데 쓴다. 선택이 바뀌면 를 비우고
+ /// 새로 만들기 때문에, 그대로 두면 컨트롤을 옮길 때마다 편집하던 칸과 스크롤 위치가 사라진다.
+ /// 하루 수백 건을 다루는 사람에게 그건 "다음 것으로 넘어가면 손이 처음으로 돌아간다"는 뜻이다.
+ ///
+ /// 행 컬렉션을 키 기준 갱신으로 바꾸는 쪽이 더 근본적이지만, 이 패널은 회귀 기록이 가장 많은 곳이라
+ /// 이번에는 손대지 않는다. 실제 아픔은 재구성 비용이 아니라 포커스·스크롤 소실이고
+ /// (--scale-budget 이 뷰모델 작업은 마이크로초 단위임을 보여 준다) 그것만 되돌려도 손이 이어진다.
+ ///
+ public event Action? Rebuilding;
+
+ public event Action? Rebuilt;
+
/// 행 재구성 — 선택 집합 변경 시
public void Rebuild()
+ {
+ // 감싸는 이유: 본문에 이른 return 이 여러 갈래 있어, 끝에 이벤트를 두면
+ // 도는 경로와 안 도는 경로가 갈린다. 그러면 어떤 선택 변경에서는 포커스가 안 돌아온다.
+ Rebuilding?.Invoke();
+ try
+ {
+ RebuildCore();
+ }
+ finally
+ {
+ Rebuilt?.Invoke();
+ }
+ }
+
+ private void RebuildCore()
{
Rows.Clear();
boundsRows.Clear();
diff --git a/src/SheetMe.Designer/ViewModels/MainViewModel.cs b/src/SheetMe.Designer/ViewModels/MainViewModel.cs
index b8f86da..308e61d 100644
--- a/src/SheetMe.Designer/ViewModels/MainViewModel.cs
+++ b/src/SheetMe.Designer/ViewModels/MainViewModel.cs
@@ -679,10 +679,22 @@ internal sealed class MainViewModel : ViewModelBase
document.Title = register.SheetName;
}
+ // 문면을 두 층으로 가른다.
+ //
+ // 이 대화상자는 세 부류가 다 보는 유일한 위험 지점이다 —
+ // 사내 개발·지원, 병원 전산팀, 의료진·간호부. 그런데 본문에
+ // E_SdgMst/E_SctMst, SdgDelYon='Y', ShtCneYon='Y' 가 그대로 노출되어 있었다.
+ // 사내 인력에게는 정확한 정보이고, 전산팀에게는 읽을 수 없는 문장이고,
+ // 간호부에게는 공포다. 위층은 사람 말로, 테이블·컬럼은 접힌 아래층에 둔다
+ // (상세는 접혀 있고 사내 인력이 펼쳐 본다).
+ var inPlace = "제자리 갱신 서식이면 지금 버전이 바로 갱신됩니다.";
var confirm = DialogService.Confirm("DB 저장 확인",
- $"서식 [{document.FormId}] {document.Title} 을(를) DB(E_SdgMst/E_SctMst)에 저장할까요?",
- "기존 활성 디자인은 이력(SdgDelYon='Y')으로 보존되고 새 버전이 생성됩니다.\n" +
- "(제자리 갱신 서식(ShtCneYon='Y')은 기존 버전이 갱신됩니다)",
+ $"[{document.FormId}] {document.Title} — 이 서식의 새 버전을 만듭니다.",
+ "지금 쓰이는 버전은 이력으로 남고, 앞으로는 새 버전이 열립니다.\n"
+ + inPlace + "\n\n"
+ + "기술 정보 — E_SdgMst/E_SctMst 에 기록합니다. "
+ + "기존 활성 디자인은 SdgDelYon='Y' 로 이력 전환되고 새 SdgKey 가 생성됩니다. "
+ + "ShtCneYon='Y' 서식은 기존 버전을 갱신합니다.",
yes: "저장", no: "취소");
if (!confirm)
{
diff --git a/src/SheetMe.Designer/Views/InspectorView.xaml b/src/SheetMe.Designer/Views/InspectorView.xaml
index d27706f..28bb921 100644
--- a/src/SheetMe.Designer/Views/InspectorView.xaml
+++ b/src/SheetMe.Designer/Views/InspectorView.xaml
@@ -892,8 +892,8 @@
ToolTip="{Binding PageScopeTip}"/>
-
-
+
+