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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + - - +