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}