4차 C-3: Git 탭의 원격 칸을 접는다

원격 저장소가 없어 전부 비활성인 세 줄이 위쪽 4분의 1을 차지했다. 지우지 않고 접었다.
새로고침은 로컬 작업이라 로컬 경로 줄로 옮겼다.
펼침 상태는 설정에 남기되 Browsable(false) 로 설정 화면에는 안 내놓는다.
This commit is contained in:
김승준 2026-09-10 22:06:44 +09:00
parent aa30988a35
commit d8c8d6c6f7
7 changed files with 107 additions and 6 deletions

View File

@ -416,4 +416,39 @@ MERGED 바닥② 편집 0건 · 되돌리기 0건 · 남은 차이 10 라인 |
| 엔터 20번 | 622ms (한 번당 31ms) — 글자 치기와 같은 값 유지 | | 엔터 20번 | 622ms (한 번당 31ms) — 글자 치기와 같은 값 유지 |
**남길 것** - 화면 반응을 앞당길 때 <b>어느 이벤트 안에서 부르는지</b>를 먼저 봐야 한다. **남길 것** - 화면 반응을 앞당길 때 <b>어느 이벤트 안에서 부르는지</b>를 먼저 봐야 한다.
"바로 부른다"가 "지금 이 자리에서 부른다"가 되면 되돌이가 생긴다. "바로 부른다"가 "지금 이 자리에서 부른다"가 되면 되돌이가 생긴다.
---
## C-3. Git 탭에서 지금 못 쓰는 것이 위쪽 4분의 1을 차지하던 것 — **완료** (2026-09-10)
**무엇이 문제였나** - `저장소 연결` 칸에 원격 URL · 이름 · 클론 · 원격 추가 · 원격 삭제 ·
Gitea 계정 · 토큰 · Fetch · Pull · Push 가 세 줄로 있었다. **원격 저장소가 없어 전부 비활성**인데
화면에서는 원격이 제일 넓었다. 이 도구는 로컬에서 쓰는 머지툴이 우선이고 푸시도 하지 않는다.
**지우지 않고 접었다.** 사내 Gitea 가 생기면 다시 필요하다.
제목 옆에 `▸ 원격 · 계정` 단추를 두고 두 줄을 함께 접는다. **단추 글자가 지금 상태를 그대로 말한다.**
**늘 보이는 것은 로컬 경로 한 줄이다** - 경로 · `폴더...` · `열기` · `새로고침`.
**새로고침을 옮겼다.** 원격 줄에 Fetch/Pull/Push 와 함께 있었는데, 이건 **로컬 작업**이다.
접으면 함께 사라지므로 로컬 경로 줄로 옮겼다.
**펼침 상태를 기억한다.** `MergeHubSettings.GitRemoteExpanded` 에 남기되
`[Browsable(false)]` 로 **설정 화면에는 내놓지 않는다** - 화면에서 접고 펴는 것이지
사람이 설정 목록에서 찾아 고칠 값이 아니다(B-1 의 최근 목록과 같은 판단).
플랫폼 설정 그리드가 `Browsable` 을 이미 보고 있어 별도 처리가 필요 없었다.
**원격을 이미 쓰고 있으면 펼친 채로 시작한다.** `RemoteUrl` 이 적혀 있으면 접지 않는다 -
쓰던 사람 화면에서 갑자기 사라지면 없어진 줄 안다.
**화면에서 확인한 것**
| 확인 | 결과 |
|---|---|
| 접었을 때 | `클론` · `원격 추가/삭제` · `Fetch/Pull/Push` 가 사라진다 |
| 서브탭 줄 위치 | 접으면 위로 올라온다 (2560×1600 에서 약 128px) |
| 펼치면 | 단추가 `▾` 로 바뀌고 예전과 똑같이 나온다 |
| 설정 파일 | `"GitRemoteExpanded": true` / `false` 로 따라 바뀐다 |
| 껐다 켜기 | 펼쳐 둔 채로 껐다 켜면 펼쳐진 채로 뜬다 |
검사 571건 통과 · 빌드 경고 0 · 오류 0.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 | | 날짜 | 항목 | 커밋 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 |
| 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 |
| 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | | 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 |
| 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 | | 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 |
@ -36,6 +37,7 @@
| 날짜 | 문서 | 내용 | | 날짜 | 문서 | 내용 |
|---|---|---| |---|---|---|
| 2026-09-10 | **4차 C-3** — Git 탭의 원격 칸을 접을 수 있게. 로컬 경로 한 줄만 남고 세로 128px 가 목록으로 간다 | 아래 |
| 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 | | 2026-09-10 | **엔터 고침의 되돌이 문제** — TextChanged 안에서 편집기 글을 갈아 끼워 캐럿이 엉켰다. 한 차례 뒤로 물림 | 아래 |
| 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | | 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 |
| 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 | | 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 |

