38 lines
2.1 KiB
Markdown
38 lines
2.1 KiB
Markdown
# Contract: 캡쳐 이미지 브릿지 + 챗 첨부
|
|
|
|
## C#→JS 메시지 (신규)
|
|
|
|
기존 `SendToWeb`(`CoreWebView2.PostWebMessageAsJson`) 채널 재사용.
|
|
|
|
| 방향 | 메시지 | 처리 |
|
|
|---|---|---|
|
|
| C#→JS | `{type:"capture.image", dataUrl}` | 프론트가 캡쳐 이미지를 챗 입력창 첨부로 받음 |
|
|
|
|
- `dataUrl`: `data:image/png;base64,...` (PNG).
|
|
- App 캡쳐 완료 순서: `ShowPalette()` → `NavigateApp("/snap/new")` → `SendCaptureImage(dataUrl)`. (navigate·소환은 기존 배선.)
|
|
- 기존 메시지(navigate·paste.target·window.*·snippets.* 등)와 같은 리스너 허브에서 `type`으로 분기.
|
|
|
|
## C# 표면 (신규/확장)
|
|
|
|
- `Shell/Platform/ScreenCapture.cs` — `static byte[] CapturePng(int x, int y, int width, int height)`: 물리 좌표 영역을 `CopyFromScreen`으로 PNG 바이트. (좌표 변환은 호출측=오버레이 몫.)
|
|
- `Views/CaptureOverlayWindow` — 드래그 선택 + DIP→물리 변환 + `ScreenCapture.CapturePng` 호출 → `event Action<string> Captured`(base64 dataUrl) / `event Action Cancelled`.
|
|
- `App.xaml.cs` — 핫키 id `0x1002`(Ctrl+Shift+9) → 오버레이 표시. `Captured` → 위 순서 실행. `Cancelled` → 무시.
|
|
- `PaletteWindow.SendCaptureImage(string dataUrl) => Web.SendToWeb(new { type = "capture.image", dataUrl });`
|
|
|
|
## 프론트 계약 (`bridgeNavigate.ts`)
|
|
|
|
```ts
|
|
// 마지막 캡쳐 이미지 dataUrl 을 1회 소비(마운트 레이스 대비). 없으면 "".
|
|
export function consumePendingCaptureImage(): string
|
|
// capture.image 수신 → pendingCaptureImage 갱신 + window.dispatchEvent(new CustomEvent("bridge:captureImage", { detail: { dataUrl } }))
|
|
```
|
|
|
|
## 프론트 계약 (`Composer.tsx`)
|
|
|
|
- 상태 `imageAttachments: string[]`(dataUrl). 마운트 시 `consumePendingCaptureImage()` push + `bridge:captureImage` 구독 push. X 제거. (data-model.md 규칙.)
|
|
- v1 전송: 텍스트만. 이미지 첨부는 미전송 + 전송 후 정리.
|
|
|
|
## 순수 브라우저(dev)
|
|
|
|
`SendToWeb`/`chrome.webview` 없음 → capture.image 안 옴, 캡쳐 기능 비활성(데스크톱 전용). 기존 챗은 그대로.
|