diff --git a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs index 309fc11..a1dd8cc 100644 --- a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs +++ b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs @@ -463,6 +463,14 @@ public static class EditSmoke Check("레이어: 잠금 토글이 Undo 로 원복", lay.Pages.SelectMany(p => p.Controls).All(c => !c.Model.Locked) && depthBefore); + // 눈·자물쇠는 평소 숨기고 호버/상태 켜짐일 때만 띄운다 — 그 판정 플래그 + var flagRow = lay.LayerRows.OfType().First(); + Check("레이어: 상태 없으면 토글 숨김 대상", !flagRow.HasLayerFlag); + flagRow.IsHiddenFlag = true; + Check("레이어: 숨김이면 토글 계속 표시", flagRow.HasLayerFlag); + flagRow.IsHiddenFlag = false; + Check("레이어: 해제하면 다시 숨김 대상", !flagRow.HasLayerFlag); + // 데이터 배선 배지 var badgeTarget = lay.Pages[0].Controls[0]; Check("레이어: 배선 없는 컨트롤은 배지 없음", !badgeTarget.HasDataBinding); diff --git a/src/SheetMe.Designer/Themes/DesignerTheme.xaml b/src/SheetMe.Designer/Themes/DesignerTheme.xaml index a359b32..ba7d824 100644 --- a/src/SheetMe.Designer/Themes/DesignerTheme.xaml +++ b/src/SheetMe.Designer/Themes/DesignerTheme.xaml @@ -742,7 +742,8 @@ - + + @@ -775,6 +776,28 @@ + + + + + diff --git a/src/SheetMe.Designer/Themes/Tokens.Light.xaml b/src/SheetMe.Designer/Themes/Tokens.Light.xaml index ca5d191..0091d4a 100644 --- a/src/SheetMe.Designer/Themes/Tokens.Light.xaml +++ b/src/SheetMe.Designer/Themes/Tokens.Light.xaml @@ -30,17 +30,23 @@ - + - - + + + + + diff --git a/src/SheetMe.Designer/ViewModels/Controls/ControlViewModel.cs b/src/SheetMe.Designer/ViewModels/Controls/ControlViewModel.cs index ad285e2..7968473 100644 --- a/src/SheetMe.Designer/ViewModels/Controls/ControlViewModel.cs +++ b/src/SheetMe.Designer/ViewModels/Controls/ControlViewModel.cs @@ -1,4 +1,4 @@ -using System.Windows; +using System.Windows; using System.Windows.Media; using SheetMe.Core.Models; using SheetMe.Core.Serialization; @@ -131,6 +131,7 @@ public abstract class ControlViewModel : ViewModelBase, ILayerRow OnPropertyChanged(nameof(IsLockedFlag)); OnPropertyChanged(nameof(LockIcon)); OnPropertyChanged(nameof(LockIconSpec)); + OnPropertyChanged(nameof(HasLayerFlag)); } } @@ -149,6 +150,7 @@ public abstract class ControlViewModel : ViewModelBase, ILayerRow OnPropertyChanged(nameof(IsHiddenFlag)); OnPropertyChanged(nameof(HiddenIcon)); OnPropertyChanged(nameof(HiddenIconSpec)); + OnPropertyChanged(nameof(HasLayerFlag)); OnPropertyChanged(nameof(DesignOpacity)); } } @@ -156,6 +158,13 @@ public abstract class ControlViewModel : ViewModelBase, ILayerRow /// 디자인 표시 불투명도 — 숨김이면 0.25 public double DesignOpacity => Model.Hidden ? 0.25 : 1.0; + /// + /// 잠금·숨김 중 하나라도 켜져 있는가 — 레이어 행에서 눈·자물쇠를 계속 띄워 둘지 판단. + /// 평소에는 두 토글을 숨겨 이름 칸을 넓히지만, 상태가 켜진 행에서까지 숨기면 + /// 마우스를 올리기 전에는 무엇이 잠겼는지 알 수 없다. + /// + public bool HasLayerFlag => Model.Locked || Model.Hidden; + /// /// 레이어 목록 표시명 — Text 가 있으면 그것, 없으면 Id. /// @@ -200,7 +209,7 @@ public abstract class ControlViewModel : ViewModelBase, ILayerRow /// 강조 밴드 위 아이콘 색 — 밴드는 짙은 파랑 채움이라 보조색(B.Muted)을 그대로 두면 /// 눈·자물쇠가 1.6:1 로 묻힌다. 선택한 행에서 잠금 상태가 안 보이면 배지의 의미가 없다. /// - private string RowIconKey => layerHighlight == LayerHighlight.Blue ? "B.OnAccent" : "B.Muted"; + private string RowIconKey => layerHighlight == LayerHighlight.Blue ? "B.OnLayerSel" : "B.Muted"; /// 잠금 토글 아이콘 사양 public string LockIconSpec => $"{LockIcon}|13|{RowIconKey}"; @@ -263,7 +272,7 @@ public abstract class ControlViewModel : ViewModelBase, ILayerRow public string LayerIconSpec => $"{SheetMe.Designer.Controls.PaletteIconCatalog.IconOf(Type)}|14|" + layerHighlight switch { - LayerHighlight.Blue => "B.OnAccent", + LayerHighlight.Blue => "B.OnLayerSel", LayerHighlight.Navy => "B.AccentText", _ => "B.Accent", }; diff --git a/src/SheetMe.Designer/ViewModels/LayerGroupViewModel.cs b/src/SheetMe.Designer/ViewModels/LayerGroupViewModel.cs index 9b237b1..0798bcd 100644 --- a/src/SheetMe.Designer/ViewModels/LayerGroupViewModel.cs +++ b/src/SheetMe.Designer/ViewModels/LayerGroupViewModel.cs @@ -1,4 +1,4 @@ -using SheetMe.Designer.ViewModels.Controls; +using SheetMe.Designer.ViewModels.Controls; namespace SheetMe.Designer.ViewModels; @@ -98,8 +98,14 @@ public sealed class LayerGroupViewModel : ViewModelBase, ILayerRow /// 숨김 아이콘명 — 하나라도 숨겨져 있으면 숨긴 모양 public string HiddenIcon => Members.Any(m => m.IsHiddenFlag) ? "eye-off" : "eye"; + /// + /// 멤버 중 하나라도 잠기거나 숨겨져 있는가 — 폴더 행의 눈·자물쇠를 계속 띄워 둘지 판단. + /// (전원 기준)이 아니라 하나라도 기준인 이유는 아이콘도 같은 기준이기 때문이다. + /// + public bool HasLayerFlag => Members.Any(m => m.IsLockedFlag || m.IsHiddenFlag); + /// 강조 밴드 위 아이콘 색 — 짙은 파랑 채움 위에서 보조색은 묻힌다 - private string RowIconKey => highlight == LayerHighlight.Blue ? "B.OnAccent" : "B.Muted"; + private string RowIconKey => highlight == LayerHighlight.Blue ? "B.OnLayerSel" : "B.Muted"; /// 그룹 잠금 아이콘 사양 public string LockIconSpec => $"{LockIcon}|13|{RowIconKey}"; @@ -162,7 +168,7 @@ public sealed class LayerGroupViewModel : ViewModelBase, ILayerRow /// 폴더 아이콘 사양 — 강조 밴드 위에서는 흰색으로 뒤집는다 public string FolderIconSpec => "folder|14|" + highlight switch { - LayerHighlight.Blue => "B.OnAccent", + LayerHighlight.Blue => "B.OnLayerSel", LayerHighlight.Navy => "B.AccentText", _ => "B.Accent", }; @@ -178,6 +184,7 @@ public sealed class LayerGroupViewModel : ViewModelBase, ILayerRow OnPropertyChanged(nameof(LockIcon)); OnPropertyChanged(nameof(HiddenIconSpec)); OnPropertyChanged(nameof(LockIconSpec)); + OnPropertyChanged(nameof(HasLayerFlag)); } /// 이름이 없을 때의 기본 표시 diff --git a/src/SheetMe.Designer/Views/LayerPanelView.xaml b/src/SheetMe.Designer/Views/LayerPanelView.xaml index 068eefb..34724f7 100644 --- a/src/SheetMe.Designer/Views/LayerPanelView.xaml +++ b/src/SheetMe.Designer/Views/LayerPanelView.xaml @@ -163,10 +163,10 @@ - - - -