4차 C-5: ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눔

저장 형식·비교 규칙·편집 잠금을 한자리에 모아 접었다. 차이 이동을 개수 옆으로 옮겼다.
지시서의 "폭이 넓어진다"는 틀렸다. 폭을 정하는 단추들이 접어도 남는 쪽이다.
This commit is contained in:
김승준 2026-09-10 22:39:26 +09:00
parent 27a8bfb275
commit bad30f50e4
6 changed files with 137 additions and 13 deletions

View File

@ -517,3 +517,45 @@ C-3 에서 똑같은 실수를 했다. 접거나 누를 수 있게 만들 때는
**줄 머리에서 한 번만 말한다** - `색 구분 (눌러서 이동)`. **줄 머리에서 한 번만 말한다** - `색 구분 (눌러서 이동)`.
항목마다 칠하지 않으므로 줄은 그대로 조용하고, 무엇인지는 한 번 읽으면 안다. 항목마다 칠하지 않으므로 줄은 그대로 조용하고, 무엇인지는 한 번 읽으면 안다.
---
## C-5. ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 — **완료** (2026-09-10)
**무엇이 문제였나** - 오른쪽 칸에 두 가지 성격이 섞여 있었다.
| 매번 쓰는 것 | 한 번 정하면 그대로인 것 |
|---|---|
| Undo/Redo · 전체 반영 · Accept · 이 덩어리 반영 · Revert · 차이 이동 · 저장 | 저장 형식 두 칸 · 비교 규칙 넷 · 편집 잠금 |
뒤엣것이 앞엣것 사이사이에 흩어져 있었다(`저장 형식` 은 가운데, `비교 규칙` 은 맨 아래).
**한자리에 모으고 접었다.** `▸ 저장 형식 · 비교 규칙 펴기` 하나로 셋을 함께 여닫는다.
자리는 차이 이동 아래, 저장 위다. **단추 글자가 무엇이 숨어 있는지 말한다** -
화살표만으로는 전해지지 않는다는 것을 C-3 · C-4 에서 두 번 겪었다.
펼침 상태는 `ActionsRulesExpanded` 에 남기고 설정 화면에는 안 내놓는다.
**차이 이동을 개수 옆으로 옮겼다.** 가장 자주 누르는 것인데 오른쪽 칸 끝에 있었고,
정작 "몇 번째인지"는 아래 상태바에 있었다. **보는 자리와 누르는 자리가 갈려 있으면 눈과 손이 따로 움직인다.**
상태바에 `◀ 차이 3 / 5 ▶` 로 붙였다. 오른쪽 칸의 큰 단추는 그대로 둔다 - 쓰던 사람 손을 빼앗지 않는다.
### 지시서가 틀렸던 것 — 접어도 폭은 안 줄어든다
지시서에 "오른쪽 칸 폭을 그만큼 코드에 돌려준다" 고 적었는데 **틀린 말이었다.**
폭을 정하는 것은 두 칸짜리 단추(Undo/Redo · 이전 차이/다음 차이)와 Accept 인데,
그것들은 전부 **접어도 남는 쪽**이다. 접히는 것은 세로만 먹는다.
실제로 214 → 176 으로 좁혀 봤더니 `Undo` 가 `Undc` 로, `이전 차이` 가 `이전 차` 로 잘렸다.
되돌리고 폭은 그대로 두었다. **C-5 가 얻는 것은 폭이 아니라 세로 자리와 덜 어지러운 칸이다.**
**화면에서 확인한 것**
| 확인 | 결과 |
|---|---|
| 접었을 때 | 저장 형식 · 비교 규칙 · 편집 잠금이 사라진다 |
| 남은 단추 글자 | `Undo` `Redo` `이전 차이` `다음 차이` 모두 안 잘린다 |
| 펼치면 | 차이 이동 아래에 셋이 한 덩어리로 나온다 |
| 상태바 | `1행 1열 │ ◀ 차이 -/3 ▶ │ 총 13줄 · 남은 차이 3줄` |
| 규칙을 바꾼 뒤 | 반영한 줄이 `머지 반영함` 그대로, `직접 수정` 0 (3차 E-5 회귀 없음) |
검사 571건 통과 · 빌드 경고 0 · 오류 0.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 | | 날짜 | 항목 | 커밋 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-5** — 한 번 정하는 것들을 한자리에 모아 접고, 차이 이동을 개수 옆으로 | 아래 |
| 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 | | 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 |
| 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 | | 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 |
| 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 |
@ -38,6 +39,7 @@
| 날짜 | 문서 | 내용 | | 날짜 | 문서 | 내용 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-5** — 한 번 정하는 것들을 한자리에 모아 접고, 차이 이동을 개수 옆으로 | 아래 |
| 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 | | 2026-09-10 | **4차 C-4** — 범례를 눌러 그 갈래로 이동. 0건은 흐리게 | 아래 |
| 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 | | 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 |
| 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 |

