Tidy Assistant2 composer (#11321)

Release Notes:

- N/A
This commit is contained in:
Nate Butler 2024-05-02 17:54:55 -04:00 committed by GitHub
parent 1915a756a0
commit 47b38a0428
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 58 additions and 75 deletions

View File

@ -595,7 +595,6 @@ impl AssistantChat {
if self.editing_message_id() == Some(*id) {
element.child(Composer::new(
body.clone(),
self.user_store.read(cx).current_user(),
self.project_index_button.clone(),
crate::ui::ModelSelector::new(
cx.view().downgrade(),
@ -773,7 +772,6 @@ impl Render for AssistantChat {
.child(list(self.list_state.clone()).flex_1())
.child(Composer::new(
self.composer_editor.clone(),
self.user_store.read(cx).current_user(),
self.project_index_button.clone(),
crate::ui::ModelSelector::new(cx.view().downgrade(), self.model.clone())
.into_any_element(),

View File

@ -1,16 +1,13 @@
use crate::{ui::ProjectIndexButton, AssistantChat, CompletionProvider};
use client::User;
use editor::{Editor, EditorElement, EditorStyle};
use gpui::{AnyElement, FontStyle, FontWeight, TextStyle, View, WeakView, WhiteSpace};
use settings::Settings;
use std::sync::Arc;
use theme::ThemeSettings;
use ui::{popover_menu, prelude::*, Avatar, ButtonLike, ContextMenu, Tooltip};
use ui::{popover_menu, prelude::*, ButtonLike, ContextMenu, Tooltip};
#[derive(IntoElement)]
pub struct Composer {
editor: View<Editor>,
player: Option<Arc<User>>,
project_index_button: Option<View<ProjectIndexButton>>,
model_selector: AnyElement,
}
@ -18,13 +15,11 @@ pub struct Composer {
impl Composer {
pub fn new(
editor: View<Editor>,
player: Option<Arc<User>>,
project_index_button: Option<View<ProjectIndexButton>>,
model_selector: AnyElement,
) -> Self {
Self {
editor,
player,
project_index_button,
model_selector,
}
@ -41,72 +36,59 @@ impl Composer {
impl RenderOnce for Composer {
fn render(mut self, cx: &mut WindowContext) -> impl IntoElement {
let mut player_avatar = div().size(rems_from_px(20.)).into_any_element();
if let Some(player) = self.player.clone() {
player_avatar = Avatar::new(player.avatar_uri.clone())
.size(rems_from_px(20.))
.into_any_element();
}
let font_size = rems(0.875);
let line_height = font_size.to_pixels(cx.rem_size()) * 1.3;
h_flex()
.w_full()
.items_start()
.mt_4()
.gap_3()
.child(player_avatar)
.child(
v_flex().size_full().gap_1().child(
v_flex()
.w_full()
.p_4()
.bg(cx.theme().colors().editor_background)
.rounded_lg()
.child(
v_flex()
.justify_between()
.w_full()
.gap_2()
.child({
let settings = ThemeSettings::get_global(cx);
let text_style = TextStyle {
color: cx.theme().colors().editor_foreground,
font_family: settings.buffer_font.family.clone(),
font_features: settings.buffer_font.features.clone(),
font_size: font_size.into(),
font_weight: FontWeight::NORMAL,
font_style: FontStyle::Normal,
line_height: line_height.into(),
background_color: None,
underline: None,
strikethrough: None,
white_space: WhiteSpace::Normal,
};
h_flex().w_full().items_start().mt_2().child(
v_flex().size_full().gap_1().child(
v_flex()
.w_full()
.p_3()
.bg(cx.theme().colors().editor_background)
.rounded_lg()
.child(
v_flex()
.justify_between()
.w_full()
.gap_2()
.child({
let settings = ThemeSettings::get_global(cx);
let text_style = TextStyle {
color: cx.theme().colors().editor_foreground,
font_family: settings.buffer_font.family.clone(),
font_features: settings.buffer_font.features.clone(),
font_size: font_size.into(),
font_weight: FontWeight::NORMAL,
font_style: FontStyle::Normal,
line_height: line_height.into(),
background_color: None,
underline: None,
strikethrough: None,
white_space: WhiteSpace::Normal,
};
EditorElement::new(
&self.editor,
EditorStyle {
background: cx.theme().colors().editor_background,
local_player: cx.theme().players().local(),
text: text_style,
..Default::default()
},
)
})
.child(
h_flex()
.flex_none()
.gap_2()
.justify_between()
.w_full()
.child(h_flex().gap_1().child(self.render_tools(cx)))
.child(h_flex().gap_1().child(self.model_selector)),
),
),
),
)
EditorElement::new(
&self.editor,
EditorStyle {
background: cx.theme().colors().editor_background,
local_player: cx.theme().players().local(),
text: text_style,
..Default::default()
},
)
})
.child(
h_flex()
.flex_none()
.gap_2()
.justify_between()
.w_full()
.child(h_flex().gap_1().child(self.render_tools(cx)))
.child(h_flex().gap_1().child(self.model_selector)),
),
),
),
)
}
}

View File

@ -34,7 +34,6 @@ impl ProjectIndexButton {
}
impl Render for ProjectIndexButton {
// Expanded information on ToolView
fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
let status = self.project_index.read(cx).status();
let is_enabled = self.tool_registry.is_tool_enabled::<ProjectIndexTool>();
@ -82,13 +81,17 @@ impl Render for ProjectIndexButton {
)
.tooltip({
move |cx| {
let (tooltip, meta) = match status {
Status::Idle => (
let (tooltip, meta) = match (is_enabled, status) {
(false, _) => (
"Project index disabled".to_string(),
Some("Click to enable".to_string()),
),
(_, Status::Idle) => (
"Project index ready".to_string(),
Some("Click to disable".to_string()),
),
Status::Loading => ("Project index loading...".to_string(), None),
Status::Scanning { remaining_count } => (
(_, Status::Loading) => ("Project index loading...".to_string(), None),
(_, Status::Scanning { remaining_count }) => (
"Project index scanning...".to_string(),
Some(format!("{} remaining...", remaining_count)),
),