diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index ff4e601..5afcb5f 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -48,8 +48,6 @@ mod content; mod utils; mod static_resource; -// use views::podcasts; - /* THIS IS STILL A PROTOTYPE. */ @@ -63,8 +61,7 @@ fn build_ui(app: >k::Application) { // Get the main window let window = gtk::ApplicationWindow::new(app); 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 stack = ct.stack.clone(); window.add(&stack); diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index 4851a03..4d51d85 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -22,94 +22,141 @@ type Foo = RefCell thread_local!(static GLOBAL: Foo = RefCell::new(None)); -fn epidose_widget(episode: &mut Episode, pd_title: &str) -> gtk::Box { - // This is just a prototype and will be reworked probably. - let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui"); +#[derive(Debug)] +struct EpisodeWidget { + 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(); - let download_button: gtk::Button = builder.get_object("download_button").unwrap(); - let play_button: gtk::Button = builder.get_object("play_button").unwrap(); - let delete_button: gtk::Button = builder.get_object("delete_button").unwrap(); - let played_button: gtk::Button = builder.get_object("mark_played_button").unwrap(); - let unplayed_button: gtk::Button = builder.get_object("mark_unplayed_button").unwrap(); +impl EpisodeWidget { + fn new() -> EpisodeWidget { + // This is just a prototype and will be reworked probably. + let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui"); - let title_label: gtk::Label = builder.get_object("title_label").unwrap(); - // let desc_label: gtk::Label = builder.get_object("desc_label").unwrap(); - let expander: gtk::Expander = builder.get_object("expand_desc").unwrap(); - let desc_text_view: gtk::TextView = builder.get_object("desc_text_view").unwrap(); + let container: gtk::Box = builder.get_object("episode_box").unwrap(); + let download: gtk::Button = builder.get_object("download_button").unwrap(); + let play: gtk::Button = builder.get_object("play_button").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() { - title_label.set_text(t); + EpisodeWidget { + container, + download, + play, + delete, + played, + unplayed, + title, + expander, + description, + } } - if episode.description().is_some() { - let d = episode.description().unwrap().to_owned(); - - expander.connect_activate(move |_| { - 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()); - }); + pub fn new_initialized(episode: &mut Episode, pd: &Podcast) -> EpisodeWidget { + let widget = EpisodeWidget::new(); + widget.init(episode, pd); + widget } - if episode.played().is_some() { - unplayed_button.show(); - played_button.hide(); + fn init(&self, episode: &mut Episode, pd: &Podcast) { + self.title.set_xalign(0.0); + + 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. @@ -192,8 +239,9 @@ pub fn episodes_listbox(pd: &Podcast) -> Result { let list = gtk::ListBox::new(); episodes.into_iter().for_each(|mut ep| { - let w = epidose_widget(&mut ep, pd.title()); - list.add(&w) + // let w = epidose_widget(&mut ep, pd.title()); + let widget = EpisodeWidget::new_initialized(&mut ep, pd); + list.add(&widget.container) }); list.set_vexpand(false);