Rebuilding UI logic, splitting into multiple components

This commit is contained in:
Gabriel 2025-07-03 11:25:23 -04:00
parent 2a40fe9beb
commit 7d06ba9404
3 changed files with 95 additions and 21 deletions

View file

@ -30,7 +30,7 @@ const feeds_table_create: &str = "CREATE TABLE IF NOT EXISTS 'feeds' (
'description' TEXT,
'icon' BLOB,
'url' text not null unique on conflict replace,
'subscribed' INTEGER,
'subscribed' INTEGER NOT NULL default 0,
'last_updated' TEXT ,
PRIMARY KEY('feedID')
);";
@ -116,13 +116,13 @@ pub fn return_item() -> String {
}
pub struct Feed {
feedID: u8,
title: String,
description: Option<String>,
icon: Option<String>,
url: String,
subscribed: Option<String>, //needs to be bool
last_updated: Option<String>,
pub feedID: u8,
pub title: String,
pub description: Option<String>,
pub icon: Option<String>,
pub url: String,
pub subscribed: bool,
pub last_updated: Option<String>,
}
pub fn get_feeds() -> Vec<Feed> {
@ -136,7 +136,7 @@ pub fn get_feeds() -> Vec<Feed> {
description: row.get(2).unwrap(),
icon: row.get(3).unwrap(),
url: row.get(4).unwrap(),
subscribed: row.get(5).unwrap(),
subscribed: row.get::<_,bool>(5).unwrap(),
last_updated: row.get(6).unwrap(),
})
}).unwrap().collect();

View file

@ -4,12 +4,10 @@ use net::load_rss;
mod ui;
mod html;
mod db;
use db::Feed;
mod files;
pub fn main() -> iced::Result {
db::initialize();
db::get_feeds();
ui::user_interface()
}

View file

@ -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 {
iced::run(update, view)
}
#[derive(Default)]
struct State{
#[derive(Clone, Debug)]
enum Page {
home,
feed_view,
item_view,
testing,
}
#[derive(Debug,Clone)]
enum Message {}
struct State {
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> {
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()
}