81 lines · 3.0 KB · Rust
RawDownload
use std::time::Instant; use ui::{SpinnerLabel, div, prelude::*}; use crate::CsvPreviewView; impl Render for CsvPreviewView {    fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {        let theme = cx.theme();        let row_height = window.pixel_snap(window.line_height());        if row_height != self.row_height {            self.row_height = row_height;            // Font size (rem size, buffer font override, ...) changed since the list was last            // measured: existing rows and unmeasured-item height hints are now the wrong size.            // Unlike `reset_with_uniform_height`, this preserves scroll position and keeps each            // item's prior size as a hint rather than dropping straight to a fresh guess.            self.list_state.remeasure();        }        let render_prep_start = Instant::now();        let table_with_settings = v_flex()            .size_full()            .bg(theme.colors().editor_background)            .track_focus(&self.focus_handle)            .child(self.render_settings_panel(window, cx))            .child({                let is_parsing = self.is_parsing;                if is_parsing || self.engine.contents.number_of_cols == 0 {                    div()                        .flex()                        .items_center()                        .justify_center()                        .h_32()                        .text_ui(cx)                        .font_buffer(cx)                        .text_color(cx.theme().colors().text_muted)                        .when(is_parsing, |div| {                            div.child(                                h_flex()                                    .gap_2()                                    .child(SpinnerLabel::new())                                    .child("Loading…"),                            )                        })                        .when(!is_parsing, |div| div.child("No CSV content to display"))                        .into_any_element()                } else {                    self.create_table(&self.column_widths.widths, cx)                }            });         let render_prep_duration = render_prep_start.elapsed();        self.performance_metrics.timings.insert(            "render_prep",            (render_prep_duration, std::time::Instant::now()),        );         let div = div()            .relative()            .w_full()            .h_full()            .child(table_with_settings);         #[cfg(feature = "dev-tools")]        let show_perf_metrics_overlay = self.settings.show_perf_metrics_overlay;         #[cfg(feature = "dev-tools")]        let div = div.when(show_perf_metrics_overlay, |div| {            div.child(self.render_performance_metrics_overlay(cx))        });         #[cfg(feature = "dev-tools")]        if !show_perf_metrics_overlay {            self.performance_metrics.rendered_indices.clear();        }         #[cfg(not(feature = "dev-tools"))]        self.performance_metrics.rendered_indices.clear();         div    }}