4차 C-2: 아래쪽 정보를 창 아래 한 줄로

같은 뜻의 숫자가 세 군데에 있었다. 왼쪽은 어디, 가운데는 얼마나 남았나, 오른쪽은 무슨 파일인가.
패널 밖으로 나오면서 두 패널 코드 영역 높이가 저절로 같아진다.
This commit is contained in:
김승준 2026-09-10 21:40:28 +09:00
parent 9f0802e58f
commit cbf9e64539
5 changed files with 166 additions and 109 deletions

View File

@ -320,4 +320,44 @@ Git 모드도 같이 정리됐다 - `BASE / 9c9e0bb · StartWeld.cs`, `LOCAL / m
**걸린 것 하나** - `SplitLead` 의 튜플 요소 이름을 `Rest` 로 뒀다가 CS8126 이 났다.
`Rest` 는 `ValueTuple` 이 제 필드 이름으로 쓰는 예약어다. `Tail` 로 바꿨다.
검사 571건 통과 · 빌드 경고 0 · 오류 0.
---
## C-2. 아래쪽 정보가 세 군데로 흩어져 있던 것 — **완료** (2026-09-10)
**무엇이 문제였나** - 같은 성격의 정보가 세 자리에 나뉘어 있었다.
```
BASE 바닥 Diff 요약 / 총 43 라인 · 차이 10 라인
MERGED 바닥① 1행 1열 | 차이 - / 5 | UTF-8 · CRLF · C#
MERGED 바닥② 편집 0건 · 되돌리기 0건 · 남은 차이 10 라인 | 코드 검사 이상 없음
```
<b>같은 뜻의 숫자가 세 벌이었다</b> - `차이 10 라인` · `남은 차이 10 라인` · `차이 - / 5`.
어느 것을 봐야 할지 헷갈리고, 패널마다 54px 를 먹었다.
**패널 안이 아니라 창 아래 한 줄로 옮겼다.** 자리 규칙을 정했다.
| 자리 | 무엇 |
|---|---|
| 왼쪽 | 지금 어디에 있는지 — `1행 1열` · `차이 3 / 5` |
| 가운데 | 얼마나 남았는지 — `총 34줄 · 남은 차이 5줄` (고친 것이 있으면 편집·되돌리기가 붙는다) |
| 오른쪽 | 이 파일이 무엇인지 — `UTF-8 · CRLF · C#` · 비교 규칙 · 코드 검사 |
**곁들여 얻은 것** - 상태바가 패널 밖으로 나오면서 <b>두 패널의 코드 영역 높이가 저절로 같아진다.</b>
전에는 BASE 와 MERGED 의 바닥 높이를 손으로 맞춰 두어야 했다(`PaneFooterHeight` 상수가 그 흔적이다).
3-Way 에서도 네 칸이 같은 자리에 선다.
**숫자를 하나씩만 남겼다.** `총 N줄` 은 파일 크기, `남은 차이 N줄` 은 남은 일이다.
편집·되돌리기 건수는 **0건일 때는 아예 적지 않는다** - 늘 `0건 0건` 이 붙어 있으면 눈이 그냥 지나친다.
**화면에서 확인한 것**
| 확인 | 결과 |
|---|---|
| 2-Way | `1행 1열 │ 차이 -/2 │ 총 8줄 · 남은 차이 2줄 … UTF-8 · CRLF · C/C++ │ 코드 검사 이상 없음` |
| 3-Way | 같은 한 줄, `총 34줄 · 남은 차이 5줄` · `코드 검사 확인 필요 1건` |
| 두 패널 코드 높이 | 같다. 3-Way 네 칸도 같은 자리에 선다 |
| 같은 숫자 두 번 | 없다 |
검사 571건 통과 · 빌드 경고 0 · 오류 0.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 |
|---|---|---|
| 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 |
| 2026-09-10 | **4차 C-1 다시** — 머리글을 파일 이름만으로 줄인 것이 잘못이었다. 두 경로에서 다른 부분만 남기게 고침 | 아래 |
| 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 |
| 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 |
@ -33,6 +34,7 @@
| 날짜 | 문서 | 내용 |
|---|---|---|
| 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 |
| 2026-09-10 | **4차 C-1 다시** — 머리글을 파일 이름만으로 줄인 것이 잘못이었다. 두 경로에서 다른 부분만 남기게 고침 | 아래 |
| 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 |
| 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 |

