Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T06:55:35.642Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

preview.rs

135 lines · 5.7 KB · rust
1use csv_preview::{CsvPreviewView, TabularDataPreviewFeatureFlag};
2use editor::{Editor, MultiBuffer};
3use feature_flags::FeatureFlagAppExt as _;
4use gpui::{AnyElement, Entity, Modifiers};
5use markdown_preview::markdown_preview_view::MarkdownPreviewView;
6use svg_preview::svg_preview_view::SvgPreviewView;
7use ui::{Tooltip, prelude::*, text_for_keystroke};
8
9use super::QuickActionBar;
10
11enum PreviewTarget {
12    Markdown(Entity<Editor>),
13    Svg(Entity<MultiBuffer>),
14    Csv(Entity<Editor>),
15}
16
17impl QuickActionBar {
18    pub fn render_preview_button(&self, cx: &mut Context<Self>) -> Option<AnyElement> {
19        // Resolve against this toolbar's own pane item rather than the
20        // workspace's focused item, so each pane's button reflects and
21        // targets the content of the pane it belongs to.
22        let active_item = self.active_item.as_ref()?;
23        let editor = active_item.act_as::<Editor>(cx);
24
25        let preview_target = if let Some(editor) = &editor
26            && MarkdownPreviewView::is_markdown_file(editor, cx)
27        {
28            PreviewTarget::Markdown(editor.clone())
29        } else if let Some(buffer) = active_item.act_as::<MultiBuffer>(cx)
30            && SvgPreviewView::is_svg_file(&buffer, cx)
31        {
32            PreviewTarget::Svg(buffer)
33        } else if let Some(editor) = editor
34            && cx.has_flag::<TabularDataPreviewFeatureFlag>()
35            && CsvPreviewView::is_csv_file(&editor, cx)
36        {
37            PreviewTarget::Csv(editor)
38        } else {
39            return None;
40        };
41
42        let (button_id, tooltip_text, open_action_for_tooltip) = match &preview_target {
43            PreviewTarget::Markdown(_) => (
44                "toggle-markdown-preview",
45                "Preview Markdown",
46                &markdown_preview::OpenPreview as &dyn gpui::Action,
47            ),
48            PreviewTarget::Svg(_) => (
49                "toggle-svg-preview",
50                "Preview SVG",
51                &svg_preview::OpenPreview as &dyn gpui::Action,
52            ),
53            PreviewTarget::Csv(_) => (
54                "toggle-csv-preview",
55                "Preview CSV",
56                &csv_preview::OpenPreview as &dyn gpui::Action,
57            ),
58        };
59
60        let alt_click = gpui::Keystroke {
61            key: "click".into(),
62            modifiers: Modifiers::alt(),
63            ..Default::default()
64        };
65
66        let button = IconButton::new(button_id, IconName::Eye)
67            .icon_size(IconSize::Small)
68            .style(ButtonStyle::Subtle)
69            .tooltip(move |_window, cx| {
70                Tooltip::with_meta(
71                    tooltip_text,
72                    Some(open_action_for_tooltip),
73                    format!(
74                        "{} to open in a split",
75                        text_for_keystroke(&alt_click.modifiers, &alt_click.key, cx)
76                    ),
77                    cx,
78                )
79            })
80            .on_click({
81                let workspace_handle = self.workspace.clone();
82                let active_item = active_item.boxed_clone();
83                move |_, window, cx| {
84                    let Some(workspace) = workspace_handle.upgrade() else {
85                        return;
86                    };
87                    workspace.update(cx, |workspace, cx| {
88                        let Some(pane) = workspace.pane_for(active_item.as_ref()) else {
89                            return;
90                        };
91                        let open_to_the_side = window.modifiers().alt;
92                        match &preview_target {
93                            PreviewTarget::Markdown(editor) => {
94                                let editor = editor.clone();
95                                if open_to_the_side {
96                                    MarkdownPreviewView::open_preview_to_the_side_of_pane(
97                                        workspace, editor, pane, window, cx,
98                                    );
99                                } else {
100                                    MarkdownPreviewView::open_preview_in_pane(
101                                        workspace, editor, pane, window, cx,
102                                    );
103                                }
104                            }
105                            PreviewTarget::Svg(buffer) => {
106                                let buffer = buffer.clone();
107                                if open_to_the_side {
108                                    SvgPreviewView::open_preview_to_the_side_of_pane(
109                                        workspace, buffer, pane, window, cx,
110                                    );
111                                } else {
112                                    SvgPreviewView::open_preview_in_pane(
113                                        workspace, buffer, pane, window, cx,
114                                    );
115                                }
116                            }
117                            PreviewTarget::Csv(editor) => {
118                                let editor = editor.clone();
119                                if open_to_the_side {
120                                    CsvPreviewView::open_preview_to_the_side_of_pane(
121                                        workspace, editor, pane, window, cx,
122                                    );
123                                } else {
124                                    CsvPreviewView::open_preview_in_pane(editor, pane, window, cx);
125                                }
126                            }
127                        }
128                    });
129                }
130            });
131
132        Some(button.into_any_element())
133    }
134}
135
Served at tenant.openagents/omega Member data and write actions are omitted.