Skip to content

표 편집(삭제/생성/행열 삽입·삭제/셀 분할·병합) Undo/Redo 미동작 #204

@edwardkim

Description

@edwardkim

현상

편집 영역에서 표를 삭제하거나 행/열을 삽입·삭제해도 Ctrl+Z 로 되돌릴 수 없음. 셀 분할/병합도 동일. 사용자가 실수로 표를 날리면 복구 불가.

진단 결과 (v0.7.3 시점)

근본 원인

rhwp-studio 에는 두 개의 편집 경로가 있음:

  1. 텍스트 편집history.tsEditCommand 스택을 통해 정상적으로 do/undo 쌍 등록
  2. 표 편집hwpctl/actions/table-edit.ts 에서 WASM doc.deleteTableRow/Column/...직접 호출. history.execute()saveSnapshot() 을 거치지 않음

관련 코드:

누락된 Command (8건)

  1. 표 생성 (`createTable`)
  2. 표 삭제 (`deleteTable`)
  3. 행 삽입 (`insertTableRow`)
  4. 행 삭제 (`deleteTableRow`)
  5. 열 삽입 (`insertTableColumn`)
  6. 열 삭제 (`deleteTableColumn`)
  7. 셀 분할 (`splitTableCell`)
  8. 셀 병합 (`mergeTableCells`)

관련 이슈

해결 방안

A안 — 정공법: 개별 EditCommand 로 래핑

각 표 연산마다 do/undo 쌍을 갖는 EditCommand 클래스 추가. 텍스트 편집과 동일한 방식.

  • 장점: 메모리 효율 (delta 만 저장), 표준 패턴 일관성
  • 단점: 8개 Command 구현 필요, IR 수준 역연산 로직 (특히 셀 병합 복원) 복잡

B안 — 스냅샷 + SnapshotCommand 일괄 래핑

표 편집 전 `Document` clone → 편집 실행 → SnapshotCommand(before, after) 로 history 등록. 기존 SnapshotCommand 패턴 재사용.

  • 장점: 구현 최소 (`table-edit.ts` 에서 `history.execute(new SnapshotCommand(...))` 래핑만)
  • 단점: 메모리 사용량 ↑ (대형 문서에서 표 1건 편집당 전체 문서 2개 복제)

C안 — 하이브리드

쉬운 연산(행/열 삽입·삭제)은 A안, 복잡한 연산(셀 병합·분할)은 B안. 점진적 이전.

제안 마일스톤

M07x (v0.7.x) — 사용자 데이터 보호 관점에서 우선순위 높음. v1.0.0 전 필수.

테스트 체크리스트

  • 표 삭제 → Ctrl+Z → 원본 표 복원
  • 행 삽입 → Ctrl+Z → 원래 행 수 복원
  • 행 삭제 → Ctrl+Z → 삭제된 행 내용 복원
  • 열 삽입/삭제 → Ctrl+Z (동일)
  • 셀 분할 → Ctrl+Z → 원래 셀 복원
  • 셀 병합 → Ctrl+Z → 분리된 셀 복원
  • Ctrl+Y (redo) 왕복 3회 무손상
  • 표 편집 후 텍스트 편집 → Ctrl+Z 스택 순서 유지

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestrustPull requests that update rust code

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions