Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix file missing or duplicated when copying multiple items in project…
… panel + Fix marked files not being deselected after selecting a directory (zed-industries#20859) Closes zed-industries#20858 This fix depends on the sanitization logic implemented in PR zed-industries#20577. Since that branch may undergo further changes, this branch will be periodically rebased on it. Once zed-industries#20577 is merged, the dependency will no longer apply. Release Notes: - Fix missing or duplicated files when copying multiple items in the project panel. - Fix marked files not being deselected after selecting a directory on primary click. - Fix "copy path" and "copy path relative" with multiple items selected in project panel. **Problem**: In this case, `dir1` is selected while `dir2`, `dir3`, and `dir1/file` are marked. Using the `marked_entries` function results in only `dir1`, which is incorrect. <img height="120" src="https://github.com/user-attachments/assets/d4d92cc5-c998-4948-9a58-25c4f54167f2" /> Currently, the `marked_entries` function is used in five actions, which all produce incorrect results: 1. Delete (via the disjoint function) 2. Copy 3. Cut 4. Copy Path 5. Copy Path Relative **Solution**: 1. `marked_entries` function should not use "When currently selected entry is not marked, it's treated as the only marked entry." logic. There is no grand scheme behind this logic as confirmed by piotr [here](zed-industries#17746 (comment)). 2. `copy` and `cut` actions should use the disjoint function to prevent obivous failures. 3. `copy path` and `copy path relative` should keep using *fixed* `marked_entries` as that is expected behavior for these actions. --- 1. Before/After: Partial Copy Select `dir1` and `c.txt` (in that order, reverse order works!), and copy it and paste in `dir2`. `c.txt` is not copied in `dir2`. <img height="170" src="https://github.com/user-attachments/assets/a09fcb40-f38f-46ef-b0b4-e44ec01dda18" /> <img height="170" src="https://github.com/user-attachments/assets/bb87dbe5-8e2e-4ca4-a565-42be5755ec8a" /> --- 2. Before/After: Duplicate Copy Select `a.txt`, `dir1` and `c.txt` (in that order), and copy it and paste in `dir2`. `a.txt` is duplicated in `dir2`. <img height="170" src="https://github.com/user-attachments/assets/6f999d22-3607-48d7-9ff6-2e27494002f8" /> <img height="170" src="https://github.com/user-attachments/assets/b4b6ff7d-0df7-45ea-83e4-50a0acb18457" /> --- 3. Before/After: Directory Selection Simply primary click on any file, now primary click on any dir. That previous file is still marked. <img height="170" src="https://github.com/user-attachments/assets/9f1948ce-7445-4377-9733-06490ed6a324" /> <img height="170" src="https://github.com/user-attachments/assets/e78203bc-96ba-424b-b588-c038992a9f0e" /> --- 4. Before/After: Copy Path and Copy Path Relative Upon `copy path` (ctrl + alt + c): Before: Only `/home/tims/test/dir2/a.txt` was copied. After: All three paths `/home/tims/test/dir2`, `/home/tims/test/c.txt` and `/home/tims/test/dir2/a.txt` are copied. This is also how VSCode also copies path when multiple are selected. <img height="170" src="https://github.com/user-attachments/assets/e20423ea-1682-4efd-b208-631e2edd3771" />
- Loading branch information