모달 인구를 줄이고 배치 명령에 손잡이를 붙인다
3단계 계속. <b>① Ctrl+S 가 DB 문서를 디스크에 쓰고 있었다.</b> Ctrl+S 는 SaveFileCommand 에 걸려 있고 그건 항상 파일 저장이다. DB 에서 연 서식에서 누르면 OS 저장 대화상자가 뜨고 XML 이 디스크에 쓰였다 — 사용자는 저장했다고 믿지만 <b>DB 에는 아무것도 안 들어간다</b>. 종료 가드는 이미 IsFromDb 로 갈라 준다(MainViewModel.cs:365). Ctrl+S 만 안 갈라 주고 있었다. <b>② 저장 완료 알림 모달을 없앤다.</b> 정보량이 0 이었다 — SdgKey 를 바로 위에서 상태바에 넣고 같은 값을 모달로 한 번 더 보여 주는 것이었다. 하루 30회 저장하는 사람에게 그건 Enter 를 30번 치는 의식이고, 그때마다 화면이 어두워졌다. 실패는 계속 모달로 알린다 — 조용히 넘기면 저장된 줄 알고 넘어간다. <b>③ 스크림의 기본을 뒤집었다.</b> 전에는 모든 ShowDialog 에 무조건 붙어서 태그 하나 고르는 데도 앱이 암전했다. 하루 수백 번이면 신호가 아니라 소음이다. 전역 후크는 그대로 둔다 — 호출부 17곳 중 하나만 빠져도 그 대화상자만 다르게 동작하고 그건 눈으로 전수 확인해야만 안다. 대신 창이 스스로 자격을 밝혀야 깔리게 했다 (ModalScrim.DimBehind). 새 대화상자가 잊으면 암전이 안 되는데, 이제 그쪽이 안전한 기본값이다. 자격을 밝힌 것: 물음(되돌릴 수 없는 쓰기의 확인)·오류(진행이 정의되지 않는 차단)·서식 신규 등록. --modal-check 에 ⑤ 를 더했다: <b>자격을 밝히지 않은 창은 어두워지지 않는다</b>. ①~④ 만으로는 "깔린다"만 확인되고 "안 깔려야 할 때 안 깔린다"는 확인되지 않는다. <b>④ 배치 명령에 단축키와 우클릭 메뉴를 붙였다.</b> 전에는 단축키가 0개였고 우클릭 메뉴가 앱 전체에 하나도 없었다. 정렬 6종·같은 크기·간격이 전부 로고 아래 4단 메뉴 안에만 있어서, 20px→32px 간격 조정이 4px 씩 12왕복이고 매번 마우스가 화면 좌상단까지 갔다. 자리는 Figma 와 같게 둔다(Alt+A/D/W/S/H/V) — 이미 그 손버릇을 가진 사람이 있다. 균등 Alt+Shift+H/V, 같은 크기 Alt+Shift+W/S, 간격 Alt+[ / Alt+]. <b>Alt 조합에 함정이 있다.</b> WPF 는 Alt+문자를 Key.System 으로 싸서 넘기고 실제 키는 SystemKey 에 있다. e.Key 만 보면 Alt 단축키가 하나도 안 걸리는데, 그 실패는 "눌러도 아무 일이 없다"로만 보여서 원인을 찾기 어렵다. 우클릭 메뉴에 InputGestureText 를 적었다 — 단축키를 모르는 사람이 거기서 배운다. 게이트: 테스트 285/285, --edit-smoke 0실패, --modal-check 0실패(신규 1), --dialog-shots 넘침 0(대조군 4/4), --scale-budget 5/5, --maxrect 0실패, --cleartype 11/11, 빌드 경고 0, --db-smoke 1271건 diff 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
d6052610b9
commit
7e38ba654a
@@ -40,10 +40,15 @@ public sealed class CanvasKeyboardBehavior : Behavior<UIElement>
|
||||
|
||||
var ctrl = Keyboard.Modifiers.HasFlag(ModifierKeys.Control);
|
||||
var shift = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift);
|
||||
var alt = Keyboard.Modifiers.HasFlag(ModifierKeys.Alt);
|
||||
var step = shift ? designer.Snap.GridSize * 2 : 1;
|
||||
var handled = true;
|
||||
|
||||
switch (e.Key)
|
||||
// Alt 조합은 e.Key 로 오지 않는다 — WPF 가 Key.System 으로 싸서 넘기고 실제 키는 SystemKey 에 있다.
|
||||
// e.Key 만 보면 Alt 단축키가 하나도 안 걸리는데, 그 실패는 "눌러도 아무 일이 없다"로만 보인다.
|
||||
var key = e.Key == Key.System ? e.SystemKey : e.Key;
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case Key.Left: designer.NudgeSelection(-step, 0); break;
|
||||
case Key.Right: designer.NudgeSelection(step, 0); break;
|
||||
@@ -67,6 +72,31 @@ public sealed class CanvasKeyboardBehavior : Behavior<UIElement>
|
||||
case Key.Y when ctrl: designer.Undo.Redo(); break;
|
||||
case Key.G when ctrl && shift: designer.UngroupSelection(); break;
|
||||
case Key.G when ctrl: designer.GroupSelection(); break;
|
||||
|
||||
// 배치 명령 — 전에는 단축키가 <b>0개</b>였고 전부 로고 아래 4단 메뉴 안에만 있었다.
|
||||
// 20px→32px 간격 조정이 4px 씩 12왕복이고 매번 마우스가 좌상단까지 갔다.
|
||||
// 자리는 Figma 와 같게 둔다(Alt+A/D/W/S/H/V) — 이미 그 손버릇을 가진 사람이 있다.
|
||||
case Key.A when alt: designer.Align("Left"); break;
|
||||
case Key.D when alt: designer.Align("Right"); break;
|
||||
case Key.W when alt && !shift: designer.Align("Top"); break;
|
||||
case Key.S when alt && !shift: designer.Align("Bottom"); break;
|
||||
case Key.H when alt && !shift: designer.Align("CenterH"); break;
|
||||
case Key.V when alt && !shift: designer.Align("CenterV"); break;
|
||||
|
||||
// 균등 간격 — 3개 이상일 때만 뜻이 있다
|
||||
case Key.H when alt && shift: designer.AdjustSpacing("HorizEqual"); break;
|
||||
case Key.V when alt && shift: designer.AdjustSpacing("VertEqual"); break;
|
||||
|
||||
// 같은 크기로
|
||||
case Key.W when alt && shift: designer.SizeToControl("Width"); break;
|
||||
case Key.S when alt && shift: designer.SizeToControl("Height"); break;
|
||||
|
||||
// 간격 넓게/좁게 — 세로가 기본(기록지는 줄이 세로로 쌓인다), Shift 로 가로
|
||||
case Key.OemCloseBrackets when alt && !shift: designer.AdjustSpacing("VertIncrease"); break;
|
||||
case Key.OemOpenBrackets when alt && !shift: designer.AdjustSpacing("VertDecrease"); break;
|
||||
case Key.OemCloseBrackets when alt && shift: designer.AdjustSpacing("HorizIncrease"); break;
|
||||
case Key.OemOpenBrackets when alt && shift: designer.AdjustSpacing("HorizDecrease"); break;
|
||||
|
||||
default: handled = false; break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user