View File

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

View File

@ -87,5 +87,15 @@ namespace MergeHub
[DisplayName("작성자 (비우면 git config user.name)")] [DisplayName("작성자 (비우면 git config user.name)")]
public string MergeCommentAuthor { get; set; } = string.Empty; public string MergeCommentAuthor { get; set; } = string.Empty;
/// <summary>
/// Git 탭의 원격 칸을 펼쳐 두었는지.
///
/// <b>설정 화면에는 안 내놓는다</b>(Browsable). 화면에서 접고 펴는 것이지
/// 사람이 설정 목록에서 찾아 고칠 값이 아니다. 여기 두는 까닭은
/// <b>다음에 켤 때도 그대로</b>여야 하기 때문이다.
/// </summary>
[Browsable(false)]
public bool GitRemoteExpanded { get; set; }
} }
} }

View File

@ -51,6 +51,7 @@ namespace MergeHub.Services
Git = git; Git = git;
_currentUser = currentUser; _currentUser = currentUser;
_uiContext = SynchronizationContext.Current; _uiContext = SynchronizationContext.Current;
_settingsService = settingsService;
Settings = settingsService.RegisterSettings(nameof(MergeHubSettings), new MergeHubSettings()); Settings = settingsService.RegisterSettings(nameof(MergeHubSettings), new MergeHubSettings());
RepositoryPath = Settings.DefaultRepositoryPath; RepositoryPath = Settings.DefaultRepositoryPath;
@ -111,6 +112,14 @@ namespace MergeHub.Services
public MergeHubSettings Settings { get; } public MergeHubSettings Settings { get; }
private readonly ISettingsService _settingsService;
/// <summary>
/// 지금 설정을 파일에 쓴다. 화면에서 켜고 끈 것이 다음에 켤 때도 남게 하려는 것이다.
/// 설정 화면에서 고치는 값은 그쪽이 알아서 쓰므로 여기를 부를 일이 없다.
/// </summary>
public void SaveSettings() => _settingsService.Save(nameof(MergeHubSettings));
/// <summary>저장소 상태가 다시 읽힐 때마다 발생. 화면들이 자기 패널을 갱신한다.</summary> /// <summary>저장소 상태가 다시 읽힐 때마다 발생. 화면들이 자기 패널을 갱신한다.</summary>
public event Action? Refreshed; public event Action? Refreshed;

View File

@ -28,6 +28,35 @@ namespace MergeHub.ViewModels
_workspace.Refreshed += () => OnPropertyChanged(nameof(SelectedCommit)); _workspace.Refreshed += () => OnPropertyChanged(nameof(SelectedCommit));
_workspace.Refreshed += SyncStashSelection; _workspace.Refreshed += SyncStashSelection;
_workspace.StateChanged += RaiseCanExecuteChanged; _workspace.StateChanged += RaiseCanExecuteChanged;
// 원격을 이미 쓰고 있으면 펼쳐 둔다 - 접어 두면 쓰던 사람이 사라진 줄 안다.
_isRemoteOpen = _workspace.Settings.GitRemoteExpanded ||
!string.IsNullOrWhiteSpace(_workspace.RemoteUrl);
}
// ================= 원격 칸 접고 펴기 =================
/// <summary>
/// 원격 칸(원격 URL · Gitea 계정 · Fetch/Pull/Push)을 펼쳐 두었는지.
///
/// <b>왜 접나</b> - 이 도구는 로컬에서 쓰는 머지툴이 우선이고 아직 원격 저장소가 없다.
/// 그런데 화면에서는 원격이 위쪽 4분의 1을 차지한 채 전부 비활성이었다.
/// <b>지우지는 않는다</b> - 사내 Gitea 가 생기면 다시 필요하다.
/// </summary>
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(RemoteToggleLabel))]
private bool _isRemoteOpen;
/// <summary>단추가 지금 상태를 그대로 말한다. 화살표 방향이 다음에 일어날 일을 가리킨다.</summary>
public string RemoteToggleLabel => IsRemoteOpen ? "▾ 원격 · 계정" : "▸ 원격 · 계정";
[RelayCommand]
private void ToggleRemote()
{
IsRemoteOpen = !IsRemoteOpen;
_workspace.Settings.GitRemoteExpanded = IsRemoteOpen;
_workspace.SaveSettings();
} }
public GitWorkspace Workspace => _workspace; public GitWorkspace Workspace => _workspace;

