#![cfg_attr(feature = "cargo-clippy", allow(clone_on_ref_ptr))] use gtk; use gtk::prelude::*; use gtk::StackTransitionType; use gdk_pixbuf::Pixbuf; use hammond_downloader::downloader; use diesel::prelude::SqliteConnection; use std::sync::{Arc, Mutex}; use widgets::podcast::*; pub fn populate_podcasts_flowbox( db: &Arc>, stack: >k::Stack, flowbox: >k::FlowBox, ) { let tempdb = db.lock().unwrap(); let pd_model = podcast_liststore(&tempdb); drop(tempdb); // Get a ListStore iterator at the first element. let iter = if let Some(it) = pd_model.get_iter_first() { it } else { // stolen from gnome-news. let builder = include_str!("../../gtk/empty_view.ui"); let builder = gtk::Builder::new_from_string(builder); let view: gtk::Box = builder.get_object("empty_view").unwrap(); stack.add_named(&view, "empty"); stack.set_visible_child_name("empty"); info!("Empty view."); return; }; loop { let title = pd_model .get_value(&iter, 1) .get::() .unwrap_or_default(); let description = pd_model.get_value(&iter, 2).get::(); let image_uri = pd_model.get_value(&iter, 4).get::(); let imgpath = downloader::cache_image(&title, image_uri.as_ref().map(|s| s.as_str())); let pixbuf = if let Some(i) = imgpath { Pixbuf::new_from_file_at_scale(&i, 200, 200, true).ok() } else { None }; let f = create_flowbox_child(&title, pixbuf.clone()); let stack_clone = stack.clone(); let db_clone = db.clone(); f.connect_activate(move |_| { let pdw = stack_clone.get_child_by_name("pdw").unwrap(); stack_clone.remove(&pdw); let pdw = podcast_widget( &db_clone.clone(), Some(title.as_str()), description.as_ref().map(|x| x.as_str()), pixbuf.clone(), ); stack_clone.add_named(&pdw, "pdw"); stack_clone.set_visible_child(&pdw); println!("Hello World!, child activated"); }); flowbox.add(&f); if !pd_model.iter_next(&iter) { break; } } flowbox.show_all(); } fn setup_podcast_widget(db: &Arc>, stack: >k::Stack) { let pd_widget = podcast_widget(&db.clone(), None, None, None); stack.add_named(&pd_widget, "pdw"); } fn setup_podcasts_grid(db: &Arc>, stack: >k::Stack) { let builder = include_str!("../../gtk/podcasts_view.ui"); let builder = gtk::Builder::new_from_string(builder); let grid: gtk::Grid = builder.get_object("grid").unwrap(); stack.add_named(&grid, "pd_grid"); stack.set_visible_child(&grid); // Adapted copy of the way gnome-music does albumview // FIXME: flowbox childs activate with space/enter but not with clicks. let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); // Populate the flowbox with the Podcasts. populate_podcasts_flowbox(&db.clone(), &stack.clone(), &flowbox.clone()); } pub fn setup_stack(db: &Arc>) -> gtk::Stack { let stack = gtk::Stack::new(); let _st_clone = stack.clone(); setup_podcast_widget(&db.clone(), &stack.clone()); setup_podcasts_grid(&db.clone(), &stack.clone()); // stack.connect("foo", true, move |_| { // update_podcasts_view(db.clone(), st_clone.clone()); // None // }); stack } pub fn update_podcasts_view(db: &Arc>, stack: >k::Stack) { let builder = include_str!("../../gtk/podcasts_view.ui"); let builder = gtk::Builder::new_from_string(builder); let grid: gtk::Grid = builder.get_object("grid").unwrap(); let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); // Populate the flowbox with the Podcasts. populate_podcasts_flowbox(&db.clone(), &stack.clone(), &flowbox.clone()); let old = stack.get_child_by_name("pd_grid").unwrap(); stack.remove(&old); stack.add_named(&grid, "pd_grid"); stack.set_visible_child_full("pd_grid", StackTransitionType::None); }