tui_logger/widget/
inner.rs1use 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#[derive(Default)]
22pub struct TuiWidgetState {
23 pub inner: Arc<Mutex<TuiWidgetInnerState>>,
24}
25impl TuiWidgetState {
26 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}