diff --git a/TODO.md b/TODO.md
index 801a0c1..ea7b8ac 100644
--- a/TODO.md
+++ b/TODO.md
@@ -10,12 +10,14 @@
**Would be nice:**
+- [ ] Use GResource for assets like the banner.png etc, instead of hardcoded paths.
- [x] Possibly Convert description labels to textview.
- [ ] Make Podcast cover fetchng and loading not block the execution of the program at startup.
- [ ] Re-design EpisodeWidget.
- [ ] Lazy evaluate episode loading based on the podcast_widget's view scrolling.
- [ ] Headerbar back button and stack switching
-- [ ] New episode notifier on podcast_flowbox_child, like the one vocal has
+- [x] New episode notifier on podcast_flowbox_child, like the one vocal has
+- [ ] Polish the flowbox_child banner.
**Unhack stuff:**
diff --git a/assets/banner.png b/assets/banner.png
new file mode 100644
index 0000000..9b1af94
Binary files /dev/null and b/assets/banner.png differ
diff --git a/hammond-gtk/gtk/podcasts_child.ui b/hammond-gtk/gtk/podcasts_child.ui
index ad8158a..2497c21 100644
--- a/hammond-gtk/gtk/podcasts_child.ui
+++ b/hammond-gtk/gtk/podcasts_child.ui
@@ -15,23 +15,44 @@
True
False
-
+
+
+
+
+
+ False
+ True
+ end
+ start
+ gtk-missing-image
- -1
+ 1
+
+
+
+
+ False
+ True
+ Num
+ True
+ center
+ False
+ 0.87999999523162842
+ 0.14000000059604645
+
+
+ 2
diff --git a/hammond-gtk/src/views/podcasts_view.rs b/hammond-gtk/src/views/podcasts_view.rs
index b91aaf2..46b807e 100644
--- a/hammond-gtk/src/views/podcasts_view.rs
+++ b/hammond-gtk/src/views/podcasts_view.rs
@@ -42,7 +42,7 @@ fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) {
if let Ok(pds) = podcasts {
pds.iter().for_each(|parent| {
- let f = create_flowbox_child(db, &parent);
+ let f = create_flowbox_child(db, parent);
f.connect_activate(clone!(db, stack, parent => move |_| {
on_flowbox_child_activate(&db, &stack, &parent);
diff --git a/hammond-gtk/src/widgets/podcast.rs b/hammond-gtk/src/widgets/podcast.rs
index 14614e6..14c8438 100644
--- a/hammond-gtk/src/widgets/podcast.rs
+++ b/hammond-gtk/src/widgets/podcast.rs
@@ -30,7 +30,7 @@ macro_rules! clone {
);
}
-pub fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box {
+fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box {
// Adapted from gnome-music AlbumWidget
let pd_widget_source = include_str!("../../gtk/podcast_widget.ui");
let pd_widget_buidler = gtk::Builder::new_from_string(pd_widget_source);
@@ -123,11 +123,7 @@ fn show_played_button(db: &Database, pd: &Podcast, played_button: >k::Button)
}
}
-// TODO: Add something that displays the amount of unplayed episodes on each Podcast.
-// Look into the vocal implementation.
-// https://github.com/needle-and-thread/\
-// vocal/blob/bced2e23cedb25b5edd0626e5f9361ceace683c9/src/Widgets/CoverArt.vala#L50
-pub fn create_flowbox_child(_db: &Database, pd: &Podcast) -> gtk::FlowBoxChild {
+pub fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild {
let build_src = include_str!("../../gtk/podcasts_child.ui");
let builder = gtk::Builder::new_from_string(build_src);
@@ -135,27 +131,44 @@ pub fn create_flowbox_child(_db: &Database, pd: &Podcast) -> gtk::FlowBoxChild {
let box_: gtk::Box = builder.get_object("fb_child").unwrap();
let pd_title: gtk::Label = builder.get_object("pd_title").unwrap();
let pd_cover: gtk::Image = builder.get_object("pd_cover").unwrap();
- let events: gtk::EventBox = builder.get_object("events").unwrap();
-
- // GDK.TOUCH_MASK
- // https://developer.gnome.org/gdk3/stable/gdk3-Events.html#GDK-TOUCH-MASK:CAPS
- // http://gtk-rs.org/docs/gdk/constant.TOUCH_MASK.html
- events.add_events(4_194_304);
+ let banner: gtk::Image = builder.get_object("banner").unwrap();
+ let banner_title: gtk::Label = builder.get_object("banner_label").unwrap();
pd_title.set_text(pd.title());
let cover = get_pixbuf_from_path(pd.image_uri(), pd.title());
-
if let Some(img) = cover {
pd_cover.set_from_pixbuf(&img);
};
+ configure_banner(db, pd, &banner, &banner_title);
+
let fbc = gtk::FlowBoxChild::new();
fbc.add(&box_);
// info!("flowbox child created");
fbc
}
+fn configure_banner(db: &Database, pd: &Podcast, banner: >k::Image, banner_title: >k::Label) {
+ let bann = Pixbuf::new_from_file_at_scale("assets/banner.png", 100, 100, true);
+ if let Ok(b) = bann {
+ banner.set_from_pixbuf(&b);
+
+ let new_episodes = {
+ let tempdb = db.lock().unwrap();
+ dbqueries::get_pd_unplayed_episodes(&tempdb, pd)
+ };
+
+ if let Ok(n) = new_episodes {
+ if !n.is_empty() {
+ banner_title.set_text(&n.len().to_string());
+ banner.show();
+ banner_title.show();
+ }
+ }
+ }
+}
+
pub fn on_flowbox_child_activate(db: &Database, stack: >k::Stack, parent: &Podcast) {
let old = stack.get_child_by_name("pdw").unwrap();
let pdw = podcast_widget(db, stack, parent);
@@ -170,7 +183,7 @@ pub fn on_flowbox_child_activate(db: &Database, stack: >k::Stack, parent: &Pod
println!("Hello World!, child activated");
}
-pub fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option {
+fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option {
let img_path = downloader::cache_image(pd_title, img_path);
if let Some(i) = img_path {
Pixbuf::new_from_file_at_scale(&i, 200, 200, true).ok()