Skip to repository content135 lines · 5.7 KB · rust
tenant.openagents/omega
No repository description is available.
OpenAgents Git authority 2026-07-28T06:55:35.642Z Public web read
NIP-34 coordinate
30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omegaMaintainersHidden in public view
References2 branches · 1 tag
Read-only clone
git clone https://openagents.com/git/tenant.openagents/omega.gitBrowse files
preview.rs
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