Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T04:05:28.765Z 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

model_selector_popover.rs

97 lines · 3.3 KB · rust
1use std::rc::Rc;
2
3use acp_thread::{AgentModelIcon, AgentModelInfo, AgentModelSelector};
4use gpui::{Entity, FocusHandle};
5use picker::popover_menu::PickerPopoverMenu;
6use ui::{PopoverMenuHandle, Tooltip, prelude::*};
7
8use crate::ui::ModelSelectorTooltip;
9use crate::{ModelSelector, model_selector::acp_model_selector};
10
11pub struct ModelSelectorPopover {
12    selector: Entity<ModelSelector>,
13    menu_handle: PopoverMenuHandle<ModelSelector>,
14}
15
16impl ModelSelectorPopover {
17    pub(crate) fn new(
18        selector: Rc<dyn AgentModelSelector>,
19        menu_handle: PopoverMenuHandle<ModelSelector>,
20        focus_handle: FocusHandle,
21        window: &mut Window,
22        cx: &mut Context<Self>,
23    ) -> Self {
24        Self {
25            selector: cx
26                .new(move |cx| acp_model_selector(selector, focus_handle.clone(), window, cx)),
27            menu_handle,
28        }
29    }
30
31    pub fn toggle(&self, window: &mut Window, cx: &mut Context<Self>) {
32        self.menu_handle.toggle(window, cx);
33    }
34
35    pub fn active_model<'a>(&self, cx: &'a App) -> Option<&'a AgentModelInfo> {
36        self.selector.read(cx).delegate.active_model()
37    }
38
39    pub fn cycle_favorite_models(&self, window: &mut Window, cx: &mut Context<Self>) {
40        self.selector.update(cx, |selector, cx| {
41            selector.delegate.cycle_favorite_models(window, cx);
42        });
43    }
44}
45
46impl Render for ModelSelectorPopover {
47    fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
48        let selector = self.selector.read(cx);
49        let model = selector.delegate.active_model();
50        let model_name = model
51            .as_ref()
52            .map(|model| model.name.clone())
53            .unwrap_or_else(|| SharedString::from("Select a Model"));
54
55        let model_icon = model.as_ref().and_then(|model| model.icon.clone());
56
57        let (color, icon) = if self.menu_handle.is_deployed() {
58            (Color::Accent, IconName::ChevronUp)
59        } else {
60            (Color::Muted, IconName::ChevronDown)
61        };
62
63        let show_cycle_row = selector.delegate.favorites_count() > 1;
64
65        let tooltip = Tooltip::element({
66            move |_, _cx| {
67                ModelSelectorTooltip::new()
68                    .show_cycle_row(show_cycle_row)
69                    .into_any_element()
70            }
71        });
72
73        PickerPopoverMenu::new(
74            self.selector.clone(),
75            Button::new("active-model", model_name)
76                .label_size(LabelSize::Small)
77                .color(color)
78                .when_some(model_icon, |this, icon| {
79                    this.start_icon(
80                        match icon {
81                            AgentModelIcon::Path(path) => Icon::from_external_svg(path),
82                            AgentModelIcon::Named(icon_name) => Icon::new(icon_name),
83                        }
84                        .color(color)
85                        .size(IconSize::XSmall),
86                    )
87                })
88                .end_icon(Icon::new(icon).color(Color::Muted).size(IconSize::XSmall)),
89            tooltip,
90            gpui::Anchor::BottomRight,
91            cx,
92        )
93        .with_handle(self.menu_handle.clone())
94        .render(window, cx)
95    }
96}
97
Served at tenant.openagents/omega Member data and write actions are omitted.