Refactored to remove from Database refferences.

This commit is contained in:
Jordan Petridis
2017-11-19 23:32:37 +02:00
parent beaeeffba8
commit 5ad52fa4b2
8 changed files with 91 additions and 125 deletions
+22 -33
View File
@@ -2,7 +2,6 @@ use open;
use hammond_data::dbqueries;
use hammond_data::models::{Episode, Podcast};
use hammond_downloader::downloader;
use hammond_data::Database;
use hammond_data::utils::*;
use hammond_data::errors::*;
@@ -23,7 +22,7 @@ type Foo = RefCell<Option<(gtk::Button, gtk::Button, gtk::Button, Receiver<bool>
thread_local!(static GLOBAL: Foo = RefCell::new(None));
fn epidose_widget(db: &Database, episode: &mut Episode, pd_title: &str) -> gtk::Box {
fn epidose_widget(episode: &mut Episode, pd_title: &str) -> gtk::Box {
// This is just a prototype and will be reworked probably.
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/episode_widget.ui");
@@ -70,42 +69,41 @@ fn epidose_widget(db: &Database, episode: &mut Episode, pd_title: &str) -> gtk::
}
play_button.connect_clicked(
clone!(db, episode, played_button, unplayed_button => move |_| {
on_play_bttn_clicked(&db, *episode.id());
let _ = set_played_now(&db, &mut episode.clone());
clone!(episode, played_button, unplayed_button => move |_| {
on_play_bttn_clicked(*episode.id());
let _ = set_played_now(&mut episode.clone());
played_button.hide();
unplayed_button.show();
}),
);
delete_button.connect_clicked(
clone!(episode, db, play_button, download_button => move |del| {
on_delete_bttn_clicked(&db, *episode.id());
clone!(episode, play_button, download_button => move |del| {
on_delete_bttn_clicked(*episode.id());
del.hide();
play_button.hide();
download_button.show();
}),
);
played_button.connect_clicked(clone!(db, episode, unplayed_button => move |played| {
let _ = set_played_now(&db, &mut episode.clone());
played_button.connect_clicked(clone!(episode, unplayed_button => move |played| {
let _ = set_played_now(&mut episode.clone());
played.hide();
unplayed_button.show();
}));
unplayed_button.connect_clicked(clone!(db, episode, played_button => move |un| {
unplayed_button.connect_clicked(clone!(episode, played_button => move |un| {
let mut episode = episode.clone();
episode.set_played(None);
let _ = episode.save(&db);
let _ = episode.save();
un.hide();
played_button.show();
}));
let pd_title = pd_title.to_owned();
download_button.connect_clicked(
clone!(db, play_button, delete_button, episode => move |dl| {
clone!(play_button, delete_button, episode => move |dl| {
on_download_clicked(
&db,
&pd_title,
&mut episode.clone(),
dl,
@@ -120,7 +118,6 @@ fn epidose_widget(db: &Database, episode: &mut Episode, pd_title: &str) -> gtk::
// TODO: show notification when dl is finished.
fn on_download_clicked(
db: &Database,
pd_title: &str,
ep: &mut Episode,
download_bttn: &gtk::Button,
@@ -137,23 +134,20 @@ fn on_download_clicked(
let pd_title = pd_title.to_owned();
let mut ep = ep.clone();
thread::spawn(clone!(db => move || {
thread::spawn(move || {
let download_fold = downloader::get_download_folder(&pd_title).unwrap();
let e = downloader::get_episode(&db, &mut ep, download_fold.as_str());
let e = downloader::get_episode(&mut ep, download_fold.as_str());
if let Err(err) = e {
error!("Error while trying to download: {}", ep.uri());
error!("Error: {}", err);
};
sender.send(true).expect("Couldn't send data to channel");;
glib::idle_add(receive);
}));
});
}
fn on_play_bttn_clicked(db: &Database, episode_id: i32) {
let local_uri = {
let tempdb = db.lock().unwrap();
dbqueries::get_episode_local_uri_from_id(&tempdb, episode_id).unwrap()
};
fn on_play_bttn_clicked(episode_id: i32) {
let local_uri = dbqueries::get_episode_local_uri_from_id(episode_id).unwrap();
if let Some(uri) = local_uri {
if Path::new(&uri).exists() {
@@ -172,13 +166,10 @@ fn on_play_bttn_clicked(db: &Database, episode_id: i32) {
}
}
fn on_delete_bttn_clicked(db: &Database, episode_id: i32) {
let mut ep = {
let tempdb = db.lock().unwrap();
dbqueries::get_episode_from_id(&tempdb, episode_id).unwrap()
};
fn on_delete_bttn_clicked(episode_id: i32) {
let mut ep = dbqueries::get_episode_from_id(episode_id).unwrap();
let e = delete_local_content(db, &mut ep);
let e = delete_local_content(&mut ep);
if let Err(err) = e {
error!("Error while trying to delete file: {:?}", ep.local_uri());
error!("Error: {}", err);
@@ -200,14 +191,12 @@ fn receive() -> glib::Continue {
glib::Continue(false)
}
pub fn episodes_listbox(db: &Database, pd: &Podcast) -> Result<gtk::ListBox> {
let conn = db.lock().unwrap();
let episodes = dbqueries::get_pd_episodes(&conn, pd)?;
drop(conn);
pub fn episodes_listbox(pd: &Podcast) -> Result<gtk::ListBox> {
let episodes = dbqueries::get_pd_episodes(pd)?;
let list = gtk::ListBox::new();
episodes.into_iter().for_each(|mut ep| {
let w = epidose_widget(db, &mut ep, pd.title());
let w = epidose_widget(&mut ep, pd.title());
list.add(&w)
});
+16 -24
View File
@@ -6,13 +6,12 @@ use std::fs;
use hammond_data::dbqueries;
use hammond_data::models::Podcast;
use hammond_data::Database;
use hammond_downloader::downloader;
use widgets::episode::episodes_listbox;
use podcasts_view::update_podcasts_view;
pub fn podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) -> gtk::Box {
pub fn podcast_widget(stack: &gtk::Stack, pd: &Podcast) -> gtk::Box {
// Adapted from gnome-music AlbumWidget
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/podcast_widget.ui");
let pd_widget: gtk::Box = builder.get_object("podcast_widget").unwrap();
@@ -25,12 +24,12 @@ pub fn podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) -> gtk::B
let played_button: gtk::Button = builder.get_object("mark_all_played_button").unwrap();
// TODO: should spawn a thread to avoid locking the UI probably.
unsub_button.connect_clicked(clone!(db, stack, pd => move |bttn| {
on_unsub_button_clicked(&db, &stack, &pd, bttn);
unsub_button.connect_clicked(clone!(stack, pd => move |bttn| {
on_unsub_button_clicked(&stack, &pd, bttn);
}));
title_label.set_text(pd.title());
let listbox = episodes_listbox(db, pd);
let listbox = episodes_listbox(pd);
if let Ok(l) = listbox {
view.add(&l);
}
@@ -45,22 +44,21 @@ pub fn podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) -> gtk::B
cover.set_from_pixbuf(&i);
}
played_button.connect_clicked(clone!(db, stack, pd => move |_| {
on_played_button_clicked(&db, &stack, &pd);
played_button.connect_clicked(clone!(stack, pd => move |_| {
on_played_button_clicked(&stack, &pd);
}));
show_played_button(db, pd, &played_button);
show_played_button(pd, &played_button);
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);
let res = dbqueries::remove_feed(pd);
if res.is_ok() {
info!("{} was removed succesfully.", pd.title());
// hack to get away without properly checking for none.
@@ -76,23 +74,17 @@ fn on_unsub_button_clicked(
};
}
stack.set_visible_child_name("fb_parent");
update_podcasts_view(db, stack);
update_podcasts_view(stack);
}
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);
}
fn on_played_button_clicked(stack: &gtk::Stack, pd: &Podcast) {
let _ = dbqueries::update_none_to_played_now(pd);
update_podcast_widget(db, stack, pd);
update_podcast_widget(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)
};
fn show_played_button(pd: &Podcast, played_button: &gtk::Button) {
let new_episodes = dbqueries::get_pd_unplayed_episodes(pd);
if let Ok(n) = new_episodes {
if !n.is_empty() {
@@ -117,9 +109,9 @@ pub fn setup_podcast_widget(stack: &gtk::Stack) {
stack.add_named(&pd_widget, "pdw");
}
pub fn update_podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) {
pub fn update_podcast_widget(stack: &gtk::Stack, pd: &Podcast) {
let old = stack.get_child_by_name("pdw").unwrap();
let pdw = podcast_widget(db, stack, pd);
let pdw = podcast_widget(stack, pd);
let vis = stack.get_visible_child_name().unwrap();
stack.remove(&old);