use iced::widget::{column, container, responsive}; use iced::{Element, Fill, Font, color, font, padding}; use iced_selection::{rich_text, selectable, span}; fn main() -> iced::Result { iced::application(State::default, State::update, State::view) .theme(iced::Theme::Dark) .run() } #[derive(Default)] struct State { clicked: Option, hovered: Option, } #[derive(Debug, Clone)] enum Message { LinkClicked(String), LinkHovered(String), HoverLost, } impl State { fn update(&mut self, message: Message) { match message { Message::LinkClicked(link) => { let _ = open::that_in_background(&link); self.clicked = Some(link); } Message::LinkHovered(link) => { self.hovered = Some(link); } Message::HoverLost => self.hovered = None, }; } fn view(&self) -> Element<'_, Message> { responsive(|size| { selectable( container( column![ rich_text![ span("iced") .color(color!(0x2b79a2)) .link("https://iced.rs"), " is a cross-platform GUI library for ", span("Rust") .color(color!(0x2b79a2)) .link("https://rust-lang.org"), ". It is inspired by ", span("Elm") .color(color!(0x2b79a2)) .link("https://elm-lang.org"), ", a delightful functional language for building web applications.\n\n", "As a GUI library, iced helps you build ", span("graphical user interfaces") .color(color!(0x2b79a2)) .link("https://en.wikipedia.org/wiki/Graphical_user_interface") .font(Font { style: font::Style::Italic, ..Font::DEFAULT }), " for your Rust applications.\n\n", "iced is strongly focused on ", span("simplicity") .font(Font { weight: font::Weight::Bold, ..Font::DEFAULT }), " and ", span("type-safety") .font(Font { weight: font::Weight::Bold, ..Font::DEFAULT }), ". As a result, iced tries to provide simple building blocks that can be put together with strong typing to reduce the chance of ", span("runtime errors") .font(Font { weight: font::Weight::Bold, ..Font::DEFAULT }), "." ] .on_link_click(Message::LinkClicked) .on_link_hover(Message::LinkHovered) .on_hover_lost(Message::HoverLost), self.clicked.as_deref().map(|link| rich_text![ "Last clicked link: ", span(link).color(color!(0x2b79a2)).link(link) ] .on_link_click(Message::LinkClicked) .on_link_hover(Message::LinkHovered) .on_hover_lost(Message::HoverLost)), self.hovered.as_deref().map(|link| rich_text![ "Currently hovered link: ", span(link).color(color!(0x2b79a2)).link(link) ] .on_link_click(Message::LinkClicked)), ] .spacing(10) .max_width(size.width * 0.8), ) .padding(padding::top(size.height * 0.4)) .center_x(Fill) ) .into() }) .into() } }