After changing directory, the previously typed in prefix (for finding a selection) is cleared immediately without waiting for the timeout. This allows traversing known directory structures very quickly by typing in very few letters for each prefix and hitting enter in between.
Instead of calling `sync_all()` on every file individually during the Copy operation, the flushing is now batched and done at the end. Flushing now also happens for Move.
When a window resizes larger such that content no longer needs
scrolling, scroll_opt retains its stale offset value. Since no scroll
event fires, visible_rect was calculated with an out-of-bounds offset,
causing items at the top to be culled and not rendered.
Fix by caching content_height from each render pass and using it to
clamp scroll_opt when building visible_rect.
Hover state was only recalculated on CursorMoved events, causing items
to remain highlighted after scrolling away from them. Now hover checks
also run on WheelScrolled events and viewport changes, ensuring
on_enter/on_exit fire correctly when content moves under the cursor.
The condition `if running > 1 || finished > 0` could display
"0 operations running" when running == 0 but finished > 0.
Changed to `if running >= 1 && (running > 1 || finished > 0)` to
ensure the title only shows when at least one operation is running.
Per the FreeDesktop Desktop Entry spec, the Icon field can be either
an icon name (looked up in the theme) or an absolute path to an image.
Previously, all Icon values were passed to `widget::icon::from_name()`,
which only works for icon names.
This adds a `desktop_icon_handle()` helper that checks if the path is
absolute and exists, using `widget::icon::from_path()` for absolute
paths and `widget::icon::from_name()` for icon names.
Fixes: https://github.com/pop-os/cosmic-epoch/issues/2697