Compare commits

...

3 Commits

Author SHA1 Message Date
Conrad Irwin
40a023f9f3 Remove TerminalInlineAssistId 2025-04-28 20:48:56 -06:00
Conrad Irwin
cfa4a9c446 Simplify terminal height calculation (and leave it broken) 2025-04-28 20:41:07 -06:00
Conrad Irwin
21d9db46aa Simplify gutter dimensions
Co-authored-by: Nathan Sobo <nathan@zed.dev>
2025-04-28 15:56:16 -06:00
3 changed files with 36 additions and 108 deletions

View File

@@ -10,7 +10,7 @@ use client::telemetry::Telemetry;
use collections::{HashMap, HashSet, VecDeque, hash_map};
use editor::{
Anchor, AnchorRangeExt, CodeActionProvider, Editor, EditorEvent, ExcerptId, ExcerptRange,
GutterDimensions, MultiBuffer, MultiBufferSnapshot, ToOffset as _, ToPoint,
MultiBuffer, MultiBufferSnapshot, ToOffset as _, ToPoint,
actions::SelectAll,
display_map::{
BlockContext, BlockPlacement, BlockProperties, BlockStyle, CustomBlockId, RenderBlock,
@@ -27,7 +27,6 @@ use language::{Buffer, Point, Selection, TransactionId};
use language_model::ConfiguredModel;
use language_model::{LanguageModelRegistry, report_assistant_event};
use multi_buffer::MultiBufferRow;
use parking_lot::Mutex;
use project::LspAction;
use project::Project;
use project::{CodeAction, ProjectTransaction};
@@ -453,11 +452,9 @@ impl InlineAssistant {
)
});
let gutter_dimensions = Arc::new(Mutex::new(GutterDimensions::default()));
let prompt_editor = cx.new(|cx| {
PromptEditor::new_buffer(
assist_id,
gutter_dimensions.clone(),
self.prompt_history.clone(),
prompt_buffer.clone(),
codegen.clone(),
@@ -570,11 +567,9 @@ impl InlineAssistant {
)
});
let gutter_dimensions = Arc::new(Mutex::new(GutterDimensions::default()));
let prompt_editor = cx.new(|cx| {
PromptEditor::new_buffer(
assist_id,
gutter_dimensions.clone(),
self.prompt_history.clone(),
prompt_buffer.clone(),
codegen.clone(),
@@ -1586,9 +1581,10 @@ fn build_assist_editor_renderer(editor: &Entity<PromptEditor<BufferCodegen>>) ->
let editor = editor.clone();
Arc::new(move |cx: &mut BlockContext| {
let gutter_dimensions = editor.read(cx).gutter_dimensions();
*gutter_dimensions.lock() = *cx.gutter_dimensions;
editor.update(cx, |editor, _| {
editor.margin_left =
cx.gutter_dimensions.full_width() + (cx.gutter_dimensions.margin / 2.0);
});
editor.clone().into_any_element()
})
}

View File

@@ -10,7 +10,7 @@ use crate::{RemoveAllContext, ToggleContextPicker};
use client::ErrorExt;
use collections::VecDeque;
use editor::{
Editor, EditorElement, EditorEvent, EditorMode, EditorStyle, GutterDimensions, MultiBuffer,
Editor, EditorElement, EditorEvent, EditorMode, EditorStyle, MultiBuffer,
actions::{MoveDown, MoveUp},
};
use feature_flags::{FeatureFlagAppExt as _, ZedProFeatureFlag};
@@ -21,9 +21,7 @@ use gpui::{
};
use language_model::{LanguageModel, LanguageModelRegistry};
use language_model_selector::{ModelType, ToggleModelSelector};
use parking_lot::Mutex;
use settings::Settings;
use std::cmp;
use std::sync::Arc;
use theme::ThemeSettings;
use ui::utils::WithRemSize;
@@ -48,6 +46,7 @@ pub struct PromptEditor<T> {
editor_subscriptions: Vec<Subscription>,
_context_strip_subscription: Subscription,
show_rate_limit_notice: bool,
pub margin_left: Pixels,
_phantom: std::marker::PhantomData<T>,
}
@@ -57,28 +56,15 @@ impl<T: 'static> Render for PromptEditor<T> {
fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
let ui_font_size = ThemeSettings::get_global(cx).ui_font_size(cx);
let mut buttons = Vec::new();
if let PromptEditorMode::Buffer { codegen, .. } = &self.mode {
let codegen = codegen.read(cx);
let left_gutter_width = match &self.mode {
PromptEditorMode::Buffer {
id: _,
codegen,
gutter_dimensions,
} => {
let codegen = codegen.read(cx);
if codegen.alternative_count(cx) > 1 {
buttons.push(self.render_cycle_controls(&codegen, cx));
}
let gutter_dimensions = gutter_dimensions.lock();
gutter_dimensions.full_width() + (gutter_dimensions.margin / 2.0)
if codegen.alternative_count(cx) > 1 {
buttons.push(self.render_cycle_controls(&codegen, cx));
}
PromptEditorMode::Terminal { .. } => {
// Give the equivalent of the same left-padding that we're using on the right
Pixels::from(40.0)
}
};
}
let left_gutter_width = self.margin_left;
let bottom_padding = match &self.mode {
PromptEditorMode::Buffer { .. } => Pixels::from(0.),
@@ -794,12 +780,10 @@ pub enum PromptEditorMode {
Buffer {
id: InlineAssistId,
codegen: Entity<BufferCodegen>,
gutter_dimensions: Arc<Mutex<GutterDimensions>>,
},
Terminal {
id: TerminalInlineAssistId,
id: InlineAssistId,
codegen: Entity<TerminalCodegen>,
height_in_lines: u8,
},
}
@@ -826,7 +810,6 @@ impl InlineAssistId {
impl PromptEditor<BufferCodegen> {
pub fn new_buffer(
id: InlineAssistId,
gutter_dimensions: Arc<Mutex<GutterDimensions>>,
prompt_history: VecDeque<String>,
prompt_buffer: Entity<MultiBuffer>,
codegen: Entity<BufferCodegen>,
@@ -838,11 +821,7 @@ impl PromptEditor<BufferCodegen> {
cx: &mut Context<PromptEditor<BufferCodegen>>,
) -> PromptEditor<BufferCodegen> {
let codegen_subscription = cx.observe(&codegen, Self::handle_codegen_changed);
let mode = PromptEditorMode::Buffer {
id,
codegen,
gutter_dimensions,
};
let mode = PromptEditorMode::Buffer { id, codegen };
let prompt_editor = cx.new(|cx| {
let mut editor = Editor::new(
@@ -904,6 +883,7 @@ impl PromptEditor<BufferCodegen> {
_context_strip_subscription: context_strip_subscription,
show_rate_limit_notice: false,
mode,
margin_left: px(0.),
_phantom: Default::default(),
};
@@ -959,31 +939,11 @@ impl PromptEditor<BufferCodegen> {
PromptEditorMode::Terminal { .. } => unreachable!(),
}
}
pub fn gutter_dimensions(&self) -> &Arc<Mutex<GutterDimensions>> {
match &self.mode {
PromptEditorMode::Buffer {
gutter_dimensions, ..
} => gutter_dimensions,
PromptEditorMode::Terminal { .. } => unreachable!(),
}
}
}
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, Hash)]
pub struct TerminalInlineAssistId(pub usize);
impl TerminalInlineAssistId {
pub fn post_inc(&mut self) -> TerminalInlineAssistId {
let id = *self;
self.0 += 1;
id
}
}
impl PromptEditor<TerminalCodegen> {
pub fn new_terminal(
id: TerminalInlineAssistId,
id: InlineAssistId,
prompt_history: VecDeque<String>,
prompt_buffer: Entity<MultiBuffer>,
codegen: Entity<TerminalCodegen>,
@@ -995,11 +955,7 @@ impl PromptEditor<TerminalCodegen> {
cx: &mut Context<Self>,
) -> Self {
let codegen_subscription = cx.observe(&codegen, Self::handle_codegen_changed);
let mode = PromptEditorMode::Terminal {
id,
codegen,
height_in_lines: 1,
};
let mode = PromptEditorMode::Terminal { id, codegen };
let prompt_editor = cx.new(|cx| {
let mut editor = Editor::new(
@@ -1055,6 +1011,7 @@ impl PromptEditor<TerminalCodegen> {
_codegen_subscription: codegen_subscription,
editor_subscriptions: Vec::new(),
_context_strip_subscription: context_strip_subscription,
margin_left: px(40.0),
mode,
show_rate_limit_notice: false,
_phantom: Default::default(),
@@ -1065,27 +1022,9 @@ impl PromptEditor<TerminalCodegen> {
}
fn count_lines(&mut self, cx: &mut Context<Self>) {
let height_in_lines = cmp::max(
2, // Make the editor at least two lines tall, to account for padding and buttons.
cmp::min(
self.editor
.update(cx, |editor, cx| editor.max_point(cx).row().0 + 1),
Self::MAX_LINES as u32,
),
) as u8;
match &mut self.mode {
PromptEditorMode::Terminal {
height_in_lines: current_height,
..
} => {
if height_in_lines != *current_height {
*current_height = height_in_lines;
cx.emit(PromptEditorEvent::Resized { height_in_lines });
}
}
PromptEditorMode::Buffer { .. } => unreachable!(),
}
// todo: the terminal scrolling needs to be fixed so that we don't have to
// guess our height here.
cx.emit(PromptEditorEvent::Resized { height_in_lines: 1 });
}
fn handle_codegen_changed(&mut self, _: Entity<TerminalCodegen>, cx: &mut Context<Self>) {
@@ -1113,7 +1052,7 @@ impl PromptEditor<TerminalCodegen> {
}
}
pub fn id(&self) -> TerminalInlineAssistId {
pub fn id(&self) -> InlineAssistId {
match &self.mode {
PromptEditorMode::Buffer { .. } => unreachable!(),
PromptEditorMode::Terminal { id, .. } => *id,

View File

@@ -1,8 +1,6 @@
use crate::context::load_context;
use crate::context_store::ContextStore;
use crate::inline_prompt_editor::{
CodegenStatus, PromptEditor, PromptEditorEvent, TerminalInlineAssistId,
};
use crate::inline_prompt_editor::{CodegenStatus, InlineAssistId, PromptEditor, PromptEditorEvent};
use crate::terminal_codegen::{CLEAR_INPUT, CodegenEvent, TerminalCodegen};
use crate::thread_store::ThreadStore;
use anyhow::{Context as _, Result};
@@ -38,8 +36,8 @@ const DEFAULT_CONTEXT_LINES: usize = 50;
const PROMPT_HISTORY_MAX_LEN: usize = 20;
pub struct TerminalInlineAssistant {
next_assist_id: TerminalInlineAssistId,
assists: HashMap<TerminalInlineAssistId, TerminalInlineAssist>,
next_assist_id: InlineAssistId,
assists: HashMap<InlineAssistId, TerminalInlineAssist>,
prompt_history: VecDeque<String>,
telemetry: Option<Arc<Telemetry>>,
fs: Arc<dyn Fs>,
@@ -55,7 +53,7 @@ impl TerminalInlineAssistant {
telemetry: Arc<Telemetry>,
) -> Self {
Self {
next_assist_id: TerminalInlineAssistId::default(),
next_assist_id: InlineAssistId::default(),
assists: HashMap::default(),
prompt_history: VecDeque::default(),
telemetry: Some(telemetry),
@@ -120,12 +118,7 @@ impl TerminalInlineAssistant {
self.focus_assist(assist_id, window, cx);
}
fn focus_assist(
&mut self,
assist_id: TerminalInlineAssistId,
window: &mut Window,
cx: &mut App,
) {
fn focus_assist(&mut self, assist_id: InlineAssistId, window: &mut Window, cx: &mut App) {
let assist = &self.assists[&assist_id];
if let Some(prompt_editor) = assist.prompt_editor.as_ref() {
prompt_editor.update(cx, |this, cx| {
@@ -167,7 +160,7 @@ impl TerminalInlineAssistant {
}
}
fn start_assist(&mut self, assist_id: TerminalInlineAssistId, cx: &mut App) {
fn start_assist(&mut self, assist_id: InlineAssistId, cx: &mut App) {
let assist = if let Some(assist) = self.assists.get_mut(&assist_id) {
assist
} else {
@@ -205,7 +198,7 @@ impl TerminalInlineAssistant {
codegen.update(cx, |codegen, cx| codegen.start(request_task, cx));
}
fn stop_assist(&mut self, assist_id: TerminalInlineAssistId, cx: &mut App) {
fn stop_assist(&mut self, assist_id: InlineAssistId, cx: &mut App) {
let assist = if let Some(assist) = self.assists.get_mut(&assist_id) {
assist
} else {
@@ -217,7 +210,7 @@ impl TerminalInlineAssistant {
fn request_for_inline_assist(
&self,
assist_id: TerminalInlineAssistId,
assist_id: InlineAssistId,
cx: &mut App,
) -> Result<Task<LanguageModelRequest>> {
let assist = self.assists.get(&assist_id).context("invalid assist")?;
@@ -287,7 +280,7 @@ impl TerminalInlineAssistant {
fn finish_assist(
&mut self,
assist_id: TerminalInlineAssistId,
assist_id: InlineAssistId,
undo: bool,
execute: bool,
window: &mut Window,
@@ -344,7 +337,7 @@ impl TerminalInlineAssistant {
fn dismiss_assist(
&mut self,
assist_id: TerminalInlineAssistId,
assist_id: InlineAssistId,
window: &mut Window,
cx: &mut App,
) -> bool {
@@ -366,7 +359,7 @@ impl TerminalInlineAssistant {
fn insert_prompt_editor_into_terminal(
&mut self,
assist_id: TerminalInlineAssistId,
assist_id: InlineAssistId,
height: u8,
window: &mut Window,
cx: &mut App,
@@ -401,7 +394,7 @@ struct TerminalInlineAssist {
impl TerminalInlineAssist {
pub fn new(
assist_id: TerminalInlineAssistId,
assist_id: InlineAssistId,
terminal: &Entity<TerminalView>,
prompt_editor: Entity<PromptEditor<TerminalCodegen>>,
workspace: WeakEntity<Workspace>,