2025-07-03 20:57:37 -04:00
|
|
|
use super::db;
|
|
|
|
use super::ui;
|
2025-07-22 17:32:48 -04:00
|
|
|
use iced::widget::markdown;
|
2025-07-19 20:42:07 -04:00
|
|
|
use iced::widget::scrollable;
|
2025-07-22 17:32:48 -04:00
|
|
|
use iced::widget::Column;
|
|
|
|
use iced::Theme;
|
2025-07-19 20:42:07 -04:00
|
|
|
use rss_content::Content;
|
2025-07-03 20:57:37 -04:00
|
|
|
use ui::Message;
|
2025-07-19 20:42:07 -04:00
|
|
|
use rss_content;
|
2025-07-03 20:57:37 -04:00
|
|
|
use iced::{
|
|
|
|
widget::{button, column, container, text},
|
|
|
|
Element,
|
|
|
|
};
|
|
|
|
|
|
|
|
pub fn list_feeds() -> iced::widget::Column<'static, Message> {
|
|
|
|
let feeds = db::get_feeds();
|
|
|
|
column(
|
|
|
|
feeds
|
|
|
|
.iter()
|
|
|
|
.map(|f| {
|
|
|
|
button(text(f.title.clone())).on_press(Message::LoadFeed(f.feed_id))
|
|
|
|
})
|
|
|
|
.map(Element::from),
|
|
|
|
)
|
|
|
|
.align_x(iced::Alignment::Start)
|
|
|
|
.spacing(5)
|
2025-07-04 11:38:49 -04:00
|
|
|
.padding(15)
|
2025-07-03 20:57:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn list_items(feed_id: usize) -> iced::widget::Column<'static,Message> {
|
|
|
|
let items: Vec<db::FeedItem> = db::get_feed_items(feed_id);
|
|
|
|
column(
|
|
|
|
items.iter()
|
|
|
|
.map(|i| {
|
2025-07-19 20:42:07 -04:00
|
|
|
button(text(i.title.clone())).on_press(Message::LoadItem(i.item_id))
|
2025-07-03 20:57:37 -04:00
|
|
|
})
|
|
|
|
.map(Element::from),
|
|
|
|
)
|
|
|
|
.align_x(iced::Alignment::Start)
|
|
|
|
.spacing(5)
|
2025-07-04 11:38:49 -04:00
|
|
|
.padding(15)
|
2025-07-19 20:42:07 -04:00
|
|
|
}
|
|
|
|
|
2025-07-22 17:32:48 -04:00
|
|
|
pub fn content_area(content: &Vec<Content>) -> iced::widget::Container<Message> {
|
|
|
|
let mut children: Vec<Element<Message>> = Vec::new();
|
|
|
|
for c in content {
|
|
|
|
match c {
|
|
|
|
Content::MarkdownParsed(p) => {
|
|
|
|
children.push(
|
|
|
|
markdown(p, Theme::Dark).map(Message::LinkClicked)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
Content::Image(_) => {children.push(text("<Image goes here>")
|
|
|
|
.size(32)
|
|
|
|
.into());},
|
|
|
|
Content::Audio(_) => {children.push(text("<Audio widget here>")
|
|
|
|
.size(32)
|
|
|
|
.into());},
|
|
|
|
Content::Video(_) => {children.push(text("<Video goes here>")
|
|
|
|
.size(32)
|
|
|
|
.into());},
|
|
|
|
_ => {}
|
2025-07-19 20:42:07 -04:00
|
|
|
}
|
2025-07-22 17:32:48 -04:00
|
|
|
}
|
|
|
|
container(
|
2025-07-22 18:54:46 -04:00
|
|
|
Column::with_children(children).spacing(5)
|
2025-07-19 20:42:07 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2025-07-22 17:32:48 -04:00
|
|
|
pub fn content_view(state: &super::ui::State) -> iced::widget::Scrollable<Message> {
|
|
|
|
let item = state.current_item.clone().unwrap();
|
2025-07-19 20:42:07 -04:00
|
|
|
|
|
|
|
scrollable(
|
|
|
|
column!(
|
|
|
|
text(item.title).size(34),
|
|
|
|
match item.description {
|
2025-07-22 17:32:48 -04:00
|
|
|
Some(_d) => {
|
|
|
|
content_area(&state.item_description)
|
2025-07-19 20:42:07 -04:00
|
|
|
},
|
|
|
|
None => {container(text("No description found"))}
|
|
|
|
},
|
|
|
|
match item.content {
|
2025-07-22 17:32:48 -04:00
|
|
|
Some(_c) => {
|
|
|
|
content_area(&state.item_content)
|
2025-07-19 20:42:07 -04:00
|
|
|
}
|
|
|
|
None => {container(text("No content found"))}
|
|
|
|
}
|
|
|
|
|
|
|
|
)
|
2025-07-22 17:32:48 -04:00
|
|
|
).width(iced::Fill)
|
2025-07-03 20:57:37 -04:00
|
|
|
}
|