Skip to repository content97 lines · 3.3 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T04:05:28.765Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
model_selector_popover.rs
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