ZIm/crates/collab/src
tims 5c650cdcb2
project_panel: Add Alt/Opt+Click to expand/collapse a directory and all its contents (#22896)
Closes #15966 

This PR adds `Alt/Opt+Click` to expand or collapse a directory and all
its contents.

Context:

The current `expand_entry` scans immediate child subdirectories if they
aren’t loaded, while `expand_all_for_entry` scans the entire subtree.
The latter takes longer, so we wait for it to complete to ensure
accurate results.

For full directory scan, instead of using
`refresh_entries_for_paths(vec![path])`, which requires specifying all
explicit paths to refresh, we use `add_path_prefix_to_scan`, which
eliminates the need to list every path. Both methods internally call
`reload_entries_for_paths`, which invokes `should_scan_directory`. This
determines whether to scan deeper based on a path prefix match between
the given directory and its subdirectories, returning `true` for
`add_path_prefix_to_scan`.

The existing code handles scanning, removing path prefixes after scans
complete, and managing ignored directories.

How it works (Expand):
1. Alt clicking on non-ignored closed directory, expands it and all its
subdirectories, except ignored subdirectories. This helps while working
on mono repos, where you might not want to expand dirs like
`node_modules`, `dist`, etc or git submodules, when you expand any root
dir.

In example, `draft` and `posts` dir are ignored dir.


[expand-1.webm](https://github.com/user-attachments/assets/07d3f724-0757-408f-b349-5beb4ee8440e)

2. Alt clicking on ignored closed directory, expands it and all its
subdirectories. This is when you explicitly want to do it, on dirs like
`node_modules`, `dist`, etc.

In example, `dist` dir is ignored dir.


[expand-2.webm](https://github.com/user-attachments/assets/99e55883-ab1a-4a9c-a0f0-48026991a922)

3. In case of auto folded subdirectories, expand all action will take
precedence over it. That is, it will unfold all the subdirectories
inside clicked dir. This is intentional, as user explicitly wants to
reveal as much content as possible. (This is my personal opinion on how
it should work).


[expand-3.webm](https://github.com/user-attachments/assets/f20b0311-e92a-4e34-b640-1469b0d6fa16)

How it works (Collapse):
1. Alt clicking any opened directory will collapse it and all its
children, whether ignored or not. This is when you want to start from a
fresh state.

2. When auto fold is enabled in settings, collapse action will also fold
all subdirectories that it can fold. This is to bring it back to its
fresh state as mentioned above.


[collapse-1-2.webm](https://github.com/user-attachments/assets/74db6cee-0afa-406b-a9a2-7421083a2c2a)


Future:
- Using keybinding to expand/collapse all for selected entry
- Handle expand/collapse all for folded entry

Todos:
- [x] Expand entries logic
- [x] Handle remote worktree for expand
- [x] Figure out scan complete status
- [x] Move expansion logic to status update event
- [x] Collapse entries logic
- [x] Handle fold/unfold subdirs interaction
- [x] Do not expand git ignored sub-dirs
- [x] Tests
- [x] Test Remote

Release Notes:

- Added Alt/Opt+Click functionality to expand or collapse a directory
and all its contents.
2025-01-28 10:37:56 +02:00
..
api Allow filling co-authors in the git panel's commit input (#23329) 2025-01-18 22:57:17 +02:00
bin windows: Make collab run on Windows (#23117) 2025-01-17 09:39:13 +02:00
db Allow filling co-authors in the git panel's commit input (#23329) 2025-01-18 22:57:17 +02:00
llm Check for predict-edits feature flag, remove is_staff check (#23165) 2025-01-15 13:52:10 +00:00
rpc Remove dev servers (#19638) 2024-10-24 12:14:03 -06:00
tests Remove more references to 'model' in GPUI APIs (#23693) 2025-01-27 04:00:27 +00:00
api.rs Allow filling co-authors in the git panel's commit input (#23329) 2025-01-18 22:57:17 +02:00
auth.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00
cents.rs Send llm events to snowflake too (#21091) 2024-11-22 20:40:39 -07:00
completion.rs Supermaven (#10788) 2024-05-03 12:50:42 -07:00
db.rs Represent git statuses more faithfully (#23082) 2025-01-16 00:01:38 +00:00
env.rs collab: Add support for reading boolean values from .env.toml (#16317) 2024-08-15 17:07:17 -04:00
errors.rs Remove more unused code related to GitHub auth and errors 2022-04-21 08:57:49 -06:00
executor.rs Remove 2 suffix for collab, rope, settings, menu 2024-01-03 12:29:16 -08:00
lib.rs Stop sending data to Clickhouse (#21763) 2024-12-10 08:47:29 -07:00
llm.rs llm: Sample ~10% of staff members inputs/outputs to LLM (#23537) 2025-01-23 15:32:25 +01:00
main.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00
migrations.rs collab: Remove unused parameter to run_database_migrations (#15883) 2024-08-06 17:31:52 -04:00
rate_limiter.rs Allow filling co-authors in the git panel's commit input (#23329) 2025-01-18 22:57:17 +02:00
rpc.rs project_panel: Add Alt/Opt+Click to expand/collapse a directory and all its contents (#22896) 2025-01-28 10:37:56 +02:00
seed.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00
stripe_billing.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00
tests.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00
user_backfiller.rs Eliminate GPUI View, ViewContext, and WindowContext types (#22632) 2025-01-26 03:02:45 +00:00