Skip to main content

ek_ui/
hostwin.rs

1//! 宿主自有窗 —— 运维 / 查询合约 / K线(0.9.34 并入同一张挂载表)。
2//!
3//! 这三扇窗不属于任何插件,是 ek-ui 自己就有的("宿主自有");本模块把它们
4//! 也做成 [`crate::mount::Body`] 的一个变体,于是**菜单与窗口只剩一条代码路径**
5//! (`Registry::menu` → `Registry::windows` → `Body::*`),不再有硬编码的
6//! `egui::Window::new("运维窗")` 散在 `render_windows` 里。
7//!
8//! 开合事实源仍是 [`crate::state::UiShared`] 的老旗子(`ops_window` / `contracts_window`
9//! / `kline_windows`)—— 挂载表只是它的视图,不新增第二份状态。
10
11use crate::state::UiShared;
12
13/// 宿主窗种类。
14pub enum HostKind {
15    /// 运维窗(插件表 / 服务目录 / 配置托底)。
16    Ops,
17    /// 查询合约窗。
18    Contracts,
19    /// K线窗(按合约多开)。
20    Kline { symbol: String },
21}
22
23/// 宿主窗态。
24pub struct State {
25    /// 本窗画哪一扇。
26    pub kind: HostKind,
27}
28
29impl State {
30    /// 按种类建态。
31    #[must_use]
32    pub fn new(kind: HostKind) -> Self {
33        Self { kind }
34    }
35}
36
37/// 渲染宿主窗内容(窗框由 [`crate::mount`] 统一提供)。
38pub fn render(ui: &mut egui::Ui, st: &mut State, shared: &UiShared) {
39    match &st.kind {
40        HostKind::Ops => crate::render::render_ops_window(ui, shared),
41        HostKind::Contracts => crate::render::render_contracts_window(ui, shared),
42        HostKind::Kline { symbol } => {
43            let sym = symbol.clone();
44            // ESC = 关窗(与旧硬编码块同口径;键按子窗焦点路由,主窗按键不误关)。
45            if crate::render::render_kline_body(ui, shared, &sym) {
46                shared.close_kline(&sym);
47            }
48        }
49    }
50}