Async update refinements, Stack transition refinements.
This commit is contained in:
parent
2077215491
commit
28a10ac462
@ -37,11 +37,14 @@ pub fn get_headerbar(db: Arc<Mutex<SqliteConnection>>, stack: gtk::Stack) -> gtk
|
|||||||
let url = new_url.get_text().unwrap_or_default();
|
let url = new_url.get_text().unwrap_or_default();
|
||||||
// TODO: check if the feed is already present.
|
// TODO: check if the feed is already present.
|
||||||
let f = index_feed::insert_return_source(&tempdb, &url);
|
let f = index_feed::insert_return_source(&tempdb, &url);
|
||||||
|
|
||||||
drop(tempdb);
|
drop(tempdb);
|
||||||
info!("{:?} feed added", url);
|
info!("{:?} feed added", url);
|
||||||
|
|
||||||
|
let stack_clone = stack_clone.clone();
|
||||||
if let Ok(mut source) = f {
|
if let Ok(mut source) = f {
|
||||||
// update the db
|
// update the db
|
||||||
utils::refresh_feed(db_clone.clone(), &stack_clone, &mut source);
|
utils::refresh_feed(db_clone.clone(), stack_clone, &mut source);
|
||||||
} else {
|
} else {
|
||||||
error!("Expected Error, feed probably already exists.");
|
error!("Expected Error, feed probably already exists.");
|
||||||
error!("Error: {:?}", f.unwrap_err());
|
error!("Error: {:?}", f.unwrap_err());
|
||||||
|
|||||||
@ -55,9 +55,9 @@ fn build_ui(app: >k::Application) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Get the headerbar
|
// Get the headerbar
|
||||||
let header = headerbar::get_headerbar(db, stack);
|
let header = headerbar::get_headerbar(db.clone(), stack.clone());
|
||||||
// Uncomment this when etag implementation is fixed and refesh_db thread is non blocking.
|
// TODO: add delay, cause else theres lock contention for the db obj.
|
||||||
// utils::refresh_db(&db, &stack);
|
// utils::refresh_db(db.clone(), stack.clone());
|
||||||
window.set_titlebar(&header);
|
window.set_titlebar(&header);
|
||||||
|
|
||||||
window.show_all();
|
window.show_all();
|
||||||
|
|||||||
@ -18,20 +18,24 @@ use std::sync::mpsc::{channel, Receiver};
|
|||||||
|
|
||||||
use views::podcasts_view;
|
use views::podcasts_view;
|
||||||
|
|
||||||
|
// Create a thread local storage that will store the arguments to be transfered.
|
||||||
thread_local!(
|
thread_local!(
|
||||||
static GLOBAL: RefCell<Option<(Arc<Mutex<SqliteConnection>>,
|
static GLOBAL: RefCell<Option<(Arc<Mutex<SqliteConnection>>,
|
||||||
gtk::Stack,
|
gtk::Stack,
|
||||||
Receiver<bool>)>> = RefCell::new(None));
|
Receiver<bool>)>> = RefCell::new(None));
|
||||||
|
|
||||||
pub fn refresh_db(db: Arc<Mutex<SqliteConnection>>, stack: gtk::Stack) {
|
pub fn refresh_db(db: Arc<Mutex<SqliteConnection>>, stack: gtk::Stack) {
|
||||||
|
// Create a async channel.
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
|
|
||||||
let db_clone = db.clone();
|
let db_clone = db.clone();
|
||||||
|
// Pass the desired arguments into the Local Thread Storage.
|
||||||
GLOBAL.with(move |global| {
|
GLOBAL.with(move |global| {
|
||||||
*global.borrow_mut() = Some((db_clone, stack, receiver));
|
*global.borrow_mut() = Some((db_clone, stack, receiver));
|
||||||
});
|
});
|
||||||
|
|
||||||
// The implementation of how this is done is probably terrible but it works!.
|
// The implementation of how this is done is probably terrible but it works!.
|
||||||
|
// TODO: add timeout option and error reporting.
|
||||||
let db_clone = db.clone();
|
let db_clone = db.clone();
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let t = hammond_data::index_feed::index_loop(db_clone, false);
|
let t = hammond_data::index_feed::index_loop(db_clone, false);
|
||||||
@ -41,15 +45,23 @@ pub fn refresh_db(db: Arc<Mutex<SqliteConnection>>, stack: gtk::Stack) {
|
|||||||
};
|
};
|
||||||
sender.send(true).expect("Couldn't send data to channel");;
|
sender.send(true).expect("Couldn't send data to channel");;
|
||||||
|
|
||||||
glib::idle_add(receive);
|
// http://gtk-rs.org/docs/glib/source/fn.idle_add.html
|
||||||
|
glib::idle_add(refresh_podcasts_view);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn refresh_feed(db: Arc<Mutex<SqliteConnection>>, stack: >k::Stack, source: &mut Source) {
|
pub fn refresh_feed(db: Arc<Mutex<SqliteConnection>>, stack: gtk::Stack, source: &mut Source) {
|
||||||
|
let (sender, receiver) = channel();
|
||||||
|
|
||||||
|
let db_clone = db.clone();
|
||||||
|
GLOBAL.with(move |global| {
|
||||||
|
*global.borrow_mut() = Some((db_clone, stack, receiver));
|
||||||
|
});
|
||||||
|
|
||||||
let db_clone = db.clone();
|
let db_clone = db.clone();
|
||||||
let mut source_ = source.clone();
|
let mut source_ = source.clone();
|
||||||
// TODO: add timeout option and error reporting.
|
// TODO: add timeout option and error reporting.
|
||||||
let handle = thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let db_ = db_clone.clone();
|
let db_ = db_clone.clone();
|
||||||
let db_ = db_.lock().unwrap();
|
let db_ = db_.lock().unwrap();
|
||||||
let foo_ = hammond_data::index_feed::refresh_source(&db_, &mut source_, false);
|
let foo_ = hammond_data::index_feed::refresh_source(&db_, &mut source_, false);
|
||||||
@ -62,39 +74,17 @@ pub fn refresh_feed(db: Arc<Mutex<SqliteConnection>>, stack: >k::Stack, source
|
|||||||
error!("Error While trying to update the database.");
|
error!("Error While trying to update the database.");
|
||||||
error!("Error msg: {}", s.unwrap_err());
|
error!("Error msg: {}", s.unwrap_err());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sender.send(true).expect("Couldn't send data to channel");;
|
||||||
|
glib::idle_add(refresh_podcasts_view);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
// FIXME: atm freezing the ui till update is done.
|
|
||||||
// Make it instead emmit a signal on update completion.
|
|
||||||
// TODO: emit a signal in order to update the podcast widget.
|
|
||||||
let _ = handle.join();
|
|
||||||
podcasts_view::update_podcasts_view(db, stack);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.
|
fn refresh_podcasts_view() -> glib::Continue {
|
||||||
// com/needle-and-thread/vocal/blob/8b21f1c18c2be32921e84e289576a659ab3c8f2e/src/Utils/Utils.
|
|
||||||
// vala#L136
|
|
||||||
// TODO:
|
|
||||||
// pub fn html_to_markup(s: String) -> String {
|
|
||||||
// let markup = glib::uri_escape_string(s.as_str(), None, true);
|
|
||||||
|
|
||||||
// let markup = if let Some(m) = markup {
|
|
||||||
// m
|
|
||||||
// } else {
|
|
||||||
// warn!("unable to unescape markup: {}", s);
|
|
||||||
// s
|
|
||||||
// };
|
|
||||||
// // let markup = s;
|
|
||||||
|
|
||||||
|
|
||||||
// info!("{}", markup);
|
|
||||||
// markup
|
|
||||||
// }
|
|
||||||
|
|
||||||
fn receive() -> glib::Continue {
|
|
||||||
GLOBAL.with(|global| {
|
GLOBAL.with(|global| {
|
||||||
if let Some((ref db, ref stack, ref reciever)) = *global.borrow() {
|
if let Some((ref db, ref stack, ref reciever)) = *global.borrow() {
|
||||||
if let Ok(_) = reciever.try_recv() {
|
if reciever.try_recv().is_ok() {
|
||||||
podcasts_view::update_podcasts_view(db.clone(), stack);
|
podcasts_view::update_podcasts_view(db.clone(), stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
use gtk;
|
use gtk;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::StackTransitionType;
|
|
||||||
|
|
||||||
use diesel::prelude::SqliteConnection;
|
use diesel::prelude::SqliteConnection;
|
||||||
|
|
||||||
@ -107,7 +106,10 @@ pub fn update_podcasts_view(db: Arc<Mutex<SqliteConnection>>, stack: >k::Stack
|
|||||||
populate_podcasts_flowbox(db, stack, &flowbox);
|
populate_podcasts_flowbox(db, stack, &flowbox);
|
||||||
|
|
||||||
let old = stack.get_child_by_name("pd_grid").unwrap();
|
let old = stack.get_child_by_name("pd_grid").unwrap();
|
||||||
|
let vis = stack.get_visible_child_name().unwrap();
|
||||||
|
|
||||||
stack.remove(&old);
|
stack.remove(&old);
|
||||||
stack.add_named(&grid, "pd_grid");
|
stack.add_named(&grid, "pd_grid");
|
||||||
stack.set_visible_child_full("pd_grid", StackTransitionType::None);
|
// preserve the visible widget
|
||||||
|
stack.set_visible_child_name(&vis);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,9 +7,6 @@ use diesel::prelude::SqliteConnection;
|
|||||||
use hammond_data::dbqueries;
|
use hammond_data::dbqueries;
|
||||||
use hammond_data::models::Episode;
|
use hammond_data::models::Episode;
|
||||||
use hammond_downloader::downloader;
|
use hammond_downloader::downloader;
|
||||||
// use html5ever::parse_document;
|
|
||||||
// use html5ever::rcdom::RcDom;
|
|
||||||
// use tendril::stream::TendrilSink;
|
|
||||||
use dissolve::strip_html_tags;
|
use dissolve::strip_html_tags;
|
||||||
|
|
||||||
use std::thread;
|
use std::thread;
|
||||||
@ -20,8 +17,6 @@ use gtk;
|
|||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::ContainerExt;
|
use gtk::ContainerExt;
|
||||||
|
|
||||||
// use utils;
|
|
||||||
|
|
||||||
fn epidose_widget(
|
fn epidose_widget(
|
||||||
connection: Arc<Mutex<SqliteConnection>>,
|
connection: Arc<Mutex<SqliteConnection>>,
|
||||||
episode: &mut Episode,
|
episode: &mut Episode,
|
||||||
@ -47,8 +42,6 @@ fn epidose_widget(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if episode.description().is_some() {
|
if episode.description().is_some() {
|
||||||
// let mk = utils::html_to_markup(d.to_string());
|
|
||||||
// desc_label.set_markup(mk.as_str());
|
|
||||||
let d = episode.description().unwrap().to_owned();
|
let d = episode.description().unwrap().to_owned();
|
||||||
|
|
||||||
expander.connect_activate(move |_| {
|
expander.connect_activate(move |_| {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user