1use super::*;
6
7impl Editor {
8 pub fn should_quit(&self) -> bool {
10 self.should_quit
11 }
12
13 pub fn should_detach(&self) -> bool {
15 self.should_detach
16 }
17
18 pub fn clear_detach(&mut self) {
20 self.should_detach = false;
21 }
22
23 pub fn set_session_mode(&mut self, session_mode: bool) {
25 self.session_mode = session_mode;
26 self.clipboard.set_session_mode(session_mode);
27 if session_mode {
29 self.active_custom_contexts
30 .insert(crate::types::context_keys::SESSION_MODE.to_string());
31 } else {
32 self.active_custom_contexts
33 .remove(crate::types::context_keys::SESSION_MODE);
34 }
35 }
36
37 pub fn is_session_mode(&self) -> bool {
39 self.session_mode
40 }
41
42 pub fn set_software_cursor_only(&mut self, enabled: bool) {
45 self.software_cursor_only = enabled;
46 }
47
48 pub fn set_session_name(&mut self, name: Option<String>) {
54 if let Some(ref session_name) = name {
55 let base_recovery_dir = self.dir_context.recovery_dir();
56 let scope = crate::services::recovery::RecoveryScope::Session {
57 name: session_name.clone(),
58 };
59 let recovery_config = RecoveryConfig {
60 enabled: self.recovery_service.is_enabled(),
61 ..RecoveryConfig::default()
62 };
63 self.recovery_service =
64 RecoveryService::with_scope(recovery_config, &base_recovery_dir, &scope);
65 }
66 self.session_name = name;
67 }
68
69 pub fn session_name(&self) -> Option<&str> {
71 self.session_name.as_deref()
72 }
73
74 pub fn queue_escape_sequences(&mut self, sequences: &[u8]) {
76 self.pending_escape_sequences.extend_from_slice(sequences);
77 }
78
79 pub fn take_pending_escape_sequences(&mut self) -> Vec<u8> {
81 std::mem::take(&mut self.pending_escape_sequences)
82 }
83
84 pub fn take_pending_clipboard(
86 &mut self,
87 ) -> Option<crate::services::clipboard::PendingClipboard> {
88 self.clipboard.take_pending_clipboard()
89 }
90
91 pub fn should_restart(&self) -> bool {
93 self.restart_with_dir.is_some()
94 }
95
96 pub fn take_restart_dir(&mut self) -> Option<PathBuf> {
99 self.restart_with_dir.take()
100 }
101
102 pub fn request_full_redraw(&mut self) {
107 self.full_redraw_requested = true;
108 }
109
110 pub fn take_full_redraw_request(&mut self) -> bool {
112 let requested = self.full_redraw_requested;
113 self.full_redraw_requested = false;
114 requested
115 }
116
117 pub fn request_suspend(&mut self) {
121 self.suspend_requested = true;
122 }
123
124 pub fn take_suspend_request(&mut self) -> bool {
126 let requested = self.suspend_requested;
127 self.suspend_requested = false;
128 requested
129 }
130
131 pub fn request_restart(&mut self, new_working_dir: PathBuf) {
132 tracing::info!(
133 "Restart requested with new working directory: {}",
134 new_working_dir.display()
135 );
136 self.restart_with_dir = Some(new_working_dir);
137 self.should_quit = true;
139 }
140
141 pub fn theme(&self) -> &crate::view::theme::Theme {
143 &self.theme
144 }
145
146 pub fn is_settings_open(&self) -> bool {
148 self.settings_state.as_ref().is_some_and(|s| s.visible)
149 }
150
151 pub fn quit(&mut self) {
153 let modified_count = self.count_modified_buffers_needing_prompt();
155 if modified_count > 0 {
156 let save_key = t!("prompt.key.save").to_string();
157 let cancel_key = t!("prompt.key.cancel").to_string();
158 let hot_exit = self.config.editor.hot_exit;
159
160 let discard_key = t!("prompt.key.discard").to_string();
161 let msg = if hot_exit {
162 let quit_key = t!("prompt.key.quit").to_string();
164 if modified_count == 1 {
165 t!(
166 "prompt.quit_modified_hot_one",
167 save_key = save_key,
168 discard_key = discard_key,
169 quit_key = quit_key,
170 cancel_key = cancel_key
171 )
172 .to_string()
173 } else {
174 t!(
175 "prompt.quit_modified_hot_many",
176 count = modified_count,
177 save_key = save_key,
178 discard_key = discard_key,
179 quit_key = quit_key,
180 cancel_key = cancel_key
181 )
182 .to_string()
183 }
184 } else {
185 if modified_count == 1 {
187 t!(
188 "prompt.quit_modified_one",
189 save_key = save_key,
190 discard_key = discard_key,
191 cancel_key = cancel_key
192 )
193 .to_string()
194 } else {
195 t!(
196 "prompt.quit_modified_many",
197 count = modified_count,
198 save_key = save_key,
199 discard_key = discard_key,
200 cancel_key = cancel_key
201 )
202 .to_string()
203 }
204 };
205 self.start_prompt(msg, PromptType::ConfirmQuitWithModified);
206 } else {
207 self.should_quit = true;
208 }
209 }
210
211 fn count_modified_buffers_needing_prompt(&self) -> usize {
219 let hot_exit = self.config.editor.hot_exit;
220 let auto_save = self.config.editor.auto_save_enabled;
221
222 self.buffers
223 .iter()
224 .filter(|(buffer_id, state)| {
225 if !state.buffer.is_modified() {
226 return false;
227 }
228 if let Some(meta) = self.buffer_metadata.get(buffer_id) {
229 if let Some(path) = meta.file_path() {
230 let is_unnamed = path.as_os_str().is_empty();
231 if is_unnamed && hot_exit {
232 return false; }
234 if !is_unnamed && auto_save {
235 return false; }
237 }
238 }
239 true
240 })
241 .count()
242 }
243
244 pub fn focus_gained(&mut self) {
246 self.plugin_manager.run_hook(
247 "focus_gained",
248 crate::services::plugins::hooks::HookArgs::FocusGained {},
249 );
250 }
251
252 pub fn resize(&mut self, width: u16, height: u16) {
254 self.terminal_width = width;
256 self.terminal_height = height;
257
258 for view_state in self.split_view_states.values_mut() {
260 view_state.viewport.resize(width, height);
261 }
262
263 self.resize_visible_terminals();
265
266 self.plugin_manager.run_hook(
268 "resize",
269 fresh_core::hooks::HookArgs::Resize { width, height },
270 );
271 }
272}