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_page_view(&mut self) {
12        let active_split = self.split_manager.active_split();
13        let active_buffer = self
14            .split_manager
15            .get_buffer_id(active_split.into())
16            .unwrap_or(crate::model::event::BufferId(0));
17        let default_wrap = self.resolve_line_wrap_for_buffer(active_buffer);
18        let default_line_numbers = self.config.editor.line_numbers;
19        let page_width = self
20            .buffers
21            .get(&active_buffer)
22            .and_then(|s| self.config.languages.get(&s.language))
23            .and_then(|lc| lc.page_width)
24            .or(self.config.editor.page_width);
25
26        let view_mode = {
27            let current = self
28                .split_view_states
29                .get(&active_split)
30                .map(|vs| vs.view_mode.clone())
31                .unwrap_or(ViewMode::Source);
32            match current {
33                ViewMode::PageView => ViewMode::Source,
34                _ => ViewMode::PageView,
35            }
36        };
37
38        // Update split view state (source of truth for view mode and line numbers)
39        if let Some(vs) = self.split_view_states.get_mut(&active_split) {
40            vs.view_mode = view_mode.clone();
41            // In Compose mode, disable builtin line wrap - the plugin handles
42            // wrapping by inserting Break tokens in the view transform pipeline.
43            // In Source mode, respect the user's default_wrap preference.
44            vs.viewport.line_wrap_enabled = match view_mode {
45                ViewMode::PageView => false,
46                ViewMode::Source => default_wrap,
47            };
48            match view_mode {
49                ViewMode::PageView => {
50                    vs.show_line_numbers = false;
51                    // Apply page_width from language config if available
52                    if let Some(width) = page_width {
53                        vs.compose_width = Some(width as u16);
54                    }
55                }
56                ViewMode::Source => {
57                    // Clear compose width to remove margins
58                    vs.compose_width = None;
59                    vs.view_transform = None;
60                    vs.show_line_numbers = default_line_numbers;
61                }
62            }
63        }
64
65        let mode_label = match view_mode {
66            ViewMode::PageView => t!("view.page_view").to_string(),
67            ViewMode::Source => "Source".to_string(),
68        };
69        self.set_status_message(t!("view.mode", mode = mode_label).to_string());
70    }
71}