rss-tool/src/main.rs

106 lines
2.6 KiB
Rust
Raw Normal View History

2024-09-03 22:53:57 -04:00
mod net;
use iced::{application, widget::{self, button, column, row, text}, Settings, Theme};
use net::load_rss;
use rss::Channel;
mod ui;
mod html;
pub fn main() -> iced::Result {
iced::application("Really Sweet Stuff",State::update,State::view)
.theme(theme)
.run()
}
#[derive(Clone,Debug)]
struct State {
scene: Scene,
channels: Vec<Channel>,
current_channel: usize,
current_item: usize,
item_open: bool,
play_media: bool,
}
fn theme(state: &State) -> Theme {
iced::Theme::Nord
}
#[derive(Clone, Copy, Debug)]
pub enum Scene {
Feeds,
Items,
ItemView,
}
impl Default for Scene {
fn default() -> Self {
Scene::Feeds
}
}
#[derive(Debug, Clone)]
pub enum Message {
SetScene(Scene),
SetChannel(usize),
SetItem(usize),
OpenItem,
ToggleMedia,
AddFeed(String),
}
impl Default for State {
fn default() -> Self {
let main = net::load_rss("https://libresolutions.network/rss").unwrap();
let small = net::load_rss("https://libresolutions.network/about/index.xml").unwrap();
let test = net::load_rss("http://localhost:1313/about/index.xml").unwrap();
let gabefeed = net::load_rss("https://gabe.rocks/rss").unwrap();
let channels = vec![test];
Self {
scene: Scene::ItemView,
channels,
current_channel: 0,
current_item: 0,
item_open: true,
play_media: false,
}
}
}
impl State {
fn update(&mut self, mes: Message) {
match mes {
Message::SetScene (scene) => self.scene = scene,
Message::SetChannel(c) => {
self.current_channel = c;
self.scene = Scene::Items;
},
Message::SetItem(i) => {
self.current_item = i;
self.scene = Scene::ItemView;
},
Message::OpenItem => self.item_open = !self.item_open,
Message::ToggleMedia => self.play_media = !self.play_media,
Message::AddFeed(feed) => {self.channels.push(load_rss(&feed).unwrap())}
}
}
fn view(&self) -> iced::Element<'_, Message> {
match self.scene {
Scene::Feeds => {
ui::channel_view(&self.channels)
},
Scene::Items => {
ui::item_list_view(&self.channels[self.current_channel])
},
Scene::ItemView => {
let item = &self.channels[self.current_channel].items()[self.current_item];
ui::item_view(item)
}
}.into()
}
}