tui_logger/widget/
inner.rs

1use parking_lot::Mutex;
2use std::sync::Arc;
3
4use chrono::{DateTime, Local};
5use log::LevelFilter;
6
7use crate::{
8    set_level_for_target, CircularBuffer, ExtLogRecord, LevelConfig, TuiLoggerFile, TuiWidgetEvent,
9};
10
11pub struct TuiLoggerInner {
12    pub hot_depth: usize,
13    pub events: CircularBuffer<ExtLogRecord>,
14    pub dump: Option<TuiLoggerFile>,
15    pub total_events: usize,
16    pub default: LevelFilter,
17    pub targets: LevelConfig,
18}
19
20/// This struct contains the shared state of a TuiLoggerWidget and a TuiLoggerTargetWidget.
21#[derive(Default)]
22pub struct TuiWidgetState {
23    pub inner: Arc<Mutex<TuiWidgetInnerState>>,
24}
25impl TuiWidgetState {
26    /// Create a new TuiWidgetState
27    pub fn new() -> TuiWidgetState {
28        TuiWidgetState {
29            inner: Arc::new(Mutex::new(TuiWidgetInnerState::new())),
30        }
31    }
32    pub fn set_default_display_level(self, levelfilter: LevelFilter) -> TuiWidgetState {
33        self.inner.lock().config.default_display_level = Some(levelfilter);
34        self
35    }
36    pub fn set_level_for_target(self, target: &str, levelfilter: LevelFilter) -> TuiWidgetState {
37        self.inner.lock().config.set(target, levelfilter);
38        self
39    }
40    pub fn transition(&self, event: TuiWidgetEvent) {
41        self.inner.lock().transition(event);
42    }
43}
44
45#[derive(Default)]
46pub struct TuiWidgetInnerState {
47    pub config: LevelConfig,
48    pub nr_items: usize,
49    pub selected: usize,
50    pub opt_timestamp_bottom: Option<DateTime<Local>>,
51    pub opt_timestamp_next_page: Option<DateTime<Local>>,
52    pub opt_timestamp_prev_page: Option<DateTime<Local>>,
53    pub opt_selected_target: Option<String>,
54    pub opt_selected_visibility_more: Option<LevelFilter>,
55    pub opt_selected_visibility_less: Option<LevelFilter>,
56    pub opt_selected_recording_more: Option<LevelFilter>,
57    pub opt_selected_recording_less: Option<LevelFilter>,
58    pub offset: usize,
59    pub hide_off: bool,
60    pub hide_target: bool,
61    pub focus_selected: bool,
62}
63impl TuiWidgetInnerState {
64    pub fn new() -> TuiWidgetInnerState {
65        TuiWidgetInnerState::default()
66    }
67    fn transition(&mut self, event: TuiWidgetEvent) {
68        use TuiWidgetEvent::*;
69        match event {
70            SpaceKey => {
71                self.hide_off ^= true;
72            }
73            HideKey => {
74                self.hide_target ^= true;
75            }
76            FocusKey => {
77                self.focus_selected ^= true;
78            }
79            UpKey => {
80                if !self.hide_target && self.selected > 0 {
81                    self.selected -= 1;
82                }
83            }
84            DownKey => {
85                if !self.hide_target && self.selected + 1 < self.nr_items {
86                    self.selected += 1;
87                }
88            }
89            LeftKey => {
90                if let Some(selected_target) = self.opt_selected_target.take() {
91                    if let Some(selected_visibility_less) = self.opt_selected_visibility_less.take()
92                    {
93                        self.config.set(&selected_target, selected_visibility_less);
94                    }
95                }
96            }
97            RightKey => {
98                if let Some(selected_target) = self.opt_selected_target.take() {
99                    if let Some(selected_visibility_more) = self.opt_selected_visibility_more.take()
100                    {
101                        self.config.set(&selected_target, selected_visibility_more);
102                    }
103                }
104            }
105            PlusKey => {
106                if let Some(selected_target) = self.opt_selected_target.take() {
107                    if let Some(selected_recording_more) = self.opt_selected_recording_more.take() {
108                        set_level_for_target(&selected_target, selected_recording_more);
109                    }
110                }
111            }
112            MinusKey => {
113                if let Some(selected_target) = self.opt_selected_target.take() {
114                    if let Some(selected_recording_less) = self.opt_selected_recording_less.take() {
115                        set_level_for_target(&selected_target, selected_recording_less);
116                    }
117                }
118            }
119            PrevPageKey => self.opt_timestamp_bottom = self.opt_timestamp_prev_page,
120            NextPageKey => self.opt_timestamp_bottom = self.opt_timestamp_next_page,
121            EscapeKey => self.opt_timestamp_bottom = None,
122        }
123    }
124}