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::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]

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,
// 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.

View File

@ -8,16 +8,19 @@ use hammond_data::index_feed::Database;
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 view: gtk::Box = builder.get_object("empty_view").unwrap();
stack.add_named(&view, "empty");
}
fn show_empty_view(stack: &gtk::Stack) {
stack.set_visible_child_name("empty");
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 db = db.lock().unwrap();
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);
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: &gtk::Stack, parent: &Podcast
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 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: &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 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: &gtk::Stack, flowbox: &gtk::FlowBox) {
on_flowbox_child_activate(&db, &stack, &parent);
}));
// 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);
stack.set_visible_child_name("fb_parent")
}
fn on_played_button_clicked(db: &Database, stack: &gtk::Stack, pd: &Podcast) {