View File

@ -42,7 +42,7 @@
| **완료** | C-2 아래쪽 정보가 세 군데로 흩어져 있다 | | **완료** | C-2 아래쪽 정보가 세 군데로 흩어져 있다 |
| **완료** | C-3 Git 탭의 원격 블록을 접는다 | | **완료** | C-3 Git 탭의 원격 블록을 접는다 |
| **완료** | C-4 색 구분 범례를 이동 도구로 | | **완료** | C-4 색 구분 범례를 이동 도구로 |
| 대기 | C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다 | | **완료** | C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다 |
### D. 변경 이력을 전용 폴더로 ### D. 변경 이력을 전용 폴더로

View File

@ -97,5 +97,12 @@ namespace MergeHub
[Browsable(false)] [Browsable(false)]
public bool GitRemoteExpanded { get; set; } public bool GitRemoteExpanded { get; set; }
/// <summary>
/// 파일 비교 오른쪽 칸에서 <b>한 번 정하면 그대로인 것들</b>(저장 형식 · 비교 규칙 · 편집 잠금)을
/// 펼쳐 두었는지. 설정 화면에는 안 내놓는다 — 화면에서 접고 펴는 값이다.
/// </summary>
[Browsable(false)]
public bool ActionsRulesExpanded { get; set; }
} }
} }

View File

@ -38,6 +38,7 @@ namespace MergeHub.ViewModels
_workspace.PlainCompareRequested += OnPlainCompareRequested; _workspace.PlainCompareRequested += OnPlainCompareRequested;
_workspace.Recent.Changed += (_, _) => _workspace.OnUi(RefreshRecent); _workspace.Recent.Changed += (_, _) => _workspace.OnUi(RefreshRecent);
_workspace.QueueChanged += (_, _) => RefreshQueue(); _workspace.QueueChanged += (_, _) => RefreshQueue();
_isRulesOpen = _workspace.Settings.ActionsRulesExpanded;
_reflowTimer.Tick += (_, _) => Reflow(); _reflowTimer.Tick += (_, _) => Reflow();
RefreshRecent(); RefreshRecent();
@ -190,6 +191,36 @@ namespace MergeHub.ViewModels
/// <summary>비교 대상 파일 목록(충돌 중이면 충돌 파일, 아니면 선택 커밋의 파일).</summary> /// <summary>비교 대상 파일 목록(충돌 중이면 충돌 파일, 아니면 선택 커밋의 파일).</summary>
public ObservableCollection<string> Files { get; } = new ObservableCollection<string>(); public ObservableCollection<string> Files { get; } = new ObservableCollection<string>();
// ================= 오른쪽 칸 접고 펴기 =================
/// <summary>
/// 저장 형식 · 비교 규칙 · 편집 잠금을 펼쳐 두었는지.
///
/// <b>왜 접나</b> - 오른쪽 칸에는 <b>매번 쓰는 것</b>(반영 · 되돌리기 · 차이 이동 · 저장)과
/// <b>한 번 정하면 그대로인 것</b>(저장 형식 · 비교 규칙 · 편집 잠금)이 섞여 있었다.
/// 뒤엣것을 접으면 그만큼 코드 폭이 넓어진다. 코드를 나란히 읽는 도구에서 가로 한 칸은
/// 그대로 읽을 수 있는 글자 수다.
/// </summary>
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(RulesToggleLabel))]
private bool _isRulesOpen;
/// <summary>
/// 단추 글자. 무엇이 숨어 있고 누르면 무슨 일이 나는지 함께 적는다 -
/// 화살표만으로는 "여기 접힌 것이 있다"가 전해지지 않는다(C-3 · C-4 에서 두 번 겪었다).
/// </summary>
public string RulesToggleLabel =>
IsRulesOpen ? "▾ 저장 형식 · 비교 규칙 접기" : "▸ 저장 형식 · 비교 규칙 펴기";
[RelayCommand]
private void ToggleRules()
{
IsRulesOpen = !IsRulesOpen;
_workspace.Settings.ActionsRulesExpanded = IsRulesOpen;
_workspace.SaveSettings();
}
// ================= 폴더에서 훑는 중인 파일 이동 ================= // ================= 폴더에서 훑는 중인 파일 이동 =================
/// <summary>훑을 목록이 있는지. 폴더를 거치지 않고 연 파일에는 없다.</summary> /// <summary>훑을 목록이 있는지. 폴더를 거치지 않고 연 파일에는 없다.</summary>

