From b47c7af8df60c9816d05911064d7f42a695b145d Mon Sep 17 00:00:00 2001 From: Msystech Date: Wed, 12 Aug 2026 18:19:59 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=ED=96=89=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=98=EB=A6=BC=20=ED=95=B4=EC=86=8C=20?= =?UTF-8?q?+=20=EB=9D=BC=EC=9D=B4=ED=8A=B8=20=EC=84=A0=ED=83=9D=EC=83=89?= =?UTF-8?q?=EC=9D=84=20=EC=97=B0=ED=95=9C=20=ED=8C=8C=EB=9E=91=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이름이 잘려 행을 구분할 수 없었다 눈·자물쇠가 48px 를 상시 차지해 이름 칸이 한글 11자로 줄었다. 운영 서식에는 '입원일 복용약-전립선약' 처럼 앞이 같고 끝에서 갈리는 이름이 흔해 전부 '입원일 복용약-…' 로 잘렸다 — 목록만 보고는 어느 행인지 알 수 없었다. 두 토글을 평소엔 숨기고 마우스를 올린 행에서만 띄운다. 잠김·숨김이 켜진 행에서는 계속 띄운다(거기서까지 숨기면 마우스를 올리기 전에는 상태를 알 방법이 없다). [200] 은 항상 띄우지만 여기서만 갈라선다 — 폭이 곧 가독성이라서. 라이트 모드 선택 밴드가 너무 무거웠다 양 테마 모두 짙은 파랑(#0F6FBF)에 흰 글자를 쓰다 보니, 흰 배경에 짙은 슬라브가 얹혀 선택 몇 줄이 패널 전체를 짓눌렀다. 라이트만 방향을 뒤집는다 — 연한 채움(#A8D3F7, 흰 패널 대비 1.58:1) + 진한 글자(10.1:1). 서브트리도 한 단계 옅게(#DCEBFB) 해서 '폴더가 주인, 멤버는 딸림'이 색 세기로 읽힌다. 밴드 위 글자색을 B.OnAccent(흰색 고정)에서 신설 토큰 B.OnLayerSel 로 바꿔 테마별로 갈라지게 했다(다크 흰색 / 라이트 #222222). 보조 텍스트도 라이트만 #35536C 로(연한 채움 위 5.12:1 — 기존 #E6F1FB 는 라이트에서 사라진다). 회귀: 테스트 124/124, 편집 스모크 실패 0(레이어 검사 45건), DB 왕복 1,271건 diff 0/예외 0, 종이 렌더 P062 바이트 동일. Co-Authored-By: Claude Opus 5 --- src/SheetMe.Designer/Diagnostics/EditSmoke.cs | 8 ++++++ .../Themes/DesignerTheme.xaml | 25 ++++++++++++++++++- src/SheetMe.Designer/Themes/Tokens.Dark.xaml | 2 ++ src/SheetMe.Designer/Themes/Tokens.Light.xaml | 22 ++++++++++------ .../ViewModels/Controls/ControlViewModel.cs | 15 ++++++++--- .../ViewModels/LayerGroupViewModel.cs | 13 +++++++--- .../Views/LayerPanelView.xaml | 8 +++--- 7 files changed, 74 insertions(+), 19 deletions(-) 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 @@ - - - -