1
0
Fork 0
Windows 우클릭 한 방에 모든 것을 모든 것으로 양방향 변환 (WPF Fluent 2 + TDD)
Find a file
Yun Chan 00d1eeff96 ux: 우클릭 → 메인 윈도우 통합 + Preview를 우측 컬럼으로 승격
우클릭 진입 통합
- App.OnStartup의 dialog 분기에서 ConvertWindow 대신 MainWindow를 띄우면서
  파일을 Active Queue에 자동 추가, 첫 항목 자동 Preview 로드.
- 사용자 시점에서 우클릭 → "JPEG로 변환…" 클릭 시 작은 다이얼로그가
  아니라 풀스크린 FormatShift 메인 화면이 그대로 노출.
- ConvertWindow 자체는 FormatShift 토큰으로 통일했지만 더 이상 호출되지
  않음 (코드는 향후 활용 위해 보존).

Preview를 탭 → 우측 메인 컬럼으로 승격
- 메인 영역 그리드를 1 column → 2 column 으로 분할: 좌측 *(min 360),
  우측 380px 고정 Preview 컬럼.
- 탭은 Active Queue / Past Results 두 개만 (Preview 탭과 무의미한 0 뱃지
  제거). Preview는 항상 보임.
- Active Queue 행 클릭 → 우측 Preview에 즉시 표시 (탭 전환 없음).
- Past Results 행도 클릭 가능: 실제 파일이면 미리보기, 데모/소실 파일이면
  안내 문구.
- Drop hint overlay는 ColumnSpan=2로 양쪽 컬럼 모두 덮음.

이벤트 처리 개선
- 행 Border에 PreviewMouseLeftButtonUp(tunnel) 사용 → 자식 컨트롤이 클릭을
  가로채는 이슈 해소.
- IsInsideButton 헬퍼로 Remove/Open 버튼이 발화시킨 클릭은 행 핸들러에서
  무시하여 의도 충돌 방지.

App.xaml 정리
- FormatShiftTheme.xaml 을 App-level resources에 머지 → 모든 윈도우에서
  Application.Current.FindResource("Fs*") 조회 가능 (이전엔 Window-level
  머지만 해서 ResourceReferenceKeyNotFoundException 발생).

LoadPreview 통합
- LoadPreviewByPathAsync(path, fileName, format, size) 단일 메서드로 통합.
- _selectedPreviewPath 로 Active/Past 두 케이스 모두 Open in Explorer 일관
  처리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 19:26:27 +09:00
.github/workflows Phase 2: MSIX 패키지 + IExplorerCommand 셸 익스텐션 2026-05-06 13:03:16 +09:00
packaging Phase 3: HTML(WebView2) + HWP/HWPX(LibreOffice) 실구현 2026-05-06 13:23:47 +09:00
src ux: 우클릭 → 메인 윈도우 통합 + Preview를 우측 컬럼으로 승격 2026-05-06 19:26:27 +09:00
.gitignore Phase 2: MSIX 패키지 + IExplorerCommand 셸 익스텐션 2026-05-06 13:03:16 +09:00
EverythingToJpeg.slnx 초기 커밋: Phase 1 — 레지스트리 기반 컨텍스트 메뉴 + 핵심 변환 파이프라인 2026-05-06 12:50:35 +09:00
README.md Phase 3: HTML(WebView2) + HWP/HWPX(LibreOffice) 실구현 2026-05-06 13:23:47 +09:00

EverythingToJpeg

Windows 우클릭 컨텍스트 메뉴에서 한 방에 JPEG로. PNG · GIF · BMP · TIFF · WebP · AVIF · HEIC · RAW · PSD · PDF · DOCX 를 지원합니다.

  • 빠른 변환 — 다이얼로그 없이 원본 폴더의 <원본명>_jpeg/ 하위에 즉시 저장
  • 변환… — 옵션 다이얼로그(품질, 출력 위치, 이름 충돌, 크기 제한, PDF DPI)
  • 진행 상황 + 썸네일 + 드래그 & 드롭 (메인 창)

빠른 시작

1) 빌드

# 솔루션 빌드
dotnet build EverythingToJpeg.slnx -c Release

