diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 0e7170d..3683672 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -129,6 +129,18 @@ pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result, DataE .map_err(From::from) } +pub fn get_episode_description(rowid_: i32) -> Result, DataError> { + use schema::episode::dsl::*; + let db = connection(); + let con = db.get()?; + + episode + .filter(rowid.eq(rowid_)) + .select(description) + .get_result::>(&con) + .map_err(From::from) +} + pub fn get_episodes_widgets_filter_limit( filter_ids: &[i32], limit: u32, @@ -360,7 +372,18 @@ pub(crate) fn episode_exists(title_: &str, podcast_id_: i32) -> Result Result { + use schema::episode::dsl::*; + + let db = connection(); + let con = db.get()?; + + select(exists(episode.filter(rowid.eq(rowid_)))) + .get_result(&con) + .map_err(From::from) +} + +/// Check if the `episode` table contains any rows /// /// Return true if `episode` table is populated. pub fn is_episodes_populated() -> Result { diff --git a/hammond-gtk/resources/gtk/episode_widget.ui b/hammond-gtk/resources/gtk/episode_widget.ui index 0323169..55b14f0 100644 --- a/hammond-gtk/resources/gtk/episode_widget.ui +++ b/hammond-gtk/resources/gtk/episode_widget.ui @@ -207,41 +207,24 @@ Tobias Bernard False center - - Cancel - True - False - center - center - - - False - False - end - 0 - - - - + True True True - Download this episode center center - True True False - document-save-symbolic + view-paged-symbolic - False - False - 1 + True + True + 0 True @@ -268,6 +251,45 @@ Tobias Bernard True + + + True + True + True + Download this episode + center + center + True + + + True + False + document-save-symbolic + + + + + False + False + 3 + True + + + + + Cancel + True + False + center + center + + + False + False + end + 3 + + False diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 8490fa5..9974614 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -10,7 +10,7 @@ use gtk::prelude::*; use gtk::SettingsExt as GtkSettingsExt; use crossbeam_channel::{unbounded, Sender}; -use hammond_data::Podcast; +use hammond_data::{Podcast, dbqueries}; use headerbar::Header; use settings::{self, WindowGeometry}; @@ -53,6 +53,7 @@ pub enum Action { MarkAllPlayerNotification(Arc), RemoveShow(Arc), ErrorNotification(String), + AboutWidget(i32), } #[derive(Debug)] @@ -179,6 +180,13 @@ impl App { || {}, UndoState::Hidden); notif.show(&overlay); } + Ok(Action::AboutWidget(rowid)) => { + if let Ok(d) = dbqueries::get_episode_description(rowid) { + if let Some(_desc) = d { + let _stack = content.get_visible_stack(); + } + } + } Err(_) => (), } diff --git a/hammond-gtk/src/stacks/content.rs b/hammond-gtk/src/stacks/content.rs index c63d640..be56b4e 100644 --- a/hammond-gtk/src/stacks/content.rs +++ b/hammond-gtk/src/stacks/content.rs @@ -85,4 +85,8 @@ impl Content { pub fn get_shows(&self) -> Rc> { self.shows.clone() } + + pub fn get_visible_stack(&self) -> Option { + self.stack.get_visible_child().and_then(|w| w.downcast::().ok()) + } } diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index b7cfde3..f1958c4 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -65,6 +65,7 @@ struct Buttons { play: gtk::Button, download: gtk::Button, cancel: gtk::Button, + desc: gtk::Button, } impl InfoLabels { @@ -168,6 +169,7 @@ impl Default for EpisodeWidget { let download = builder.get_object("download_button").unwrap(); let play = builder.get_object("play_button").unwrap(); let cancel = builder.get_object("cancel_button").unwrap(); + let desc_button = builder.get_object("desc_button").unwrap(); let info_container = builder.get_object("info_container").unwrap(); let title = builder.get_object("title_label").unwrap(); @@ -198,6 +200,7 @@ impl Default for EpisodeWidget { play, download, cancel, + desc: desc_button, }, progressbar, container, @@ -213,6 +216,32 @@ impl EpisodeWidget { .map_err(|err| error!("Error: {}", err)) .ok(); widget + .on_desc_clicked(episode, sender) + .map_err(|err| error!("Error: {}", err)) + .ok(); + widget + } + + fn on_desc_clicked( + &self, + episode: &EpisodeWidgetQuery, + sender: &Sender, + ) -> Result<(), Error> { + let id = episode.rowid(); + if dbqueries::episode_had_description(id)? { + self.buttons.desc.show(); + self.buttons + .desc + .connect_clicked(clone!(sender => move |_| { + sender.send(Action::AboutWidget(id)) + .map_err(|err| error!("Action Sender: {}", err)) + .ok(); + })); + Ok(()) + } else { + self.buttons.desc.hide(); + Ok(()) + } } // fn init(widget: Rc, sender: &Sender) {}