Refactored empty view logic.

This commit is contained in:
Jordan Petridis 2017-11-10 16:15:53 +02:00
parent fe571df1d5
commit f2476cde65
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 35 additions and 29 deletions

View File

@ -183,10 +183,13 @@ mod tests {
use hammond_data::{DL_DIR, HAMMOND_CACHE}; use hammond_data::{DL_DIR, HAMMOND_CACHE};
use hammond_data::models::NewPodcast; use hammond_data::models::NewPodcast;
use std::fs;
#[test] #[test]
fn test_get_dl_folder() { fn test_get_dl_folder() {
let foo_ = format!("{}/{}", DL_DIR.to_str().unwrap(), "foo"); let foo_ = format!("{}/{}", DL_DIR.to_str().unwrap(), "foo");
assert_eq!(get_download_folder("foo").unwrap(), foo_); assert_eq!(get_download_folder("foo").unwrap(), foo_);
let _ = fs::remove_dir_all(foo_);
} }
#[test] #[test]

View File

@ -37,14 +37,8 @@ pub fn get_headerbar(db: &Database, stack: &gtk::Stack) -> gtk::HeaderBar {
// TODO: make it a back arrow button, that will hide when appropriate, // TODO: make it a back arrow button, that will hide when appropriate,
// and add a StackSwitcher when more views are added. // and add a StackSwitcher when more views are added.
home_button.connect_clicked(clone!(db, stack => move |_| { home_button.connect_clicked(clone!(db, stack => move |_| {
let vis = stack.get_visible_child_name().unwrap(); stack.set_visible_child_name("fb_parent");
if vis == "fb_parent" { update_podcasts_view(&db, &stack);
// 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");
}
})); }));
// FIXME: There appears to be a memmory leak here. // FIXME: There appears to be a memmory leak here.

View File

@ -8,16 +8,19 @@ use hammond_data::index_feed::Database;
use widgets::podcast::*; use widgets::podcast::*;
fn show_empty_view(stack: &gtk::Stack) { fn setup_empty_view(stack: &gtk::Stack) {
let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/empty_view.ui"); let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/empty_view.ui");
let view: gtk::Box = builder.get_object("empty_view").unwrap(); let view: gtk::Box = builder.get_object("empty_view").unwrap();
stack.add_named(&view, "empty"); stack.add_named(&view, "empty");
}
fn show_empty_view(stack: &gtk::Stack) {
stack.set_visible_child_name("empty"); stack.set_visible_child_name("empty");
info!("Empty view."); info!("Empty view.");
} }
fn populate_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) { fn populate_flowbox(db: &Database, flowbox: &gtk::FlowBox) {
let podcasts = { let podcasts = {
let db = db.lock().unwrap(); let db = db.lock().unwrap();
dbqueries::get_podcasts(&db) dbqueries::get_podcasts(&db)
@ -28,10 +31,8 @@ fn populate_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) {
let f = create_flowbox_child(db, parent); let f = create_flowbox_child(db, parent);
flowbox.add(&f); flowbox.add(&f);
}); });
} else { flowbox.show_all();
show_empty_view(stack);
} }
flowbox.show_all();
} }
fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild { fn create_flowbox_child(db: &Database, pd: &Podcast) -> gtk::FlowBoxChild {
@ -93,39 +94,47 @@ fn on_flowbox_child_activate(db: &Database, stack: &gtk::Stack, parent: &Podcast
old.destroy(); old.destroy();
} }
fn setup_podcasts_flowbox(db: &Database, stack: &gtk::Stack) { fn setup_podcasts_flowbox(db: &Database, stack: &gtk::Stack) -> gtk::FlowBox {
let builder = gtk::Builder::new_from_resource("/org/gtk/hammond/gtk/podcasts_view.ui"); 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 fb_parent: gtk::Box = builder.get_object("fb_parent").unwrap();
let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap();
init_flowbox(db, stack, &flowbox); init_flowbox(db, stack, &flowbox);
stack.add_named(&fb_parent, "fb_parent"); 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 { pub fn setup_stack(db: &Database) -> gtk::Stack {
let stack = gtk::Stack::new(); let stack = gtk::Stack::new();
stack.set_transition_type(gtk::StackTransitionType::SlideLeftRight); stack.set_transition_type(gtk::StackTransitionType::SlideLeftRight);
setup_empty_view(&stack);
setup_podcast_widget(&stack); setup_podcast_widget(&stack);
setup_podcasts_flowbox(db, &stack); setup_podcasts_flowbox(db, &stack);
stack stack
} }
pub fn update_podcasts_view(db: &Database, stack: &gtk::Stack) { pub fn update_podcasts_view(db: &Database, stack: &gtk::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 vis = stack.get_visible_child_name().unwrap();
let old = stack.get_child_by_name("fb_parent").unwrap();
stack.remove(&old); stack.remove(&old);
stack.add_named(&fb_parent, "fb_parent");
// preserve the visible widget let flowbox = setup_podcasts_flowbox(db, stack);
stack.set_visible_child_name(&vis);
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 // aggresive memory cleanup
// probably not needed // probably not needed
@ -144,5 +153,5 @@ fn init_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) {
on_flowbox_child_activate(&db, &stack, &parent); on_flowbox_child_activate(&db, &stack, &parent);
})); }));
// Populate the flowbox with the Podcasts. // Populate the flowbox with the Podcasts.
populate_flowbox(db, stack, flowbox); populate_flowbox(db, flowbox);
} }

View File

@ -75,8 +75,8 @@ fn on_unsub_button_clicked(
} }
}; };
} }
stack.set_visible_child_name("fb_parent");
update_podcasts_view(db, stack); update_podcasts_view(db, stack);
stack.set_visible_child_name("fb_parent")
} }
fn on_played_button_clicked(db: &Database, stack: &gtk::Stack, pd: &Podcast) { fn on_played_button_clicked(db: &Database, stack: &gtk::Stack, pd: &Podcast) {