rss-tool/src/widgets.rs

140 lines
4.2 KiB
Rust
Raw Normal View History

use crate::net;
use crate::ui::Page;
use super::db;
use super::ui;
use iced::widget::Text;
use iced::widget::markdown;
use iced::widget::row;
use iced::widget::scrollable;
use iced::widget::Column;
use iced::Theme;
use rss_content::Content;
use ui::Message;
use rss_content;
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| {
let n = net::url_network(&f.url);
let prefix = match n {
net::Network::Clearnet => {""}
net::Network::Tor => {"Tor: "}
net::Network::I2P => {"I2P: "}
_ => {""}
};
row!(
button(text(prefix.to_owned() + &f.title)).on_press(Message::LoadFeed(f.feed_id)),
button(text("Remove feed")).on_press(Message::RemoveFeed(f.feed_id))
)
})
.map(Element::from),
)
.align_x(iced::Alignment::Start)
.spacing(5)
.padding(15)
}
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| {
button(text(i.title.clone())).on_press(Message::LoadItem(i.item_id))
})
.map(Element::from),
)
.align_x(iced::Alignment::Start)
.spacing(5)
.padding(15)
}
2025-09-07 04:03:38 -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());},
_ => {}
}
}
container(
2025-07-22 18:54:46 -04:00
Column::with_children(children).spacing(5)
)
}
2025-09-07 04:03:38 -04:00
pub fn media_view(state: &'_ ui::State) -> Element<'_, Message> {
2025-07-23 12:38:05 -04:00
match state.current_item.clone().unwrap().media {
Some(m) => {
2025-07-23 22:00:31 -04:00
if m.len() > 0{
text(format!("<Media is available:{}>",m)).into()
}
else {
text("".to_owned()).into()
}
2025-07-23 12:38:05 -04:00
}
None => {
text("".to_owned()).into()
}
}
}
pub fn navbar (state: &'_ ui::State) -> Element<'_,Message>{
row!(
button("Home").on_press(Message::ChangePage(Page::Home)),
button("All Items").on_press(Message::ChangePage(Page::AllItems)),
button("Categories").on_press(Message::ChangePage(Page::CategoryView))
).spacing(5).padding(5).width(iced::Fill).into()
}
pub fn list_item(id: usize,title: String, description: String) -> Column<'static,Message>{
Column::new()
.push(button(Text::new(title)).on_press(Message::LoadItem(id)))
.push(text(description))
.align_x(iced::Alignment::Center)
.spacing(5)
}
2025-09-07 04:03:38 -04:00
pub fn content_view(state: &'_ ui::State) -> iced::widget::Scrollable<'_, Message> {
let item = state.current_item.clone().unwrap();
scrollable(
column!(
match item.description {
Some(_d) => {
content_area(&state.item_description)
},
None => {container(text("No description found"))}
},
match item.content {
Some(_c) => {
content_area(&state.item_content)
}
None => {container(text("No content found"))}
}
)
).width(iced::Fill)
}