use gtk::prelude::*; use gtk::{TextView, Expander, ScrolledWindow, Label, Align, Button, Application, LinkButton, PasswordEntry, ApplicationWindow, Box, Orientation, PolicyType}; use html_parser::{Dom, Node}; const APP_ID: &str = "org.antopie.AshBat"; fn parse(gtk_box: &Box) { let html = include_str!("test.html"); let dom = Dom::parse(html); let dom_valid = match dom { Ok(dom) => dom, Err(_) => panic!("Aaaaaahhhhhh !!!") }; let iter = dom_valid.children.get(0).unwrap().into_iter(); println!("{:#?}", dom_valid); let hrefs = iter.filter_map(|item| match item { Node::Element(ref element) if element.name == "a" => { match element.attributes["href"].clone() { Some(href) => Some(gtk_box.append(&LinkButton::new(&href))), _ => Some(()), } }, Node::Text(text) => Some(gtk_box.append(&Label::new(Some(&text)))), _ => Some(()), }); for _href in hrefs { println!("Affichage !"); } } fn build_ui(app: &Application) { let password_entry = PasswordEntry::new(); password_entry.set_show_peek_icon(true); let text = Label::new(Some("text gjero jgier iogrejgoi jriogjiog iorgjoiergoi eroi gjoiergjioregj erjgierojg oierjg ierjiog jreoi gjoierg jiergoirejgoierjoig jreio gjorieg jioergis cool!")); text.set_wrap(true); text.set_use_markup(true); let button = Button::from_icon_name("go-next"); let link_button = LinkButton::new("matrix:r/antopie-synapse:matrix.antopie.org"); let text_view = TextView::new(); text_view.set_editable(false); let text2 = Label::new(Some("Message caché !")); let expander = Expander::new(Some("Détails")); expander.set_child(Some(&text2)); let gtk_box = Box::builder() .margin_top(12) .margin_bottom(12) .margin_start(12) .margin_end(12) .valign(Align::Center) .halign(Align::Center) .spacing(12) .orientation(Orientation::Vertical) .build(); gtk_box.append(&link_button); gtk_box.append(&password_entry); gtk_box.append(&text); gtk_box.append(&button); gtk_box.append(&expander); gtk_box.append(&text_view); let scrolled_window = ScrolledWindow::builder() .hscrollbar_policy(PolicyType::Never) .min_content_width(700) .min_content_height(950) .child(>k_box) .build(); let window = ApplicationWindow::builder() .application(app) .title("AshBat") .child(&scrolled_window) .build(); window.present(); gtk_box.append(&Button::from_icon_name("go-next")); parse(>k_box); } fn main() { let app = Application::builder().application_id(APP_ID).build(); app.connect_activate(build_ui); app.run(); }