diff --git a/src/ui.rs b/src/ui.rs index 769964c..fadd905 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,17 +1,20 @@ +use crate::db::FeedItem; use crate::widgets::content_view; use super::db; use super::widgets; +use iced::widget::markdown::Url; use iced::widget::row; use iced::widget::scrollable; use iced::widget::text_input; -use iced::widget::markdown::Url; use iced::Task; use iced::{ widget::{button, column, container, text}, Element, Length::Fill, }; +use rss_content::parse_content; +use rss_content::Content; pub fn user_interface() -> iced::Result { iced::run(update, view) @@ -26,20 +29,24 @@ pub enum Page { Testing, } -struct State { +pub struct State { page: Page, current_feed: usize, - current_item: usize, - feed_input: String + pub current_item: Option, + pub item_description: Vec, + pub item_content: Vec, + feed_input: String, } impl Default for State { fn default() -> Self { - State { + State { page: Page::Home, current_feed: 0, - current_item: 0, - feed_input: String::from("") - } + current_item: None, + item_description: Vec::new(), + item_content: Vec::new(), + feed_input: String::from(""), + } } } @@ -49,15 +56,15 @@ pub enum Message { LoadFeed(usize), AddFeed(String), LoadItem(usize), - FieldUpdated(AppField,String), + FieldUpdated(AppField, String), LinkClicked(Url), Done(String), - ResetDB + ResetDB, } -#[derive(Debug,Clone)] +#[derive(Debug, Clone)] pub enum AppField { - FeedInput + FeedInput, } async fn add_feed_background(url: String) -> String { @@ -66,51 +73,58 @@ async fn add_feed_background(url: String) -> String { "Done adding feed".to_string() } -fn update(state: &mut State, mes: Message) -> Task{ +fn update(state: &mut State, mes: Message) -> Task { match mes { Message::ChangePage(p) => { - state.page=p; + state.page = p; Task::none() - }, + } Message::LoadFeed(feed_id) => { state.current_feed = feed_id; - state.page=Page::FeedView; + state.page = Page::FeedView; Task::none() - }, + } Message::AddFeed(f) => { state.feed_input = "".to_string(); - Task::perform( - add_feed_background(f.to_string()), - Message::Done - ) - }, + Task::perform(add_feed_background(f.to_string()), Message::Done) + } Message::LinkClicked(l) => { - println!("Link clicked: {}",l); + println!("Link clicked: {}", l); + Task::none() } Message::LoadItem(id) => { - state.current_item = id; + let item = db::get_item(id); + state.item_description = match &item.description { + Some(d) => { + parse_content(&d) + } + None => Vec::new() + }; + state.item_content = match &item.content{ + Some(c) => { + parse_content(&c) + } + None => Vec::new() + }; + state.current_item = Some(item); state.page = Page::ItemView; Task::none() } - Message::Done(_) => {Task::none()}, + Message::Done(_) => Task::none(), Message::FieldUpdated(field, value) => { match field { AppField::FeedInput => { - state.feed_input=value; + state.feed_input = value; } } Task::none() - }, + } Message::ResetDB => { db::reset(); Task::none() } - } - - - } fn view(state: &State) -> Element<'_, Message> { @@ -125,7 +139,9 @@ fn view(state: &State) -> Element<'_, Message> { fn home(_state: &State) -> Element<'_, Message> { container(column!( - scrollable(widgets::list_feeds()).width(iced::Fill).height(iced::Fill), + scrollable(widgets::list_feeds()) + .width(iced::Fill) + .height(iced::Fill), button("Go to test!").on_press(Message::ChangePage(Page::Testing)) )) .padding(15) @@ -134,47 +150,50 @@ fn home(_state: &State) -> Element<'_, Message> { .into() } - fn feed_layout(state: &State) -> Element<'_, Message> { - container( - column!( - button(text("Home")).on_press(Message::ChangePage(Page::Home)), - scrollable(widgets::list_items(state.current_feed)).width(iced::Fill).height(iced::Fill), - ) - ) - .height(Fill) - .width(Fill) - .into() + container(column!( + button(text("Home")).on_press(Message::ChangePage(Page::Home)), + scrollable(widgets::list_items(state.current_feed)) + .width(iced::Fill) + .height(iced::Fill), + )) + .height(Fill) + .width(Fill) + .into() } fn item_view(state: &State) -> Element<'_, Message> { - let item = db::get_item(state.current_item); - container( - column!( - row!( - button(text("Home")).on_press(Message::ChangePage(Page::Home)), - button(text("Feed")).on_press(Message::ChangePage(Page::FeedView)) - ).spacing(10), - content_view(item), + container(column!( + row!( + button(text("Home")).on_press(Message::ChangePage(Page::Home)), + button(text("Feed")).on_press(Message::ChangePage(Page::FeedView)) ) - ) - .height(Fill) - .width(Fill) - .into() + .spacing(10), + content_view(state), + )) + .height(Fill) + .width(Fill) + .into() } -fn item_list(_: &State) -> Element<'_,Message>{ +fn item_list(_: &State) -> Element<'_, Message> { todo!() } fn testing(state: &State) -> Element<'_, Message> { column!( text("Dev Panel"), button("Add gabe.rocks").on_press(Message::AddFeed(String::from("https://gabe.rocks/rss"))), - button("Add LSN").on_press(Message::AddFeed(String::from("https://libresolutions.network/rss"))), + button("Add LSN").on_press(Message::AddFeed(String::from( + "https://libresolutions.network/rss" + ))), row!( - text_input("Add a feed",&state.feed_input).on_input(|val| Message::FieldUpdated(AppField::FeedInput,val)).width(300), + text_input("Add a feed", &state.feed_input) + .on_input(|val| Message::FieldUpdated(AppField::FeedInput, val)) + .width(300), button("Add feed!").on_press(Message::AddFeed(state.feed_input.clone())) - ).spacing(5).padding(10), + ) + .spacing(5) + .padding(10), button("Wipe DB").on_press(Message::ResetDB), button("go back!").on_press(Message::ChangePage(Page::Home)) ) diff --git a/src/widgets.rs b/src/widgets.rs index 071304b..80a98af 100644 --- a/src/widgets.rs +++ b/src/widgets.rs @@ -1,8 +1,9 @@ -use crate::db::FeedItem; - use super::db; use super::ui; +use iced::widget::markdown; use iced::widget::scrollable; +use iced::widget::Column; +use iced::Theme; use rss_content::Content; use ui::Message; use rss_content; @@ -40,44 +41,52 @@ pub fn list_items(feed_id: usize) -> iced::widget::Column<'static,Message> { .padding(15) } -pub fn content_area(cnt: String) -> iced::widget::Container<'static,Message>{ - let content = rss_content::parse_content(&cnt); - container( - column( - content.into_iter().map(|c: Content|{ - match c { - Content::Markdown(md) => { - text(md) - }, - Content::Image(_) => {text("Image goes here")}, - Content::Audio(_) => {text("Audio widget here")}, - Content::Video(_) => {text("video player here")}, - _ => {text("")} +pub fn content_area(content: &Vec) -> iced::widget::Container { + let mut children: Vec> = Vec::new(); + for c in content { + match c { + Content::MarkdownParsed(p) => { + children.push( + markdown(p, Theme::Dark).map(Message::LinkClicked) + ); + } + Content::Image(_) => {children.push(text("") + .size(32) + .into());}, + Content::Audio(_) => {children.push(text("