View File

@ -821,6 +821,14 @@
</ColumnDefinition> </ColumnDefinition>
<ColumnDefinition Width="4"/> <ColumnDefinition Width="4"/>
<!--
ACTIONS 칸. 접어도 폭은 그대로 둔다(4차 C-5).
<b>접는다고 폭이 줄지 않는다</b> - 폭을 정하는 것은 두 칸짜리 단추(Undo/Redo ·
이전 차이/다음 차이)와 Accept 인데, 그것들은 접어도 남는 쪽이다.
실제로 176 으로 좁혀 봤더니 "Undo" 가 "Undc" 로, "이전 차이" 가 "이전 차" 로 잘렸다.
C-5 가 얻는 것은 폭이 아니라 <b>세로 자리와 덜 어지러운 칸</b>이다.
-->
<ColumnDefinition Width="214" MinWidth="170"/> <ColumnDefinition Width="214" MinWidth="170"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
@ -1450,15 +1458,13 @@
저장 형식. 기본은 "원본 유지"라 지금까지와 똑같이 나간다. 저장 형식. 기본은 "원본 유지"라 지금까지와 똑같이 나간다.
사내 소스에 CP949 가 섞여 있어, 새로 만드는 파일과 형식이 갈릴 때 여기서 맞춘다. 사내 소스에 CP949 가 섞여 있어, 새로 만드는 파일과 형식이 갈릴 때 여기서 맞춘다.
--> -->
<TextBlock Text="저장 형식" Style="{StaticResource Muted}" FontSize="11" Margin="0,12,0,4"/> <!--
<UniformGrid Columns="2"> 한 번 정하면 그대로인 것들은 접어 둔다(4차 C-5).
<ComboBox ItemsSource="{Binding SaveEncodings}" SelectedItem="{Binding SaveEncoding}" 매번 쓰는 것(반영 · 되돌리기 · 차이 이동 · 저장)과 섞여 있어 오른쪽 칸이 길었다.
MinHeight="26" FontSize="11" Margin="2,0" 단추 글자가 무엇이 숨어 있는지 말한다 - 화살표만으로는 전해지지 않는다(C-3 · C-4).
ToolTip="저장할 때 쓸 인코딩"/> -->
<ComboBox ItemsSource="{Binding SaveNewLines}" SelectedItem="{Binding SaveNewLine}"
MinHeight="26" FontSize="11" Margin="2,0"
ToolTip="저장할 때 쓸 줄바꿈"/>
</UniformGrid>
<!-- <!--
3-Way 흐름. "안 겹치는 변경은 자동으로, 사람은 충돌만" 이 순서다. 3-Way 흐름. "안 겹치는 변경은 자동으로, 사람은 충돌만" 이 순서다.
@ -1578,8 +1584,31 @@
ToolTip="줄 번호로 이동 (Ctrl+G)"/> ToolTip="줄 번호로 이동 (Ctrl+G)"/>
</Grid> </Grid>
<TextBlock Text="비교 규칙" Style="{StaticResource Muted}" FontSize="11" Margin="0,14,0,4"/> <!--
<UniformGrid Columns="2"> 여기서부터가 <b>한 번 정하면 그대로인 것들</b>이다(4차 C-5).
위쪽(반영 · 되돌리기 · 차이 이동 · 저장)과 성격이 달라 한자리에 모으고 접었다.
단추 글자가 무엇이 숨어 있는지 말한다 - 화살표만으로는 전해지지 않는다(C-3 · C-4).
-->
<Button Content="{Binding RulesToggleLabel}" Command="{Binding ToggleRulesCommand}"
MinHeight="26" FontSize="11" FontWeight="Bold" Margin="2,14,2,0"
Cursor="Hand"
Foreground="{DynamicResource Ubisam.Brush.Accent}"
ToolTip="저장 형식 · 비교 규칙 · 편집 잠금을 접거나 폅니다. 접힌 상태는 다음에 켤 때도 그대로입니다"/>
<TextBlock Text="저장 형식" Style="{StaticResource Muted}" FontSize="11" Margin="0,10,0,4"
Visibility="{Binding IsRulesOpen, Converter={StaticResource BoolToVis}}"/>
<UniformGrid Columns="2" Visibility="{Binding IsRulesOpen, Converter={StaticResource BoolToVis}}">
<ComboBox ItemsSource="{Binding SaveEncodings}" SelectedItem="{Binding SaveEncoding}"
MinHeight="26" FontSize="11" Margin="2,0"
ToolTip="저장할 때 쓸 인코딩"/>
<ComboBox ItemsSource="{Binding SaveNewLines}" SelectedItem="{Binding SaveNewLine}"
MinHeight="26" FontSize="11" Margin="2,0"
ToolTip="저장할 때 쓸 줄바꿈"/>
</UniformGrid>
<TextBlock Text="비교 규칙" Style="{StaticResource Muted}" FontSize="11" Margin="0,10,0,4"
Visibility="{Binding IsRulesOpen, Converter={StaticResource BoolToVis}}"/>
<UniformGrid Columns="2" Visibility="{Binding IsRulesOpen, Converter={StaticResource BoolToVis}}">
<Button Content="{Binding WhitespaceLabel}" Command="{Binding CycleWhitespaceCommand}" <Button Content="{Binding WhitespaceLabel}" Command="{Binding CycleWhitespaceCommand}"
MinHeight="28" FontSize="11" MinHeight="28" FontSize="11"
ToolTip="공백을 얼마나 무시할지 - 전부 비교 → 개수만 무시 → 전부 무시"/> ToolTip="공백을 얼마나 무시할지 - 전부 비교 → 개수만 무시 → 전부 무시"/>
@ -1595,6 +1624,7 @@
</UniformGrid> </UniformGrid>
<Button Content="{Binding ReadOnlyLabel}" Click="ToggleReadOnly_Click" <Button Content="{Binding ReadOnlyLabel}" Click="ToggleReadOnly_Click"
MinHeight="28" FontSize="11" Margin="2,4,2,0" MinHeight="28" FontSize="11" Margin="2,4,2,0"
Visibility="{Binding IsRulesOpen, Converter={StaticResource BoolToVis}}"
ToolTip="실수로 고치는 것을 막습니다"/> ToolTip="실수로 고치는 것을 막습니다"/>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
@ -1627,8 +1657,20 @@
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding CaretPosition}" Style="{StaticResource Mono}" FontSize="11"/> <TextBlock Text="{Binding CaretPosition}" Style="{StaticResource Mono}" FontSize="11"/>
<Border Width="1" Margin="10,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/> <Border Width="1" Margin="10,1" Background="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="{Binding DiffPosition}" FontSize="11" FontWeight="Bold" <!--
차이 이동을 개수 바로 옆에 둔다(4차 C-5).
가장 자주 누르는 것인데 오른쪽 칸 끝에 있었고, 정작 "몇 번째인지"는 여기 있었다.
보는 자리와 누르는 자리가 갈려 있으면 눈과 손이 따로 움직인다.
오른쪽 칸의 큰 단추는 그대로 둔다 - 쓰던 사람 손을 빼앗지 않는다.
-->
<Button Content="◀" Command="{Binding PrevDiffCommand}"
Style="{StaticResource LegendButton}" FontSize="11" FontWeight="Bold" Margin="6,0,0,0"
ToolTip="이전 차이 (Alt+Up)"/>
<TextBlock Text="{Binding DiffPosition}" FontSize="11" FontWeight="Bold" Margin="2,0"
Foreground="{DynamicResource Ubisam.Brush.Accent}"/> Foreground="{DynamicResource Ubisam.Brush.Accent}"/>
<Button Content="▶" Command="{Binding NextDiffCommand}"
Style="{StaticResource LegendButton}" FontSize="11" FontWeight="Bold"
ToolTip="다음 차이 (Alt+Down)"/>
</StackPanel> </StackPanel>
<!-- 가운데: 얼마나 남았나 --> <!-- 가운데: 얼마나 남았나 -->