From a5083fd0bba9e26a14fd993823dbc6022fa3973a Mon Sep 17 00:00:00 2001 From: Msystech Date: Fri, 14 Aug 2026 11:07:06 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B8=EC=8A=A4=ED=8E=99=ED=84=B0=20?= =?UTF-8?q?=EB=A6=AC=EB=94=94=EC=9E=90=EC=9D=B8=20=E2=80=94=20=EB=AA=A9?= =?UTF-8?q?=EC=97=85=EB=8C=80=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 우측 속성 패널을 [200] 인스펙터 목업에 맞췄다. 바뀐 것 여섯. · 탭이 알약에서 밑줄로. 알약은 '고르는 필터'로 읽히는데 탭은 화면을 가르는 것이지 값이 아니다. 좌측 패널 탭 스타일을 재사용할 수 없었다 — 저쪽은 TabControl 의 키 없는 암시 스타일이고 템플릿 안에 알약 컨테이너가 박혀 있어 고치면 레이어·팔레트 패널이 통째로 바뀐다. 미선택도 밑줄 두께 2 를 Transparent 로 잡아 둔다. 안 그러면 고르는 순간 글자가 2px 튄다. 밑줄과 글자는 같은 토큰(B.AccentText)이다 — B.Accent 는 라이트에서 3.0:1 이라 글자로 못 쓴다. · 탭 배지를 뺐다. 잃는 게 없다: 개수가 0 인 탭은 RefreshTabCounts 가 탭 자체를 접으므로 배지가 "0"을 보여 줄 기회가 애초에 없고, 누르기 전에 정확한 개수를 알아야 할 작업이 없다. DesignCount/DataCount/BehaviorCount 는 남긴다 — ShowDataTab/ShowBehaviorTab 이 그걸 물고 있다. · 제목 줄이 생겼다. 타입 아이콘 + 이름 + ⋮. 무엇을 편집 중인지 아이콘으로 즉시 읽힌다. 타입은 툴팁으로 보냈다(Summary 가 "TextBox — TextBox1" 형태로 이미 그 말을 한다). 여럿을 골랐어도 타입이 같으면 그 타입 아이콘을 쓴다. · 참/거짓이 체크박스에서 스위치로. 17px 사각형이 목록 오른쪽에 흩어져 정렬 축이 없었다. 손잡이는 켬·끔 모두 흰색이다 — 색이 아니라 위치가 상태를 말하게 한다. 불확정(다중선택 값 불일치)은 가운데다. 꺼짐으로 보이면 조용한 덮어쓰기 사고가 된다. 미끄러지지 않고 튄다: 이 저장소에는 Storyboard 가 한 곳도 없어 여기만 움직이면 물성이 달라진다. ToggleButton 을 유지했으므로 스크린리더가 On/Off/Indeterminate 를 그대로 읽는다. · 섹션 머리 — 위쪽에 구분선(아래에 그으면 마지막 섹션 밑에 뜬 선이 남는다), 제목을 B.Ink 로 승격, 개수는 접혔을 때만. 펼쳤으면 개수는 바로 아래가 답이라 잡음이다. 목업의 오른쪽 ⌃ 는 안 그린다 — 왼쪽 셰브론이 이미 같은 상태를 말하는데 한 행에 같은 정보를 두 번 그리면 둘이 다른 뜻이라고 읽힌다. · 라벨 폭 92 → 72, 세그먼트는 가로 꽉. 목업의 56 은 못 준다 — 목업에 없는 데이터·동작 탭에 11자 라벨("입력 파라미터 컨트롤")이 있고 56 이면 3줄로 접힌다. 72 가 2줄을 지키는 최소값이다. 줄어든 20px 은 그대로 입력 칸으로 갔다(121 → 141). 태그 제안 칩의 하드코딩 들여쓰기도 같이 옮겼다. 목업에 있지만 넣지 않은 것 둘. 회전 행과 그 옆 자물쇠 — Rotation/Angle 이 Core·레지스트리 전부 0건이다. 레거시 WinForms 컨트롤에 회전이 없다. 모델부터 새로 만들 신규 기능이지 리스킨이 아니다. 자물쇠도 종횡비 잠금이 없는 기능이고, 레이어 잠금과 같은 아이콘을 쓰면 오해가 확정된다. '자동 줄바꿈'은 그 키가 레지스트리에 없어 실제 키인 '자동 높이'로 둔다. '선택 정보' 탭은 만들지 않기로 했다(사용자 결정). 탭은 3개 그대로, 밑줄 스타일만 입혔다. 정렬 행은 디자인 탭 상단에 그대로 둔다 — 목업이 그려진 시점보다 나중에 생긴 기능이라 목업의 부재는 '빼라'는 뜻이 아니다. 새 토큰 B.SwitchOff 를 양 테마에 넣었다. 기존 토큰으로는 못 만든다 — B.Input 은 라이트에서 패널과 같은 색이고, 다크는 입력 테두리가 Transparent 라 36x20 알약이 #262626 위 #151515 = 1.23:1 로 사라진다. 비텍스트 3:1 을 넘긴 값으로 골랐다. 아이콘 ellipsis-vertical / file-text 2종 추가. 게이트: 테스트 267/267, --edit-smoke 237건 0실패, --query-popup 17/17, --maxrect 10/10, --db-smoke 3000 diff 0·예외 0, --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 동일, --dialog-shots 57파일(인스펙터 스냅샷은 전부 바뀐다 — 이번 변경의 산출물이다). Co-Authored-By: Claude Opus 5 --- src/SheetMe.Designer/Controls/LucideIcons.cs | 2 + src/SheetMe.Designer/Themes/Tokens.Dark.xaml | 4 + src/SheetMe.Designer/Themes/Tokens.Light.xaml | 4 + .../Inspector/InspectorViewModel.cs | 41 ++++ src/SheetMe.Designer/Views/InspectorView.xaml | 209 ++++++++++++++---- 5 files changed, 213 insertions(+), 47 deletions(-) diff --git a/src/SheetMe.Designer/Controls/LucideIcons.cs b/src/SheetMe.Designer/Controls/LucideIcons.cs index c8fded4..0e6cb9f 100644 --- a/src/SheetMe.Designer/Controls/LucideIcons.cs +++ b/src/SheetMe.Designer/Controls/LucideIcons.cs @@ -89,6 +89,8 @@ public static class LucideIcons ["align-obj-bottom"] = """ """, ["distribute-h"] = """ """, ["distribute-v"] = """ """, + ["ellipsis-vertical"] = """ """, + ["file-text"] = """ """, ["square"] = """""", ["lock"] = """ """, ["unlock"] = """ """, diff --git a/src/SheetMe.Designer/Themes/Tokens.Dark.xaml b/src/SheetMe.Designer/Themes/Tokens.Dark.xaml index 0f97947..d34e5d6 100644 --- a/src/SheetMe.Designer/Themes/Tokens.Dark.xaml +++ b/src/SheetMe.Designer/Themes/Tokens.Dark.xaml @@ -51,6 +51,10 @@ + + + diff --git a/src/SheetMe.Designer/Themes/Tokens.Light.xaml b/src/SheetMe.Designer/Themes/Tokens.Light.xaml index b1206f2..0b7d0db 100644 --- a/src/SheetMe.Designer/Themes/Tokens.Light.xaml +++ b/src/SheetMe.Designer/Themes/Tokens.Light.xaml @@ -85,6 +85,10 @@ + + + diff --git a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs index 1522f3a..bb75faa 100644 --- a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs +++ b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs @@ -198,6 +198,44 @@ public sealed class InspectorViewModel : ViewModelBase _ => "표시할 속성이 없습니다", }; + /// 제목 줄 이름 — 타입은 툴팁()으로 보낸다 + public string HeaderName + { + get + { + if (designer.Selection.Items.Count == 0) + { + return designer.InspectedPage is { } page ? $"페이지 {page.Index + 1}" : "선택 없음"; + } + return designer.Selection.Items.Count == 1 + ? designer.Selection.Primary?.Id ?? string.Empty + : $"{designer.Selection.Items.Count}개 선택"; + } + } + + /// + /// 제목 줄 아이콘. 없는 이름을 넘기면 예외 없이 빈 자리가 되므로 반드시 카탈로그에 있는 이름이어야 한다. + /// 여러 개를 골랐어도 타입이 같으면 그 타입 아이콘을 보여 준다 — 섞였을 때만 일반 도형. + /// + public string HeaderIcon + { + get + { + var items = designer.Selection.Items; + if (items.Count == 0) + { + return "file-text"; + } + var type = items[0].Type; + return items.All(vm => vm.Type == type) + ? SheetMe.Designer.Controls.PaletteIconCatalog.IconOf(type) + : "square"; + } + } + + /// 더보기 버튼은 하나를 골랐을 때만 — 여럿에 걸친 컨트롤 단위 명령이 없다 + public bool IsSingleSelection => designer.Selection.Items.Count == 1; + /// 선택 요약 텍스트 public string Summary { @@ -268,6 +306,9 @@ public sealed class InspectorViewModel : ViewModelBase currentSection = null; OnPropertyChanged(nameof(Summary)); OnPropertyChanged(nameof(HasSelection)); + OnPropertyChanged(nameof(HeaderName)); + OnPropertyChanged(nameof(HeaderIcon)); + OnPropertyChanged(nameof(IsSingleSelection)); OnPropertyChanged(nameof(ShowAlignBar)); NotifyAlignScope(); diff --git a/src/SheetMe.Designer/Views/InspectorView.xaml b/src/SheetMe.Designer/Views/InspectorView.xaml index eb6e5ad..e7c3da6 100644 --- a/src/SheetMe.Designer/Views/InspectorView.xaml +++ b/src/SheetMe.Designer/Views/InspectorView.xaml @@ -13,6 +13,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + - - +