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
}
pub fn get_episode_from_local_uri(
con: &SqliteConnection,
ep_id: i32,
) -> QueryResult<Option<String>> {
pub fn get_episode_local_uri(con: &SqliteConnection, ep_id: i32) -> QueryResult<Option<String>> {
use schema::episode::dsl::*;
let ep = episode

View File

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

View File

@ -54,6 +54,7 @@ fn build_ui(app: &gtk::Application) {
Inhibit(false)
});
// Setup quit in the app menu since default is overwritten.
let quit = gio::SimpleAction::new("quit", None);
let window2 = window.clone();
quit.connect_activate(move |_, _| {
@ -61,6 +62,7 @@ fn build_ui(app: &gtk::Application) {
});
app.add_action(&quit);
// Setup the dbcheckup in the app menu.
let db2 = Arc::clone(&db);
let check = gio::SimpleAction::new("check", None);
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 img = parent.image_uri();
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 |_| {
on_flowbox_child_activate(&db, &stack, &parent, pixbuf.clone());
on_flowbox_child_activate(&db, &stack, &parent);
}));
flowbox.add(&f);
});
@ -58,8 +58,11 @@ fn populate_flowbox(db: &Database, stack: &gtk::Stack, flowbox: &gtk::FlowBox) {
flowbox.show_all();
}
fn setup_podcast_widget(db: &Database, stack: &gtk::Stack) {
let pd_widget = podcast_widget(db, stack, None, None, None);
fn setup_podcast_widget(stack: &gtk::Stack) {
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");
}
@ -80,7 +83,7 @@ fn setup_podcasts_grid(db: &Database, stack: &gtk::Stack) {
pub fn setup_stack(db: &Database) -> gtk::Stack {
let stack = gtk::Stack::new();
setup_podcast_widget(db, &stack);
setup_podcast_widget(&stack);
setup_podcasts_grid(db, &stack);
stack
}

View File

@ -167,7 +167,7 @@ fn on_download_clicked(
fn on_play_bttn_clicked(db: &Database, episode_id: i32) {
let local_uri = {
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 {

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,
title: Option<&str>,
description: Option<&str>,
image: Option<Pixbuf>,
) -> gtk::Box {
pub fn podcast_widget(db: &Database, stack: &gtk::Stack, pd: &Podcast) -> gtk::Box {
// Adapted from gnome-music AlbumWidget
let pd_widget_source = include_str!("../../gtk/podcast_widget.ui");
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")
.unwrap();
// TODO: refactor, splitoff, spawn a thread probably.
if title.is_some() {
let t = title.unwrap().to_owned();
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")
// TODO: 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);
}));
}
if let Some(t) = title {
title_label.set_text(t);
let listbox = episodes_listbox(db, t);
view.add(&listbox);
}
title_label.set_text(pd.title());
let listbox = episodes_listbox(db, pd.title());
view.add(&listbox);
if let Some(d) = description {
desc_label.set_text(d);
}
desc_label.set_text(pd.description());
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);
}
// TODO: refactor
if let Some(t) = title {
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);
}));
}
played_button.connect_clicked(clone!(db, stack, pd => move |_| {
on_played_button_clicked(&db, &stack, &pd);
}));
if let Some(t) = title {
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()
}
}
}
show_played_button(db, 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);
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 {
let build_src = include_str!("../../gtk/podcasts_child.ui");
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
}
pub fn on_flowbox_child_activate(
db: &Database,
stack: &gtk::Stack,
parent: &Podcast,
pixbuf: Option<Pixbuf>,
) {
pub fn on_flowbox_child_activate(db: &Database, stack: &gtk::Stack, parent: &Podcast) {
let old = stack.get_child_by_name("pdw").unwrap();
let pdw = podcast_widget(
db,
stack,
Some(parent.title()),
Some(parent.description()),
pixbuf,
);
let pdw = podcast_widget(db, stack, parent);
stack.remove(&old);
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) {
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();
stack.remove(&old);
stack.add_named(&pdw, "pdw");
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)
}