골라서, 끌어서, 줄 세운다 — 책갈피를 손에 익게 (ICEPDF v1.6.0)
책갈피가 늘어나니 정리가 일이 됐다. 여러 개를 골라 한 번에 지우고, 끌어서 순서를 바꾸고, 페이지 순으로 줄 세운다. 그리고 '드래그가 안 돼요' 한마디에서 시작된 한 줄짜리 버그 추적기.
책갈피를 몇십 개씩 달다 보니, 정작 정리가 일이 됐다. 하나 지우려면 그 줄의 ✕을 찾아 누르고, 위로 올리려면 ▲를 여러 번 두드리고. 뷰어일 땐 몰랐는데 "에디터"라면서 이건 손이 너무 갔다. v1.6.0은 책갈피를 손에 익게 만드는 데 썼다 — 골라서 지우고, 끌어서 옮기고, 한 번에 줄 세운다.
1. 여러 개를 한 번에 — 다중 선택
이제 책갈피도 파일 탐색기처럼 고른다. Shift+클릭은 먼저 고른 곳부터 클릭한 곳까지를 한 번에, Ctrl+클릭은 원하는 것만 콕콕 집어 추가로 선택한다. 여러 개를 골라 놓으면 위쪽 "선택 삭제 (3)" 버튼이 몇 개를 지울지 알려 주고, 한 번에 정리된다. 부모 책갈피를 지우면 그 아래 하위 책갈피도 함께 사라진다.
2. 끌어서 순서 바꾸기
위/아래 버튼을 연타하던 걸 드래그로 바꿨다. 책갈피를 집어 다른 항목의 위 절반에 놓으면 그 앞으로, 아래 절반이면 그 뒤로 들어간다(끄는 동안 파란 선으로 어디에 떨어질지 보여 준다). 다른 책갈피의 하위 줄들 사이에 떨어뜨리면 자연스럽게 그 아래로 들어가 계층까지 바뀐다. 여러 개를 골라 둔 채로 끌면 고른 것들이 순서를 지키며 통째로 움직인다.
3. 페이지 순으로 정렬
PDF를 편집하다 보면 책갈피가 페이지 순서와 어긋나기 마련이다. "페이지순 정렬" 버튼 하나로 같은 묶음 안에서 페이지 번호 오름차순으로 줄을 세운다. 챕터-섹션 같은 계층 구조는 그대로 두고, 형제끼리만 정렬하기 때문에 목차가 뒤섞이지 않는다.
4. 버튼은 줄였다
기능을 더하면서 버튼은 오히려 줄였다. 줄마다 다섯 개(삭제·위·아래·하위·상위)씩 붙어 복잡했는데, 삭제·위로·아래로를 뺐다. 지우는 건 다중 선택으로, 순서는 드래그로 하니 더는 필요가 없었다. 남은 건 계층을 바꾸는 하위로(→)·상위로(←) 둘뿐이다.
그리고 — "드래그가 안 돼요"
다 만들었다 싶어 설치까지 했는데, 정작 끌어도 순서가 안 바뀐다는 말을 들었다. 트리 변환 로직은 단위 테스트 12개가 전부 통과하는데도 그랬다. 범인은 알고리즘이 아니라 그 바깥의 이벤트 처리 한 줄이었다.
떨어뜨리는 순간, 끌고 있던 항목들을 기억해 둔 값을 읽기도 전에 드래그 상태를 비우는 함수를 먼저 불러 버렸다. 그래서 "옮길 대상"이 늘 빈 손 — 아무 일도 안 일어났던 것이다. 읽는 순서를 비우기 앞으로 한 줄 당기니 끝이었다.
덤으로 하나 더 잡았다. ICEPDF는 창에 PDF를 끌어다 놓으면 열리는데, 그 "파일 받기" 기능이 책갈피를 끄는 동안에도 끼어들어 "여기에 PDF를 놓으세요" 안내를 띄우고 드롭을 가로채고 있었다. 진짜 파일을 끌 때만 반응하도록 막았다. 순수 함수는 테스트가 잡아 주지만, 화면과 맞닿은 이런 글루 코드는 결국 직접 끌어 봐야 보인다.
마무리
책갈피 하나에도 "골라서, 끌어서, 줄 세운다"는 당연한 동작을 갖추는 데 손이 꽤 갔다. 그래도 이제 책갈피가 백 개가 되어도 무섭지 않다.
- 소스 / 다운로드: github.com/icenovel-rgb/icepdf
- 라이선스: AGPL-3.0