View File

@ -39,7 +39,7 @@
| 상태 | 항목 |
|---|---|
| **완료** | C-1 같은 경로가 세 군데 나온다 |
| 대기 | C-2 아래쪽 정보가 세 군데로 흩어져 있다 |
| **완료** | C-2 아래쪽 정보가 세 군데로 흩어져 있다 |
| 대기 | C-3 Git 탭의 원격 블록을 접는다 |
| 대기 | C-4 색 구분 범례를 이동 도구로 |
| 대기 | C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다 |

View File

@ -2534,9 +2534,15 @@ namespace MergeHub.ViewModels
var total = Lines.Count;
var diff = Lines.Count(l => l.IsDifferent);
DiffSummary = total == 0 ? "-" : $"총 {total} 라인 · 차이 {diff} 라인";
// 같은 숫자를 두 번 적지 않는다(4차 C-2). 예전에는 여기서 "차이 {diff} 라인" 을 적고
// 바로 아래 줄에서 "남은 차이 {diff} 라인" 을 또 적었다 - 어느 쪽을 봐야 하는지 헷갈렸다.
// 파일 크기(총 N줄)와 남은 일(차이 N줄)은 다른 것이므로 하나씩만 남긴다.
DiffSummary = total == 0 ? "-" : $"총 {total}줄";
DiffVersion++;
EditSummary = $"편집 {_undo.Count}건 · 되돌리기 {_redo.Count}건 · 남은 차이 {diff} 라인";
EditSummary = _undo.Count == 0 && _redo.Count == 0
? $"남은 차이 {diff}줄"
: $"남은 차이 {diff}줄 · 편집 {_undo.Count}건 · 되돌리기 {_redo.Count}건";
UpdateLegendCounts();
RefreshProblems();

View File

