use egui_dock::tab_viewer::OnCloseResponse;
use egui_dock::{
AllowedSplits, DockArea, DockState, Node, NodeIndex, Split, Style, SurfaceIndex, TabViewer,
};
use crate::state::UiShared;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DataGroup {
Orders,
Trades,
Positions,
Funds,
}
impl DataGroup {
pub const ALL: [DataGroup; 4] = [
DataGroup::Orders,
DataGroup::Trades,
DataGroup::Positions,
DataGroup::Funds,
];
pub fn title(&self) -> &'static str {
match self {
DataGroup::Orders => "委托",
DataGroup::Trades => "成交",
DataGroup::Positions => "持仓",
DataGroup::Funds => "资金",
}
}
}
pub fn default_tree() -> DockState<DataGroup> {
let mut tree = DockState::new(vec![DataGroup::Orders]);
let main = SurfaceIndex::main();
let [left, right] = tree.split(
(main, NodeIndex::from(0usize)),
Split::Right,
0.5,
Node::leaf(DataGroup::Trades),
);
tree.split(
(main, left),
Split::Below,
0.5,
Node::leaf(DataGroup::Positions),
);
tree.split(
(main, right),
Split::Below,
0.5,
Node::leaf(DataGroup::Funds),
);
tree
}
pub struct EkTabViewer<'a> {
shared: &'a UiShared,
}
impl<'a> EkTabViewer<'a> {
pub fn new(shared: &'a UiShared) -> Self {
Self { shared }
}
}
impl TabViewer for EkTabViewer<'_> {
type Tab = DataGroup;
fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText {
tab.title().to_string().into()
}
fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) {
match tab {
DataGroup::Orders => crate::render::render_topleft_group(ui, self.shared),
DataGroup::Trades => crate::render::render_trades_group(ui, self.shared),
DataGroup::Positions => crate::render::render_positions_group(ui, self.shared),
DataGroup::Funds => crate::render::render_bottomright_group(ui, self.shared),
}
}
fn id(&mut self, tab: &mut Self::Tab) -> egui::Id {
egui::Id::new(*tab)
}
fn is_closeable(&self, _tab: &Self::Tab) -> bool {
false
}
fn closeable(&mut self, _tab: &mut Self::Tab) -> bool {
false
}
fn on_close(&mut self, _tab: &mut Self::Tab) -> OnCloseResponse {
OnCloseResponse::Ignore
}
fn allowed_in_windows(&self, _tab: &mut Self::Tab) -> bool {
true
}
}
pub fn show_monitor_dock(ui: &mut egui::Ui, shared: &UiShared) {
let mut guard = shared.dock_tree();
if guard.is_none() {
*guard = Some(default_tree());
}
let tree = guard.as_mut().expect("dock 树已初始化");
let style = Style::from_egui(ui.style().as_ref());
DockArea::new(tree)
.id(egui::Id::new("ek_monitor_dock"))
.style(style)
.show_close_buttons(false)
.show_add_buttons(false)
.show_leaf_close_all_buttons(false)
.show_leaf_collapse_buttons(false)
.draggable_tabs(true)
.allowed_splits(AllowedSplits::All)
.show_inside(ui, &mut EkTabViewer::new(shared));
}