Rebuilding UI logic, splitting into multiple components
This commit is contained in:
parent
2a40fe9beb
commit
7d06ba9404
3 changed files with 95 additions and 21 deletions
18
src/db.rs
18
src/db.rs
|
@ -30,7 +30,7 @@ const feeds_table_create: &str = "CREATE TABLE IF NOT EXISTS 'feeds' (
|
||||||
'description' TEXT,
|
'description' TEXT,
|
||||||
'icon' BLOB,
|
'icon' BLOB,
|
||||||
'url' text not null unique on conflict replace,
|
'url' text not null unique on conflict replace,
|
||||||
'subscribed' INTEGER,
|
'subscribed' INTEGER NOT NULL default 0,
|
||||||
'last_updated' TEXT ,
|
'last_updated' TEXT ,
|
||||||
PRIMARY KEY('feedID')
|
PRIMARY KEY('feedID')
|
||||||
);";
|
);";
|
||||||
|
@ -116,13 +116,13 @@ pub fn return_item() -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Feed {
|
pub struct Feed {
|
||||||
feedID: u8,
|
pub feedID: u8,
|
||||||
title: String,
|
pub title: String,
|
||||||
description: Option<String>,
|
pub description: Option<String>,
|
||||||
icon: Option<String>,
|
pub icon: Option<String>,
|
||||||
url: String,
|
pub url: String,
|
||||||
subscribed: Option<String>, //needs to be bool
|
pub subscribed: bool,
|
||||||
last_updated: Option<String>,
|
pub last_updated: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_feeds() -> Vec<Feed> {
|
pub fn get_feeds() -> Vec<Feed> {
|
||||||
|
@ -136,7 +136,7 @@ pub fn get_feeds() -> Vec<Feed> {
|
||||||
description: row.get(2).unwrap(),
|
description: row.get(2).unwrap(),
|
||||||
icon: row.get(3).unwrap(),
|
icon: row.get(3).unwrap(),
|
||||||
url: row.get(4).unwrap(),
|
url: row.get(4).unwrap(),
|
||||||
subscribed: row.get(5).unwrap(),
|
subscribed: row.get::<_,bool>(5).unwrap(),
|
||||||
last_updated: row.get(6).unwrap(),
|
last_updated: row.get(6).unwrap(),
|
||||||
})
|
})
|
||||||
}).unwrap().collect();
|
}).unwrap().collect();
|
||||||
|
|
|
@ -4,12 +4,10 @@ use net::load_rss;
|
||||||
mod ui;
|
mod ui;
|
||||||
mod html;
|
mod html;
|
||||||
mod db;
|
mod db;
|
||||||
use db::Feed;
|
|
||||||
mod files;
|
mod files;
|
||||||
|
|
||||||
pub fn main() -> iced::Result {
|
pub fn main() -> iced::Result {
|
||||||
db::initialize();
|
db::initialize();
|
||||||
db::get_feeds();
|
|
||||||
ui::user_interface()
|
ui::user_interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
94
src/ui.rs
94
src/ui.rs
|
@ -1,21 +1,97 @@
|
||||||
use iced::{Element, Result};
|
use super::db;
|
||||||
|
use db::Feed;
|
||||||
|
use iced::{
|
||||||
|
widget::{button, column, container, text},
|
||||||
|
Element,
|
||||||
|
Length::Fill,
|
||||||
|
};
|
||||||
pub fn user_interface() -> iced::Result {
|
pub fn user_interface() -> iced::Result {
|
||||||
|
|
||||||
iced::run(update, view)
|
iced::run(update, view)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Clone, Debug)]
|
||||||
struct State{
|
enum Page {
|
||||||
|
home,
|
||||||
|
feed_view,
|
||||||
|
item_view,
|
||||||
|
testing,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug,Clone)]
|
struct State {
|
||||||
enum Message {}
|
page: Page,
|
||||||
|
}
|
||||||
|
impl Default for State {
|
||||||
|
fn default() -> Self {
|
||||||
|
State { page: Page::home }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
enum Message {
|
||||||
|
changePage(Page),
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(state: &mut State, mes: Message) {
|
||||||
|
match mes {
|
||||||
|
Message::changePage(p) => state.page=p
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn update(state: &mut State,message: Message) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn view(state: &State) -> Element<'_, Message> {
|
fn view(state: &State) -> Element<'_, Message> {
|
||||||
iced::widget::text("Ayy lmao").into()
|
match state.page {
|
||||||
|
Page::home => home(&state),
|
||||||
|
Page::feed_view => feeds(&state),
|
||||||
|
Page::item_view => item(&state),
|
||||||
|
Page::testing => testing(&state),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn home(state: &State) -> Element<'_, Message> {
|
||||||
|
container(column!(
|
||||||
|
list_feeds(),
|
||||||
|
button("Go to test!").on_press(Message::changePage(Page::testing))
|
||||||
|
))
|
||||||
|
.padding(15)
|
||||||
|
.height(Fill)
|
||||||
|
.width(Fill)
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn list_feeds() -> iced::widget::Column<'static, Message> {
|
||||||
|
let feeds = db::get_feeds();
|
||||||
|
column(
|
||||||
|
feeds
|
||||||
|
.iter()
|
||||||
|
.map(|f| {
|
||||||
|
let title = f.title.clone();
|
||||||
|
let index = f.feedID;
|
||||||
|
text(title)
|
||||||
|
})
|
||||||
|
.map(Element::from),
|
||||||
|
)
|
||||||
|
.align_x(iced::Alignment::Start)
|
||||||
|
.spacing(5)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn feeds(state: &State) -> Element<'_, Message> {
|
||||||
|
container(list_feeds().padding(15))
|
||||||
|
.height(Fill)
|
||||||
|
.width(Fill)
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn item(state: &State) -> Element<'_, Message> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn testing(state: &State) -> Element<'_, Message> {
|
||||||
|
column!(
|
||||||
|
iced::widget::text("Ayy lmao"),
|
||||||
|
button("go back!").on_press(Message::changePage(Page::home))
|
||||||
|
)
|
||||||
|
.spacing(5)
|
||||||
|
.into()
|
||||||
}
|
}
|
Loading…
Reference in a new issue