@ -339,6 +339,8 @@
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<!-- 상태바. 패널 안이 아니라 창 아래 한 줄로 둔다(4차 C-2). -->
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- ===== 상단 상태 바 ===== -->
@ -999,15 +1001,7 @@
Value="{Binding SourceScrollValue, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
Visibility="{Binding SourceBarVisibility, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
<Border Grid.Row="2" Padding="8,5" BorderThickness="0,1,0,0"
Height="{StaticResource PaneFooterHeight}"
Visibility="{Binding IsTwoWay, Converter={StaticResource BoolToVis}}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<StackPanel VerticalAlignment="Center">
<TextBlock Text="Diff 요약" Style="{StaticResource Muted}" FontSize="11"/>
<TextBlock Text="{Binding DiffSummary}" FontSize="12"/>
</StackPanel>
</Border>
<!-- Diff 요약도 아래 한 줄로 갔다(4차 C-2). 같은 숫자가 세 군데 있었다. -->
</Grid>
</Border>
@ -1184,103 +1178,7 @@
LineRequested="MiniMap_LineRequested"/>
</Grid>
<Border Grid.Row="2" Padding="8,5" BorderThickness="0,1,0,0"
Height="{StaticResource PaneFooterHeight}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<StackPanel VerticalAlignment="Center">
<!--
상태바. 지금 어디에 있고(행·열, 몇 번째 차이),
저장하면 어떤 형식으로 나가는지(인코딩·줄바꿈)를 한 줄에 모아 둔다.
-->
<StackPanel Orientation="Horizontal" Margin="0,0,0,4">
<TextBlock Text="{Binding CaretPosition}" Style="{StaticResource Mono}" FontSize="11"/>
<Border Width="1" Margin="8,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="{Binding DiffPosition}" FontSize="11" FontWeight="Bold"
Foreground="{DynamicResource Ubisam.Brush.Accent}"/>
<Border Width="1" Margin="8,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="{Binding FileEncoding}" Style="{StaticResource Muted}" FontSize="11"/>
<TextBlock Text="·" Style="{StaticResource Muted}" FontSize="11" Margin="5,0"/>
<TextBlock Text="{Binding FileNewLine}" Style="{StaticResource Muted}" FontSize="11"/>
<TextBlock Text="·" Style="{StaticResource Muted}" FontSize="11" Margin="5,0"/>
<TextBlock Text="{Binding LanguageName}" Style="{StaticResource Muted}" FontSize="11"
ToolTip="확장자로 고른 언어입니다. 색칠과 코드 검사가 이 값을 따릅니다"/>
<Border Width="1" Margin="8,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"
Visibility="{Binding RulesSummary, Converter={StaticResource TextToVis}}"/>
<TextBlock Text="{Binding RulesSummary}" FontSize="11"
Foreground="{DynamicResource Ubisam.Brush.Muted}"
Visibility="{Binding RulesSummary, Converter={StaticResource TextToVis}}"/>
</StackPanel>
<!--
편집 상태와 코드 검사를 한 줄에 둔다. BASE 쪽 요약과 높이를 맞춰야
두 패널의 코드 영역이 같은 크기가 되고 나란히 읽힌다.
검사 결과는 걸린 게 있을 때만 눌러서 목록을 펼친다 - 늘 펼쳐 두면
이 칸이 커져 코드가 가린다.
-->
<StackPanel Orientation="Horizontal" Margin="0,2,0,0">
<TextBlock Text="{Binding EditSummary}" FontSize="12"
VerticalAlignment="Center"/>
<Border Width="1" Margin="8,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="코드 검사" Style="{StaticResource Muted}" FontSize="11" Margin="0,0,6,0"/>
<ToggleButton x:Name="ProblemToggle" Padding="6,1" FontSize="11" FontWeight="Bold"
MinHeight="22" BorderThickness="0" Background="Transparent"
IsEnabled="{Binding HasProblems}"
ToolTip="눌러서 확인이 필요한 줄을 봅니다">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Foreground" Value="{DynamicResource Ubisam.Brush.Success}"/>
<Setter Property="Cursor" Value="Arrow"/>
<Style.Triggers>
<DataTrigger Binding="{Binding HasProblems}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Ubisam.Brush.Danger}"/>
<Setter Property="Cursor" Value="Hand"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
<TextBlock Text="{Binding ProblemSummary}"/>
</ToggleButton>
<Popup IsOpen="{Binding IsChecked, ElementName=ProblemToggle}"
PlacementTarget="{Binding ElementName=ProblemToggle}"
Placement="Top" StaysOpen="False" AllowsTransparency="True"
HorizontalOffset="-8" VerticalOffset="-4">
<Border Background="{DynamicResource Ubisam.Brush.Input.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Danger}"
BorderThickness="1" Padding="4" MaxWidth="620" MaxHeight="240"
Effect="{DynamicResource Ubisam.Effect.Popup}">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Problems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding DataContext.GoToProblemCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
HorizontalContentAlignment="Left"
Background="Transparent" BorderThickness="0"
Padding="6,3" Margin="0"
ToolTip="누르면 그 줄로 이동합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Where}" FontFamily="Consolas"
FontSize="11" FontWeight="Bold" MinWidth="46"
Foreground="{DynamicResource Ubisam.Brush.Danger}"/>
<TextBlock Text="{Binding Message}" FontSize="11"
TextWrapping="Wrap" Margin="6,0,0,0"/>
</StackPanel>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</Popup>
</StackPanel>
</StackPanel>
</Border>
<!-- 상태바는 창 아래 한 줄로 옮겼다(4차 C-2). 두 패널이 같은 높이를 갖게 된다. -->
</Grid>
</Border>
@ -1602,5 +1500,116 @@
</DockPanel>
</Border>
</Grid>
<!--
④ 상태바 — 창 아래 한 줄.
<b>왜 옮겼나</b> - 예전에는 세 군데에 흩어져 있었다.
BASE 바닥의 "총 43 라인 · 차이 10 라인", MERGED 바닥 첫 줄의 "1행 1열 | 차이 -/5 | UTF-8",
그 아래 줄의 "편집 0건 · 되돌리기 0건 · 남은 차이 10 라인". 같은 뜻의 숫자가 세 벌이라
어느 것을 봐야 할지 헷갈렸고, 패널마다 54px 를 먹었다.
<b>자리 규칙</b> - 왼쪽은 지금 어디에 있는지, 가운데는 얼마나 남았는지, 오른쪽은 이 파일이 무엇인지.
패널 밖으로 나오면서 두 패널의 코드 영역 높이가 저절로 같아진다.
-->
<Border Grid.Row="3" Padding="8,4" BorderThickness="1,1,1,1" Margin="0,2,0,0"
Background="{DynamicResource Ubisam.Brush.Sidebar.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- 왼쪽: 지금 어디 -->
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding CaretPosition}" Style="{StaticResource Mono}" FontSize="11"/>
<Border Width="1" Margin="10,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="{Binding DiffPosition}" FontSize="11" FontWeight="Bold"
Foreground="{DynamicResource Ubisam.Brush.Accent}"/>
</StackPanel>
<!-- 가운데: 얼마나 남았나 -->
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
Margin="14,0,14,0">
<TextBlock Text="{Binding DiffSummary}" FontSize="12" VerticalAlignment="Center"/>
<TextBlock Text="·" Style="{StaticResource Muted}" FontSize="11" Margin="6,0"
Visibility="{Binding EditSummary, Converter={StaticResource TextToVis}}"/>
<TextBlock Text="{Binding EditSummary}" FontSize="12" VerticalAlignment="Center"/>
</StackPanel>
<!-- 오른쪽: 이 파일이 무엇인가 -->
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding FileEncoding}" Style="{StaticResource Muted}" FontSize="11"/>
<TextBlock Text="·" Style="{StaticResource Muted}" FontSize="11" Margin="5,0"/>
<TextBlock Text="{Binding FileNewLine}" Style="{StaticResource Muted}" FontSize="11"/>
<TextBlock Text="·" Style="{StaticResource Muted}" FontSize="11" Margin="5,0"/>
<TextBlock Text="{Binding LanguageName}" Style="{StaticResource Muted}" FontSize="11"
ToolTip="확장자로 고른 언어입니다. 색칠과 코드 검사가 이 값을 따릅니다"/>
<Border Width="1" Margin="10,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"
Visibility="{Binding RulesSummary, Converter={StaticResource TextToVis}}"/>
<TextBlock Text="{Binding RulesSummary}" FontSize="11"
Foreground="{DynamicResource Ubisam.Brush.Muted}"
Visibility="{Binding RulesSummary, Converter={StaticResource TextToVis}}"/>
<Border Width="1" Margin="10,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="코드 검사" Style="{StaticResource Muted}" FontSize="11" Margin="0,0,6,0"/>
<ToggleButton x:Name="ProblemToggle" Padding="6,1" FontSize="11" FontWeight="Bold"
MinHeight="22" BorderThickness="0" Background="Transparent"
IsEnabled="{Binding HasProblems}"
ToolTip="눌러서 확인이 필요한 줄을 봅니다">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Foreground" Value="{DynamicResource Ubisam.Brush.Success}"/>
<Setter Property="Cursor" Value="Arrow"/>
<Style.Triggers>
<DataTrigger Binding="{Binding HasProblems}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource Ubisam.Brush.Danger}"/>
<Setter Property="Cursor" Value="Hand"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
<TextBlock Text="{Binding ProblemSummary}"/>
</ToggleButton>
<Popup IsOpen="{Binding IsChecked, ElementName=ProblemToggle}"
PlacementTarget="{Binding ElementName=ProblemToggle}"
Placement="Top" StaysOpen="False" AllowsTransparency="True"
HorizontalOffset="-8" VerticalOffset="-4">
<Border Background="{DynamicResource Ubisam.Brush.Input.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Danger}"
BorderThickness="1" Padding="4" MaxWidth="620" MaxHeight="240"
Effect="{DynamicResource Ubisam.Effect.Popup}">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Problems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding DataContext.GoToProblemCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
HorizontalContentAlignment="Left"
Background="Transparent" BorderThickness="0"
Padding="6,3" Margin="0"
ToolTip="누르면 그 줄로 이동합니다">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Where}" FontFamily="Consolas"
FontSize="11" FontWeight="Bold" MinWidth="46"
Foreground="{DynamicResource Ubisam.Brush.Danger}"/>
<TextBlock Text="{Binding Message}" FontSize="11"
TextWrapping="Wrap" Margin="6,0,0,0"/>
</StackPanel>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Border>
</Popup>
</StackPanel>
</Grid>
</Border>
</Grid>
</UserControl>