feat: restore legacy modal and drag behavior
This commit is contained in:
@@ -182,19 +182,20 @@
|
||||
|
||||
고정한 계약:
|
||||
|
||||
- modal에서 처리한 Escape/F2/F3/F8은 뒤의 playout key listener로 전달하지 않는다. 이름 있는
|
||||
playlist modal의 Escape는 modal만 닫고 TAKE OUT을 보내지 않는다.
|
||||
- 원본 child form에는 `CancelButton`/`KeyPreview`/Escape handler가 없고 `ShowDialog`가 MainForm을
|
||||
비활성화한다. 따라서 modal의 Escape는 form을 닫지도 TAKE OUT을 보내지도 않으며,
|
||||
F2/F3/F8과 playlist 전역 키도 owner로 전달하지 않는다.
|
||||
- Delete는 원본 KeyPreview처럼 playlist 삭제 intent를 보내되 기본 키를 억제하지 않아,
|
||||
텍스트 입력이 focus를 가진 경우 문자 삭제도 정상 동작한다.
|
||||
- 시작 기본 배경은 `Cuts\video\기본.vrv`, F2/F3 기본 배경은 `Cuts\..\배경\기본.vrv`로
|
||||
분리하고 두 신뢰 root가 서로 대신하지 않게 했다.
|
||||
- 화면에 원본 `DissolveTime` 1..20을 표시하고 C#에는 인덱스 0..19만 보낸다. 기본 인덱스는
|
||||
6(화면 7)이며, PREPARE/F8 때 현재 전역 인덱스를 기존 playlist 모든 entry에 적용한다.
|
||||
행 생성 시 저장된 기본 6이 전역 선택을 덮어쓰던 경로는 제거했다.
|
||||
- 원본 `DissolveTime`을 소유한 `panel3`은 Designer에서 항상 숨겨져 있으므로 WebView selector도
|
||||
hidden/disabled로 유지하고 운영자 변경 intent를 노출하지 않는다. C#의 기존 0..19 인덱스와
|
||||
기본값 6은 scene effect 상태로만 보존한다.
|
||||
|
||||
## Slice 6: 탭 재진입과 dragover 교환
|
||||
|
||||
상태: 코드 및 자동 테스트 완료, 실제 DB 쓰기/Tornado 명령은 실행하지 않음.
|
||||
상태: 코드 및 자동 테스트 완료, 실제 DB/Tornado 명령은 실행하지 않음.
|
||||
|
||||
원본 근거:
|
||||
|
||||
@@ -278,11 +279,61 @@
|
||||
- PREPARED/PROGRAM/pending/unknown 또는 종목 미선택 상태에서는 컷 선택과 focus 이동을 함께
|
||||
차단해 DOM과 C# 상태가 어긋나지 않게 한다.
|
||||
|
||||
## Slice 10: modal 소유권·PList 완료 순서와 컷 drag 임계값
|
||||
|
||||
상태: 코드·자동 테스트·unsigned Release package-context 시작/정상 종료 완료. 실제 컷 drag
|
||||
마우스 실측과 DB 쓰기/Tornado 명령은 실행하지 않음.
|
||||
|
||||
원본 근거:
|
||||
|
||||
- `Form/PList.cs:173-196`, `222-237` 행 double-click과 확인 버튼 save/load/close 순서
|
||||
- `Form/PList.cs:184`, `226`, `229`의 `저장하겠습니까?`, `저장되었습니다`
|
||||
- `Form/*Designer.cs`의 child form에 없는 `CancelButton`, `KeyPreview`, Escape handler
|
||||
- `MainForm.cs:3427-3459`, `3534-3549`, `3635-3643` 컷 mouse-down rectangle,
|
||||
drag 시작과 체크 행 physical-order drop
|
||||
- `MainForm.Designer.cs:1391-1399` 숨겨진 `panel3`
|
||||
|
||||
고정한 계약:
|
||||
|
||||
- named playlist, GraphE, FSell/VI, ThemeA/EList modal은 opener를 기억하고 최초 legacy control에
|
||||
focus하며 Tab/Shift+Tab을 modal 안에 가둔다. 중첩 alert를 닫으면 child modal의 이전 control로,
|
||||
child modal을 닫으면 owner control로 focus를 돌려준다.
|
||||
- child modal의 Escape는 원본처럼 no-op으로 소비하고 MainForm TAKE OUT으로 새지 않는다.
|
||||
- PList save는 정확히 `저장하겠습니까?`를 묻는다. 확인 버튼 save 성공만
|
||||
`저장되었습니다`를 표시하고, 행 double-click save는 성공 알림 없이 닫는다. No를 선택해도
|
||||
원본의 unconditional `Close()`처럼 modal을 닫는다.
|
||||
- 비동기 DB 명령 중에는 원본 동기 `ShowDialog` 호출이 반환되지 않던 구간처럼 close/cancel과
|
||||
중복 명령을 잠근다. 정확한 command/requestId/definition/sequence receipt만 modal을 닫으며
|
||||
실패 또는 결과 불명확 상태에서는 성공 알림·추정 close를 하지 않는 안전 교정을 유지한다.
|
||||
- `PList.Get_FileName_Folder`가 새 `DataSource`를 지정할 때 non-empty ListBox의 첫 행이 자동
|
||||
선택되는 동작을 열기·새로고침·추가·삭제 뒤 모두 유지한다. 다른 행 click은 즉시 시각 선택을
|
||||
바꾸되 exact native selection receipt 전에는 확인·삭제를 잠그고, double-click은 같은 opaque
|
||||
definition id에 묶어 receipt 뒤 한 번만 실행하므로 이전 첫 행을 잘못 저장/삭제하지 않는다.
|
||||
- DB commit이 확정되고 read-back만 실패한 `CommittedOptimistic`은 원본처럼 저장 완료로
|
||||
처리하되 warning은 유지한다. 반대로 이전 성공 outcome이 남은 채 현재 입력 검증이 실패한
|
||||
경우에는 named workflow revision이 증가하지 않으므로 성공 receipt·알림·close를 만들지 않는다.
|
||||
- category tree 검색 input을 state render가 다시 만들더라도 id, caret/selection 범위와 focus를
|
||||
복원해 Enter 검색 뒤 원본 textbox의 연속 입력 동작을 유지한다.
|
||||
- 컷 drag rectangle은 `Point(x-SM_CXDRAG, y-SM_CYDRAG)`와 Windows drag size를 사용하고
|
||||
left/top 포함, right/bottom 제외 `Rectangle.Contains` 판정을 그대로 적용한다. 브라우저 native
|
||||
drag 임계값은 사용하지 않으며 pointer capture 뒤 playlist 경계 안에서 놓았을 때만 기존
|
||||
`DropSelectedCutsOnPlaylist`를 한 번 호출한다.
|
||||
- `SM_CXDRAG/SM_CYDRAG`는 DPI 비인지 `GetSystemMetrics` 값을 그대로 쓰지 않는다.
|
||||
`GetSystemMetricsForDpi(..., 96)`로 XAML host DIP 값을 읽고 `XamlRoot.RasterizationScale`도
|
||||
state에 싣는다. Web은 이를 `window.devicePixelRatio`와 대조해 과거 profile에 남은 browser
|
||||
zoom까지 제거한 pointer-event CSS pixel 임계값을 계산한다. 100%/150% DPI와 retained zoom을
|
||||
자동 테스트하며 비정상 scale 비율은 1로 fail-safe한다.
|
||||
- `WM_SETTINGCHANGE`/`WM_DISPLAYCHANGE`/`WM_DPICHANGED`와 모든 state 게시 경계에서 값을 다시
|
||||
읽어 시작 시 한 번만 캐시하지 않는다. cut-pointer-down 회신이 도착했을 때 아직 시작되지
|
||||
않은 pointer gesture의 rectangle도 최신 값으로 다시 만든다. 이후 browser/pinch zoom 입력은
|
||||
비활성화하고 API 실패나 0 이하는 축별 4 DIP로 fail-safe한다. 실제 drop 내용은 payload가
|
||||
아니라 C#의 현재 선택 집합과 physical 순서가 계속 권위본이다.
|
||||
|
||||
## 다음 대조 순서
|
||||
|
||||
1. 컷 ListView의 drag 시작 임계값과 실제 package 키보드 회귀
|
||||
2. GraphE/FSell/VI/PList/AList/ThemeA/EList modal별 남은 키·focus·취소 이벤트
|
||||
1. 새 package에서 실제 마우스·키보드·컷/playlist drag 회귀
|
||||
2. ThemeA/EList 편집 save/delete/close의 세부 확인 문구와 focus 순서 대조
|
||||
3. 자동 갱신 UI의 실제 실행 상태 기반 통합 테스트와 종료 상태 행렬
|
||||
4. Debug/Release x64와 새 package에서 실제 마우스·키보드·drag 회귀
|
||||
4. 다음 Designer handler 묶음의 원본 코드·상태 전이 대조
|
||||
|
||||
각 항목은 실제 원본 코드 근거와 회귀 테스트가 모두 생기기 전에는 완료로 판정하지 않는다.
|
||||
|
||||
Reference in New Issue
Block a user