C-1: 경로를 읽으라고 적는다

늘 똑같은 BASE/LOCAL 이 크고 정작 경로가 회색 작은 글씨였다. 뒤집었다.
접두사를 빼고 본문 색 고정폭 12px 로, 갈리는 첫 칸만 굵은 강조색.
This commit is contained in:
김승준 2026-09-10 21:30:29 +09:00
parent a6877d7b13
commit 9f0802e58f
3 changed files with 79 additions and 9 deletions

View File

@ -293,4 +293,31 @@ D:\work\branch\src\a.cpp → branch\src\a.cpp
검사 11건 추가(`PathTest` 43 → 54). 전체 **571건 통과**. 검사 11건 추가(`PathTest` 43 → 54). 전체 **571건 통과**.
**남길 것** - 화면을 줄이는 일은 <b>무엇이 남아야 하는지부터 정하고</b> 줄여야 한다. **남길 것** - 화면을 줄이는 일은 <b>무엇이 남아야 하는지부터 정하고</b> 줄여야 한다.
여기서는 "경로가 길다"만 보고 줄였는데, 정작 그 경로가 두 칸을 가르는 유일한 정보였다. 여기서는 "경로가 길다"만 보고 줄였는데, 정작 그 경로가 두 칸을 가르는 유일한 정보였다.
### C-1 또 한 번 — 경로를 읽으라고 적는다 (2026-09-10)
**사용자 지적** - "경로를 좀 잘 보이게 해볼까."
머리글의 위아래가 뒤집혀 있었다. **늘 똑같은 `BASE` 는 크고 파란데,
정작 이 칸이 무엇인지 말하는 경로는 회색 작은 글씨였다.** 정보를 담은 쪽이 뒤로 물러나 있었다.
세 가지를 바꿨다.
- 경로 줄에서 `BASE ·` `LOCAL ·` 접두사를 뺐다. **위 제목이 이미 그 말을 하고 있다.**
- 회색(Muted) 을 걷고 본문 색으로, 11 → 12px, 글꼴은 코드와 같은 Consolas 로.
경로는 기호가 많아 고정폭이 읽기 쉽다.
- **갈리는 첫 칸만 굵은 강조색**으로 칠한다(`left\` · `right\`). 나머지는 양쪽이 같은 글자라
읽을 값이 없다. 어디가 다른지 눈이 바로 간다.
```
BASE LOCAL
left\WeldController.cpp right\WeldController.cpp
^^^^ ^^^^^ (굵은 강조색)
```
Git 모드도 같이 정리됐다 - `BASE / 9c9e0bb · StartWeld.cs`, `LOCAL / master`.
**걸린 것 하나** - `SplitLead` 의 튜플 요소 이름을 `Rest` 로 뒀다가 CS8126 이 났다.
`Rest` 는 `ValueTuple` 이 제 필드 이름으로 쓰는 예약어다. `Tail` 로 바꿨다.
검사 571건 통과 · 빌드 경고 0 · 오류 0.

View File

@ -785,12 +785,16 @@ namespace MergeHub.ViewModels
// BASE 가 비어 있으면 <b>그 파일이 공통 조상에 없었다</b>는 뜻이다 - 양쪽 브랜치가 // BASE 가 비어 있으면 <b>그 파일이 공통 조상에 없었다</b>는 뜻이다 - 양쪽 브랜치가
// 각자 새로 만든 파일이라 견줄 조상이 없다. 그냥 두면 빈 칸이 고장으로 보인다. // 각자 새로 만든 파일이라 견줄 조상이 없다. 그냥 두면 빈 칸이 고장으로 보인다.
// 큰 제목이 이미 BASE/LOCAL 이라고 말하므로 여기서는 되풀이하지 않는다(4차 C-1).
BaseHeaderLead = string.Empty;
LocalHeaderLead = string.Empty;
BaseHeader = threeWay BaseHeader = threeWay
? string.IsNullOrEmpty(baseText) ? string.IsNullOrEmpty(baseText)
? $"BASE ({baseOrigin}) · 이 파일 없음 - 양쪽에서 새로 만든 파일입니다" ? $"({baseOrigin}) 이 파일 없음 - 양쪽에서 새로 만든 파일입니다"
: $"BASE ({baseOrigin}) · {path}" : $"({baseOrigin}) {path}"
: $"BASE · {commit.ShortSha} · {path}"; : $"{commit.ShortSha} · {path}";
LocalHeader = $"LOCAL · {_workspace.CurrentBranch}"; LocalHeader = _workspace.CurrentBranch;
RemoteHeader = isConflict RemoteHeader = isConflict
? "REMOTE · THEIRS" ? "REMOTE · THEIRS"
: $"REMOTE · {branch}"; : $"REMOTE · {branch}";
@ -1883,10 +1887,38 @@ namespace MergeHub.ViewModels
{ {
var (left, right) = PathUtil.DistinctTail(LeftFile, RightFile); var (left, right) = PathUtil.DistinctTail(LeftFile, RightFile);
BaseHeader = $"BASE · {left}"; // 큰 제목이 이미 BASE/LOCAL 이라고 말한다. 여기에 또 적으면 자리만 먹는다.
LocalHeader = $"LOCAL · {right}"; var l = SplitLead(left);
BaseHeaderLead = l.Lead;
BaseHeader = l.Tail;
var r = SplitLead(right);
LocalHeaderLead = r.Lead;
LocalHeader = r.Tail;
} }
/// <summary>
/// 경로에서 <b>실제로 갈리는 첫 칸</b>만 떼어 낸다.
///
/// <see cref="PathUtil.DistinctTail"/> 이 같은 앞부분을 이미 뗐으므로, 남은 것의 첫 칸이
/// 두 쪽을 가르는 자리다(<c>left\</c> · <c>branch\</c>). 그 칸만 굵게 칠하면
/// <b>어디가 다른지 눈이 바로 간다</b> - 나머지는 양쪽이 같은 글자라 읽을 값이 없다.
/// 칸이 하나뿐이면(파일 이름만 남은 경우) 뗄 것이 없다.
/// </summary>
// 'Rest' 는 ValueTuple 이 제 필드 이름으로 쓰는 예약어라 튜플 요소 이름으로 못 쓴다.
private static (string Lead, string Tail) SplitLead(string path)
{
if (string.IsNullOrEmpty(path)) return (string.Empty, string.Empty);
var at = path.IndexOfAny(new[] { '\\', '/' });
return at < 0 ? (string.Empty, path) : (path.Substring(0, at + 1), path.Substring(at + 1));
}
/// <summary>머리글에서 굵게 칠할 앞부분. 없으면 빈 글자.</summary>
[ObservableProperty] private string _baseHeaderLead = string.Empty;
[ObservableProperty] private string _localHeaderLead = string.Empty;
// ================= 저장 안 한 편집 지키기 ================= // ================= 저장 안 한 편집 지키기 =================
/// <summary> /// <summary>

View File

@ -949,9 +949,17 @@
패널마다 세로 40px 남짓을 먹었다. 전체 경로는 툴팁으로 옮기고 패널마다 세로 40px 남짓을 먹었다. 전체 경로는 툴팁으로 옮기고
<b>복사는 우클릭 메뉴로</b> 지켰다 - 읽기전용 TextBox 를 뒀던 까닭이 복사였다. <b>복사는 우클릭 메뉴로</b> 지켰다 - 읽기전용 TextBox 를 뒀던 까닭이 복사였다.
--> -->
<TextBlock Text="{Binding BaseHeader}" Style="{StaticResource Muted}" FontSize="11" <!--
경로가 이 칸의 정체다(4차 C-1). 늘 똑같은 "BASE" 는 위 제목이 이미 말하므로
여기서는 경로만, 그것도 <b>회색 작은 글씨가 아니라 읽으라고</b> 적는다.
갈리는 첫 칸만 굵게 칠해 어디가 다른지 눈이 바로 가게 한다.
-->
<TextBlock FontFamily="Consolas" FontSize="12" Margin="0,1,0,0"
TextTrimming="CharacterEllipsis" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource Ubisam.Brush.ContentForeground}"
ToolTip="{Binding BaseFileLocation}"> ToolTip="{Binding BaseFileLocation}">
<Run Text="{Binding BaseHeaderLead, Mode=OneWay}" FontWeight="Bold"
Foreground="{DynamicResource Ubisam.Brush.Accent}"/><Run Text="{Binding BaseHeader, Mode=OneWay}"/>
<TextBlock.ContextMenu> <TextBlock.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="전체 경로 복사" Click="CopyBasePath_Click"/> <MenuItem Header="전체 경로 복사" Click="CopyBasePath_Click"/>
@ -1048,9 +1056,12 @@
<StackPanel Grid.Row="0" Margin="8,6"> <StackPanel Grid.Row="0" Margin="8,6">
<TextBlock Text="{Binding LocalTitle}" Style="{StaticResource PanelTitle}"/> <TextBlock Text="{Binding LocalTitle}" Style="{StaticResource PanelTitle}"/>
<!-- BASE 와 같은 처리(4차 C-1). 전체 경로는 툴팁, 복사는 우클릭 메뉴. --> <!-- BASE 와 같은 처리(4차 C-1). 전체 경로는 툴팁, 복사는 우클릭 메뉴. -->
<TextBlock Text="{Binding LocalHeader}" Style="{StaticResource Muted}" FontSize="11" <TextBlock FontFamily="Consolas" FontSize="12" Margin="0,1,0,0"
TextTrimming="CharacterEllipsis" TextTrimming="CharacterEllipsis"
Foreground="{DynamicResource Ubisam.Brush.ContentForeground}"
ToolTip="{Binding SelectedFileFullPath}"> ToolTip="{Binding SelectedFileFullPath}">
<Run Text="{Binding LocalHeaderLead, Mode=OneWay}" FontWeight="Bold"
Foreground="{DynamicResource Ubisam.Brush.Accent}"/><Run Text="{Binding LocalHeader, Mode=OneWay}"/>
<TextBlock.ContextMenu> <TextBlock.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="전체 경로 복사" Click="CopyLocalPath_Click"/> <MenuItem Header="전체 경로 복사" Click="CopyLocalPath_Click"/>