Refactored podcast_widget constructor.

This commit is contained in:
Jordan Petridis 2017-10-31 12:25:15 +02:00
parent faf4a4bce0
commit 401c13eee7
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
6 changed files with 77 additions and 97 deletions

View File

@ -59,10 +59,7 @@ pub fn get_episode(con: &SqliteConnection, ep_id: i32) -> QueryResult<Episode> {
ep ep
} }
pub fn get_episode_from_local_uri( pub fn get_episode_local_uri(con: &SqliteConnection, ep_id: i32) -> QueryResult<Option<String>> {
con: &SqliteConnection,
ep_id: i32,
) -> QueryResult<Option<String>> {
use schema::episode::dsl::*; use schema::episode::dsl::*;
let ep = episode let ep = episode

View File

@ -37,7 +37,7 @@
</object> </object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">False</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>

View File

@ -54,6 +54,7 @@ fn build_ui(app: &gtk::Application) {
Inhibit(false) Inhibit(false)
}); });
// Setup quit in the app menu since default is overwritten.
let quit = gio::SimpleAction::new("quit", None); let quit = gio::SimpleAction::new("quit", None);
let window2 = window.clone(); let window2 = window.clone();
quit.connect_activate(move |_, _| { quit.connect_activate(move |_, _| {
@ -61,6 +62,7 @@ fn build_ui(app: &gtk::Application) {
}); });
app.add_action(&quit); app.add_action(&quit);
// Setup the dbcheckup in the app menu.
let db2 = Arc::clone(&db); let db2 = Arc::clone(&db);
let check = gio::SimpleAction::new("check", None); let check = gio::SimpleAction::new("check", None);
check.connect_activate(move |_, _| { check.connect_activate(move |_, _| {

View File

@ -45,10 +45,10 @@ fn populate_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) {
let title = parent.title(); let title = parent.title();
let img = parent.image_uri(); let img = parent.image_uri();
let pixbuf = get_pixbuf_from_path(img, title); let pixbuf = get_pixbuf_from_path(img, title);
let f = create_flowbox_child(title, pixbuf.clone()); let f = create_flowbox_child(title, pixbuf);
f.connect_activate(clone!(db, stack, parent => move |_| { f.connect_activate(clone!(db, stack, parent => move |_| {
on_flowbox_child_activate(&db, &stack, &parent, pixbuf.clone()); on_flowbox_child_activate(&db, &stack, &parent);
})); }));
flowbox.add(&f); flowbox.add(&f);
}); });
@ -58,8 +58,11 @@ fn populate_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) {
flowbox.show_all(); flowbox.show_all();
} }
fn setup_podcast_widget(db: &Database, stack: &gtk::Stack) { fn setup_podcast_widget(stack: &gtk::Stack) {
let pd_widget = podcast_widget(db, stack, None, None, None); let pd_widget_source = include_str!("../../gtk/podcast_widget.ui");
let pd_widget_buidler = gtk::Builder::new_from_string(pd_widget_source);
let pd_widget: gtk::Box = pd_widget_buidler.get_object("podcast_widget").unwrap();
stack.add_named(&pd_widget, "pdw"); stack.add_named(&pd_widget, "pdw");
} }
@ -80,7 +83,7 @@ fn setup_podcasts_grid(db: &Database, stack: &gtk::Stack) {
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();
setup_podcast_widget(db, &stack); setup_podcast_widget(&stack);
setup_podcasts_grid(db, &stack); setup_podcasts_grid(db, &stack);
stack stack
} }

View File

@ -167,7 +167,7 @@ fn on_download_clicked(
fn on_play_bttn_clicked(db: &Database, episode_id: i32) { fn on_play_bttn_clicked(db: &Database, episode_id: i32) {
let local_uri = { let local_uri = {
let tempdb = db.lock().unwrap(); let tempdb = db.lock().unwrap();
dbqueries::get_episode_from_local_uri(&tempdb, episode_id).unwrap() dbqueries::get_episode_local_uri(&tempdb, episode_id).unwrap()
}; };
if let Some(uri) = local_uri { if let Some(uri) = local_uri {

View File

@ -30,14 +30,7 @@ macro_rules! clone {
); );
} }
// TODO: Refacto to take a Podcast Stuct as argument instead. pub fn podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) -> gtk::Box {
pub fn podcast_widget(
db: &Database,
stack: &gtk::Stack,
title: Option<&str>,
description: Option<&str>,
image: Option<Pixbuf>,
) -> gtk::Box {
// Adapted from gnome-music AlbumWidget // Adapted from gnome-music AlbumWidget
let pd_widget_source = include_str!("../../gtk/podcast_widget.ui"); let pd_widget_source = include_str!("../../gtk/podcast_widget.ui");
let pd_widget_buidler = gtk::Builder::new_from_string(pd_widget_source); let pd_widget_buidler = gtk::Builder::new_from_string(pd_widget_source);
@ -52,77 +45,78 @@ pub fn podcast_widget(
.get_object("mark_all_played_button") .get_object("mark_all_played_button")
.unwrap(); .unwrap();
// TODO: refactor, splitoff, spawn a thread probably. // TODO: spawn a thread to avoid locking the UI probably.
if title.is_some() { unsub_button.connect_clicked(clone!(db, stack, pd => move |bttn| {
let t = title.unwrap().to_owned(); on_unsub_button_clicked(&db, &stack, &pd, bttn);
unsub_button.connect_clicked(clone!(db, stack, t => move |bttn| {
let pd = {
let tempdb = db.lock().unwrap();
dbqueries::load_podcast_from_title(&tempdb, &t)};
if let Ok(pd) = pd {
let res = dbqueries::remove_feed(&db, &pd);
if res.is_ok(){
info!("{} was removed succesfully.", &t);
// hack to get away without properly checking for none.
// if pressed twice would panic.
bttn.hide();
let dl_fold = downloader::get_download_folder(&t);
if let Ok(fold) = dl_fold{
let res3 = fs::remove_dir_all(&fold);
if res3.is_ok(){
info!("All the content at, {} was removed succesfully", &fold);
}
};
}
}
update_podcasts_view(&db, &stack);
stack.set_visible_child_name("pd_grid")
})); }));
}
if let Some(t) = title { title_label.set_text(pd.title());
title_label.set_text(t); let listbox = episodes_listbox(db, pd.title());
let listbox = episodes_listbox(db, t); view.add(&listbox);
view.add(&listbox);
}
if let Some(d) = description { desc_label.set_text(pd.description());
desc_label.set_text(d);
}
if let Some(i) = image { let img = get_pixbuf_from_path(pd.image_uri(), pd.title());
if let Some(i) = img {
cover.set_from_pixbuf(&i); cover.set_from_pixbuf(&i);
} }
// TODO: refactor played_button.connect_clicked(clone!(db, stack, pd => move |_| {
if let Some(t) = title { on_played_button_clicked(&db, &stack, &pd);
let t = t.to_owned(); }));
played_button.connect_clicked(clone!(db, stack, t => move |_| {
let tempdb = db.lock().unwrap();
let parent = dbqueries::load_podcast_from_title(&tempdb, &t).unwrap();
let _ = dbqueries::update_none_to_played_now(&tempdb, &parent);
drop(tempdb);
update_podcast_widget(&db, &stack, &parent);
}));
}
if let Some(t) = title { show_played_button(db, pd, &played_button);
let tempdb = db.lock().unwrap();
let parent = dbqueries::load_podcast_from_title(&tempdb, t).unwrap();
let f = dbqueries::get_pd_unplayed_episodes(&tempdb, &parent);
if let Ok(l) = f {
if !l.is_empty() {
played_button.show()
}
}
}
pd_widget pd_widget
} }
fn on_unsub_button_clicked(
db: &Database,
stack: &gtk::Stack,
pd: &Podcast,
unsub_button: &gtk::Button,
) {
let res = dbqueries::remove_feed(db, pd);
if res.is_ok() {
info!("{} was removed succesfully.", pd.title());
// hack to get away without properly checking for none.
// if pressed twice would panic.
unsub_button.hide();
let dl_fold = downloader::get_download_folder(pd.title());
if let Ok(fold) = dl_fold {
let res3 = fs::remove_dir_all(&fold);
if res3.is_ok() {
info!("All the content at, {} was removed succesfully", &fold);
}
};
}
update_podcasts_view(db, stack);
stack.set_visible_child_name("pd_grid")
}
fn on_played_button_clicked(db: &Database, stack: &gtk::Stack, pd: &Podcast) {
{
let tempdb = db.lock().unwrap();
let _ = dbqueries::update_none_to_played_now(&tempdb, pd);
}
update_podcast_widget(db, stack, pd);
}
fn show_played_button(db: &Database, pd: &Podcast, played_button: &gtk::Button) {
let new_episodes = {
let tempdb = db.lock().unwrap();
dbqueries::get_pd_unplayed_episodes(&tempdb, pd)
};
if let Ok(n) = new_episodes {
if !n.is_empty() {
played_button.show()
}
}
}
pub fn create_flowbox_child(title: &str, cover: Option<Pixbuf>) -> gtk::FlowBoxChild { pub fn create_flowbox_child(title: &str, cover: Option<Pixbuf>) -> gtk::FlowBoxChild {
let build_src = include_str!("../../gtk/podcasts_child.ui"); let build_src = include_str!("../../gtk/podcasts_child.ui");
let builder = gtk::Builder::new_from_string(build_src); let builder = gtk::Builder::new_from_string(build_src);
@ -151,20 +145,9 @@ pub fn create_flowbox_child(title: &str, cover: Option<Pixbuf>) -> gtk::FlowBoxC
fbc fbc
} }
pub fn on_flowbox_child_activate( pub fn on_flowbox_child_activate(db: &Database, stack: &gtk::Stack, parent: &Podcast) {
db: &Database,
stack: &gtk::Stack,
parent: &Podcast,
pixbuf: Option<Pixbuf>,
) {
let old = stack.get_child_by_name("pdw").unwrap(); let old = stack.get_child_by_name("pdw").unwrap();
let pdw = podcast_widget( let pdw = podcast_widget(db, stack, parent);
db,
stack,
Some(parent.title()),
Some(parent.description()),
pixbuf,
);
stack.remove(&old); stack.remove(&old);
stack.add_named(&pdw, "pdw"); stack.add_named(&pdw, "pdw");
@ -187,15 +170,10 @@ pub fn get_pixbuf_from_path(img_path: Option<&str>, pd_title: &str) -> Option<Pi
pub fn update_podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) { pub fn update_podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) {
let old = stack.get_child_by_name("pdw").unwrap(); let old = stack.get_child_by_name("pdw").unwrap();
let pdw = pd_widget_from_diesel_model(db, pd, stack); let pdw = podcast_widget(db, stack, pd);
let vis = stack.get_visible_child_name().unwrap(); let vis = stack.get_visible_child_name().unwrap();
stack.remove(&old); stack.remove(&old);
stack.add_named(&pdw, "pdw"); stack.add_named(&pdw, "pdw");
stack.set_visible_child_name(&vis); stack.set_visible_child_name(&vis);
} }
fn pd_widget_from_diesel_model(db: &Database, pd: &Podcast, stack: &gtk::Stack) -> gtk::Box {
let img = get_pixbuf_from_path(pd.image_uri(), pd.title());
podcast_widget(db, stack, Some(pd.title()), Some(pd.description()), img)
}