1use egui_dock::tab_viewer::OnCloseResponse;
14use egui_dock::{
15 AllowedSplits, DockArea, DockState, Node, NodeIndex, Split, Style, SurfaceIndex, TabViewer,
16};
17
18use crate::state::UiShared;
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22pub enum DataGroup {
23 Orders,
25 Trades,
27 Positions,
29 Funds,
31}
32
33impl DataGroup {
34 pub const ALL: [DataGroup; 4] = [
36 DataGroup::Orders,
37 DataGroup::Trades,
38 DataGroup::Positions,
39 DataGroup::Funds,
40 ];
41
42 pub fn title(&self) -> &'static str {
45 match self {
46 DataGroup::Orders => "委托",
47 DataGroup::Trades => "成交",
48 DataGroup::Positions => "持仓",
49 DataGroup::Funds => "资金",
50 }
51 }
52}
53
54pub fn default_tree() -> DockState<DataGroup> {
59 let mut tree = DockState::new(vec![DataGroup::Orders]);
60 let main = SurfaceIndex::main();
61 let [left, right] = tree.split(
62 (main, NodeIndex::from(0usize)),
63 Split::Right,
64 0.5,
65 Node::leaf(DataGroup::Trades),
66 );
67 tree.split(
68 (main, left),
69 Split::Below,
70 0.5,
71 Node::leaf(DataGroup::Positions),
72 );
73 tree.split(
74 (main, right),
75 Split::Below,
76 0.5,
77 Node::leaf(DataGroup::Funds),
78 );
79 tree
80}
81
82pub struct EkTabViewer<'a> {
84 shared: &'a UiShared,
85}
86
87impl<'a> EkTabViewer<'a> {
88 pub fn new(shared: &'a UiShared) -> Self {
89 Self { shared }
90 }
91}
92
93impl TabViewer for EkTabViewer<'_> {
94 type Tab = DataGroup;
95
96 fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText {
97 tab.title().to_string().into()
98 }
99
100 fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) {
101 match tab {
102 DataGroup::Orders => crate::render::render_topleft_group(ui, self.shared),
103 DataGroup::Trades => crate::render::render_trades_group(ui, self.shared),
104 DataGroup::Positions => crate::render::render_positions_group(ui, self.shared),
105 DataGroup::Funds => crate::render::render_bottomright_group(ui, self.shared),
106 }
107 }
108
109 fn id(&mut self, tab: &mut Self::Tab) -> egui::Id {
110 egui::Id::new(*tab)
111 }
112
113 fn is_closeable(&self, _tab: &Self::Tab) -> bool {
115 false
116 }
117
118 fn closeable(&mut self, _tab: &mut Self::Tab) -> bool {
119 false
120 }
121
122 fn on_close(&mut self, _tab: &mut Self::Tab) -> OnCloseResponse {
123 OnCloseResponse::Ignore
124 }
125
126 fn allowed_in_windows(&self, _tab: &mut Self::Tab) -> bool {
128 true
129 }
130}
131
132pub fn show_monitor_dock(ui: &mut egui::Ui, shared: &UiShared) {
135 let mut guard = shared.dock_tree();
136 if guard.is_none() {
137 *guard = Some(default_tree());
138 }
139 let tree = guard.as_mut().expect("dock 树已初始化");
140 let style = Style::from_egui(ui.style().as_ref());
141 DockArea::new(tree)
142 .id(egui::Id::new("ek_monitor_dock"))
143 .style(style)
144 .show_close_buttons(false)
145 .show_add_buttons(false)
146 .show_leaf_close_all_buttons(false)
149 .show_leaf_collapse_buttons(false)
150 .draggable_tabs(true)
151 .allowed_splits(AllowedSplits::All)
152 .show_inside(ui, &mut EkTabViewer::new(shared));
153}