Skip to content

도형 리사이즈 시 width=0 전송으로 도형이 사라지는 문제 (Rectangle·Group) #162

@seunghan91

Description

@seunghan91

증상

MDM 데스크톱 앱(vendored rhwp 0.7.2)에서 사용자 피드백으로 확인된 이슈입니다.

  • HWP 문서에서 도형 리사이즈 핸들을 반대편 너머로 여러 번 드래그하다 보면 도형이 갑자기 화면에서 사라집니다.
  • Ctrl+Z 로 되돌리기도 동작하지 않습니다.
  • IR(문서 모델)에는 도형이 남아 있지만 렌더러 출력이 비어 시각적으로 "지워진 것처럼" 보입니다.

재현 문서: 사용자 로컬 HWP (공개 불가). 유사한 도형 포함 HWP에서 재현 가능.

루트 원인 (document_core/commands/object_ops.rs)

set_shape_properties_native 경로에서 width/height 에 대한 최소값 검증이 없습니다.

studio가 리사이즈 드래그 중 width=0 또는 height=0 을 setShapeProperties 로 전송하면:

  1. Rectangleobject_ops.rs:1755-1760
    ```rust
    let w = rect.common.width as i32;
    let h = rect.common.height as i32;
    rect.x_coords = [0, w, w, 0];
    rect.y_coords = [0, 0, h, h];
    ```
    w=0, h=0 이면 x_coords=[0,0,0,0] / y_coords=[0,0,0,0] 로 붕괴.

  2. Groupobject_ops.rs:1764-1777
    ```rust
    if let Some(nw) = new_w {
    group.shape_attr.current_width = nw;
    // original_width는 유지 (스케일 기준)
    }
    ```
    current_width=0 이면 current/original 스케일 비율이 0 이 되어 자식 전부 0배 렌더링.

apply_common_obj_attr_from_json (object_ops.rs:1402-1403) 역시 동일하게 raw u32 를 그대로 기록합니다.

관련: Ctrl+Z 미작동 (별도 이슈)

코어에는 save_snapshot_native / restore_snapshot_native 스냅샷 API가 이미 존재합니다 (document.rs:305-343). studio 측에서 리사이즈 드래그 시작 시점에 saveSnapshot 을 호출하지 않는 것으로 보이며, 이 때문에 중간 0-width 상태를 undo 스택에 잡지 못합니다. 이 부분은 studio 쪽 범위라 별도 이슈/PR로 분리하는 게 적절해 보입니다.

제안 수정안

table_ops.rs:572MIN_CELL_SIZE: u32 = 200 (≈0.7mm) 전례를 따라 MIN_SHAPE_SIZE: u32 = 200 을 도입하고 두 지점에서 clamp:

  • apply_common_obj_attr_from_json 의 width/height 할당 시 .max(MIN_SHAPE_SIZE)
  • set_shape_properties_nativenew_w/new_h 읽기 시점에 .max(MIN_SHAPE_SIZE)

회귀 테스트 3개도 함께 포함:

  • resize_to_zero_width_clamps_to_min
  • rectangle_coords_nonzero_after_shrink_to_zero
  • repeated_zero_resize_does_not_corrupt_state

PR 준비했습니다 (devel 대상). 승인 주시면 push 하겠습니다. 기존 MDM→rhwp 역기여 맥락 (#153, #154) 의 연장선입니다.

환경

  • rhwp 0.7.2 (vendored in MDM)
  • 재현 플랫폼: macOS (Tauri v2 데스크톱 앱)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions