1use crate::{App, InputMode};
5
6#[derive(Debug, Default, Clone, PartialEq, Eq)]
9pub enum Overlay {
10 #[default]
12 None,
13 SortFilter,
14 PivotMelt,
15 Export {
17 returns_to: Box<Overlay>,
18 },
19 Copy,
21 Inspect,
23 GoToColumn,
25 PickFormat,
27 Retype {
29 returns_to: Box<Overlay>,
30 },
31 Combine {
33 returns_to: Box<Overlay>,
34 },
35 PickTable,
37 Info,
38 Chart,
39 ChartExport,
41 ValueCounts,
43 Hex,
45 Sample,
47 Analysis,
49 View,
51}
52
53impl Overlay {
54 fn back(self) -> Overlay {
56 match self {
57 Overlay::Export { returns_to }
58 | Overlay::Retype { returns_to }
59 | Overlay::Combine { returns_to } => *returns_to,
60 Overlay::ChartExport => Overlay::Chart,
61 _ => Overlay::None,
62 }
63 }
64
65 pub fn shows(&self, overlay: &Overlay) -> bool {
68 self == overlay
69 || match self {
70 Overlay::Export { returns_to }
71 | Overlay::Retype { returns_to }
72 | Overlay::Combine { returns_to } => returns_to.shows(overlay),
73 Overlay::ChartExport => *overlay == Overlay::Chart,
74 _ => false,
75 }
76 }
77}
78
79impl App {
80 pub(crate) fn open_overlay(&mut self, overlay: Overlay) {
82 self.show_table();
83 self.overlay = overlay;
84 }
85
86 pub(crate) fn show_table(&mut self) {
88 self.input_mode = InputMode::Normal;
89 self.prompt.input_type = None;
90 }
91
92 pub(crate) fn open_over(&mut self, overlay: impl FnOnce(Box<Overlay>) -> Overlay) {
94 let under = std::mem::take(&mut self.overlay);
95 self.open_overlay(overlay(Box::new(under)));
96 }
97
98 pub fn close_overlay(&mut self) {
101 match self.overlay {
102 Overlay::Copy => self.copy_modal.close(),
103 Overlay::Inspect => self.inspector_modal.close(),
104 Overlay::SortFilter => self.sort_filter_modal.close(),
105 Overlay::PivotMelt => self.pivot_melt_modal.close(),
106 Overlay::Export { .. } => self.export_modal.close(),
107 Overlay::Retype { .. } | Overlay::Combine { .. } => {
108 self.column_forms.retype = None;
109 self.column_forms.combine = None;
110 }
111 Overlay::Sample => self.sample.form = None,
112 Overlay::PickTable => self.pickers.table_choices = None,
113 Overlay::Hex => {
114 self.stop_hex_find();
115 self.hex.close();
116 }
117 Overlay::Chart => {
118 self.chart.modal.close();
119 self.reset_chart_state();
120 }
121 Overlay::ChartExport => self.chart.export_modal.close(),
122 Overlay::Analysis => self.analysis_modal.close(),
123 Overlay::View => self.view_modal.close(),
124 _ => {}
125 }
126 self.step_back();
127 }
128
129 pub(crate) fn close_overlays(&mut self) {
131 while self.overlay != Overlay::None {
132 self.close_overlay();
133 }
134 }
135
136 pub(crate) fn step_back(&mut self) {
139 self.overlay = std::mem::take(&mut self.overlay).back();
140 }
141
142 pub fn at_table(&self) -> bool {
144 self.overlay == Overlay::None && self.input_mode == InputMode::Normal
145 }
146}