use super::DateRange;
use crate::model::Timeframe;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SessionType {
#[default]
RTH,
ETH,
Full24x7,
}
impl SessionType {
pub fn label(&self) -> &'static str {
match self {
SessionType::RTH => "RTH",
SessionType::ETH => "ETH",
SessionType::Full24x7 => "24/7",
}
}
pub fn tooltip(&self) -> &'static str {
match self {
SessionType::RTH => "Regular trading hours",
SessionType::ETH => "Extended trading hours",
SessionType::Full24x7 => "24/7 trading",
}
}
}
#[derive(Clone, Debug)]
pub struct TimeframeToolbarState {
pub timeframe: Timeframe,
pub sel_range: DateRange,
pub date_picker_open: bool,
pub range_collapsed: bool,
pub timezone: String,
pub timezone_menu_open: bool,
pub session_type: SessionType,
pub session_menu_open: bool,
pub adjust_for_dividends: bool,
pub curr_time: Option<chrono::DateTime<chrono::Utc>>,
pub trading_panel_expanded: bool,
}
impl Default for TimeframeToolbarState {
fn default() -> Self {
Self {
timeframe: Timeframe::Min1,
sel_range: DateRange::Month1,
date_picker_open: false,
range_collapsed: false,
timezone: "UTC".to_string(),
timezone_menu_open: false,
session_type: SessionType::RTH,
session_menu_open: false,
adjust_for_dividends: false,
curr_time: None,
trading_panel_expanded: false,
}
}
}
impl TimeframeToolbarState {
pub fn toggle_trading_panel(&mut self) {
self.trading_panel_expanded = !self.trading_panel_expanded;
}
pub fn set_trading_panel_expanded(&mut self, expanded: bool) {
self.trading_panel_expanded = expanded;
}
}
impl TimeframeToolbarState {
pub fn new() -> Self {
Self::default()
}
pub fn set_timeframe(&mut self, timeframe: Timeframe) {
self.timeframe = timeframe;
}
pub fn set_date_range(&mut self, range: DateRange) {
self.sel_range = range;
}
pub fn toggle_date_picker(&mut self) {
self.date_picker_open = !self.date_picker_open;
}
pub fn toggle_range_collapsed(&mut self) {
self.range_collapsed = !self.range_collapsed;
}
pub fn set_timezone(&mut self, timezone: String) {
self.timezone = timezone;
}
pub fn toggle_timezone_menu(&mut self) {
self.timezone_menu_open = !self.timezone_menu_open;
}
pub fn set_session_type(&mut self, session: SessionType) {
self.session_type = session;
}
pub fn toggle_session_menu(&mut self) {
self.session_menu_open = !self.session_menu_open;
}
pub fn toggle_adjust_for_dividends(&mut self) {
self.adjust_for_dividends = !self.adjust_for_dividends;
}
pub fn update_time(&mut self) {
self.curr_time = Some(chrono::Utc::now());
}
pub fn formatted_time(&self) -> String {
match &self.curr_time {
Some(time) => {
let formatted = time.format("%H:%M:%S").to_string();
format!("{} {}", formatted, self.timezone)
}
None => format!("--:--:-- {}", self.timezone),
}
}
pub fn sync_from_app_state(&mut self, app_state: &dyn crate::ui::app_state::ChartAppState) {
self.timeframe = *app_state.active_timeframe();
}
}