diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index a6ce91a67..d6c07593a 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -57,6 +57,7 @@ use self::handlers::{DynamicQueryChange, DynamicQueryHandler, PreviewHighlightHa pub const ID: &str = "picker"; pub const MIN_AREA_WIDTH_FOR_PREVIEW: u16 = 72; +pub const MIN_AREA_HEIGHT_FOR_PREVIEW: u16 = 24; /// Biggest file size to preview in bytes pub const MAX_FILE_SIZE_FOR_PREVIEW: u64 = 10 * 1024 * 1024; @@ -988,27 +989,50 @@ impl Picker { impl Component for Picker { fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + // default render // +---------+ +---------+ // |prompt | |preview | // +---------+ | | // |picker | | | // | | | | // +---------+ +---------+ + // + // stack vertically + // +---------+ + // |prompt | + // +---------+ + // |picker | + // | | + // +---------+ + // |preview | + // | | + // | | + // +---------+ - let render_preview = - self.show_preview && self.file_fn.is_some() && area.width > MIN_AREA_WIDTH_FOR_PREVIEW; + let render_preview = self.show_preview + && self.file_fn.is_some() + && area.width >= MIN_AREA_WIDTH_FOR_PREVIEW + && area.height >= MIN_AREA_HEIGHT_FOR_PREVIEW; + let stack_vertically = area.width / 2 < MIN_AREA_WIDTH_FOR_PREVIEW; - let picker_width = if render_preview { - area.width / 2 + let picker_area = if render_preview { + if stack_vertically { + area.with_height(area.height / 3) + } else { + area.with_width(area.width / 2) + } } else { - area.width + area }; - let picker_area = area.with_width(picker_width); self.render_picker(picker_area, surface, cx); if render_preview { - let preview_area = area.clip_left(picker_width); + let preview_area = if stack_vertically { + area.clip_top(picker_area.height) + } else { + area.clip_left(picker_area.width) + }; self.render_preview(preview_area, surface, cx); } } @@ -1135,10 +1159,13 @@ impl Component for Picker MIN_AREA_WIDTH_FOR_PREVIEW; + let render_preview = self.show_preview + && self.file_fn.is_some() + && area.width >= MIN_AREA_WIDTH_FOR_PREVIEW + && area.height >= MIN_AREA_HEIGHT_FOR_PREVIEW; + let stack_vertically = area.width / 2 < MIN_AREA_WIDTH_FOR_PREVIEW; - let picker_width = if render_preview { + let picker_width = if render_preview && !stack_vertically { area.width / 2 } else { area.width