From d428b253d6dc69aaf8751d1708e607cbc28a1bab Mon Sep 17 00:00:00 2001 From: Gabriel Date: Fri, 4 Jul 2025 22:14:24 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20async=20feed=20updating=20(needs?= =?UTF-8?q?=20UI=20for=20it)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/db.rs | 3 +++ src/main.rs | 12 +++++----- src/ui.rs | 68 +++++++++++++++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/db.rs b/src/db.rs index 127ab67..568ce57 100644 --- a/src/db.rs +++ b/src/db.rs @@ -56,6 +56,8 @@ const ITEMS_TABLE_CREATE: &str = "CREATE TABLE IF NOT EXISTS 'items' ( );"; const ITEMS_INDEX_CREATE: &str = "CREATE INDEX IF NOT EXISTS 'items_idx' on 'items'('itemID' ASC);"; +const ITEMS_FEED_INDEX_CREATE: &str = "CREATE INDEX IF NOT EXISTS 'item_feed_idx' on 'items'('feedID' ASC);"; + const DB_RESET: &str = " drop table items; drop table feeds; @@ -82,6 +84,7 @@ pub fn initialize() { conn.execute(FEEDS_INDEX_CREATE, []).unwrap(); conn.execute(ITEMS_TABLE_CREATE, []).unwrap(); conn.execute(ITEMS_INDEX_CREATE, []).unwrap(); + conn.execute(ITEMS_FEED_INDEX_CREATE,[]).unwrap(); conn.close().unwrap(); println!("Database Initialized.") } diff --git a/src/main.rs b/src/main.rs index 353f8b1..2044a4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,9 @@ -mod net; -mod ui; -mod html; -mod db; -mod files; -mod widgets; +pub mod net; +pub mod ui; +pub mod html; +pub mod db; +pub mod files; +pub mod widgets; pub fn main() -> iced::Result { db::initialize(); diff --git a/src/ui.rs b/src/ui.rs index c01cf3d..8858faa 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,10 +1,9 @@ -use crate::db::add_feed; - use super::db; use super::widgets; use iced::widget::row; use iced::widget::scrollable; use iced::widget::text_input; +use iced::Task; use iced::{ widget::{button, column, container, text}, Element, @@ -15,12 +14,12 @@ pub fn user_interface() -> iced::Result { } #[derive(Clone, Debug)] -enum Page { - home, - feed_view, - all_items, - item_view, - testing, +pub enum Page { + Home, + FeedView, + AllItems, + ItemView, + Testing, } struct State { @@ -31,7 +30,7 @@ struct State { impl Default for State { fn default() -> Self { State { - page: Page::home, + page: Page::Home, current_feed: 0, feed_input: String::from("") } @@ -44,34 +43,51 @@ pub enum Message { LoadFeed(usize), AddFeed(String), FieldUpdated(AppField,String), + Done(String), ResetDB } #[derive(Debug,Clone)] -enum AppField { +pub enum AppField { FeedInput } -fn update(state: &mut State, mes: Message) { +async fn add_feed_background(url: String) -> String { + println!("Adding feed!"); + db::add_feed(&url); + "Done adding feed".to_string() +} + +fn update(state: &mut State, mes: Message) -> Task{ match mes { - Message::ChangePage(p) => state.page=p, + Message::ChangePage(p) => { + state.page=p; + Task::none() + }, Message::LoadFeed(feed_id) => { state.current_feed = feed_id; - state.page=Page::feed_view; - + state.page=Page::FeedView; + Task::none() }, Message::AddFeed(f) => { - db::add_feed(&f); + state.feed_input = "".to_string(); + Task::perform( + add_feed_background(f), + Message::Done + ) }, + Message::Done(_) => {Task::none()}, Message::FieldUpdated(field, value) => { match field { AppField::FeedInput => { state.feed_input=value; } } + Task::none() }, Message::ResetDB => { db::reset(); + Task::none() } } @@ -82,18 +98,18 @@ fn update(state: &mut State, mes: Message) { 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), + Page::Home => home(&state), + Page::FeedView => feed_layout(&state), + Page::AllItems => item_list(&state), + Page::ItemView => item_view(&state), + Page::Testing => testing(&state), } } -fn home(state: &State) -> Element<'_, Message> { +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)) + button("Go to test!").on_press(Message::ChangePage(Page::Testing)) )) .padding(15) .height(Fill) @@ -105,7 +121,7 @@ fn home(state: &State) -> Element<'_, Message> { fn feed_layout(state: &State) -> Element<'_, Message> { container( column!( - button(text("Go Home")).on_press(Message::ChangePage(Page::home)), + button(text("Go Home")).on_press(Message::ChangePage(Page::Home)), scrollable(widgets::list_items(state.current_feed)).width(iced::Fill).height(iced::Fill), ) ) @@ -127,11 +143,11 @@ fn testing(state: &State) -> Element<'_, Message> { 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"))), row!( - text_input("Add a feed",&state.feed_input).on_input(|val| Message::FieldUpdated(AppField::FeedInput,val)), + 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), button("Wipe DB").on_press(Message::ResetDB), - button("go back!").on_press(Message::ChangePage(Page::home)) + button("go back!").on_press(Message::ChangePage(Page::Home)) ) .spacing(5) .into()