#[derive(Debug, Clone)]
pub(crate) struct VirtualListInternalParams {
pub estimated_item_height: i32,
pub estimated_item_width: i32,
pub temporary_panel_height: i32,
pub temporary_panel_width: i32,
pub scrollbar_size: i32,
pub buffer_size: usize,
pub width_change_threshold: i32,
pub early_termination_threshold: i32,
pub pool_target_size: usize,
pub max_measurement_cache_size: usize,
pub keyboard_scroll_amount: i32,
pub safety_padding: i32,
pub measurement_tolerance: i32,
}
impl Default for VirtualListInternalParams {
fn default() -> Self {
Self {
estimated_item_height: 80,
estimated_item_width: 200,
temporary_panel_height: 100,
temporary_panel_width: 1000, scrollbar_size: 16,
buffer_size: 2,
width_change_threshold: 5,
early_termination_threshold: 200,
pool_target_size: 10,
max_measurement_cache_size: 1000,
keyboard_scroll_amount: 300,
safety_padding: 20, measurement_tolerance: 5, }
}
}
impl VirtualListInternalParams {
pub fn new_for_viewport(
viewport_size: (i32, i32), scrollbar_size: Option<i32>,
keyboard_scroll_amount: Option<i32>,
mouse_wheel_multiplier: f32,
) -> Self {
let mut params = Self::default();
params.auto_configure(viewport_size, scrollbar_size, keyboard_scroll_amount, mouse_wheel_multiplier);
params
}
pub fn auto_configure(
&mut self,
viewport_size: (i32, i32),
scrollbar_size: Option<i32>,
keyboard_scroll_amount: Option<i32>,
_mouse_wheel_multiplier: f32,
) {
let (viewport_width, viewport_height) = viewport_size;
self.scrollbar_size = scrollbar_size.unwrap_or(16);
let visible_items_estimate = (viewport_height / self.estimated_item_height).max(1);
self.buffer_size = match visible_items_estimate {
1..=5 => 1, 6..=15 => 2, 16..=30 => 3, _ => 4, };
self.pool_target_size = ((visible_items_estimate as usize) + self.buffer_size * 2 + 5).min(50);
self.max_measurement_cache_size = ((visible_items_estimate as usize) * 10).clamp(100, 2000);
self.width_change_threshold = match viewport_width {
..=400 => 3, 401..=800 => 5, 801..=1200 => 8, _ => 10, };
self.early_termination_threshold = viewport_height / 2;
self.keyboard_scroll_amount = keyboard_scroll_amount.unwrap_or_else(|| {
(viewport_height / 3).clamp(50, 500)
});
}
}