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}"/> - - + +