use editor::Editor; use encoding_rs::{Encoding, UTF_8}; use gpui::{ Context, Entity, IntoElement, ParentElement, Render, Styled, Subscription, Window, div, }; use ui::{Button, ButtonCommon, Clickable, LabelSize, Tooltip}; use workspace::{ StatusBarSettings, StatusItemView, Workspace, item::{ItemHandle, Settings}, }; pub struct ActiveBufferEncoding { active_encoding: Option<&'static Encoding>, //workspace: WeakEntity, _observe_active_editor: Option, has_bom: bool, } impl ActiveBufferEncoding { pub fn new(_workspace: &Workspace) -> Self { Self { active_encoding: None, //workspace: workspace.weak_handle(), _observe_active_editor: None, has_bom: false, } } fn update_encoding(&mut self, editor: Entity, _: &mut Window, cx: &mut Context) { self.active_encoding = None; let editor = editor.read(cx); if let Some((_, buffer, _)) = editor.active_excerpt(cx) { let buffer = buffer.read(cx); self.active_encoding = Some(buffer.encoding()); self.has_bom = buffer.has_bom(); } cx.notify(); } } impl Render for ActiveBufferEncoding { fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement { let Some(active_encoding) = self.active_encoding else { return div().hidden(); }; let display_option = StatusBarSettings::get_global(cx).active_encoding_button; let is_utf8 = active_encoding == UTF_8; if !display_option.should_show(is_utf8, self.has_bom) { return div().hidden(); } let mut text = active_encoding.name().to_string(); if self.has_bom { text.push_str(" (BOM)"); } div().child( Button::new("change-encoding", text) .label_size(LabelSize::Small) .on_click(|_, _, _cx| { // No-op }) .tooltip(Tooltip::text("Current Encoding")), ) } } impl StatusItemView for ActiveBufferEncoding { fn set_active_pane_item( &mut self, active_pane_item: Option<&dyn ItemHandle>, window: &mut Window, cx: &mut Context, ) { if let Some(editor) = active_pane_item.and_then(|item| item.downcast::()) { self._observe_active_editor = Some(cx.observe_in(&editor, window, Self::update_encoding)); self.update_encoding(editor, window, cx); } else { self.active_encoding = None; self.has_bom = false; self._observe_active_editor = None; } cx.notify(); } }