View File

@ -55,20 +55,36 @@
Background="{DynamicResource Ubisam.Brush.Input.Background}" Background="{DynamicResource Ubisam.Brush.Input.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}" BorderThickness="1"> BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}" BorderThickness="1">
<StackPanel> <StackPanel>
<TextBlock Text="저장소 연결" Style="{StaticResource GroupTitle}"/> <!--
저장소 연결(4차 C-3).
<b>로컬 경로 한 줄만 늘 보인다.</b> 이 도구는 로컬에서 쓰는 머지툴이 우선이고
아직 원격 저장소가 없다. 그런데 예전에는 원격 URL · 계정 · Fetch/Pull/Push 가
화면 위쪽 4분의 1을 차지한 채 전부 비활성이었다.
<b>지우지 않고 접었다</b> - 사내 Gitea 가 생기면 다시 필요하다.
-->
<StackPanel Orientation="Horizontal" Margin="0,0,0,4">
<TextBlock Text="저장소 연결" Style="{StaticResource GroupTitle}" Margin="0,0,10,0"/>
<Button Content="{Binding RemoteToggleLabel}" Command="{Binding ToggleRemoteCommand}"
MinWidth="110" MinHeight="22" Padding="8,1" FontSize="11" Margin="0,0,0,4"
ToolTip="원격 저장소·계정 칸을 접거나 폅니다. 접힌 상태는 다음에 켤 때도 그대로입니다"/>
</StackPanel>
<Grid Margin="0,0,0,4"> <Grid Margin="0,0,0,4">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="로컬 경로" Style="{StaticResource Muted}" Margin="0,0,6,0"/> <TextBlock Grid.Column="0" Text="로컬 경로" Style="{StaticResource Muted}" Margin="0,0,6,0"/>
<TextBox Grid.Column="1" Text="{Binding Workspace.RepositoryPath, UpdateSourceTrigger=PropertyChanged}"/> <TextBox Grid.Column="1" Text="{Binding Workspace.RepositoryPath, UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="2" Content="폴더..." Click="BrowseFolder_Click"/> <Button Grid.Column="2" Content="폴더..." Click="BrowseFolder_Click"/>
<Button Grid.Column="3" Content="열기" Command="{Binding OpenCommand}"/> <Button Grid.Column="3" Content="열기" Command="{Binding OpenCommand}"/>
<!-- 새로고침은 로컬 작업이다. 원격 줄에 있다가 접히면 함께 사라져 여기로 옮겼다. -->
<Button Grid.Column="4" Content="새로고침" Command="{Binding RefreshCommand}"/>
</Grid> </Grid>
<Grid> <Grid Visibility="{Binding IsRemoteOpen, Converter={StaticResource BoolToVis}}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
@ -88,7 +104,8 @@
ToolTip="다른 저장소를 원격으로 등록하고 바로 fetch"/> ToolTip="다른 저장소를 원격으로 등록하고 바로 fetch"/>
<Button Grid.Column="6" Content="원격 삭제" Command="{Binding RemoveRemoteCommand}"/> <Button Grid.Column="6" Content="원격 삭제" Command="{Binding RemoveRemoteCommand}"/>
</Grid> </Grid>
<Grid Margin="0,4,0,0"> <Grid Margin="0,4,0,0"
Visibility="{Binding IsRemoteOpen, Converter={StaticResource BoolToVis}}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="150"/> <ColumnDefinition Width="150"/>
@ -107,7 +124,6 @@
<Button Content="Fetch" Command="{Binding FetchCommand}"/> <Button Content="Fetch" Command="{Binding FetchCommand}"/>
<Button Content="Pull" Command="{Binding PullCommand}"/> <Button Content="Pull" Command="{Binding PullCommand}"/>
<Button Content="Push" Command="{Binding PushCommand}"/> <Button Content="Push" Command="{Binding PushCommand}"/>
<Button Content="새로고침" Command="{Binding RefreshCommand}"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</StackPanel> </StackPanel>