ek-ui 0.9.46

ek 生态常驻主界面(egui/eframe):插件即界面——观测页 + 日志页,车头与 UI 同插件
//! 宿主自有窗 —— 运维 / 查询合约 / K线(0.9.34 并入同一张挂载表)。
//!
//! 这三扇窗不属于任何插件,是 ek-ui 自己就有的("宿主自有");本模块把它们
//! 也做成 [`crate::mount::Body`] 的一个变体,于是**菜单与窗口只剩一条代码路径**
//! (`Registry::menu` → `Registry::windows` → `Body::*`),不再有硬编码的
//! `egui::Window::new("运维窗")` 散在 `render_windows` 里。
//!
//! 开合事实源仍是 [`crate::state::UiShared`] 的老旗子(`ops_window` / `contracts_window`
//! / `kline_windows`)—— 挂载表只是它的视图,不新增第二份状态。

use crate::state::UiShared;

/// 宿主窗种类。
pub enum HostKind {
    /// 运维窗(插件表 / 服务目录 / 配置托底)。
    Ops,
    /// 查询合约窗。
    Contracts,
    /// K线窗(按合约多开)。
    Kline { symbol: String },
}

/// 宿主窗态。
pub struct State {
    /// 本窗画哪一扇。
    pub kind: HostKind,
}

impl State {
    /// 按种类建态。
    #[must_use]
    pub fn new(kind: HostKind) -> Self {
        Self { kind }
    }
}

/// 渲染宿主窗内容(窗框由 [`crate::mount`] 统一提供)。
pub fn render(ui: &mut egui::Ui, st: &mut State, shared: &UiShared) {
    match &st.kind {
        HostKind::Ops => crate::render::render_ops_window(ui, shared),
        HostKind::Contracts => crate::render::render_contracts_window(ui, shared),
        HostKind::Kline { symbol } => {
            let sym = symbol.clone();
            // ESC = 关窗(与旧硬编码块同口径;键按子窗焦点路由,主窗按键不误关)。
            if crate::render::render_kline_body(ui, shared, &sym) {
                shared.close_kline(&sym);
            }
        }
    }
}