Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T05:35:28.762Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

active_buffer_language.rs

101 lines · 3.5 KB · rust
1use editor::Editor;
2use gpui::{
3    App, Context, Entity, IntoElement, ParentElement, Render, Styled, Subscription, WeakEntity,
4    Window, div,
5};
6use language::LanguageName;
7use settings::Settings as _;
8use ui::{Button, ButtonCommon, Clickable, FluentBuilder, LabelSize, Tooltip};
9use workspace::{HideStatusItem, StatusBarSettings, StatusItemView, Workspace, item::ItemHandle};
10
11use crate::{LanguageSelector, Toggle};
12
13pub struct ActiveBufferLanguage {
14    active_language: Option<Option<LanguageName>>,
15    workspace: WeakEntity<Workspace>,
16    _observe_active_editor: Option<Subscription>,
17}
18
19impl ActiveBufferLanguage {
20    pub fn new(workspace: &Workspace) -> Self {
21        Self {
22            active_language: None,
23            workspace: workspace.weak_handle(),
24            _observe_active_editor: None,
25        }
26    }
27
28    fn update_language(&mut self, editor: Entity<Editor>, _: &mut Window, cx: &mut Context<Self>) {
29        self.active_language = Some(None);
30
31        let editor = editor.read(cx);
32        if let Some(buffer) = editor.active_buffer(cx)
33            && let Some(language) = buffer.read(cx).language()
34        {
35            self.active_language = Some(Some(language.name()));
36        }
37
38        cx.notify();
39    }
40}
41
42impl Render for ActiveBufferLanguage {
43    fn render(&mut self, _: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
44        if !StatusBarSettings::get_global(cx).active_language_button {
45            return div().hidden();
46        }
47
48        div().when_some(self.active_language.as_ref(), |el, active_language| {
49            let active_language_text = if let Some(active_language_text) = active_language {
50                active_language_text.to_string()
51            } else {
52                "Unknown".to_string()
53            };
54
55            el.child(
56                Button::new("change-language", active_language_text.clone())
57                    .label_size(LabelSize::Small)
58                    .tab_index(0isize)
59                    .aria_label(format!("Language: {active_language_text}"))
60                    .on_click(cx.listener(|this, _, window, cx| {
61                        if let Some(workspace) = this.workspace.upgrade() {
62                            workspace.update(cx, |workspace, cx| {
63                                LanguageSelector::toggle(workspace, window, cx)
64                            });
65                        }
66                    }))
67                    .tooltip(|_window, cx| Tooltip::for_action("Select Language", &Toggle, cx)),
68            )
69        })
70    }
71}
72
73impl StatusItemView for ActiveBufferLanguage {
74    fn set_active_pane_item(
75        &mut self,
76        active_pane_item: Option<&dyn ItemHandle>,
77        window: &mut Window,
78        cx: &mut Context<Self>,
79    ) {
80        if let Some(editor) = active_pane_item.and_then(|item| item.downcast::<Editor>()) {
81            self._observe_active_editor =
82                Some(cx.observe_in(&editor, window, Self::update_language));
83            self.update_language(editor, window, cx);
84        } else {
85            self.active_language = None;
86            self._observe_active_editor = None;
87        }
88
89        cx.notify();
90    }
91
92    fn hide_setting(&self, _: &App) -> Option<HideStatusItem> {
93        Some(HideStatusItem::new(|settings| {
94            settings
95                .status_bar
96                .get_or_insert_default()
97                .active_language_button = Some(false);
98        }))
99    }
100}
101
Served at tenant.openagents/omega Member data and write actions are omitted.