markdown_as_child.rs

  1use assets::Assets;
  2use gpui::*;
  3use language::{language_settings::AllLanguageSettings, LanguageRegistry};
  4use markdown::{Markdown, MarkdownStyle};
  5use node_runtime::FakeNodeRuntime;
  6use settings::SettingsStore;
  7use std::sync::Arc;
  8use theme::LoadThemes;
  9use ui::div;
 10use ui::prelude::*;
 11
 12const MARKDOWN_EXAMPLE: &'static str = r#"
 13this text should be selectable
 14
 15wow so cool
 16
 17## Heading 2
 18"#;
 19pub fn main() {
 20    env_logger::init();
 21
 22    App::new().with_assets(Assets).run(|cx| {
 23        let store = SettingsStore::test(cx);
 24        cx.set_global(store);
 25        language::init(cx);
 26        SettingsStore::update(cx, |store, cx| {
 27            store.update_user_settings::<AllLanguageSettings>(cx, |_| {});
 28        });
 29        cx.bind_keys([KeyBinding::new("cmd-c", markdown::Copy, None)]);
 30
 31        let node_runtime = FakeNodeRuntime::new();
 32        let language_registry = Arc::new(LanguageRegistry::new(
 33            Task::ready(()),
 34            cx.background_executor().clone(),
 35        ));
 36        languages::init(language_registry.clone(), node_runtime, cx);
 37        theme::init(LoadThemes::JustBase, cx);
 38        Assets.load_fonts(cx).unwrap();
 39
 40        cx.activate(true);
 41        let _ = cx.open_window(WindowOptions::default(), |cx| {
 42            cx.new_view(|cx| {
 43                let markdown_style = MarkdownStyle {
 44                    base_text_style: gpui::TextStyle {
 45                        font_family: "Zed Mono".into(),
 46                        color: cx.theme().colors().text,
 47                        ..Default::default()
 48                    },
 49                    code_block: StyleRefinement {
 50                        text: Some(gpui::TextStyleRefinement {
 51                            font_family: Some("Zed Mono".into()),
 52                            background_color: Some(cx.theme().colors().editor_background),
 53                            ..Default::default()
 54                        }),
 55                        margin: gpui::EdgesRefinement {
 56                            top: Some(Length::Definite(rems(4.).into())),
 57                            left: Some(Length::Definite(rems(4.).into())),
 58                            right: Some(Length::Definite(rems(4.).into())),
 59                            bottom: Some(Length::Definite(rems(4.).into())),
 60                        },
 61                        ..Default::default()
 62                    },
 63                    inline_code: gpui::TextStyleRefinement {
 64                        font_family: Some("Zed Mono".into()),
 65                        background_color: Some(cx.theme().colors().editor_background),
 66                        ..Default::default()
 67                    },
 68                    rule_color: Color::Muted.color(cx),
 69                    block_quote_border_color: Color::Muted.color(cx),
 70                    block_quote: gpui::TextStyleRefinement {
 71                        color: Some(Color::Muted.color(cx)),
 72                        ..Default::default()
 73                    },
 74                    link: gpui::TextStyleRefinement {
 75                        color: Some(Color::Accent.color(cx)),
 76                        underline: Some(gpui::UnderlineStyle {
 77                            thickness: px(1.),
 78                            color: Some(Color::Accent.color(cx)),
 79                            wavy: false,
 80                        }),
 81                        ..Default::default()
 82                    },
 83                    syntax: cx.theme().syntax().clone(),
 84                    selection_background_color: {
 85                        let mut selection = cx.theme().players().local().selection;
 86                        selection.fade_out(0.7);
 87                        selection
 88                    },
 89                    break_style: Default::default(),
 90                    heading: Default::default(),
 91                };
 92                let markdown = cx.new_view(|cx| {
 93                    Markdown::new(MARKDOWN_EXAMPLE.into(), markdown_style, None, cx, None)
 94                });
 95
 96                HelloWorld { markdown }
 97            })
 98        });
 99    });
100}
101struct HelloWorld {
102    markdown: View<Markdown>,
103}
104
105impl Render for HelloWorld {
106    fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
107        div()
108            .flex()
109            .bg(rgb(0x2e7d32))
110            .size(Length::Definite(Pixels(700.0).into()))
111            .justify_center()
112            .items_center()
113            .shadow_lg()
114            .border_1()
115            .border_color(rgb(0x0000ff))
116            .text_xl()
117            .text_color(rgb(0xffffff))
118            .child(div().child(self.markdown.clone()).p_20())
119    }
120}