ratatui_toolkit/widgets/markdown_widget/widget/constructors/
from_state.rs

1//! Construct MarkdownWidget from a unified MarkdownState.
2
3use crate::widgets::markdown_widget::extensions::scrollbar::ScrollbarConfig;
4use crate::widgets::markdown_widget::extensions::toc::TocConfig;
5use crate::widgets::markdown_widget::state::markdown_state::MarkdownState;
6use crate::widgets::markdown_widget::widget::enums::MarkdownWidgetMode;
7use crate::widgets::markdown_widget::widget::MarkdownWidget;
8
9impl<'a> MarkdownWidget<'a> {
10    /// Create a new MarkdownWidget from a unified MarkdownState.
11    ///
12    /// This is the preferred constructor as it simplifies state management
13    /// by bundling all component states into a single struct.
14    ///
15    /// # Arguments
16    ///
17    /// * `content` - The markdown content to render (pass `state.content()`)
18    /// * `state` - The unified markdown state containing all component states
19    ///
20    /// # Returns
21    ///
22    /// A new `MarkdownWidget` instance.
23    ///
24    /// # Example
25    ///
26    /// ```rust,ignore
27    /// use ratatui_toolkit::markdown_widget::state::MarkdownState;
28    /// use ratatui_toolkit::MarkdownWidget;
29    ///
30    /// let mut state = MarkdownState::default();
31    /// state.source.set_content("# Hello World");
32    ///
33    /// let content = state.content().to_string();
34    /// let widget = MarkdownWidget::from_state(&content, &mut state)
35    ///     .show_toc(true)
36    ///     .show_statusline(true);
37    /// ```
38    pub fn from_state(content: &'a str, state: &'a mut MarkdownState) -> Self {
39        // Use cached rendered lines if available, otherwise use state's rendered_lines
40        let rendered_lines = state
41            .cache
42            .render
43            .as_ref()
44            .map(|c| c.lines.clone())
45            .unwrap_or_else(|| state.rendered_lines.clone());
46
47        // Determine mode based on filter_mode state
48        let mode = if state.filter_mode {
49            MarkdownWidgetMode::Filter
50        } else {
51            MarkdownWidgetMode::Normal
52        };
53
54        Self {
55            content,
56            scroll: &mut state.scroll,
57            source: &mut state.source,
58            cache: &mut state.cache,
59            display: &state.display,
60            collapse: &mut state.collapse,
61            expandable: &mut state.expandable,
62            git_stats_state: &mut state.git_stats,
63            vim: &mut state.vim,
64            selection: &mut state.selection,
65            double_click: &mut state.double_click,
66            toc_state: None,
67            is_resizing: false,
68            mode,
69            show_statusline: true,
70            show_scrollbar: false,
71            scrollbar_config: ScrollbarConfig::default(),
72            selection_active: state.selection_active,
73            git_stats: state.cached_git_stats,
74            show_toc: false,
75            toc_config: TocConfig::default(),
76            toc_hovered: state.toc_hovered,
77            toc_hovered_entry: state.toc_hovered_entry,
78            toc_scroll_offset: state.toc_scroll_offset,
79            rendered_lines,
80            app_theme: None,
81            last_double_click: None,
82            filter: state.filter.clone(),
83            filter_mode: state.filter_mode,
84            bordered: false,
85            has_pane: true,
86            pane: None,
87            pane_title: None,
88            pane_color: None,
89        }
90    }
91}