🎉 async feed updating (needs UI for it)
This commit is contained in:
parent
2604306d67
commit
d428b253d6
3 changed files with 51 additions and 32 deletions
|
@ -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_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 = "
|
const DB_RESET: &str = "
|
||||||
drop table items;
|
drop table items;
|
||||||
drop table feeds;
|
drop table feeds;
|
||||||
|
@ -82,6 +84,7 @@ pub fn initialize() {
|
||||||
conn.execute(FEEDS_INDEX_CREATE, []).unwrap();
|
conn.execute(FEEDS_INDEX_CREATE, []).unwrap();
|
||||||
conn.execute(ITEMS_TABLE_CREATE, []).unwrap();
|
conn.execute(ITEMS_TABLE_CREATE, []).unwrap();
|
||||||
conn.execute(ITEMS_INDEX_CREATE, []).unwrap();
|
conn.execute(ITEMS_INDEX_CREATE, []).unwrap();
|
||||||
|
conn.execute(ITEMS_FEED_INDEX_CREATE,[]).unwrap();
|
||||||
conn.close().unwrap();
|
conn.close().unwrap();
|
||||||
println!("Database Initialized.")
|
println!("Database Initialized.")
|
||||||
}
|
}
|
||||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -1,9 +1,9 @@
|
||||||
mod net;
|
pub mod net;
|
||||||
mod ui;
|
pub mod ui;
|
||||||
mod html;
|
pub mod html;
|
||||||
mod db;
|
pub mod db;
|
||||||
mod files;
|
pub mod files;
|
||||||
mod widgets;
|
pub mod widgets;
|
||||||
|
|
||||||
pub fn main() -> iced::Result {
|
pub fn main() -> iced::Result {
|
||||||
db::initialize();
|
db::initialize();
|
||||||
|
|
68
src/ui.rs
68
src/ui.rs
|
@ -1,10 +1,9 @@
|
||||||
use crate::db::add_feed;
|
|
||||||
|
|
||||||
use super::db;
|
use super::db;
|
||||||
use super::widgets;
|
use super::widgets;
|
||||||
use iced::widget::row;
|
use iced::widget::row;
|
||||||
use iced::widget::scrollable;
|
use iced::widget::scrollable;
|
||||||
use iced::widget::text_input;
|
use iced::widget::text_input;
|
||||||
|
use iced::Task;
|
||||||
use iced::{
|
use iced::{
|
||||||
widget::{button, column, container, text},
|
widget::{button, column, container, text},
|
||||||
Element,
|
Element,
|
||||||
|
@ -15,12 +14,12 @@ pub fn user_interface() -> iced::Result {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
enum Page {
|
pub enum Page {
|
||||||
home,
|
Home,
|
||||||
feed_view,
|
FeedView,
|
||||||
all_items,
|
AllItems,
|
||||||
item_view,
|
ItemView,
|
||||||
testing,
|
Testing,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
|
@ -31,7 +30,7 @@ struct State {
|
||||||
impl Default for State {
|
impl Default for State {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
State {
|
State {
|
||||||
page: Page::home,
|
page: Page::Home,
|
||||||
current_feed: 0,
|
current_feed: 0,
|
||||||
feed_input: String::from("")
|
feed_input: String::from("")
|
||||||
}
|
}
|
||||||
|
@ -44,34 +43,51 @@ pub enum Message {
|
||||||
LoadFeed(usize),
|
LoadFeed(usize),
|
||||||
AddFeed(String),
|
AddFeed(String),
|
||||||
FieldUpdated(AppField,String),
|
FieldUpdated(AppField,String),
|
||||||
|
Done(String),
|
||||||
ResetDB
|
ResetDB
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug,Clone)]
|
#[derive(Debug,Clone)]
|
||||||
enum AppField {
|
pub enum AppField {
|
||||||
FeedInput
|
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<Message>{
|
||||||
match mes {
|
match mes {
|
||||||
Message::ChangePage(p) => state.page=p,
|
Message::ChangePage(p) => {
|
||||||
|
state.page=p;
|
||||||
|
Task::none()
|
||||||
|
},
|
||||||
Message::LoadFeed(feed_id) => {
|
Message::LoadFeed(feed_id) => {
|
||||||
state.current_feed = feed_id;
|
state.current_feed = feed_id;
|
||||||
state.page=Page::feed_view;
|
state.page=Page::FeedView;
|
||||||
|
Task::none()
|
||||||
},
|
},
|
||||||
Message::AddFeed(f) => {
|
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) => {
|
Message::FieldUpdated(field, value) => {
|
||||||
match field {
|
match field {
|
||||||
AppField::FeedInput => {
|
AppField::FeedInput => {
|
||||||
state.feed_input=value;
|
state.feed_input=value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Task::none()
|
||||||
},
|
},
|
||||||
Message::ResetDB => {
|
Message::ResetDB => {
|
||||||
db::reset();
|
db::reset();
|
||||||
|
Task::none()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -82,18 +98,18 @@ fn update(state: &mut State, mes: Message) {
|
||||||
|
|
||||||
fn view(state: &State) -> Element<'_, Message> {
|
fn view(state: &State) -> Element<'_, Message> {
|
||||||
match state.page {
|
match state.page {
|
||||||
Page::home => home(&state),
|
Page::Home => home(&state),
|
||||||
Page::feed_view => feed_layout(&state),
|
Page::FeedView => feed_layout(&state),
|
||||||
Page::all_items => item_list(&state),
|
Page::AllItems => item_list(&state),
|
||||||
Page::item_view => item_view(&state),
|
Page::ItemView => item_view(&state),
|
||||||
Page::testing => testing(&state),
|
Page::Testing => testing(&state),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn home(state: &State) -> Element<'_, Message> {
|
fn home(_state: &State) -> Element<'_, Message> {
|
||||||
container(column!(
|
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))
|
button("Go to test!").on_press(Message::ChangePage(Page::Testing))
|
||||||
))
|
))
|
||||||
.padding(15)
|
.padding(15)
|
||||||
.height(Fill)
|
.height(Fill)
|
||||||
|
@ -105,7 +121,7 @@ fn home(state: &State) -> Element<'_, Message> {
|
||||||
fn feed_layout(state: &State) -> Element<'_, Message> {
|
fn feed_layout(state: &State) -> Element<'_, Message> {
|
||||||
container(
|
container(
|
||||||
column!(
|
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),
|
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 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!(
|
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()))
|
button("Add feed!").on_press(Message::AddFeed(state.feed_input.clone()))
|
||||||
),
|
).spacing(5).padding(10),
|
||||||
button("Wipe DB").on_press(Message::ResetDB),
|
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)
|
.spacing(5)
|
||||||
.into()
|
.into()
|
||||||
|
|
Loading…
Reference in a new issue