use iced::widget::{operation, row, scrollable, text_editor}; use iced::{Element, Fill, Font, Theme, highlighter}; use iced_selection::markdown; fn main() -> iced::Result { iced::application(State::new, State::update, State::view) .theme(Theme::CatppuccinMocha) .run() } #[derive(Default)] struct State { content: markdown::Content, raw: text_editor::Content, } #[derive(Debug, Clone)] enum Message { Edit(text_editor::Action), LinkClicked(markdown::Url), } impl State { fn new() -> (Self, iced::Task) { const INITIAL_CONTENT: &str = include_str!("../overview.md"); ( Self { content: markdown::Content::parse(INITIAL_CONTENT), raw: text_editor::Content::with_text(INITIAL_CONTENT), }, operation::focus_next(), ) } fn update(&mut self, message: Message) { match message { Message::Edit(action) => { let is_edit = action.is_edit(); self.raw.perform(action); if is_edit { self.content = markdown::Content::parse(&self.raw.text()); } } Message::LinkClicked(link) => { let _ = open::that_in_background(link.to_string()); } } } fn view(&self) -> Element<'_, Message> { let editor = text_editor(&self.raw) .placeholder("Type your Markdown here...") .on_action(Message::Edit) .height(Fill) .padding(10) .font(Font::MONOSPACE) .highlight("markdown", highlighter::Theme::Base16Ocean); let preview = markdown::view(self.content.items(), &Theme::CatppuccinMocha) .map(Message::LinkClicked); row![ editor, scrollable(preview).spacing(10).width(Fill).height(Fill) ] .spacing(10) .padding(10) .into() } }