diff --git a/doc/history/2026-09-10-4차.md b/doc/history/2026-09-10-4차.md index 586b6a4..1a82c93 100644 --- a/doc/history/2026-09-10-4차.md +++ b/doc/history/2026-09-10-4차.md @@ -465,3 +465,42 @@ Gitea 계정 · 토큰 · Fetch · Pull · Push 가 세 줄로 있었다. **원 - **글자가 무슨 일이 나는지 말한다** - `▸ 원격 저장소 · 계정 펴기` / `▾ … 접기`. 무엇이 숨어 있고 누르면 어떻게 되는지가 한 줄에 다 있다. - **누르는 것으로 읽히게** - 12px 굵게, 강조색, 손 모양 커서, 폭을 190 으로. + +--- + +## C-4. 색 구분 범례를 읽는 것에서 쓰는 것으로 — **완료** (2026-09-10) + +**무엇이 문제였나** - 범례 여덟 칸이 늘 한 줄을 차지하는데 읽기만 하는 설명이었다. +0건인 갈래도 있는 갈래와 똑같은 무게로 자리를 잡고 있었다. + +**두 가지를 했다.** + +**① 0건은 흐리게.** `ZeroToDimConverter` 로 투명도를 0.35 로 낮춘다. +숨기지 않는 까닭 - 항목이 나타났다 사라지면 자리가 매번 움직여 같은 것을 다시 찾아야 한다. +자리는 그대로 두고 무게만 뺀다. 있는 것과 없는 것이 한눈에 갈린다. + +**② 개수를 누르면 그 갈래로 간다.** `추가 1` 을 누르면 추가된 줄로 가고, 다시 누르면 다음 추가 줄로 간다. +"추가된 줄만 훑고 싶다"는 일이 잦은데 차이 이동(`Alt+↑↓`)은 갈래를 가리지 않는다. +이제 색 이름을 외울 필요도 없다 - 색을 보고 그 자리를 누르면 된다. + +지금 자리 다음부터 찾고 끝에 닿으면 처음으로 돌아온다. **차이 이동과 같은 방식이라 새로 외울 규칙이 없다.** +한 줄도 없으면 조용히 넘어가지 않고 `삭제 줄이 없습니다` 로 알린다 - +아무 일도 안 일어나면 기능이 없는 줄 안다. + +**단추처럼 보이지 않게 했다.** 테두리와 배경을 지우고 손 모양 커서와 마우스 올렸을 때의 옅은 배경만 남겼다. +범례 줄이 단추 여덟 개로 보이면 시끄럽다. + +**화면에서 확인한 것** (차이 2줄 · 추가 1줄인 파일) + +| 누른 것 | 캐럿 | +|---|---| +| 시작 | 1행 | +| `추가 1` | **7행** (추가된 줄) | +| `BASE와 다름 2` | **12행** | +| 다시 | **5행** | +| 또 다시 | **12행** (한 바퀴 돌아옴) | +| `삭제 0` | 그대로 · "삭제 줄이 없습니다" | + +0건 갈래(`머지 반영함` · `직접 수정` · `삭제` · `무시` · `자리 옮김`)가 눈에 띄게 흐리다. + +검사 571건 통과 · 빌드 경고 0 · 오류 0. \ No newline at end of file diff --git a/doc/history/changelog.md b/doc/history/changelog.md index 34cdaa6..a5a4d0d 100644 --- a/doc/history/changelog.md +++ b/doc/history/changelog.md @@ -8,6 +8,7 @@ | 날짜 | 항목 | 커밋 | |---|---|---| +| 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 | | 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | @@ -37,6 +38,7 @@ | 날짜 | 문서 | 내용 | |---|---|---| +| 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 | | 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | diff --git a/doc/진행상황.md b/doc/진행상황.md index 45975a1..1635cf4 100644 --- a/doc/진행상황.md +++ b/doc/진행상황.md @@ -41,7 +41,7 @@ | **완료** | C-1 같은 경로가 세 군데 나온다 | | **완료** | C-2 아래쪽 정보가 세 군데로 흩어져 있다 | | **완료** | C-3 Git 탭의 원격 블록을 접는다 | -| 대기 | C-4 색 구분 범례를 이동 도구로 | +| **완료** | C-4 색 구분 범례를 이동 도구로 | | 대기 | C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다 | ### D. 변경 이력을 전용 폴더로 diff --git a/src/MergeHub/ViewModels/HomeViewModel.cs b/src/MergeHub/ViewModels/HomeViewModel.cs index 2efe1c3..9ca0812 100644 --- a/src/MergeHub/ViewModels/HomeViewModel.cs +++ b/src/MergeHub/ViewModels/HomeViewModel.cs @@ -2795,6 +2795,48 @@ namespace MergeHub.ViewModels /// 줄 하나만 반영해도 곧바로 범례 숫자가 바뀌도록, 편집이 끝날 때마다 다시 센다. /// (UpdateSummaries 가 AfterEdit / 파일 로드 양쪽에서 호출된다) /// + /// + /// 범례에서 고른 갈래의 다음 줄로 옮긴다. + /// + /// 범례는 지금까지 읽기만 하는 설명이었다. 그런데 "추가된 줄만 훑고 싶다" 는 일이 잦은데 + /// 차이 이동(Alt+↑↓)은 갈래를 가리지 않는다. 개수를 누르면 그 갈래만 딛게 해서 + /// 범례를 도구로 바꾼다. 색 이름을 외울 필요도 없어진다. + /// + /// 지금 자리 다음부터 찾고 끝에 닿으면 처음으로 돌아온다 - 차이 이동과 같은 방식이라 + /// 새 규칙을 외울 것이 없다. + /// + [RelayCommand] + private void GoToKind(LineHighlight kind) + { + if (Lines.Count == 0) return; + + for (var step = 1; step <= Lines.Count; step++) + { + var at = (CaretRow + step) % Lines.Count; + if (Lines[at].Highlight != kind) continue; + + GoToRow(at); + return; + } + + // 한 줄도 없으면 조용히 넘어가는 대신 왜 아무 일도 없는지 알려 준다. + MessageUtil.ShowToast($"{KindName(kind)} 줄이 없습니다."); + } + + private static string KindName(LineHighlight kind) => kind switch + { + LineHighlight.Changed => "BASE와 다름", + LineHighlight.Applied => "머지 반영함", + LineHighlight.Edited => "직접 수정", + LineHighlight.Added => "추가", + LineHighlight.Removed => "삭제", + LineHighlight.Ignored => "무시", + LineHighlight.Moved => "자리 옮김", + LineHighlight.RemoteChange => "Theirs only", + LineHighlight.Conflict => "Conflict", + _ => "그" + }; + private void UpdateLegendCounts() { int changed = 0, applied = 0, edited = 0, added = 0, removed = 0, moved = 0, ignored = 0, same = 0; diff --git a/src/MergeHub/Views/Controls/ZeroToDimConverter.cs b/src/MergeHub/Views/Controls/ZeroToDimConverter.cs new file mode 100644 index 0000000..8097b27 --- /dev/null +++ b/src/MergeHub/Views/Controls/ZeroToDimConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Globalization; +using System.Windows.Data; + +namespace MergeHub.Views.Controls +{ + /// + /// 개수가 0 이면 흐리게. 범례에서 있는 것과 없는 것을 한눈에 가르려는 것이다. + /// + /// 숨기지 않고 흐리게만 하는 까닭 - 항목이 나타났다 사라지면 자리가 매번 움직여 + /// 같은 것을 다시 찾아야 한다. 자리는 그대로 두고 무게만 뺀다. + /// + public sealed class ZeroToDimConverter : IValueConverter + { + /// 0 일 때의 흐리기. 읽히기는 하되 눈이 먼저 가지는 않는 정도. + private const double Dim = 0.35; + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => + value is int count && count == 0 ? Dim : 1.0; + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + Binding.DoNothing; + } +} \ No newline at end of file diff --git a/src/MergeHub/Views/HomeView.xaml b/src/MergeHub/Views/HomeView.xaml index e3478e9..f3905da 100644 --- a/src/MergeHub/Views/HomeView.xaml +++ b/src/MergeHub/Views/HomeView.xaml @@ -6,6 +6,7 @@ xmlns:local="clr-namespace:MergeHub.Views" xmlns:ctl="clr-namespace:MergeHub.Views.Controls" xmlns:system="clr-namespace:System;assembly=mscorlib" + xmlns:models="clr-namespace:MergeHub.Models" mc:Ignorable="d" PreviewKeyDown="View_PreviewKeyDown" AllowDrop="True" DragOver="View_DragOver" Drop="View_Drop"> @@ -44,6 +45,39 @@ + + + + +