# 단일 폴더 publish (framework-dependent, .NET 9 Desktop Runtime 필요)
dotnet publish src\EverythingToJpeg.App\EverythingToJpeg.App.csproj `
    -c Release -r win-x64 --self-contained false -o publish

# .NET 런타임 동봉 (단일 사용자 배포가 편함)
dotnet publish src\EverythingToJpeg.App\EverythingToJpeg.App.csproj `
    -c Release -r win-x64 --self-contained true `
    -p:PublishSingleFile=false -o publish-self

산출물: publish\EverythingToJpeg.exe

2) 컨텍스트 메뉴 등록

EverythingToJpeg.exe를 한 번 실행 → "컨텍스트 메뉴 등록" 클릭. 또는 CLI:

.\EverythingToJpeg.exe register
.\EverythingToJpeg.exe unregister

Windows 11 메인 우클릭 메뉴가 아니라 "추가 옵션 표시(Shift+우클릭)" 메뉴에 노출됩니다. 메인 메뉴 노출은 Phase 2에서 IExplorerCommand + MSIX 로 추가 예정.

3) 사용

  • 파일 우클릭 → "추가 옵션 표시" → JPEG로 빠른 변환 또는 JPEG로 변환…
  • 또는 메인 창에 파일/폴더를 끌어다 놓기

지원 현황

형식 상태 참고
PNG · BMP · JPEG · WebP · AVIF · PSD · TIFF · GIF · RAW(NEF/CR2/CR3/ARW/DNG/RAF/ORF/RW2/SRW/PEF) 준비됨 Magick.NET 14.x
HEIC · HEIF 준비됨 PhotoSauce + libheif 디코드
PDF 준비됨 PDFtoImage(PDFium)
HTML · HTM 준비됨 WebView2 헤드리스 + CDP Page.captureScreenshot 풀페이지
DOCX · DOC ⚙ 외부 도구 필요 Microsoft Word 또는 LibreOffice 자동 감지
HWP · HWPX ⚙ 외부 도구 필요 LibreOffice + H2Orestart 확장

기술 스택

  • .NET 9 + WPF, Windows 10.0.19041.0+
  • UI: WPF-UI 4.3 (Win11 Fluent 2 — Mica 백드롭, Segoe UI Variable 타입 램프)
  • 변환 엔진: Magick.NET, PDFtoImage, PhotoSauce.MagicScaler + Libheif

로드맵

단계 상태 내용
Phase 1 레지스트리 컨텍스트 메뉴 (Win11 "추가 옵션 표시"), 핵심 변환(이미지·HEIC·RAW·PDF·DOCX), Fluent UI
Phase 2 C++ IExplorerCommand DLL, MSIX 패키징, 자체 서명 인증서, GitHub Releases 자동화 — packaging/README.md 참조
Phase 3 HTML(WebView2), HWP/HWPX(LibreOffice + H2Orestart) 실구현

두 가지 사용 방식

A) Portable EXE — 가장 가벼움 (Phase 1)

  • dotnet publish 산출물 그대로 사용
  • 우클릭 → 추가 옵션 표시 → "JPEG로 빠른 변환" / "JPEG로 변환…"
  • 인증서·서명 불필요

B) MSIX 패키지 — Win11 메인 메뉴 노출 (Phase 2)

  • packaging/BuildMsix.ps1 로 MSIX 빌드
  • 자체 서명 인증서를 LocalMachine\TrustedPeople에 임포트 후 사이드로드
  • 우클릭 → 바로 메인 메뉴에 항목 노출
  • 자세한 절차는 packaging/README.md

프로젝트 구조

everythingToJpeg/
├── EverythingToJpeg.slnx
└── src/
    ├── EverythingToJpeg.Core/        — 변환 엔진, Provider 추상화
    │   ├── Providers/                — IConverterProvider + Capability 메타데이터
    │   ├── Converters/               — Magick / Heic / Pdf / Docx / Html / Hwpx
    │   ├── ConversionEngine.cs
    │   └── EverythingToJpegBootstrap.cs
    └── EverythingToJpeg.App/         — WPF + CLI 통합 진입점
        ├── App.xaml(.cs)             — CLI 라우터
        ├── Cli/CliRouter.cs          — verb: quick / dialog / register / diagnose
        ├── Shell/ContextMenuRegistrar.cs — HKCU 레지스트리 등록
        └── Views/                    — Fluent UI 화면

Provider 전략 (확장 포인트)

새 형식을 지원하려면 IConverterProvider를 구현하고 EverythingToJpegBootstrap.CreateDefault()에 등록합니다. ProviderCapability에 다음을 명시하세요:

  • StatusAvailable / Preview / RequiresExternal / ComingSoon / Disabled
  • Extensions — 자동 라우팅 + 컨텍스트 메뉴 등록 키
  • ExternalDependencies — UI에 자동 노출되는 외부 도구
  • RoadmapNote — 사용자에게 보여줄 향후 계획

ComingSoon 상태는 메인 창의 "지원 형식" 섹션에 자동 노출되지만 컨텍스트 메뉴 등록에서는 자동 제외됩니다.

라이선스

MIT (예정).