From f2476cde6514b71ba8cb77ca50ffa12b5ee20f20 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Fri, 10 Nov 2017 16:15:53 +0200 Subject: [PATCH] Refactored empty view logic. --- hammond-downloader/src/downloader.rs | 3 ++ hammond-gtk/src/headerbar.rs | 10 ++---- hammond-gtk/src/views/podcasts_view.rs | 49 +++++++++++++++----------- hammond-gtk/src/widgets/podcast.rs | 2 +- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/hammond-downloader/src/downloader.rs b/hammond-downloader/src/downloader.rs index 6add1d5..628fd67 100644 --- a/hammond-downloader/src/downloader.rs +++ b/hammond-downloader/src/downloader.rs @@ -183,10 +183,13 @@ mod tests { use hammond_data::{DL_DIR, HAMMOND_CACHE}; use hammond_data::models::NewPodcast; + use std::fs; + #[test] fn test_get_dl_folder() { let foo_ = format!("{}/{}", DL_DIR.to_str().unwrap(), "foo"); assert_eq!(get_download_folder("foo").unwrap(), foo_); + let _ = fs::remove_dir_all(foo_); } #[test] diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index bec736c..15007e4 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -37,14 +37,8 @@ pub fn get_headerbar(db: &Database, stack: >k::Stack) -> gtk::HeaderBar { // TODO: make it a back arrow button, that will hide when appropriate, // and add a StackSwitcher when more views are added. home_button.connect_clicked(clone!(db, stack => move |_| { - let vis = stack.get_visible_child_name().unwrap(); - if vis == "fb_parent" { - // More conviniet way to reload podcasts_flowbox while trying out stuff. - // Ideally, the functionality should be removed from final design. - update_podcasts_view(&db, &stack); - } else { - stack.set_visible_child_name("fb_parent"); - } + stack.set_visible_child_name("fb_parent"); + update_podcasts_view(&db, &stack); })); // FIXME: There appears to be a memmory leak here. diff --git a/hammond-gtk/src/views/podcasts_view.rs b/hammond-gtk/src/views/podcasts_view.rs index f3538f6..e7c7fc5 100644 --- a/hammond-gtk/src/views/podcasts_view.rs +++ b/hammond-gtk/src/views/podcasts_view.rs @@ -8,16 +8,19 @@ use hammond_data::index_feed::Database; use widgets::podcast::*; -fn show_empty_view(stack: >k::Stack) { +fn setup_empty_view(stack: >k::Stack) { let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/empty_view.ui"); let view: gtk::Box = builder.get_object("empty_view").unwrap(); stack.add_named(&view, "empty"); +} + +fn show_empty_view(stack: >k::Stack) { stack.set_visible_child_name("empty"); info!("Empty view."); } -fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) { +fn populate_flowbox(db: &Database, flowbox: >k::FlowBox) { let podcasts = { let db = db.lock().unwrap(); dbqueries::get_podcasts(&db) @@ -28,10 +31,8 @@ fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) { let f = create_flowbox_child(db, parent); flowbox.add(&f); }); - } else { - show_empty_view(stack); + flowbox.show_all(); } - flowbox.show_all(); } fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { @@ -93,39 +94,47 @@ fn on_flowbox_child_activate(db: &Database, stack: >k::Stack, parent: &Podcast old.destroy(); } -fn setup_podcasts_flowbox(db: &Database, stack: >k::Stack) { +fn setup_podcasts_flowbox(db: &Database, stack: >k::Stack) -> gtk::FlowBox { let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/podcasts_view.ui"); let fb_parent: gtk::Box = builder.get_object("fb_parent").unwrap(); - let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); init_flowbox(db, stack, &flowbox); stack.add_named(&fb_parent, "fb_parent"); - stack.set_visible_child(&fb_parent); + + if flowbox.get_children().is_empty() { + show_empty_view(stack); + } else { + stack.set_visible_child(&fb_parent); + }; + + flowbox } pub fn setup_stack(db: &Database) -> gtk::Stack { let stack = gtk::Stack::new(); stack.set_transition_type(gtk::StackTransitionType::SlideLeftRight); + setup_empty_view(&stack); setup_podcast_widget(&stack); setup_podcasts_flowbox(db, &stack); stack } pub fn update_podcasts_view(db: &Database, stack: >k::Stack) { - let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/podcasts_view.ui"); - let fb_parent: gtk::Box = builder.get_object("fb_parent").unwrap(); - - let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); - init_flowbox(db, stack, &flowbox); - - let old = stack.get_child_by_name("fb_parent").unwrap(); let vis = stack.get_visible_child_name().unwrap(); - + let old = stack.get_child_by_name("fb_parent").unwrap(); stack.remove(&old); - stack.add_named(&fb_parent, "fb_parent"); - // preserve the visible widget - stack.set_visible_child_name(&vis); + + let flowbox = setup_podcasts_flowbox(db, stack); + + if vis == "empty" && !flowbox.get_children().is_empty() { + stack.set_visible_child_name("fb_parent"); + } else if vis == "fb_parent" && flowbox.get_children().is_empty() { + stack.set_visible_child_name("empty"); + } else { + // preserve the visible widget + stack.set_visible_child_name(&vis); + }; // aggresive memory cleanup // probably not needed @@ -144,5 +153,5 @@ fn init_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) { on_flowbox_child_activate(&db, &stack, &parent); })); // Populate the flowbox with the Podcasts. - populate_flowbox(db, stack, flowbox); + populate_flowbox(db, flowbox); } diff --git a/hammond-gtk/src/widgets/podcast.rs b/hammond-gtk/src/widgets/podcast.rs index 36458a2..8526924 100644 --- a/hammond-gtk/src/widgets/podcast.rs +++ b/hammond-gtk/src/widgets/podcast.rs @@ -75,8 +75,8 @@ fn on_unsub_button_clicked( } }; } + stack.set_visible_child_name("fb_parent"); update_podcasts_view(db, stack); - stack.set_visible_child_name("fb_parent") } fn on_played_button_clicked(db: &Database, stack: >k::Stack, pd: &Podcast) {