mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-28 15:44:20 +03:00
Fixed scrolling and cursor location
This commit is contained in:
parent
24d671ed3f
commit
f28fb5797f
@ -6,7 +6,7 @@ use alacritty_terminal::{
|
||||
sync::FairMutex,
|
||||
term::{
|
||||
cell::{Cell, Flags},
|
||||
RenderableCursor, SizeInfo,
|
||||
SizeInfo,
|
||||
},
|
||||
Term,
|
||||
};
|
||||
@ -17,7 +17,7 @@ use gpui::{
|
||||
geometry::{rect::RectF, vector::vec2f},
|
||||
json::json,
|
||||
text_layout::Line,
|
||||
Event, PaintContext, Quad,
|
||||
Event, Quad,
|
||||
};
|
||||
use mio_extras::channel::Sender;
|
||||
use ordered_float::OrderedFloat;
|
||||
@ -26,7 +26,6 @@ use std::sync::Arc;
|
||||
|
||||
use crate::{Input, ZedListener};
|
||||
|
||||
const DEBUG_GRID: bool = false;
|
||||
const ALACRITTY_SCROLL_MULTIPLIER: f32 = 3.;
|
||||
|
||||
pub struct TerminalEl {
|
||||
@ -105,7 +104,6 @@ impl Element for TerminalEl {
|
||||
//Start rendering
|
||||
let content = term.renderable_content();
|
||||
|
||||
let mut cursor = None;
|
||||
let mut lines: Vec<(String, Option<HighlightStyle>)> = vec![];
|
||||
let mut last_line = 0;
|
||||
let mut line_count = 1;
|
||||
@ -124,10 +122,6 @@ impl Element for TerminalEl {
|
||||
}, //TODO: Learn what 'CellExtra does'
|
||||
} = cell;
|
||||
|
||||
if cell.point == content.cursor.point {
|
||||
cursor = make_cursor(em_width, line_height, content.cursor);
|
||||
}
|
||||
|
||||
let new_highlight = make_style_from_cell(fg, flags);
|
||||
|
||||
if line != last_line {
|
||||
@ -154,6 +148,20 @@ impl Element for TerminalEl {
|
||||
line_count,
|
||||
);
|
||||
|
||||
let cursor_line = content.cursor.point.line.0 + content.display_offset as i32;
|
||||
let mut cursor = None;
|
||||
if let Some(layout_line) = cursor_line
|
||||
.try_into()
|
||||
.ok()
|
||||
.and_then(|cursor_line: usize| shaped_lines.get(cursor_line))
|
||||
{
|
||||
let cursor_x = layout_line.x_for_index(content.cursor.point.column.0);
|
||||
cursor = Some(RectF::new(
|
||||
vec2f(cursor_x, cursor_line as f32 * line_height),
|
||||
vec2f(em_width, line_height),
|
||||
));
|
||||
}
|
||||
|
||||
(
|
||||
constraint.max,
|
||||
LayoutState {
|
||||
@ -172,6 +180,7 @@ impl Element for TerminalEl {
|
||||
layout: &mut Self::LayoutState,
|
||||
cx: &mut gpui::PaintContext,
|
||||
) -> Self::PaintState {
|
||||
cx.scene.push_layer(Some(visible_bounds));
|
||||
let origin = bounds.origin() + vec2f(layout.em_width, 0.);
|
||||
|
||||
let mut line_origin = origin;
|
||||
@ -190,15 +199,13 @@ impl Element for TerminalEl {
|
||||
let new_cursor = RectF::new(new_origin, c.size());
|
||||
cx.scene.push_quad(Quad {
|
||||
bounds: new_cursor,
|
||||
background: Some(Color::red()),
|
||||
background: Some(Color::white()),
|
||||
border: Default::default(),
|
||||
corner_radius: 0.,
|
||||
});
|
||||
}
|
||||
|
||||
if DEBUG_GRID {
|
||||
draw_debug_grid(bounds, layout, cx);
|
||||
}
|
||||
cx.scene.pop_layer();
|
||||
}
|
||||
|
||||
fn dispatch_event(
|
||||
@ -296,36 +303,3 @@ fn alac_color_to_gpui_color(allac_color: &AnsiColor) -> Color {
|
||||
alacritty_terminal::ansi::Color::Indexed(_) => Color::white(), //Color cube weirdness
|
||||
}
|
||||
}
|
||||
|
||||
fn make_cursor(em_width: f32, line_height: f32, cursor: RenderableCursor) -> Option<RectF> {
|
||||
Some(RectF::new(
|
||||
vec2f(
|
||||
cursor.point.column.0 as f32 * em_width,
|
||||
cursor.point.line.0 as f32 * line_height,
|
||||
),
|
||||
vec2f(em_width, line_height),
|
||||
))
|
||||
}
|
||||
|
||||
fn draw_debug_grid(bounds: RectF, layout: &mut LayoutState, cx: &mut PaintContext) {
|
||||
for col in 0..(bounds.0[2] / layout.em_width) as usize {
|
||||
let rect_origin = bounds.origin() + vec2f(col as f32 * layout.em_width, 0.);
|
||||
let line = RectF::new(rect_origin, vec2f(1., bounds.0[3]));
|
||||
cx.scene.push_quad(Quad {
|
||||
bounds: line,
|
||||
background: Some(Color::green()),
|
||||
border: Default::default(),
|
||||
corner_radius: 0.,
|
||||
});
|
||||
}
|
||||
for row in 0..(bounds.0[3] / layout.line_height) as usize {
|
||||
let rect_origin = bounds.origin() + vec2f(0., row as f32 * layout.line_height);
|
||||
let line = RectF::new(rect_origin, vec2f(bounds.0[2], 1.));
|
||||
cx.scene.push_quad(Quad {
|
||||
bounds: line,
|
||||
background: Some(Color::green()),
|
||||
border: Default::default(),
|
||||
corner_radius: 0.,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user