Convert EpisodeWidget into a Composed struct.
This commit is contained in:
parent
91ac2c6445
commit
0359e9dd35
@ -48,8 +48,6 @@ mod content;
|
|||||||
mod utils;
|
mod utils;
|
||||||
mod static_resource;
|
mod static_resource;
|
||||||
|
|
||||||
// use views::podcasts;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
THIS IS STILL A PROTOTYPE.
|
THIS IS STILL A PROTOTYPE.
|
||||||
*/
|
*/
|
||||||
@ -63,8 +61,7 @@ fn build_ui(app: >k::Application) {
|
|||||||
// Get the main window
|
// Get the main window
|
||||||
let window = gtk::ApplicationWindow::new(app);
|
let window = gtk::ApplicationWindow::new(app);
|
||||||
window.set_default_size(1150, 650);
|
window.set_default_size(1150, 650);
|
||||||
// Setup the Stack that will manage the switch between podcasts_view and podcast_widget.
|
|
||||||
// let stack = podcasts::setup_stack();
|
|
||||||
let ct = content::Content::new();
|
let ct = content::Content::new();
|
||||||
let stack = ct.stack.clone();
|
let stack = ct.stack.clone();
|
||||||
window.add(&stack);
|
window.add(&stack);
|
||||||
|
|||||||
@ -22,94 +22,141 @@ type Foo = RefCell<Option<(gtk::Button, gtk::Button, gtk::Button, Receiver<bool>
|
|||||||
|
|
||||||
thread_local!(static GLOBAL: Foo = RefCell::new(None));
|
thread_local!(static GLOBAL: Foo = RefCell::new(None));
|
||||||
|
|
||||||
fn epidose_widget(episode: &mut Episode, pd_title: &str) -> gtk::Box {
|
#[derive(Debug)]
|
||||||
// This is just a prototype and will be reworked probably.
|
struct EpisodeWidget {
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui");
|
container: gtk::Box,
|
||||||
|
download: gtk::Button,
|
||||||
|
play: gtk::Button,
|
||||||
|
delete: gtk::Button,
|
||||||
|
played: gtk::Button,
|
||||||
|
unplayed: gtk::Button,
|
||||||
|
title: gtk::Label,
|
||||||
|
description: gtk::TextView,
|
||||||
|
expander: gtk::Expander,
|
||||||
|
}
|
||||||
|
|
||||||
let ep: gtk::Box = builder.get_object("episode_box").unwrap();
|
impl EpisodeWidget {
|
||||||
let download_button: gtk::Button = builder.get_object("download_button").unwrap();
|
fn new() -> EpisodeWidget {
|
||||||
let play_button: gtk::Button = builder.get_object("play_button").unwrap();
|
// This is just a prototype and will be reworked probably.
|
||||||
let delete_button: gtk::Button = builder.get_object("delete_button").unwrap();
|
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui");
|
||||||
let played_button: gtk::Button = builder.get_object("mark_played_button").unwrap();
|
|
||||||
let unplayed_button: gtk::Button = builder.get_object("mark_unplayed_button").unwrap();
|
|
||||||
|
|
||||||
let title_label: gtk::Label = builder.get_object("title_label").unwrap();
|
let container: gtk::Box = builder.get_object("episode_box").unwrap();
|
||||||
// let desc_label: gtk::Label = builder.get_object("desc_label").unwrap();
|
let download: gtk::Button = builder.get_object("download_button").unwrap();
|
||||||
let expander: gtk::Expander = builder.get_object("expand_desc").unwrap();
|
let play: gtk::Button = builder.get_object("play_button").unwrap();
|
||||||
let desc_text_view: gtk::TextView = builder.get_object("desc_text_view").unwrap();
|
let delete: gtk::Button = builder.get_object("delete_button").unwrap();
|
||||||
|
let played: gtk::Button = builder.get_object("mark_played_button").unwrap();
|
||||||
|
let unplayed: gtk::Button = builder.get_object("mark_unplayed_button").unwrap();
|
||||||
|
|
||||||
title_label.set_xalign(0.0);
|
let title: gtk::Label = builder.get_object("title_label").unwrap();
|
||||||
|
let expander: gtk::Expander = builder.get_object("expand_desc").unwrap();
|
||||||
|
let description: gtk::TextView = builder.get_object("desc_text_view").unwrap();
|
||||||
|
|
||||||
if let Some(t) = episode.title() {
|
EpisodeWidget {
|
||||||
title_label.set_text(t);
|
container,
|
||||||
|
download,
|
||||||
|
play,
|
||||||
|
delete,
|
||||||
|
played,
|
||||||
|
unplayed,
|
||||||
|
title,
|
||||||
|
expander,
|
||||||
|
description,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if episode.description().is_some() {
|
pub fn new_initialized(episode: &mut Episode, pd: &Podcast) -> EpisodeWidget {
|
||||||
let d = episode.description().unwrap().to_owned();
|
let widget = EpisodeWidget::new();
|
||||||
|
widget.init(episode, pd);
|
||||||
expander.connect_activate(move |_| {
|
widget
|
||||||
let plain_text = strip_html_tags(&d).join(" ");
|
|
||||||
// TODO: handle unwrap
|
|
||||||
let buff = desc_text_view.get_buffer().unwrap();
|
|
||||||
buff.set_text(plain_text.trim());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if episode.played().is_some() {
|
fn init(&self, episode: &mut Episode, pd: &Podcast) {
|
||||||
unplayed_button.show();
|
self.title.set_xalign(0.0);
|
||||||
played_button.hide();
|
|
||||||
|
if let Some(t) = episode.title() {
|
||||||
|
self.title.set_text(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if episode.description().is_some() {
|
||||||
|
let d = episode.description().unwrap().to_owned();
|
||||||
|
|
||||||
|
let description = &self.description;
|
||||||
|
self.expander
|
||||||
|
.connect_activate(clone!(description => move |_| {
|
||||||
|
let plain_text = strip_html_tags(&d).join(" ");
|
||||||
|
// TODO: handle unwrap
|
||||||
|
let buff = description.get_buffer().unwrap();
|
||||||
|
buff.set_text(plain_text.trim());
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
if episode.played().is_some() {
|
||||||
|
self.unplayed.show();
|
||||||
|
self.played.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show or hide the play/delete/download buttons upon widget initialization.
|
||||||
|
let local_uri = episode.local_uri();
|
||||||
|
if local_uri.is_some() && Path::new(local_uri.unwrap()).exists() {
|
||||||
|
self.download.hide();
|
||||||
|
self.play.show();
|
||||||
|
self.delete.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
let played = &self.played;
|
||||||
|
let unplayed = &self.unplayed;
|
||||||
|
self.play
|
||||||
|
.connect_clicked(clone!(episode, played, unplayed => move |_| {
|
||||||
|
let mut episode = episode.clone();
|
||||||
|
on_play_bttn_clicked(*episode.id());
|
||||||
|
let _ = episode.set_played_now();
|
||||||
|
played.hide();
|
||||||
|
unplayed.show();
|
||||||
|
}));
|
||||||
|
|
||||||
|
let play = &self.play;
|
||||||
|
let download = &self.download;
|
||||||
|
self.delete
|
||||||
|
.connect_clicked(clone!(episode, play, download => move |del| {
|
||||||
|
on_delete_bttn_clicked(*episode.id());
|
||||||
|
del.hide();
|
||||||
|
play.hide();
|
||||||
|
download.show();
|
||||||
|
}));
|
||||||
|
|
||||||
|
let unplayed = &self.unplayed;
|
||||||
|
self.played
|
||||||
|
.connect_clicked(clone!(episode, unplayed => move |played| {
|
||||||
|
let mut episode = episode.clone();
|
||||||
|
let _ = episode.set_played_now();
|
||||||
|
played.hide();
|
||||||
|
unplayed.show();
|
||||||
|
}));
|
||||||
|
|
||||||
|
let played = &self.played;
|
||||||
|
self.unplayed
|
||||||
|
.connect_clicked(clone!(episode, played => move |un| {
|
||||||
|
let mut episode = episode.clone();
|
||||||
|
episode.set_played(None);
|
||||||
|
let _ = episode.save();
|
||||||
|
un.hide();
|
||||||
|
played.show();
|
||||||
|
}));
|
||||||
|
|
||||||
|
let pd_title = pd.title().to_owned();
|
||||||
|
let play = &self.play;
|
||||||
|
let delete = &self.delete;
|
||||||
|
self.download
|
||||||
|
.connect_clicked(clone!(play, delete, episode => move |dl| {
|
||||||
|
on_download_clicked(
|
||||||
|
&pd_title,
|
||||||
|
&mut episode.clone(),
|
||||||
|
dl,
|
||||||
|
&play,
|
||||||
|
&delete,
|
||||||
|
);
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show or hide the play/delete/download buttons upon widget initialization.
|
|
||||||
let local_uri = episode.local_uri();
|
|
||||||
if local_uri.is_some() && Path::new(local_uri.unwrap()).exists() {
|
|
||||||
download_button.hide();
|
|
||||||
play_button.show();
|
|
||||||
delete_button.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
play_button.connect_clicked(clone!(episode, played_button, unplayed_button => move |_| {
|
|
||||||
let mut episode = episode.clone();
|
|
||||||
on_play_bttn_clicked(*episode.id());
|
|
||||||
let _ = episode.set_played_now();
|
|
||||||
played_button.hide();
|
|
||||||
unplayed_button.show();
|
|
||||||
}));
|
|
||||||
|
|
||||||
delete_button.connect_clicked(clone!(episode, play_button, download_button => move |del| {
|
|
||||||
on_delete_bttn_clicked(*episode.id());
|
|
||||||
del.hide();
|
|
||||||
play_button.hide();
|
|
||||||
download_button.show();
|
|
||||||
}));
|
|
||||||
|
|
||||||
played_button.connect_clicked(clone!(episode, unplayed_button => move |played| {
|
|
||||||
let mut episode = episode.clone();
|
|
||||||
let _ = episode.set_played_now();
|
|
||||||
played.hide();
|
|
||||||
unplayed_button.show();
|
|
||||||
}));
|
|
||||||
|
|
||||||
unplayed_button.connect_clicked(clone!(episode, played_button => move |un| {
|
|
||||||
let mut episode = episode.clone();
|
|
||||||
episode.set_played(None);
|
|
||||||
let _ = episode.save();
|
|
||||||
un.hide();
|
|
||||||
played_button.show();
|
|
||||||
}));
|
|
||||||
|
|
||||||
let pd_title = pd_title.to_owned();
|
|
||||||
download_button.connect_clicked(clone!(play_button, delete_button, episode => move |dl| {
|
|
||||||
on_download_clicked(
|
|
||||||
&pd_title,
|
|
||||||
&mut episode.clone(),
|
|
||||||
dl,
|
|
||||||
&play_button,
|
|
||||||
&delete_button,
|
|
||||||
);
|
|
||||||
}));
|
|
||||||
|
|
||||||
ep
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: show notification when dl is finished.
|
// TODO: show notification when dl is finished.
|
||||||
@ -192,8 +239,9 @@ pub fn episodes_listbox(pd: &Podcast) -> Result<gtk::ListBox> {
|
|||||||
|
|
||||||
let list = gtk::ListBox::new();
|
let list = gtk::ListBox::new();
|
||||||
episodes.into_iter().for_each(|mut ep| {
|
episodes.into_iter().for_each(|mut ep| {
|
||||||
let w = epidose_widget(&mut ep, pd.title());
|
// let w = epidose_widget(&mut ep, pd.title());
|
||||||
list.add(&w)
|
let widget = EpisodeWidget::new_initialized(&mut ep, pd);
|
||||||
|
list.add(&widget.container)
|
||||||
});
|
});
|
||||||
|
|
||||||
list.set_vexpand(false);
|
list.set_vexpand(false);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user