diff --git a/doc/작업지시-3차.md b/doc/작업지시-3차.md index 441fb23..b24a6bf 100644 --- a/doc/작업지시-3차.md +++ b/doc/작업지시-3차.md @@ -155,3 +155,24 @@ - 어떤 파일을 어떻게 고쳤는지 - 실제로 실행해 확인한 결과 - 커밋 해시 + +--- + +## E. 추가 요청 (2026-09-09 오후) + +### E-1. 원본 세 칸에 세로 스크롤 막대가 없다 + +- B-1 에서 가로 막대를 붙였는데 세로가 빠져 있었다. +- **판정 기준**: 세 칸 오른쪽에 막대가 보이고, 하나를 끌면 셋이 함께 움직인다. + +### E-2. 칸 폭을 줄였다 늘리면 행 높이가 돌아오지 않는다 + +- 증상: 화면을 좁혔다가 다시 넓히면 접혔던 행이 넓은 자리를 그대로 차지한 채 남는다. +- 창을 옮겨 크기가 바뀌는 경우와 가운데 구분선을 끄는 경우 둘 다 확인한다. +- **판정 기준**: 좁혔다 되돌리면 처음과 똑같은 화면이 된다. + +### E-3. 경로 줄과 코드 사이의 빈 공간을 없앤다 + +- 증상: 패널 머리(제목·경로) 아래에 쓰이지 않는 빈 자리가 넓게 남아 코드가 그만큼 덜 보인다. +- 나란히 놓인 칸끼리는 머리 높이가 같아야 첫 줄이 같은 눈높이에 온다. 그 조건은 지킨다. +- **판정 기준**: 경로 줄 바로 아래에서 코드가 시작하고, 두(세) 칸의 01행이 같은 높이에 있다. \ No newline at end of file diff --git a/doc/진행상황.md b/doc/진행상황.md index 8797929..c4d3967 100644 --- a/doc/진행상황.md +++ b/doc/진행상황.md @@ -134,6 +134,53 @@ CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는데 이 둘 | 대기 | D-6 비교 결과 텍스트 내보내기 | | 대기 | D-7 드래그 앤 드롭으로 열기 | +### E. 추가 요청 (2026-09-09 오후) + +| 상태 | 항목 | +|---|---| +| **완료** | E-1 원본 세 칸에 세로 스크롤 막대 | +| **완료** | E-2 칸 폭을 줄였다 늘리면 행 높이가 안 돌아옴 | +| **완료** | E-3 경로 줄과 코드 사이의 빈 공간 | + +--- + +### E. 추가 요청 세 가지 — **완료** (2026-09-09) + +#### E-1. 원본 세 칸에 세로 스크롤 막대 + +가로(B-1)만 붙이고 세로가 빠져 있었다. 세 칸에 `VerticalScrollBarVisibility="Visible"` 을 켰다. +가로와 달리 세로는 이 칸들이 실제로 굴러가므로 따로 막대를 만들 필요 없이 ScrollViewer 가 +주는 것을 그대로 쓴다. 대신 막대가 자리를 차지하는 만큼 여백 보정을 걷어냈다 - +전에는 편집기 막대 폭만큼 오른쪽 여백을 줘서 글자 폭을 맞췄는데, 이제 진짜 막대가 그 자리를 +차지하므로 여백까지 주면 글자 폭이 좁아져 접히는 자리가 어긋난다. + +#### E-2. 칸 폭을 줄였다 늘리면 행 높이가 돌아오지 않던 문제 + +화면을 좁혔다 되돌리면 접혔던 행이 넓은 자리를 그대로 차지한 채 남았다. + +행 높이는 각 칸이 "내 글이 이만큼 높다"고 알려 온 값 중 가장 큰 것을 쓴다. +워드랩에서 한쪽만 접힌 행이 있으면 그쪽에 맞춰야 옆 칸과 줄이 맞물리기 때문이다. +그런데 글자를 그리는 칸이 세로로 늘어나 있어서(WPF 기본값 Stretch) 행이 한 번 커지면 +그 다음부터는 "행 높이만큼 높다"고 되돌려 보냈다. 자기가 만든 값을 자기가 다시 읽는 셈이라 +높이가 올라가기만 하고 내려오지 않았다. + +글자 칸을 위로 붙여(`VerticalAlignment="Top"`) 자기 글 높이만 알리도록 고쳤다. + +#### E-3. 경로 줄과 코드 사이의 빈 공간 + +패널 머리 높이를 상수로 못 박아 두었다(124 / 74). 실제 내용보다 훨씬 커서 경로 줄 아래가 +휑하게 비었고 그만큼 코드가 덜 보였다. 상수를 없애고 내용에 맞춰 줄어들게 한 뒤, +나란히 놓인 칸끼리는 `SharedSizeGroup` 으로 가장 큰 것에 맞추게 했다 +(REMOTE 만 "Conflict N" 줄이 하나 더 있어서 그렇게 해야 첫 줄이 같은 눈높이에 온다). +2-Way 에서는 MERGED 머리도 같은 무리에 넣고, 3-Way 에서는 뺀다 - 3-Way 의 MERGED 는 +아래 줄로 내려가 맞출 상대가 없는데, 넣어 두면 그쪽 경로 줄 때문에 위 세 칸까지 덩달아 커진다. + +**확인**: 2-Way 에서 한 화면에 보이는 코드가 29줄에서 34줄로 늘었다. +BASE·LOCAL 의 01행은 같은 높이 그대로다. + +**세 가지 모두 확인**: 세로 막대를 끌면 세 칸이 함께 움직인다. +2560×1600 ↔ 1920×1080 을 오가도, 가운데 구분선을 끌었다 되돌려도 처음과 같은 화면이 된다. +테스트 399건 그대로 통과. --- ### B. 3-Way 화면 — **완료** (2026-09-09) diff --git a/src/MergeHub/Views/HomeView.xaml b/src/MergeHub/Views/HomeView.xaml index bb50104..050a898 100644 --- a/src/MergeHub/Views/HomeView.xaml +++ b/src/MergeHub/Views/HomeView.xaml @@ -125,6 +125,7 @@ FontFamily="Consolas" FontSize="12" LineHeight="{StaticResource CodeLineHeight}" LineStackingStrategy="BlockLineHeight" + VerticalAlignment="Top" SizeChanged="BaseText_SizeChanged" ToolTip="{Binding BaseText}"> @@ -175,6 +176,7 @@ FontFamily="Consolas" FontSize="12" LineHeight="{StaticResource CodeLineHeight}" LineStackingStrategy="BlockLineHeight" + VerticalAlignment="Top" SizeChanged="OriginalLocalText_SizeChanged" ToolTip="{Binding OriginalLocalText}"> @@ -225,6 +227,7 @@ FontFamily="Consolas" FontSize="12" LineHeight="{StaticResource CodeLineHeight}" LineStackingStrategy="BlockLineHeight" + VerticalAlignment="Top" SizeChanged="RemoteText_SizeChanged" ToolTip="{Binding RemoteText}"> @@ -317,6 +320,7 @@ FontFamily="Consolas" FontSize="12" LineHeight="{StaticResource CodeLineHeight}" LineStackingStrategy="BlockLineHeight" + VerticalAlignment="Top" SizeChanged="LocalText_SizeChanged"> - + @@ -809,12 +813,12 @@ BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"> - + - + @@ -826,7 +830,7 @@ ItemContainerStyle="{StaticResource CodeLineItem}" VirtualizingPanel.ScrollUnit="Pixel" HorizontalContentAlignment="Stretch" - ScrollViewer.VerticalScrollBarVisibility="Hidden" + ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="{Binding SourceBars, RelativeSource={RelativeSource AncestorType=UserControl}}" ScrollViewer.ScrollChanged="Lines_ScrollChanged"/> @@ -877,13 +881,13 @@ - + - + @@ -914,7 +918,7 @@ ItemContainerStyle="{StaticResource CodeLineItem}" VirtualizingPanel.ScrollUnit="Pixel" HorizontalContentAlignment="Stretch" - ScrollViewer.VerticalScrollBarVisibility="Hidden" + ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="{Binding SourceBars, RelativeSource={RelativeSource AncestorType=UserControl}}" ScrollViewer.ScrollChanged="Lines_ScrollChanged"/> @@ -973,7 +977,7 @@ - + @@ -986,7 +990,7 @@ BASE 의 경로와 높이가 어긋난다. 어차피 줄 단위 반영·되돌리기 버튼이 ACTIONS 에 있으니 같은 성격끼리 한자리에 모이는 편이 낫기도 하다. --> - + @@ -1232,7 +1236,7 @@ BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"> - + @@ -1240,7 +1244,7 @@ - + @@ -1261,7 +1265,7 @@ ItemContainerStyle="{StaticResource CodeLineItem}" VirtualizingPanel.ScrollUnit="Pixel" HorizontalContentAlignment="Stretch" - ScrollViewer.VerticalScrollBarVisibility="Hidden" + ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="{Binding SourceBars, RelativeSource={RelativeSource AncestorType=UserControl}}" ScrollViewer.ScrollChanged="Lines_ScrollChanged"/> diff --git a/src/MergeHub/Views/HomeView.xaml.cs b/src/MergeHub/Views/HomeView.xaml.cs index eb0672b..a99999e 100644 --- a/src/MergeHub/Views/HomeView.xaml.cs +++ b/src/MergeHub/Views/HomeView.xaml.cs @@ -453,13 +453,31 @@ namespace MergeHub.Views var bar = SystemParameters.VerticalScrollBarWidth; var threeWay = (DataContext as HomeViewModel)?.IsThreeWay == true; - LocalLines.Margin = new Thickness(0, 0, bar, 0); - RemoteLines.Margin = new Thickness(0, 0, bar, 0); - OriginalLocalLines.Margin = new Thickness(0, 0, bar, 0); + // 패널 머리(제목·경로)의 높이를 서로 맞춘다. + // + // 예전에는 상수로 못 박아 두었는데(124 / 74), 실제 내용보다 훨씬 커서 + // 경로 줄과 코드 사이가 휑하게 비었다. 이제 내용에 맞춰 줄어들고, + // 서로 다른 패널끼리는 SharedSizeGroup 이 가장 큰 것에 맞춰 준다 + // (REMOTE 만 "Conflict N" 줄이 하나 더 있다). + // + // 2-Way 에서는 BASE 와 LOCAL(편집기 칸)이 나란히 있으므로 MERGED 머리도 같은 무리에 넣는다. + // 3-Way 에서는 MERGED 가 아래 줄로 내려가 맞출 상대가 없다 - 넣어 두면 그쪽 경로 줄 때문에 + // 위 세 칸의 머리까지 덩달아 커진다. + MergedHeaderRow.SharedSizeGroup = threeWay ? null : "PaneHeader"; + // 편집기 아래층은 편집기의 세로 막대만큼 물러난다 - 그 막대는 편집기가 그린다. + LocalLines.Margin = new Thickness(0, 0, bar, 0); + + // 원본 세 칸은 자기 세로 막대를 직접 그린다. 그 막대가 이미 자리를 차지하므로 + // 여백으로 또 물러나면 그만큼 글자 폭이 좁아져 접히는 자리가 어긋난다. + RemoteLines.Margin = new Thickness(0); + OriginalLocalLines.Margin = new Thickness(0); + + // 2-Way 의 BASE 는 LOCAL 과 폭을 맞춰야 한다. LOCAL 쪽 칸에는 미니맵이 붙어 있으므로 + // 그 폭만큼만 더 물러난다(막대 몫은 자기 막대가 이미 가져갔다). BaseLines.Margin = threeWay - ? new Thickness(0, 0, bar, 0) - : new Thickness(0, 0, bar + MiniMap.Width, 0); + ? new Thickness(0) + : new Thickness(0, 0, MiniMap.Width, 0); // 칸 폭이 달라졌으니 원본 칸 막대의 범위도 다시 잰다. ApplySourceScrollUnit();