toggle_markdown_preview.rs

 1use gpui::{AnyElement, Modifiers, WeakView};
 2use markdown_preview::{
 3    markdown_preview_view::MarkdownPreviewView, OpenPreview, OpenPreviewToTheSide,
 4};
 5use ui::{prelude::*, text_for_keystroke, IconButtonShape, Tooltip};
 6use workspace::Workspace;
 7
 8use crate::QuickActionBar;
 9
10impl QuickActionBar {
11    pub fn render_toggle_markdown_preview(
12        &self,
13        workspace: WeakView<Workspace>,
14        cx: &mut ViewContext<Self>,
15    ) -> Option<AnyElement> {
16        let mut active_editor_is_markdown = false;
17
18        if let Some(workspace) = self.workspace.upgrade() {
19            workspace.update(cx, |workspace, cx| {
20                active_editor_is_markdown =
21                    MarkdownPreviewView::resolve_active_item_as_markdown_editor(workspace, cx)
22                        .is_some();
23            });
24        }
25
26        if !active_editor_is_markdown {
27            return None;
28        }
29
30        let alt_click = gpui::Keystroke {
31            key: "click".into(),
32            modifiers: Modifiers::alt(),
33            ..Default::default()
34        };
35
36        let button = IconButton::new("toggle-markdown-preview", IconName::Eye)
37            .shape(IconButtonShape::Square)
38            .icon_size(IconSize::Small)
39            .style(ButtonStyle::Subtle)
40            .tooltip(move |cx| {
41                Tooltip::with_meta(
42                    "Preview Markdown",
43                    Some(&markdown_preview::OpenPreview),
44                    format!(
45                        "{} to open in a split",
46                        text_for_keystroke(&alt_click, PlatformStyle::platform())
47                    ),
48                    cx,
49                )
50            })
51            .on_click(move |_, cx| {
52                if let Some(workspace) = workspace.upgrade() {
53                    workspace.update(cx, |_, cx| {
54                        if cx.modifiers().alt {
55                            cx.dispatch_action(Box::new(OpenPreviewToTheSide));
56                        } else {
57                            cx.dispatch_action(Box::new(OpenPreview));
58                        }
59                    });
60                }
61            });
62
63        Some(button.into_any_element())
64    }
65}