캔버스·인스펙터 잔손질 넷 — 마퀴·치수 칩·죽은 버튼·잘린 설명
## 패널 안에 그린 마퀴가 아무것도 안 잡았다 마퀴가 최상위만 훑고 컨테이너 안으로 안 들어갔다. 패널 안 체크박스 5개를 한 번에 고르려고 안쪽을 끌면 패널만 잡히거나 아무것도 안 잡혀서, Ctrl+클릭 반복이나 레이어 목록으로 우회했다. 컨테이너 자식은 전체 컨트롤의 <b>18.3%</b>(실측 18,749개/컨테이너 4,099개)라 드문 경우가 아니다. 규칙은 <b>'담김'</b>이다 — 마퀴가 컨테이너 사각형 안에 들어가 있으면 그 안의 것을 고른다 (내 상자가 패널보다 작으니 그 안을 고르려는 뜻이다). 걸치기만 하면 예전처럼 패널이 잡힌다. 모드도 수정키도 없이 <b>그린 모양만으로</b> 갈리므로 예측할 수 있다. 한 군데를 더 고쳐야 했다. 클릭 선택이 쓰는 GroupMatesOf 는 자식을 부모 컨테이너로 되돌리는데 (패널 안의 것을 집으면 패널이 움직여야 하므로 옳다) 마퀴가 그것을 그대로 쓰고 있었다 — 안쪽을 정확히 골라 놓고도 결과가 다시 패널 하나가 되어 위 규칙이 아무 일도 못 한다. 마퀴 전용 경로를 따로 뒀다. 걸치기 동작이 그대로인 것도 검사로 고정했다. ## 끄는 동안 숫자가 캔버스에 없었다 라벨 폭을 종이 칸에 맞추는 동안 숫자는 300px 떨어진 인스펙터에만 떴다 — 끌고, 손 떼고, 오른쪽 보고, 다시 끈다. 간격 수치 칩은 <b>균등 스냅이 성립할 때만</b> 나타나므로 "지금 이게 몇 px 인가"는 드래그 중에 알 방법이 아예 없었다. 이동이면 좌표, 크기 조절이면 크기를 보여 준다 — 지금 <b>바꾸고 있는 값</b>이 그것이다. 오버레이 층이라 종이에는 없고, 줌이 걸린 층이라 역배율로 글자 크기를 화면 고정으로 만든다. ## 눌러도 아무 일이 없는 ⋮ 버튼 Command·Click·ContextMenu 가 <b>전부 없었다</b>. 그런데 툴팁은 '이 컨트롤에 대한 명령'이라 "단일 선택일 때만 되는 뭔가가 있다"고 오해시켰다. 없는 버튼보다 죽은 버튼이 나쁘다 — 컨트롤 단위 명령은 캔버스 우클릭 메뉴에 이미 다 있다. ## 주석이 논증한 값과 실제 값이 달랐다 라벨 폭 주석이 "92px + 줄바꿈이면 두 줄로 접혀 전부 읽힌다"고 근거까지 적어 놓고 값은 72 였다. 그래서 '액션 대상 컨…' 처럼 잘렸다. 92 로 맞췄다. 같은 자리에서 설명 행(ReadOnlyRow)이 값처럼 잘리고 있었다 — "타입이 달라 값의 뜻이 다른 속성 2개 — 타입별로 따로 고르세요" 에서 <b>지시에 해당하는 뒷부분</b>이 사라져 무엇을 하라는 건지 알 수 없었다. 접어서 다 보여 준다. ## 판정 - 단위 시험 388 · edit-smoke 396건 전건 통과 (마퀴 2건 · 치수 칩 4건 추가) - --dialog-shots 69장 전건 통과 (인스펙터 8종을 눈으로 대조 — 라벨·설명 잘림 없음) - --modal-check · --maxrect · --scale-budget 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
f6b456753c
commit
8c76a978a9
@@ -233,20 +233,21 @@ public sealed class InteractionController
|
||||
designer.ReassignPagesAfterMove(origBounds.Keys.ToList());
|
||||
designer.Overlay.ClearGuides();
|
||||
designer.Snap.EndDrag();
|
||||
designer.Overlay.ClearDragBadge();
|
||||
break;
|
||||
|
||||
case Mode.Resize:
|
||||
designer.Overlay.ClearGuides();
|
||||
designer.Snap.EndDrag();
|
||||
designer.Overlay.ClearDragBadge();
|
||||
break;
|
||||
|
||||
case Mode.Marquee:
|
||||
var rect = RectFrom(downPoint, world);
|
||||
designer.Overlay.UpdateMarquee(null);
|
||||
var hits = designer.ControlsIntersecting(rect)
|
||||
.SelectMany(designer.GroupMatesOf)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
// 마퀴 전용 규칙 — 그룹은 넓히되 컨테이너 자식은 부모로 되돌리지 않는다.
|
||||
// GroupMatesOf 를 그대로 쓰면 패널 안쪽을 정확히 골라 놓고도 결과가 패널 하나가 된다.
|
||||
var hits = designer.MarqueeHits(rect);
|
||||
if (ctx.Ctrl || ctx.Shift)
|
||||
{
|
||||
var merged = designer.Selection.Items.Union(hits).ToList();
|
||||
@@ -285,6 +286,7 @@ public sealed class InteractionController
|
||||
{
|
||||
designer.Overlay.ClearGuides();
|
||||
designer.Snap.EndDrag();
|
||||
designer.Overlay.ClearDragBadge();
|
||||
mode = Mode.None;
|
||||
origBounds.Clear();
|
||||
downControl = null;
|
||||
@@ -443,6 +445,11 @@ public sealed class InteractionController
|
||||
}
|
||||
|
||||
designer.Selection.NotifyBoundsChanged();
|
||||
// 끄는 동안 지금 값을 보여 준다 — 숫자가 인스펙터에만 있으면 끌다 말고 오른쪽을 봐야 한다
|
||||
if (designer.SelectionWorldBounds() is { } movedBounds)
|
||||
{
|
||||
designer.Overlay.SetDragBadge(movedBounds, resizing: false);
|
||||
}
|
||||
}
|
||||
|
||||
private void DoResize(Point world, PointerContext ctx)
|
||||
@@ -509,6 +516,10 @@ public sealed class InteractionController
|
||||
}
|
||||
|
||||
designer.Selection.NotifyBoundsChanged();
|
||||
if (designer.SelectionWorldBounds() is { } sizedBounds)
|
||||
{
|
||||
designer.Overlay.SetDragBadge(sizedBounds, resizing: true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>드래그 첫 실변경 시 1회 스냅샷 — 드래그 전체 = Undo 1스텝</summary>
|
||||
|
||||
Reference in New Issue
Block a user