4차 C-1: 같은 경로가 세 군데 나오던 것

패널의 경로 줄과 위 툴바의 잘린 경로를 없애고 머리글 툴팁으로 모았다.
복사는 우클릭 메뉴로, 끌어다 놓는 자리는 단추로 옮겨 둘 다 지켰다.
This commit is contained in:
김승준 2026-09-10 21:15:40 +09:00
parent 2ac4a5a987
commit 9d9fa40ddf
5 changed files with 100 additions and 50 deletions

View File

@ -232,4 +232,38 @@ MergeHub 파일 비교 결과
| 고친 뒤 다음 파일 → 취소 | **2 / 4 그대로** | B.cpp 그대로 | 편집 내용도 그대로 | | 고친 뒤 다음 파일 → 취소 | **2 / 4 그대로** | B.cpp 그대로 | 편집 내용도 그대로 |
| 다시 눌러 버리고 계속 | 3 / 4 | C.cpp | B.cpp 파일은 손대지 않음 | | 다시 눌러 버리고 계속 | 3 / 4 | C.cpp | B.cpp 파일은 손대지 않음 |
검사 5건 추가(`ShortcutTest` 63 → 68). 전체 **560건 통과** · 빌드 경고 0 · 오류 0. 검사 5건 추가(`ShortcutTest` 63 → 68). 전체 **560건 통과** · 빌드 경고 0 · 오류 0.
---
## C-1. 같은 경로가 세 군데 나오던 것 — **완료** (2026-09-10)
**무엇이 문제였나** - 같은 경로가 셋에 있었다.
① 위 툴바의 잘린 경로 ② 패널 머리글 `BASE · A.cpp` ③ 그 아래 `경로` 상자의 전체 경로.
①은 260px 안에서 잘려 **읽을 수 없었고**, ③은 패널마다 세로 40px 남짓을 먹었다.
**둘을 없앴다.** 전체 경로는 머리글 툴팁으로 옮겼다.
**복사하는 방법은 지켰다.** ③이 읽기전용 `TextBox` 였던 까닭이 드래그 복사다.
줄을 없애면서 복사까지 없어지면 안 되므로 **머리글 우클릭 → 전체 경로 복사** 로 옮겼다.
클립보드가 다른 프로그램에 잡혀 있으면 실패하므로 그때는 알리고 넘어간다.
**놓는 자리는 단추로 옮겼다.** ①이 3차 D-7 의 슬롯 드롭 자리였다. 없애면 그 기능이 사라지므로
`기준 파일...` · `내 파일...` 단추가 받게 했다. **잘린 글자보다 단추가 겨냥하기 쉽다.**
단추 툴팁에 전체 경로를 걸어 두어 지금 무엇이 물려 있는지도 그대로 보인다.
**행 잠금은 그대로다.** 양쪽 패널에서 같은 줄을 없앴고 머리 높이는 `SharedSizeGroup` 이 묶고 있다.
3-Way 에서는 ③이 이미 접혀 있었으므로 달라지는 것이 없다.
**화면에서 확인한 것**
| 확인 | 결과 |
|---|---|
| 코드가 시작하는 자리 | 머리글 바로 아래로 올라왔다 (2560×1600 에서 약 58px, 코드 두 줄) |
| 두 패널 01행 높이 | 같다 |
| 머리글 툴팁 | `BASE · A.cpp` → `…\left\A.cpp` / `LOCAL · A.cpp` → `…\right\A.cpp` |
| 단추 툴팁 | 각각 지금 물린 전체 경로 |
| 머리글 우클릭 → 전체 경로 복사 | 클립보드에 전체 경로가 들어왔다 |
| 탐색기에서 `기준 파일...` 단추에 놓기 | `BASE · C.cpp` 로 바뀌고 LOCAL 은 그대로 |
검사 560건 통과 · 빌드 경고 0 · 오류 0.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 | | 날짜 | 항목 | 커밋 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 |
| 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 | | 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 |
| 2026-09-10 | **4차 B-1** — 최근에 견준 파일 짝·폴더 짝을 기억해 위 줄에서 바로 연다. 없는 경로는 흐리게만 하고 지우지 않는다 | 아래 | | 2026-09-10 | **4차 B-1** — 최근에 견준 파일 짝·폴더 짝을 기억해 위 줄에서 바로 연다. 없는 경로는 흐리게만 하고 지우지 않는다 | 아래 |
| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 | | 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |
@ -31,6 +32,7 @@
| 날짜 | 문서 | 내용 | | 날짜 | 문서 | 내용 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 |
| 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 | | 2026-09-10 | **4차 B-3** — 폴더 비교 목록을 파일 비교 화면에서 이전/다음으로 딛는다 (Ctrl+PageUp/PageDown) | 아래 |
| 2026-09-10 | **4차 B-1** — 최근에 견준 파일 짝·폴더 짝을 기억해 위 줄에서 바로 연다. 없는 경로는 흐리게만 하고 지우지 않는다 | 아래 | | 2026-09-10 | **4차 B-1** — 최근에 견준 파일 짝·폴더 짝을 기억해 위 줄에서 바로 연다. 없는 경로는 흐리게만 하고 지우지 않는다 | 아래 |
| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 | | 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |

