/// 약속 (E5b): 복사 · 이동할 항목을 붙여넣기 전까지 담아 둔다 (창 · 화면 사이). /// 입력 = 담기 [put] (항목 · 이동인지) · 붙여넣은 뒤 [pasted], 출력 = [items] · [move] · [isEmpty]. /// - 빈 목록은 담지 않는다 ([put] 이 false). /// - 옮긴 것은 다시 붙여넣을 수 없으므로 붙여넣기가 끝나면 비우고, 복사는 여러 곳에 붙여넣을 수 있게 남긴다. /// - 다시 쓰는 곳: 탐색기 두 창 · 한 창 · 보관함 꺼내기. class FileClipboard { List _items = const []; bool _move = false; List get items => _items; bool get move => _move; bool get isEmpty => _items.isEmpty; bool get isNotEmpty => _items.isNotEmpty; /// 담는다 (앞에 담은 것은 바뀜). 빈 목록이면 담지 않고 false bool put(List items, {required bool move}) { if (items.isEmpty) return false; _items = List.unmodifiable(items); _move = move; return true; } /// 붙여넣기가 끝남: [done] 이고 이동이었으면 비운다 void pasted({required bool done}) { if (done && _move) clear(); } void clear() => _items = const []; }