diff --git a/doc/history/2026-09-23-12차.md b/doc/history/2026-09-23-12차.md index 654f284..2c03df1 100644 --- a/doc/history/2026-09-23-12차.md +++ b/doc/history/2026-09-23-12차.md @@ -2,6 +2,34 @@ 지시서: [../작업지시/12차.md](../작업지시/12차.md) +## 커밋 뒤 사용자 요청 셋 (2026-09-30 · 완료) + +### 폴더 비교 → 두 번 눌러 파일 비교로 가도 하단 탭이 "폴더 비교" 에 남는다 (사용자 보고 · 플랫폼에서 고침) + +사용자가 쓰던 앱을 **읽기만** 해서 재현 — 화면은 파일 비교(편집기 보임, 폴더 칸 안 보임)인데 하단 탭 선택은 0번. +원인은 MergeHub 가 아니라 공용 플랫폼: 셸의 `NavList` 는 동작형 항목을 섞느라 `SelectedMainTab` 에 바인딩하지 않고 켤 때 한 번만 넣는다. +사람이 누를 때만 화면 쪽으로 알리므로, 코드가 탭을 바꾸면(`TabManager.Activate` — 폴더 비교 두 번 누르기 두 곳 · Git 충돌 열기 · +파일 비교 → 폴더) 화면만 바뀐다. 사용자 허락("플랫폼 고쳐줘")을 받아 `UbisamCommonPlatform` 의 `ShellWindow` 가 +`SelectedMainTab` 변화를 듣고 선택만 맞추게 고쳤다(플랫폼 저장소 changelog · 가이드에 적음). 빌드 = 이 PC 배포 폴더에 바로 반영, +전 상태는 `D:\UbisamPlatform\bin-backup-navsync`. 화면 `g10-drop` ①: 두 번 누른 뒤 하단 탭 선택 **[0] → [1]**. + +### Git 탭에 폴더를 끌어다 놓으면 연다 (사용자 요청) + +- `PathUtil.RepositoryFolderFor` — 파일이면 그 폴더, 저장소 안이면 최상위, 저장소가 아니면 그 폴더 그대로(열기가 알린다). `[폴더...]` 도 같은 함수로 바꿨다. +- Git 탭 전체에서 `PreviewDragOver` · `PreviewDrop` 으로 받는다 — 경로 칸 · 커밋 메시지 칸(TextBox)이 파일 놓기를 먼저 먹는 문제(7차 E-2)를 피한다. + 파일 놓기만 가로채고 글자 끌어다 놓기는 그대로. 여럿이면 첫 것. +- 하네스 `PathTest` 6건을 먼저 넣어 **컴파일 실패** 확인 → 62 → 68건. +- 화면: 흉내 낸 OLE 끌기(작은 창에서 `DoDragDrop` + 다른 실이 마우스를 옮김)는 **이미 되는 폴더 비교 칸에도 안 들어갔다**(결과 None) — + 시험 도구의 한계로 보고(창 끌기와 같은 부류), **사용자가 직접 끌어다 놓아 확인**: 로그 17:03 · 17:04 `저장소 열기: D:\Sorce\UbisamCommonPlatform\` + (그 사이 [폴더...] · [열기] 누름 기록 없음, 오류 없음). + +### 파일 비교 편집 칸 바탕 (사용자 요청 "회색 말고, 어중간하게 말고") + +칸에 바탕이 없어 페이지 바탕(밝음 #F2F2F3 · 어두움 #23262B, 둘 다 회색)이 비쳤다. 플랫폼 토큰에 맞는 짝이 없어 `PaneBackgroundConverter` 가 +물려받은 글자색 밝기로 테마를 가린다(코드 글자색과 같은 방법). 흰색 · 순검정 → "너무 까맣다" → #1E1E1E → "둘 다 보기 편하게" 에서 +후보 네 개씩을 실제 코드 색으로 그려 보여 드렸고 **사용자가 밝음 #FAFAFA · 어두움 #252830** 을 골랐다. 네 칸(BASE · LOCAL · 원본 LOCAL · REMOTE)에. +화면 `g11-pane` 두 테마: 빈 자리 화소 #FAFAFA / #252830 (BaseLines · LocalEditor 모두). + ## G 묶음 마무리 — 알파 · 베타 전 정리 (2026-09-30, 사용자 지시 · 완료) ### 설정의 "프로그램 정보" 칸을 뺐다 diff --git a/doc/history/changelog.md b/doc/history/changelog.md index b6dbc36..b2767db 100644 --- a/doc/history/changelog.md +++ b/doc/history/changelog.md @@ -8,6 +8,7 @@ | 날짜 | 항목 | 커밋 | |---|---|---| +| 2026-09-30 | **커밋 뒤 사용자 요청 셋** — ① 폴더 비교에서 두 번 눌러 파일 비교로 가도 하단 탭이 옛 탭에 남던 것: 사용자가 쓰던 앱을 읽기만 해서 재현(화면 파일 비교 · 선택 0번), 원인은 공용 플랫폼 셸의 `NavList` 가 `SelectedMainTab` 을 따라가지 않는 것 — 허락받아 `UbisamCommonPlatform` 에서 고침(MergeHub 코드 변경 없음), `g10-drop` 선택 [0] → [1]. ② Git 탭에 폴더 · 파일을 끌어다 놓으면 그 저장소 최상위를 연다(`PathUtil.RepositoryFolderFor`, `[폴더...]` 와 같은 규칙, 탭 전체 Preview 로 받아 TextBox 가 먹는 문제 회피). `PathTest` 62 → 68건(먼저 실패 확인). 흉내 낸 OLE 끌기는 이미 되는 폴더 비교 칸에도 안 들어가 도구 한계로 보고 사용자가 직접 확인(로그 저장소 열기 두 번). ③ 파일 비교 편집 칸 바탕을 회색(페이지 바탕이 비침) → 밝음 #FAFAFA · 어두움 #252830(순검정 · #1E1E1E 를 거쳐 후보를 보고 사용자가 고름, `PaneBackgroundConverter`). `g11-pane` 두 테마 화소로 확인. 빌드 경고 0 · 오류 0 | 아래 | | 2026-09-30 | **12차 G 묶음 마무리(알파 · 베타 전)** — ① 설정의 `프로그램 정보`(만든 사람 · 사내 문의처) 칸을 뺐다 — 개발자 정보가 담당을 보인다(사용자). [정보] 창은 실행 파일 값만 읽고(`ProgramInfoReader.For` 의 설정 인수를 걷음), 빈 칸 안내 글에서 없어진 설정 자리를 뺐다. ② 사용자 요청 "작성자를 입력하지 않으면 알람" — 주석 남기기가 켜져 있는데 작성자가 비면 **반영 명령 맨 앞**(여덟 곳)에서 알림 창을 띄우고 반영하지 않는다(사용자 선택, 줄마다가 아니라 명령마다 — [모두 반영] 이 줄 수만큼 알리지 않게). 예전에는 git 이름 · 윈도우 계정으로 조용히 채웠다. 미리보기도 그 이름을 안 보인다. 한때 "주석 늘 켬" 으로 바꿨다가 사용자 지시로 원복. ③ 데모(설정 두 칸 · [데모 →] 단추 · 전환 코드)를 걷어냄. 이 PC 의 시험 재료는 휴지통으로, 설정 · 최근 목록의 시험 경로를 비움. 하네스 `AboutTest` 30 · `NoteTest` 99 · `OverviewTest` 15건(둘은 먼저 고쳐 컴파일 실패 확인), 화면 `g5` · `g6` · `g9-author`(새) 실패 0. 빌드 경고 0 · 오류 0 | 아래 | | 2026-09-30 | **12차 G-6 고침** — 사용자 지시로 개발자 정보 담당 카드를 갈래 둘(`Platform` 최민영 대리 · `MergeHub` 김승준 사원, 이름표 영문)로 바꾸고 사내 문의처는 **카드에서만** 뺐다([정보] 창과 G-5 구조는 그대로 — 사용자 선택). 사람은 `ProgramOverview` 상수 둘 — 설정의 "만든 사람" 은 정보 창의 회사 이름 받침이라 섞지 않는다. 소개 문구를 `사내 Git Merge/Diff 도구` → **`사내 Merge/Diff + Git 도구`**(Merge 가 먼저)로 csproj `` · 개발자 정보 기본값 · 정보 창 받침 · 창 제목(`MergeHub - 사내 Merge/Diff + Git`) 네 곳을 맞춤 — 창 제목은 플랫폼이 표시에만 쓰는 것을 읽어 확인. 하네스 `OverviewTest` 기대값을 먼저 바꿔 4건 실패 → 15건 통과, `AboutTest` 30건, 화면 `g6-verify` · `g5-verify` 실패 0. 빌드 경고 0 · 오류 0 | 아래 | | 2026-09-30 | **12차 G-8** — 메모 편집기에 문법 강조 · 같은 글 칠하기 · 색 마킹 다섯(Ctrl+1~5) · 오른쪽 위치 막대. 방식은 파일 비교와 같은 **투명한 TextBox + 아래층**(사용자 결정 — RichTextBox 는 칠하기가 되돌리기에 섞여 버림). 셈은 `MemoHighlight.cs`(하네스 `MemoHlTest` 45건), 그리기는 `MemoPaintLayer`(글자 자리를 편집기 `GetRectFromCharacterIndex` 에 묻고 탭마다 끊어 다시 묻는다). 언어 · 마킹은 메모마다 따로, 보관하지 않는다. 화면에서 셋을 고쳤다: ① 첫 시험에서 칠한 잉크가 0px — 플랫폼 암시적 TextBox 스타일이 템플릿 안에서 배경을 직접 칠해 아래층을 덮었다(LocalEditor 와 같은 까닭) → 편집기 · 줄 번호 칸 `Style="{x:Null}"`, 선택 색은 LocalEditor 와 같은 값 ② 강조 콤보에 형 이름이 보임 → `LanguageProfile.ToString() => Name`(G-4 `SaveChoice` 와 같은 길) ③ 사용자 보고 "어두운 테마에서 메모 제목이 안 보인다" — 탭 줄 `ItemContainerStyle` 이 플랫폼 스타일을 대신해 글자색이 검정으로 떨어짐(잉크 차이 116) → 그 스타일에 `ContentForeground`(587). 같은 구조인 파일 비교 문서 탭도 재현(157 · 116)해 같은 한 줄로 고침(546 · 587). 화면 `g8-verify` — 편집기 글자 칸과 칠한 잉크를 px 로 비교: +1~2px(탭 든 줄 · 가로 스크롤 포함) · 문법 색 · 같은 글 5곳/6곳 · 마킹 걸기/풀기/바꾸기/지우기 · 막대 눈금과 누르기 · **Ctrl+Z 가 칠하기로 한 걸음도 안 늘어남** — 밝은 · 어두운 **실패 0**. 사용자가 PC 를 쓰던 동안의 판은 흔들렸다(입력이 섞인 것으로 보이나 확정 못 함). 빌드 경고 0 · 오류 0 | 아래 | diff --git a/doc/진행상황.md b/doc/진행상황.md index 3a93804..37580dd 100644 --- a/doc/진행상황.md +++ b/doc/진행상황.md @@ -446,6 +446,9 @@ | 상태 | 항목 | |---|---| +| **완료** | **하단 탭이 따라가지 않는다**(사용자 보고) — 폴더 비교에서 두 번 눌러 파일 비교로 가도 하단 탭이 폴더 비교에 남았다. 원인은 공용 플랫폼 셸(`NavList` 가 `SelectedMainTab` 을 따라가지 않음) — 허락받아 플랫폼에서 고침. 화면 `g10-drop` 선택 [0] → [1] | +| **완료** | **Git 탭 끌어다 놓기**(사용자 요청) — 폴더 · 파일을 Git 탭 아무 데나 놓으면 그 저장소(최상위)를 연다. `[폴더...]` 와 같은 규칙(`PathUtil.RepositoryFolderFor`). 하네스 `PathTest` 62 → 68건. 흉내 낸 끌기는 도구 한계로 안 들어가 **사용자가 직접 확인**(로그의 저장소 열기 두 번) | +| **완료** | **파일 비교 편집 칸 바탕**(사용자 요청) — 회색이던 칸을 밝음 #FAFAFA · 어두움 #252830 으로(후보를 보고 사용자가 고름). 화면 `g11-pane` 두 테마 화소로 확인 | | **완료** | **작성자가 비면 반영하지 않고 알린다**(사용자 요청) — '반영한 줄에 주석 남기기' 가 켜져 있는데 작성자가 비면 반영 명령 여덟 곳 맨 앞에서 알림 창("작성자를 적어 주세요", 설정 자리를 댐)을 띄우고 멈춘다(사용자 선택). 주석을 끄면 묻지 않는다(늘 켬으로 바꿨다가 사용자 지시로 원복). 미리보기도 대신 채울 이름을 안 보인다. 하네스 `NoteTest` 93 → 99건, 화면 `g9-author` 실패 0 | | **완료** | **설정의 프로그램 정보 칸 · 데모 걷어냄**(사용자 지시) — 만든 사람 · 사내 문의처 칸을 뺐다(개발자 정보가 대신). [정보] 창은 실행 파일 값만, 빈 칸 안내는 `적혀 있지 않습니다`. 데모 설정 두 칸 · [데모 →] 단추 · 전환 코드를 지움. 이 PC 의 시험 재료 13개는 휴지통으로, 설정 · 최근 목록의 시험 경로를 비움. 하네스 `AboutTest` 30건, 화면 `g5` · `g6` 실패 0 | | **완료** | **담당 카드 · 소개 문구 고침**(사용자 지시, 12차 G-6 고침) — 개발자 정보 담당 카드를 `Platform` 최민영 대리 · `MergeHub` 김승준 사원 두 줄로, 사내 문의처는 카드에서만 뺌([정보] 창 · G-5 구조는 그대로). 소개 문구를 **`사내 Merge/Diff + Git 도구`**(Merge 먼저)로 — csproj 설명 · 개발자 정보 · 정보 창 받침 · 창 제목 네 곳. 하네스 `OverviewTest` 고치기 전 4건 실패 → 15건 통과, `AboutTest` 30건, 화면 `g6-verify` · `g5-verify` 실패 0 | diff --git a/src/MergeHub/Services/PathUtil.cs b/src/MergeHub/Services/PathUtil.cs index 245aeaa..bc734f9 100644 --- a/src/MergeHub/Services/PathUtil.cs +++ b/src/MergeHub/Services/PathUtil.cs @@ -77,6 +77,23 @@ namespace MergeHub.Services return string.Empty; } + + /// + /// Git 탭에서 열 경로 - [폴더...] 로 고른 것이나 탭에 끌어다 놓은 것(2026-09-30 사용자 요청)에 같은 규칙을 쓴다. + /// 파일이면 그 파일이 든 폴더, 저장소 안이면 최상위. 저장소가 아니면 그 폴더 그대로 돌려준다 - + /// 거기서 [열기] 가 "저장소가 아니다" 라고 알린다(말없이 무시하면 놓은 사람이 무슨 일인지 모른다). + /// 없는 경로면 빈 문자열. + /// + public static string RepositoryFolderFor(string? path) + { + var folder = FullFolderPath(path); + if (folder.Length == 0) folder = FolderOfFile(path); + if (folder.Length == 0) return string.Empty; + + var root = FindRepositoryRoot(folder); + return root.Length > 0 ? root : folder; + } + /// 파일 경로가 든 폴더를 정규화해서 돌려준다. 확인할 수 없으면 빈 문자열. public static string FolderOfFile(string? filePath) { diff --git a/src/MergeHub/Views/Controls/PaneBackgroundConverter.cs b/src/MergeHub/Views/Controls/PaneBackgroundConverter.cs new file mode 100644 index 0000000..39dee82 --- /dev/null +++ b/src/MergeHub/Views/Controls/PaneBackgroundConverter.cs @@ -0,0 +1,44 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using System.Windows.Media; + +namespace MergeHub.Views.Controls +{ + /// + /// 파일 비교 편집 칸의 바탕 - 밝은 테마 #FAFAFA(부드러운 흰색), 어두운 테마 #252830(짙은 남색). 사용자가 후보를 보고 골랐다(2026-09-30). + /// 흰색 · 순검정으로 했다가 "어두운 쪽이 너무 까맣다", "둘 다 보기 편하게" 해서 바꿨다. 어두운 쪽은 페이지(#23262B)와 같은 남색 톤이라 튀지 않는다. + /// + /// + /// 예전에는 칸에 바탕이 없어 뒤의 페이지 바탕(밝음 #F2F2F3 · 어두움 #23262B)이 비쳤다 - 둘 다 회색이다. + /// 플랫폼 색 토큰에는 흰색/검은색 짝이 없어서, 코드 글자색()과 같은 방법으로 + /// 물려받은 글자색의 밝기로 테마를 가린다. 테마를 바꾸면 글자색이 바뀌어 바인딩이 다시 돈다. + /// + /// + public sealed class PaneBackgroundConverter : IValueConverter + { + public static readonly Brush Light = Freeze(Color.FromRgb(0xFA, 0xFA, 0xFA)); + public static readonly Brush Dark = Freeze(Color.FromRgb(0x25, 0x28, 0x30)); + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => + IsLightText(value as SolidColorBrush) ? Dark : Light; + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + throw new NotSupportedException(); + + /// 글자색이 밝으면 어두운 테마다. 글자색을 모르면 밝은 테마로 본다. + public static bool IsLightText(SolidColorBrush? brush) + { + if (brush is null) return false; + var c = brush.Color; + return (0.299 * c.R + 0.587 * c.G + 0.114 * c.B) / 255.0 > 0.5; + } + + private static Brush Freeze(Color color) + { + var b = new SolidColorBrush(color); + b.Freeze(); + return b; + } + } +} diff --git a/src/MergeHub/Views/GitView.xaml b/src/MergeHub/Views/GitView.xaml index 1f88e0a..f06c28c 100644 --- a/src/MergeHub/Views/GitView.xaml +++ b/src/MergeHub/Views/GitView.xaml @@ -6,6 +6,7 @@ xmlns:local="clr-namespace:MergeHub.Views" xmlns:shell="clr-namespace:UbisamBase.Core.Shell;assembly=UbisamBase.Core" shell:PlatformChrome.FullBleed="True" + AllowDrop="True" PreviewDragOver="View_PreviewDragOver" PreviewDrop="View_PreviewDrop" mc:Ignorable="d"> diff --git a/src/MergeHub/Views/GitView.xaml.cs b/src/MergeHub/Views/GitView.xaml.cs index 48a8fea..4a778fe 100644 --- a/src/MergeHub/Views/GitView.xaml.cs +++ b/src/MergeHub/Views/GitView.xaml.cs @@ -102,14 +102,46 @@ namespace MergeHub.Views var picked = MergeHub.Services.FolderPicker.Pick("Git 저장소 폴더 고르기", vm.Workspace.RepositoryPath); if (picked is null) return; - // .git 은 최상위에만 있다. 하위 폴더를 골랐어도 위로 거슬러 올라가 최상위를 연다 - - // 사람은 지금 보고 있던 깊은 폴더를 고르기 마련이다. - var root = MergeHub.Services.PathUtil.FindRepositoryRoot(picked); - vm.Workspace.RepositoryPath = root.Length > 0 ? root : picked; + OpenFolder(vm, picked); + } + /// + /// 경로 칸에 넣고 [열기]. [폴더...] 와 끌어다 놓기가 같은 길을 탄다. + /// .git 은 최상위에만 있다 - 하위 폴더 · 파일을 골랐어도 위로 거슬러 올라가 최상위를 연다(사람은 보던 깊은 곳을 고르기 마련이다). + /// + private static void OpenFolder(GitViewModel vm, string path) + { + var folder = MergeHub.Services.PathUtil.RepositoryFolderFor(path); + if (folder.Length == 0) return; + + vm.Workspace.RepositoryPath = folder; if (vm.OpenCommand.CanExecute(null)) vm.OpenCommand.Execute(null); } + // ================= 끌어다 놓기 (2026-09-30 사용자 요청) ================= + // + // 탐색기에서 폴더(또는 그 안의 파일)를 Git 탭 아무 데나 놓으면 그 저장소를 연다. + // Preview 로 받는 까닭 - 커밋 메시지 · 경로 칸 같은 TextBox 는 클래스 처리기가 Drop 을 먼저 먹고 + // 파일 목록은 버린다(폴더 비교 7차 E-2 에서 겪었다). 파일 놓기만 가로채고 글자 끌어다 놓기는 그대로 둔다. + + private void View_PreviewDragOver(object sender, DragEventArgs e) + { + if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return; + e.Effects = DragDropEffects.Copy; + e.Handled = true; + } + + private void View_PreviewDrop(object sender, DragEventArgs e) + { + if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return; + e.Handled = true; + if (ViewModel is not { } vm) return; + if (e.Data.GetData(DataFormats.FileDrop) is not string[] { Length: > 0 } paths) return; + + // 여럿을 놓았으면 첫 것만 - 저장소는 한 번에 하나만 열린다. + OpenFolder(vm, paths[0]); + } + // PasswordBox 는 보안상 Password 를 바인딩할 수 없어 코드 비하인드로 전달한다. /// 충돌 목록을 두 번 누르면 파일 비교 탭의 3분할에서 연다(6차 B-1). 항목 위가 아니면 무시한다. private void Conflicts_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) diff --git a/src/MergeHub/Views/HomeView.xaml b/src/MergeHub/Views/HomeView.xaml index 97006ec..b95ab40 100644 --- a/src/MergeHub/Views/HomeView.xaml +++ b/src/MergeHub/Views/HomeView.xaml @@ -48,6 +48,8 @@ + + @@ -1181,7 +1183,8 @@ --> + BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}" + Background="{Binding (TextElement.Foreground), RelativeSource={RelativeSource Self}, Converter={StaticResource PaneBackground}}"> @@ -1260,7 +1263,8 @@ + BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}" + Background="{Binding (TextElement.Foreground), RelativeSource={RelativeSource Self}, Converter={StaticResource PaneBackground}}">