View File

@ -38,7 +38,7 @@
| 상태 | 항목 | | 상태 | 항목 |
|---|---| |---|---|
| 대기 | C-1 같은 경로가 세 군데 나온다 | | **완료** | C-1 같은 경로가 세 군데 나온다 |
| 대기 | C-2 아래쪽 정보가 세 군데로 흩어져 있다 | | 대기 | C-2 아래쪽 정보가 세 군데로 흩어져 있다 |
| 대기 | C-3 Git 탭의 원격 블록을 접는다 | | 대기 | C-3 Git 탭의 원격 블록을 접는다 |
| 대기 | C-4 색 구분 범례를 이동 도구로 | | 대기 | C-4 색 구분 범례를 이동 도구로 |

View File

@ -380,22 +380,20 @@
<!-- Git 이 아닐 때: 비교할 파일 두 개를 직접 고른다 --> <!-- Git 이 아닐 때: 비교할 파일 두 개를 직접 고른다 -->
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" <StackPanel Orientation="Horizontal" VerticalAlignment="Center"
Visibility="{Binding IsPlainMode, Converter={StaticResource BoolToVis}}"> Visibility="{Binding IsPlainMode, Converter={StaticResource BoolToVis}}">
<!--
잘린 경로 두 줄을 뺐다(4차 C-1). 260px 안에서 잘린 경로는 읽을 수 없어
자리만 먹었고, 같은 값이 각 패널 머리글에 이미 있다.
<b>놓는 자리는 단추로 옮겼다</b> - 끌어다 놓기(3차 D-7)의 자리가 사라지면 안 되고,
잘린 글자보다 단추가 겨냥하기 쉽다.
-->
<Button Content="기준 파일..." Command="{Binding PickLeftFileCommand}" <Button Content="기준 파일..." Command="{Binding PickLeftFileCommand}"
Height="26" MinHeight="26" Padding="8,2" FontSize="11" Height="26" MinHeight="26" Padding="8,2" FontSize="11" Margin="0,0,4,0"
ToolTip="왼쪽(BASE) 에 놓을 파일"/> AllowDrop="True" DragOver="View_DragOver" Drop="LeftFile_Drop"
<TextBlock Text="{Binding LeftFile}" Style="{StaticResource Muted}" FontSize="11" ToolTip="{Binding LeftFile}"/>
MaxWidth="260" TextTrimming="CharacterEllipsis" Margin="4,0,10,0"
ToolTip="{Binding LeftFile}"
Background="Transparent"
AllowDrop="True" DragOver="View_DragOver" Drop="LeftFile_Drop"/>
<Button Content="내 파일..." Command="{Binding PickRightFileCommand}" <Button Content="내 파일..." Command="{Binding PickRightFileCommand}"
Height="26" MinHeight="26" Padding="8,2" FontSize="11" Height="26" MinHeight="26" Padding="8,2" FontSize="11"
ToolTip="오른쪽(LOCAL) 에 놓을 파일. 저장하면 이 파일에 씁니다"/> AllowDrop="True" DragOver="View_DragOver" Drop="RightFile_Drop"
<TextBlock Text="{Binding RightFile}" Style="{StaticResource Muted}" FontSize="11" ToolTip="{Binding RightFile}"/>
MaxWidth="260" TextTrimming="CharacterEllipsis" Margin="4,0,0,0"
ToolTip="{Binding RightFile}"
Background="Transparent"
AllowDrop="True" DragOver="View_DragOver" Drop="RightFile_Drop"/>
<!-- 폴더 비교에서 열었을 때만 켜진다. 목록 없이 연 파일에는 딛고 갈 자리가 없다. --> <!-- 폴더 비교에서 열었을 때만 켜진다. 목록 없이 연 파일에는 딛고 갈 자리가 없다. -->
<Button Content="◀ 이전 파일" Command="{Binding PrevFileCommand}" <Button Content="◀ 이전 파일" Command="{Binding PrevFileCommand}"
@ -945,27 +943,21 @@
<!-- BASE / LOCAL 의 머리 영역 높이를 같게 고정해야 두 패널의 01행이 같은 눈높이에 온다 --> <!-- BASE / LOCAL 의 머리 영역 높이를 같게 고정해야 두 패널의 01행이 같은 눈높이에 온다 -->
<StackPanel Grid.Row="0" Margin="8,6"> <StackPanel Grid.Row="0" Margin="8,6">
<TextBlock Text="{Binding BaseTitle}" Style="{StaticResource PanelTitle}"/> <TextBlock Text="{Binding BaseTitle}" Style="{StaticResource PanelTitle}"/>
<!--
경로 줄을 따로 두지 않는다(4차 C-1).
같은 값이 위 툴바 · 이 머리글 · 아래 경로 상자 셋에 있었고, 그중 경로 상자만
패널마다 세로 40px 남짓을 먹었다. 전체 경로는 툴팁으로 옮기고
<b>복사는 우클릭 메뉴로</b> 지켰다 - 읽기전용 TextBox 를 뒀던 까닭이 복사였다.
-->
<TextBlock Text="{Binding BaseHeader}" Style="{StaticResource Muted}" FontSize="11" <TextBlock Text="{Binding BaseHeader}" Style="{StaticResource Muted}" FontSize="11"
TextTrimming="CharacterEllipsis"/> TextTrimming="CharacterEllipsis"
ToolTip="{Binding BaseFileLocation}">
<!-- 커밋 안의 파일 목록은 위 툴바로 옮겼다. <TextBlock.ContextMenu>
여기 있으면 BASE 머리에만 한 줄이 더 생겨 경로 줄이 LOCAL 과 어긋난다. --> <ContextMenu>
<MenuItem Header="전체 경로 복사" Click="CopyBasePath_Click"/>
<!-- 파일 경로. 읽기전용 TextBox 라 드래그해서 복사할 수 있다. </ContextMenu>
3-Way 에서는 자리가 빠듯해 접는다 - 같은 값이 제목 아래 줄에 이미 있다. --> </TextBlock.ContextMenu>
<Grid Margin="0,4,0,0" </TextBlock>
Visibility="{Binding IsTwoWay, Converter={StaticResource BoolToVis}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="경로" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,6,0"/>
<TextBox Grid.Column="1" Text="{Binding BaseFileLocation, Mode=OneWay}"
IsReadOnly="True" FontSize="11" FontFamily="Consolas"
BorderThickness="0" Background="Transparent" Padding="0"
ToolTip="{Binding BaseFileLocation}"/>
</Grid>
</StackPanel> </StackPanel>
<!-- 코드 칸을 제 자리 밖으로 못 나가게 자른다. 표시층의 미세 보정은 배치가 아니라 <!-- 코드 칸을 제 자리 밖으로 못 나가게 자른다. 표시층의 미세 보정은 배치가 아니라
@ -1055,22 +1047,16 @@
--> -->
<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). 전체 경로는 툴팁, 복사는 우클릭 메뉴. -->
<TextBlock Text="{Binding LocalHeader}" Style="{StaticResource Muted}" FontSize="11" <TextBlock Text="{Binding LocalHeader}" Style="{StaticResource Muted}" FontSize="11"
TextTrimming="CharacterEllipsis"/> TextTrimming="CharacterEllipsis"
ToolTip="{Binding SelectedFileFullPath}">
<!-- BASE 와 같은 자리에 경로를 둔다. 이쪽은 워킹트리의 실제 파일. --> <TextBlock.ContextMenu>
<Grid Margin="0,4,0,0"> <ContextMenu>
<Grid.ColumnDefinitions> <MenuItem Header="전체 경로 복사" Click="CopyLocalPath_Click"/>
<ColumnDefinition Width="Auto"/> </ContextMenu>
<ColumnDefinition Width="*"/> </TextBlock.ContextMenu>
</Grid.ColumnDefinitions> </TextBlock>
<TextBlock Grid.Column="0" Text="경로" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,6,0"/>
<TextBox Grid.Column="1" Text="{Binding SelectedFileFullPath, Mode=OneWay}"
IsReadOnly="True" FontSize="11" FontFamily="Consolas"
BorderThickness="0" Background="Transparent" Padding="0"
ToolTip="{Binding SelectedFileFullPath}"/>
</Grid>
</StackPanel> </StackPanel>
<!-- 코드 칸을 제 자리 밖으로 못 나가게 자른다 - 표시층 보정은 그리기라 자르지 않으면 바닥 글 위에 겹친다. --> <!-- 코드 칸을 제 자리 밖으로 못 나가게 자른다 - 표시층 보정은 그리기라 자르지 않으면 바닥 글 위에 겹친다. -->

