2024-09-03 22:53:57 -04:00
|
|
|
mod net;
|
2025-01-10 07:32:12 -05:00
|
|
|
use db::initialize;
|
|
|
|
use iced::{application, widget::{self, button, column, markdown, row, text}, Settings, Theme};
|
2024-09-03 22:53:57 -04:00
|
|
|
use net::load_rss;
|
|
|
|
use rss::Channel;
|
|
|
|
mod ui;
|
|
|
|
mod html;
|
2025-01-10 07:32:12 -05:00
|
|
|
mod db;
|
2024-09-03 22:53:57 -04:00
|
|
|
|
2025-01-10 07:32:12 -05:00
|
|
|
|
|
|
|
|
|
|
|
/*pub fn main() -> iced::Result {
|
|
|
|
db::initialize();
|
|
|
|
iced::application("Really Sweet Stuff",State::update,State::view)
|
2024-09-03 22:53:57 -04:00
|
|
|
.theme(theme)
|
|
|
|
.run()
|
2025-01-10 07:32:12 -05:00
|
|
|
}*/
|
|
|
|
pub fn main() -> iced::Result{
|
|
|
|
db::initialize();
|
2025-05-14 23:01:06 -04:00
|
|
|
//db::add_feed("https://gabe.rocks/rss");
|
|
|
|
iced::run(Viewer::update,Viewer::view)
|
2025-01-10 07:32:12 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone,Debug)]
|
|
|
|
struct Viewer {
|
|
|
|
content: Vec<markdown::Item>
|
|
|
|
}
|
|
|
|
impl Default for Viewer{
|
|
|
|
fn default() -> Self {
|
|
|
|
Self { content: markdown::parse(&html::process(db::return_item())).collect(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-03 22:53:57 -04:00
|
|
|
}
|
|
|
|
|
2025-01-10 07:32:12 -05:00
|
|
|
#[derive(Clone,Debug)]
|
|
|
|
enum Changes{
|
|
|
|
Nullchange(markdown::Url)
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Viewer{
|
|
|
|
fn update(&mut self, _mes: Changes) {
|
|
|
|
|
|
|
|
}
|
|
|
|
fn view(&self) -> iced::Element<'_, Changes> {
|
|
|
|
widget::container(
|
|
|
|
widget::scrollable(
|
|
|
|
markdown::view(
|
|
|
|
&self.content,
|
2025-05-14 23:01:06 -04:00
|
|
|
markdown::Settings::with_style(markdown::Style::from_palette(iced::Theme::Dark.palette())),
|
|
|
|
|
2025-01-10 07:32:12 -05:00
|
|
|
).map(Changes::Nullchange))
|
|
|
|
)
|
|
|
|
.align_x(iced::alignment::Horizontal::Center)
|
|
|
|
.align_y(iced::alignment::Vertical::Center)
|
|
|
|
.width(iced::Length::Fill)
|
|
|
|
.height(iced::Length::Fill)
|
|
|
|
.padding(5)
|
|
|
|
.into()
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2024-09-03 22:53:57 -04:00
|
|
|
#[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 gabefeed = net::load_rss("https://gabe.rocks/rss").unwrap();
|
2025-01-10 07:32:12 -05:00
|
|
|
let channels = vec![small];
|
2024-09-03 22:53:57 -04:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|