잠시 쓰지 않는 기능을 끈 것과 상단에서 영구히 빼고 싶은 것은 다른 선택이다. 두 상태를 합치면 다시 켤 때 사용자가 배치부터 다시 해야 한다. 앞선 플랫폼 모음 이야기가 메뉴의 층을 다뤘다면 이번에는 개별 항목의 숨은 값과 드래그 순서를 어떻게 보존했는지에 집중했다.
비활성이라는 값에 고정 해제를 섞지 않는다
changePlugin의 disable은 enabled만 False로 바꾼다. pinned가 True라면 그대로 남는다. enable 역시 enabled만 바꾼다. 상단에는 enabled와 pinned가 모두 참인 항목만 보내므로 꺼진 동안은 보이지 않고 다시 켜면 고정 상태가 드러난다. 값의 보존과 지금 노출할지의 계산을 나눴다.
unpin은 반대로 pinned만 False로 바꾸므로 menu에서는 계속 쓸 수 있다. 사용자는 기능 자체를 끄지 않고도 상단을 정리할 수 있다. 이 차이를 지우면 메뉴가 짧아진 이유가 미사용인지 숨김인지 알기 어렵다. 화면의 빈자리를 같은 저장 상태로 해석하지 않는 것이 핵심이었다.
복원 목록도 그대로 믿지 않고 정규화한다
pluginPreferences는 저장된 배열에서 형태가 맞는 자료만 받아들인다. 같은 programId가 반복되면 첫 유효 항목만 남긴다. pluginItems는 현재 프로그램 목록과 연결되는 등록만 화면 자료로 만든다. 정의가 없거나 다른 범위에 있는 항목을 이름만으로 살려서 보여 주지 않는다.
따라서 pinned=True를 저장했다는 사실만으로 항상 상단 버튼을 보장하지 않는다. 정의를 읽을 수 있어야 하고 enabled도 맞아야 한다. 나는 사용자가 선택을 잃지 않게 하되 사용할 수 없는 연결까지 가짜 버튼으로 복원하지 않으려 했다. 보존하는 선호와 복원 가능한 대상을 함께 읽는 구조다.
처음 고정할 때와 다시 고정할 때 순서가 다르다
새로 pin하면 해당 항목을 등록 배열의 뒤로 옮겨 기존 고정 항목 뒤에 붙인다. 이미 pinned인 항목을 다시 pin하면 순서를 바꾸지 않는다. 같은 설정 요청이 반복됐다는 이유로 상단 배치가 자꾸 움직이지 않게 했다. 자동화 호출자의 재시도에도 사용자의 순서가 흔들리지 않는 작은 멱등성이다.
기존 시험은 원본 배열이 바뀌지 않았는지도 함께 본다. 설정 변경이 새 결과를 돌려주는 함수이면 변경 전후를 비교하기 쉽다. 이름으로 정렬하는 menu와 사용자가 고정한 toolbar의 순서는 목적이 다르다. 한 정렬 규칙을 양쪽에 그대로 적용하지 않았다.
드래그는 보이는 자리만 다시 채운다
movePinnedPlugin은 enabled·pinned이고 현재 정의가 있는 항목의 배열 위치만 slots로 뽑는다. 그 위치에 해당하는 visible 목록만 재정렬한 뒤 같은 자리들에 다시 채운다. 가운데 꺼진 등록이 있어도 그 등록 자체와 설정을 따로 밀어내거나 지우지 않는다.
기존 시험은 A·꺼진 C·B를 B·꺼진 C·A로 바꾼다. C의 값은 그대로 남아야 하고 원본도 변하지 않아야 한다. 숨은 항목을 정렬 대상에서 빼면서 전체 저장 배열의 다른 상태까지 건드리지 않는 방법이다. 단순히 화면에 보이는 두 항목의 순서만 비교하면 놓칠 수 있는 조건이었다.
오래된 드래그 대상에는 대신 옮기기를 하지 않는다
이미 꺼졌거나 고정 해제됐거나 정의가 사라진 항목을 이동 대상으로 주면 PLUGIN_MOVE_UNAVAILABLE로 거절한다. beforeId도 현재 보이는 고정 대상이어야 한다. 현재 위치에 자신을 놓는 요청은 그대로 반환한다. 화면을 연 뒤 상태가 바뀌었다고 가장 비슷한 이름의 버튼을 대신 옮기지 않는다.
실제 명령은 프로필·프로젝트·탭을 명시하는 계약도 사용한다. 순서를 정리하는 요청도 어느 작업실의 선호인지 분명해야 한다. 이 글에서 원래 화면을 드래그하거나 설정을 수정하지는 않았다. 함수와 기존 시험의 비교를 근거로 쓰며 새 예제에서 제공하는 범위는 따로 구분했다.
작은 선호를 보존하는 것도 기능의 일부다
공유 모듈은 enabled와 pinned의 독립성, 자동 등록의 선택 보존을24개 시험 중 일부로 확인한다. 다만 실제 메뉴 정렬과 드래그 재배치는 구현하지 않았다. 원래 계약을 이해하려고 작은 예제를 썼다는 이유로 모든 화면 동작을 복제했다고 소개하지 않는다.
맞춤 관리자에서 자주 쓰는 버튼의 위치는 사용자의 업무 습관이기도 하다. 기능 추가 때마다 그 습관을 지우면 사용자는 프로그램을 다시 배워야 한다. 나는 고정 상태를 숨겼다가 되살리는 과정과 보이는 자리만 움직이는 코드를 통해 작은 선호가 어디서 유지되는지 남기고 싶었다.