repl: Rely on block decorations to size according to content (#15713)
We no longer have to use line height calculations now that https://github.com/zed-industries/zed/pull/15536 is in. Blocks resize according to their content. This fixes up some of the rendering issues on plaintext outputs as well. Release Notes: - Fix repl plain text output wrapping around and covering editor text (https://github.com/zed-industries/zed/issues/15491, https://github.com/zed-industries/zed/issues/14855)
This commit is contained in:
parent
5c54596027
commit
b6a3556a32
3 changed files with 6 additions and 90 deletions
|
@ -6,7 +6,7 @@ use anyhow::Result;
|
||||||
use base64::prelude::*;
|
use base64::prelude::*;
|
||||||
use gpui::{
|
use gpui::{
|
||||||
img, percentage, Animation, AnimationExt, AnyElement, FontWeight, ImageData, Render, TextRun,
|
img, percentage, Animation, AnimationExt, AnyElement, FontWeight, ImageData, Render, TextRun,
|
||||||
Transformation, View,
|
Transformation,
|
||||||
};
|
};
|
||||||
use runtimelib::datatable::TableSchema;
|
use runtimelib::datatable::TableSchema;
|
||||||
use runtimelib::media::datatable::TabularDataResource;
|
use runtimelib::media::datatable::TabularDataResource;
|
||||||
|
@ -16,12 +16,6 @@ use settings::Settings;
|
||||||
use theme::ThemeSettings;
|
use theme::ThemeSettings;
|
||||||
use ui::{div, prelude::*, v_flex, IntoElement, Styled, ViewContext};
|
use ui::{div, prelude::*, v_flex, IntoElement, Styled, ViewContext};
|
||||||
|
|
||||||
/// Given these outputs are destined for the editor with the block decorations API, all of them must report
|
|
||||||
/// how many lines they will take up in the editor.
|
|
||||||
pub trait LineHeight: Sized {
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// When deciding what to render from a collection of mediatypes, we need to rank them in order of importance
|
/// When deciding what to render from a collection of mediatypes, we need to rank them in order of importance
|
||||||
fn rank_mime_type(mimetype: &MimeType) -> usize {
|
fn rank_mime_type(mimetype: &MimeType) -> usize {
|
||||||
match mimetype {
|
match mimetype {
|
||||||
|
@ -87,13 +81,6 @@ impl ImageView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for ImageView {
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize {
|
|
||||||
let line_height = cx.line_height();
|
|
||||||
(self.height as f32 / line_height.0) as usize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// TableView renders a static table inline in a buffer.
|
/// TableView renders a static table inline in a buffer.
|
||||||
/// It uses the https://specs.frictionlessdata.io/tabular-data-resource/ specification for data interchange.
|
/// It uses the https://specs.frictionlessdata.io/tabular-data-resource/ specification for data interchange.
|
||||||
pub struct TableView {
|
pub struct TableView {
|
||||||
|
@ -250,21 +237,6 @@ impl TableView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for TableView {
|
|
||||||
fn num_lines(&self, _cx: &mut WindowContext) -> usize {
|
|
||||||
let num_rows = match &self.table.data {
|
|
||||||
// Rows + header
|
|
||||||
Some(data) => data.len() + 1,
|
|
||||||
// We don't support Path based data sources, however we
|
|
||||||
// still render the header and padding
|
|
||||||
None => 1 + 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
let num_lines = num_rows as f32 * (1.0 + TABLE_Y_PADDING_MULTIPLE) + 1.0;
|
|
||||||
num_lines.ceil() as usize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Userspace error from the kernel
|
/// Userspace error from the kernel
|
||||||
pub struct ErrorView {
|
pub struct ErrorView {
|
||||||
pub ename: String,
|
pub ename: String,
|
||||||
|
@ -296,13 +268,6 @@ impl ErrorView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for ErrorView {
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize {
|
|
||||||
// Start at 1 to account for the y padding
|
|
||||||
1 + self.ename.lines().count() + self.evalue.lines().count() + self.traceback.num_lines(cx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum OutputType {
|
pub enum OutputType {
|
||||||
Plain(TerminalOutput),
|
Plain(TerminalOutput),
|
||||||
Stream(TerminalOutput),
|
Stream(TerminalOutput),
|
||||||
|
@ -346,21 +311,6 @@ impl OutputType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for OutputType {
|
|
||||||
/// Calculates the expected number of lines
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize {
|
|
||||||
match self {
|
|
||||||
Self::Plain(stdio) => stdio.num_lines(cx),
|
|
||||||
Self::Stream(stdio) => stdio.num_lines(cx),
|
|
||||||
Self::Image(image) => image.num_lines(cx),
|
|
||||||
Self::Message(message) => message.lines().count(),
|
|
||||||
Self::Table(table) => table.num_lines(cx),
|
|
||||||
Self::ErrorOutput(error_view) => error_view.num_lines(cx),
|
|
||||||
Self::ClearOutputWaitMarker => 0,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default, Clone, Debug)]
|
#[derive(Default, Clone, Debug)]
|
||||||
pub enum ExecutionStatus {
|
pub enum ExecutionStatus {
|
||||||
#[default]
|
#[default]
|
||||||
|
@ -561,32 +511,3 @@ impl Render for ExecutionView {
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for ExecutionView {
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize {
|
|
||||||
if self.outputs.is_empty() {
|
|
||||||
return 1; // For the status message if outputs are not there
|
|
||||||
}
|
|
||||||
|
|
||||||
let num_lines = self
|
|
||||||
.outputs
|
|
||||||
.iter()
|
|
||||||
.map(|output| output.num_lines(cx))
|
|
||||||
.sum::<usize>()
|
|
||||||
.max(1);
|
|
||||||
|
|
||||||
let num_lines = match self.status {
|
|
||||||
// Account for the status message if the execution is still ongoing
|
|
||||||
ExecutionStatus::Executing => num_lines.saturating_add(1),
|
|
||||||
ExecutionStatus::Queued => num_lines.saturating_add(1),
|
|
||||||
_ => num_lines,
|
|
||||||
};
|
|
||||||
num_lines
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LineHeight for View<ExecutionView> {
|
|
||||||
fn num_lines(&self, cx: &mut WindowContext) -> usize {
|
|
||||||
self.update(cx, |execution_view, cx| execution_view.num_lines(cx))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ use crate::components::KernelListItem;
|
||||||
use crate::KernelStatus;
|
use crate::KernelStatus;
|
||||||
use crate::{
|
use crate::{
|
||||||
kernels::{Kernel, KernelSpecification, RunningKernel},
|
kernels::{Kernel, KernelSpecification, RunningKernel},
|
||||||
outputs::{ExecutionStatus, ExecutionView, LineHeight as _},
|
outputs::{ExecutionStatus, ExecutionView},
|
||||||
};
|
};
|
||||||
use client::telemetry::Telemetry;
|
use client::telemetry::Telemetry;
|
||||||
use collections::{HashMap, HashSet};
|
use collections::{HashMap, HashSet};
|
||||||
|
@ -82,7 +82,8 @@ impl EditorBlock {
|
||||||
let invalidation_anchor = buffer.read(cx).read(cx).anchor_before(next_row_start);
|
let invalidation_anchor = buffer.read(cx).read(cx).anchor_before(next_row_start);
|
||||||
let block = BlockProperties {
|
let block = BlockProperties {
|
||||||
position: code_range.end,
|
position: code_range.end,
|
||||||
height: (execution_view.num_lines(cx) + 1) as u32,
|
// Take up at least one height for status, allow the editor to determine the real height based on the content from render
|
||||||
|
height: 1,
|
||||||
style: BlockStyle::Sticky,
|
style: BlockStyle::Sticky,
|
||||||
render: Self::create_output_area_renderer(execution_view.clone(), on_close.clone()),
|
render: Self::create_output_area_renderer(execution_view.clone(), on_close.clone()),
|
||||||
disposition: BlockDisposition::Below,
|
disposition: BlockDisposition::Below,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::outputs::{ExecutionView, LineHeight};
|
use crate::outputs::ExecutionView;
|
||||||
use alacritty_terminal::vte::{
|
use alacritty_terminal::vte::{
|
||||||
ansi::{Attr, Color, NamedColor, Rgb},
|
ansi::{Attr, Color, NamedColor, Rgb},
|
||||||
Params, ParamsIter, Parser, Perform,
|
Params, ParamsIter, Parser, Perform,
|
||||||
|
@ -7,7 +7,7 @@ use core::iter;
|
||||||
use gpui::{font, prelude::*, AnyElement, StyledText, TextRun};
|
use gpui::{font, prelude::*, AnyElement, StyledText, TextRun};
|
||||||
use settings::Settings as _;
|
use settings::Settings as _;
|
||||||
use theme::ThemeSettings;
|
use theme::ThemeSettings;
|
||||||
use ui::{div, prelude::*, IntoElement, ViewContext, WindowContext};
|
use ui::{div, prelude::*, IntoElement, ViewContext};
|
||||||
|
|
||||||
/// Implements the most basic of terminal output for use by Jupyter outputs
|
/// Implements the most basic of terminal output for use by Jupyter outputs
|
||||||
/// whether:
|
/// whether:
|
||||||
|
@ -95,12 +95,6 @@ impl TerminalOutput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LineHeight for TerminalOutput {
|
|
||||||
fn num_lines(&self, _cx: &mut WindowContext) -> usize {
|
|
||||||
self.handler.buffer.lines().count().max(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
struct AnsiTextRun {
|
struct AnsiTextRun {
|
||||||
len: usize,
|
len: usize,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue