86 lines
2.7 KiB
Rust
86 lines
2.7 KiB
Rust
use gtk;
|
|
use gtk::prelude::*;
|
|
|
|
use hammond_data::dbqueries;
|
|
use hammond_data::index_feed::Database;
|
|
|
|
use widgets::podcast::*;
|
|
|
|
fn show_empty_view(stack: >k::Stack) {
|
|
let builder = gtk::Builder::new_from_string(include_str!("../../gtk/empty_view.ui"));
|
|
let view: gtk::Box = builder.get_object("empty_view").unwrap();
|
|
stack.add_named(&view, "empty");
|
|
stack.set_visible_child_name("empty");
|
|
|
|
info!("Empty view.");
|
|
}
|
|
|
|
fn populate_flowbox(db: &Database, stack: >k::Stack, flowbox: >k::FlowBox) {
|
|
let podcasts = {
|
|
let db = db.lock().unwrap();
|
|
dbqueries::get_podcasts(&db)
|
|
};
|
|
|
|
if let Ok(pds) = podcasts {
|
|
pds.iter().for_each(|parent| {
|
|
let f = create_flowbox_child(db, parent);
|
|
|
|
f.connect_activate(clone!(db, stack, parent => move |_| {
|
|
on_flowbox_child_activate(&db, &stack, &parent);
|
|
}));
|
|
flowbox.add(&f);
|
|
});
|
|
} else {
|
|
show_empty_view(stack);
|
|
}
|
|
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();
|
|
|
|
stack.add_named(&pd_widget, "pdw");
|
|
}
|
|
|
|
fn setup_podcasts_grid(db: &Database, stack: >k::Stack) {
|
|
let builder = gtk::Builder::new_from_string(include_str!("../../gtk/podcasts_view.ui"));
|
|
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_flowbox(db, stack, &flowbox);
|
|
}
|
|
|
|
pub fn setup_stack(db: &Database) -> gtk::Stack {
|
|
let stack = gtk::Stack::new();
|
|
setup_podcast_widget(&stack);
|
|
setup_podcasts_grid(db, &stack);
|
|
stack
|
|
}
|
|
|
|
pub fn update_podcasts_view(db: &Database, stack: >k::Stack) {
|
|
let builder = gtk::Builder::new_from_string(include_str!("../../gtk/podcasts_view.ui"));
|
|
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_flowbox(db, stack, &flowbox);
|
|
|
|
let old = stack.get_child_by_name("pd_grid").unwrap();
|
|
let vis = stack.get_visible_child_name().unwrap();
|
|
|
|
stack.remove(&old);
|
|
stack.add_named(&grid, "pd_grid");
|
|
// preserve the visible widget
|
|
stack.set_visible_child_name(&vis);
|
|
|
|
// aggresive memory cleanup
|
|
// probably not needed
|
|
old.destroy();
|
|
}
|