Skip to main content

fresh/app/
view_actions.rs

1//! View mode action handlers.
2//!
3//! This module contains handlers for view-related actions like compose mode toggling.
4
5use super::Editor;
6use crate::state::ViewMode;
7use rust_i18n::t;
8
9impl Editor {
10    /// Toggle between Compose and Source view modes.
11    pub fn handle_toggle_compose_mode(&mut self) {
12        let default_wrap = self.config.editor.line_wrap;
13        let default_line_numbers = self.config.editor.line_numbers;
14        let active_split = self.split_manager.active_split();
15
16        let view_mode = {
17            let current = self
18                .split_view_states
19                .get(&active_split)
20                .map(|vs| vs.view_mode.clone())
21                .unwrap_or(ViewMode::Source);
22            match current {
23                ViewMode::Compose => ViewMode::Source,
24                _ => ViewMode::Compose,
25            }
26        };
27
28        // Update split view state (source of truth for view mode and line numbers)
29        if let Some(vs) = self.split_view_states.get_mut(&active_split) {
30            vs.view_mode = view_mode.clone();
31            // In Compose mode, disable builtin line wrap - the plugin handles
32            // wrapping by inserting Break tokens in the view transform pipeline.
33            // In Source mode, respect the user's default_wrap preference.
34            vs.viewport.line_wrap_enabled = match view_mode {
35                ViewMode::Compose => false,
36                ViewMode::Source => default_wrap,
37            };
38            match view_mode {
39                ViewMode::Compose => {
40                    vs.show_line_numbers = false;
41                }
42                ViewMode::Source => {
43                    // Clear compose width to remove margins
44                    vs.compose_width = None;
45                    vs.view_transform = None;
46                    vs.show_line_numbers = default_line_numbers;
47                }
48            }
49        }
50
51        let mode_label = match view_mode {
52            ViewMode::Compose => t!("view.compose").to_string(),
53            ViewMode::Source => "Source".to_string(),
54        };
55        self.set_status_message(t!("view.mode", mode = mode_label).to_string());
56    }
57}