From b0369974dabdd72e2c2b09a37c2b3937b77c6811 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Sat, 4 Nov 2017 18:40:54 +0200 Subject: [PATCH] Restructe of podcast_widget and podcasts_view modules. --- hammond-gtk/src/views/podcasts_view.rs | 64 +++++++++++++++++++++-- hammond-gtk/src/widgets/podcast.rs | 72 ++++---------------------- 2 files changed, 69 insertions(+), 67 deletions(-) diff --git a/hammond-gtk/src/views/podcasts_view.rs b/hammond-gtk/src/views/podcasts_view.rs index 4135b2d..ab70ffe 100644 --- a/hammond-gtk/src/views/podcasts_view.rs +++ b/hammond-gtk/src/views/podcasts_view.rs @@ -1,7 +1,9 @@ use gtk; use gtk::prelude::*; +use gdk_pixbuf::Pixbuf; use hammond_data::dbqueries; +use hammond_data::models::Podcast; use hammond_data::index_feed::Database; use widgets::podcast::*; @@ -32,11 +34,65 @@ fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) { flowbox.show_all(); } -fn setup_podcast_widget(stack: >k::Stack) { - let buidler = gtk::Builder::new_from_string(include_str!("../../gtk/podcast_widget.ui")); - let pd_widget: gtk::Box = buidler.get_object("podcast_widget").unwrap(); +fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { + let builder = gtk::Builder::new_from_string(include_str!("../../gtk/podcasts_child.ui")); - stack.add_named(&pd_widget, "pdw"); + // Copy of gnome-music AlbumWidget + 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 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(); + // There's probably a better way to store the id somewhere. + fbc.set_name(&pd.id().to_string()); + fbc.add(&box_); + fbc +} + +fn configure_banner(db: &Database, pd: &Podcast, banner: >k::Image, banner_title: >k::Label) { + // TODO: use GResource instead. + let bann = Pixbuf::new_from_file_at_scale("hammond-gtk/gtk/banner.png", 256, 256, 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(); + } + } + } +} + +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); + + stack.remove(&old); + stack.add_named(&pdw, "pdw"); + stack.set_visible_child(&pdw); + + // aggresive memory cleanup + // probably not needed + old.destroy(); + println!("Hello World!, child activated"); } fn setup_podcasts_grid(db: &Database, stack: >k::Stack) { diff --git a/hammond-gtk/src/widgets/podcast.rs b/hammond-gtk/src/widgets/podcast.rs index 335b5ac..d06df5e 100644 --- a/hammond-gtk/src/widgets/podcast.rs +++ b/hammond-gtk/src/widgets/podcast.rs @@ -12,7 +12,7 @@ use hammond_data::dbqueries; use widgets::episode::episodes_listbox; use podcasts_view::update_podcasts_view; -fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box { +pub fn podcast_widget(db: &Database, stack: >k::Stack, pd: &Podcast) -> gtk::Box { // Adapted from gnome-music AlbumWidget let builder = gtk::Builder::new_from_string(include_str!("../../gtk/podcast_widget.ui")); let pd_widget: gtk::Box = builder.get_object("podcast_widget").unwrap(); @@ -101,68 +101,7 @@ fn show_played_button(db: &Database, pd: &Podcast, played_button: >k::Button) } } -pub fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { - let builder = gtk::Builder::new_from_string(include_str!("../../gtk/podcasts_child.ui")); - - // Copy of gnome-music AlbumWidget - 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 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(); - // There's probably a better way to store the id somewhere. - fbc.set_name(&pd.id().to_string()); - fbc.add(&box_); - fbc -} - -fn configure_banner(db: &Database, pd: &Podcast, banner: >k::Image, banner_title: >k::Label) { - // TODO: use GResource instead. - let bann = Pixbuf::new_from_file_at_scale("hammond-gtk/gtk/banner.png", 256, 256, 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); - - stack.remove(&old); - stack.add_named(&pdw, "pdw"); - stack.set_visible_child(&pdw); - - // aggresive memory cleanup - // probably not needed - old.destroy(); - println!("Hello World!, child activated"); -} - -fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option { +pub 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, 256, 256, true).ok() @@ -171,6 +110,13 @@ fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option