View File

@ -932,6 +932,34 @@ namespace MergeHub.Views
if (DataContext is HomeViewModel vm) vm.OpenRecent(pair); if (DataContext is HomeViewModel vm) vm.OpenRecent(pair);
} }
/// <summary>
/// 패널 머리글 우클릭 → 전체 경로 복사.
///
/// 예전에는 읽기전용 <c>TextBox</c> 를 두어 드래그로 복사했다. 그 줄을 없애면서(C-1)
/// <b>복사하는 방법까지 없어지면 안 되므로</b> 메뉴로 옮겼다.
/// </summary>
private void CopyBasePath_Click(object sender, RoutedEventArgs e) =>
CopyPath((DataContext as HomeViewModel)?.BaseFileLocation);
private void CopyLocalPath_Click(object sender, RoutedEventArgs e) =>
CopyPath((DataContext as HomeViewModel)?.SelectedFileFullPath);
private static void CopyPath(string? path)
{
if (string.IsNullOrWhiteSpace(path)) return;
try
{
Clipboard.SetText(path);
UbisamBase.Core.Messaging.MessageUtil.ShowSuccessToast("경로를 복사했습니다.");
}
catch (System.Runtime.InteropServices.COMException)
{
// 다른 프로그램이 클립보드를 붙들고 있으면 실패한다. 알리고 넘어간다.
UbisamBase.Core.Messaging.MessageUtil.ShowErrorToast("복사하지 못했습니다. 잠시 뒤 다시 해 보세요.");
}
}
// ================= 끌어다 놓기 ================= // ================= 끌어다 놓기 =================
/// <summary> /// <summary>