use crate::db::add_feed; use super::db; use super::widgets; use iced::widget::scrollable; use iced::{ widget::{button, column, container, text}, Element, Length::Fill, }; pub fn user_interface() -> iced::Result { iced::run(update, view) } #[derive(Clone, Debug)] enum Page { home, feed_view, all_items, item_view, testing, } struct State { page: Page, current_feed: usize } impl Default for State { fn default() -> Self { State { page: Page::home, current_feed: 0 } } } #[derive(Debug, Clone)] pub enum Message { ChangePage(Page), LoadFeed(usize), AddFeed(String), ResetDB } fn update(state: &mut State, mes: Message) { match mes { Message::ChangePage(p) => state.page=p, Message::LoadFeed(feed_id) => { state.current_feed = feed_id; state.page=Page::feed_view; }, Message::AddFeed(f) => { db::add_feed(&f); }, Message::ResetDB => { db::reset(); } } } fn view(state: &State) -> Element<'_, Message> { match state.page { Page::home => home(&state), Page::feed_view => feed_layout(&state), Page::all_items => item_list(&state), Page::item_view => item_view(&state), Page::testing => testing(&state), } } fn home(state: &State) -> Element<'_, Message> { container(column!( scrollable(widgets::list_feeds()).width(iced::Fill).height(iced::Fill), button("Go to test!").on_press(Message::ChangePage(Page::testing)) )) .padding(15) .height(Fill) .width(Fill) .into() } fn feed_layout(state: &State) -> Element<'_, Message> { container( column!( button(text("Go 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> { todo!() } fn item_list(state: &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("Wipe DB").on_press(Message::ResetDB), button("go back!").on_press(Message::ChangePage(Page::home)) ) .spacing(5) .into() }