Files · Items: one icon map, file icon, file row and file grid

The crate had two maps from a file's name to its icon, in chat and in the
file tree, and they disagreed. One map now lives in primitives, over the
Lucide file-* icons, and chat, agent, the file tree and the directory
listing use it. FileIcon draws it for a file or a folder. FileItem is a
file's row, a ListItem with its size and when it changed. FileList is the
directory listing. FileGrid lays tiles in the order given, with a cursor
seeded from the owner's pick: arrows by tile and by row, Home, End, Enter
and a double press to open. The count of what fits a width has one home,
layout's columns_for, and fit builds on it.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-26 19:40:10 -04:00
1 parent e75171c995
commit a846e10847
36 files changed
+1024 -77

No files matched your search

+4 -16
View File
@@ -9,6 +9,7 @@ use gpui::{
use super::scrubber::{OnTime, clock, time_at, time_tip};
use crate::{
forms::keyed,
layout::fit,
primitives::{FocusRing, tab_stop},
theme::{ActiveTheme, Radius},
};
@@ -32,13 +33,6 @@ pub(crate) fn resample(peaks: &[f32], count: usize) -> Vec<f32> {
.collect()
}
/// How many bars `bar` wide with `gap` between fit across `width`, at least one, and the inset that centers them.
pub(crate) fn fit(width: f32, bar: f32, gap: f32) -> (usize, f32) {
let count = ((width + gap) / (bar + gap)).floor().max(1.0) as usize;
let used = (bar + gap) * count as f32 - gap;
(count, ((width - used) / 2.0).max(0.0))
}
/// A seeking drag on a waveform, marked with its waveform.
struct Seek(EntityId);
@@ -121,7 +115,8 @@ impl RenderOnce for AudioWaveform {
move |bounds, _, window, _| {
let width = f32::from(bounds.size.width);
let pitch = f32::from(bar + gap);
let (count, inset) = fit(width, f32::from(bar), f32::from(gap));
let (count, inset) = fit(bounds.size.width, bar, gap);
let inset = f32::from(inset);
for (ix, peak) in resample(&peaks, count).into_iter().enumerate() {
let left = inset + pitch * ix as f32;
let tall = (bounds.size.height * peak).max(bar);
@@ -248,14 +243,7 @@ impl RenderOnce for AudioSpectrum {
#[cfg(test)]
mod tests {
use super::{fit, resample};
#[test]
fn the_bars_that_fit_sit_centered() {
assert_eq!(fit(100.0, 3.0, 2.0), (20, 1.0));
assert_eq!(fit(98.0, 3.0, 2.0), (20, 0.0));
assert_eq!(fit(2.0, 3.0, 2.0), (1, 0.0));
}
use super::resample;
#[test]
fn peaks_gather_into_bars_by_their_loudest() {