ShowsView: Do not block while loading ShowChilds.
This commit is contained in:
parent
5336981154
commit
3b5831f317
@ -377,6 +377,34 @@ pub fn is_episodes_populated() -> Result<bool, DataError> {
|
|||||||
.map_err(From::from)
|
.map_err(From::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check `episode` table empty
|
||||||
|
///
|
||||||
|
// FIXME: Return true if `episode` table is populated.
|
||||||
|
pub fn is_podcasts_populated() -> Result<bool, DataError> {
|
||||||
|
use schema::podcast::dsl::*;
|
||||||
|
|
||||||
|
let db = connection();
|
||||||
|
let con = db.get()?;
|
||||||
|
|
||||||
|
// FIXME
|
||||||
|
// select(exists(select(podcast)))
|
||||||
|
// .get_result(&con)
|
||||||
|
// .map_err(From::from)
|
||||||
|
|
||||||
|
podcast
|
||||||
|
.count()
|
||||||
|
.get_result(&con)
|
||||||
|
// FIXME: fix the diesel querry
|
||||||
|
.map(|b: i64| {
|
||||||
|
if b == 0 {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.map_err(From::from)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<(), DataError> {
|
pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<(), DataError> {
|
||||||
use schema::episode::dsl::*;
|
use schema::episode::dsl::*;
|
||||||
let db = connection();
|
let db = connection();
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.21.0
|
<!-- Generated with glade 3.22.0
|
||||||
|
|
||||||
Copyright (C) 2017 - 2018
|
Copyright (C) 2017 - 2018
|
||||||
|
|
||||||
@ -39,26 +39,17 @@ Tobias Bernard
|
|||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkOverlay">
|
<object class="GtkImage" id="pd_cover">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<property name="halign">center</property>
|
||||||
<placeholder/>
|
<property name="valign">center</property>
|
||||||
</child>
|
<property name="pixel_size">256</property>
|
||||||
<child type="overlay">
|
<property name="icon_name">image-x-generic-symbolic</property>
|
||||||
<object class="GtkImage" id="pd_cover">
|
<property name="icon_size">0</property>
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">center</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="pixel_size">256</property>
|
|
||||||
<property name="icon_name">image-x-generic-symbolic</property>
|
|
||||||
<property name="icon_size">0</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
|
|||||||
@ -126,7 +126,10 @@ impl App {
|
|||||||
|
|
||||||
utils::cleanup(cleanup_date);
|
utils::cleanup(cleanup_date);
|
||||||
|
|
||||||
gtk::idle_add(move || {
|
// The ui loads async, after initialization
|
||||||
|
// so we need to delay this a bit so it won't block
|
||||||
|
// requests that will come from loading the gui on startup.
|
||||||
|
gtk::timeout_add(1500, move || {
|
||||||
let s: Option<Vec<_>> = None;
|
let s: Option<Vec<_>> = None;
|
||||||
utils::refresh(s, sender.clone());
|
utils::refresh(s, sender.clone());
|
||||||
glib::Continue(false)
|
glib::Continue(false)
|
||||||
|
|||||||
@ -6,6 +6,7 @@ use failure::Error;
|
|||||||
use send_cell::SendCell;
|
use send_cell::SendCell;
|
||||||
|
|
||||||
use hammond_data::dbqueries;
|
use hammond_data::dbqueries;
|
||||||
|
use hammond_data::errors::DataError;
|
||||||
use hammond_data::Podcast;
|
use hammond_data::Podcast;
|
||||||
|
|
||||||
use views::{EmptyView, ShowsPopulated};
|
use views::{EmptyView, ShowsPopulated};
|
||||||
@ -43,12 +44,7 @@ impl ShowStack {
|
|||||||
show.stack.add_named(&pop.container, "podcasts");
|
show.stack.add_named(&pop.container, "podcasts");
|
||||||
show.stack.add_named(&widget.container, "widget");
|
show.stack.add_named(&widget.container, "widget");
|
||||||
show.stack.add_named(&empty.container, "empty");
|
show.stack.add_named(&empty.container, "empty");
|
||||||
|
set_stack_visible(&show.get_stack())?;
|
||||||
if pop.is_empty() {
|
|
||||||
show.stack.set_visible_child_name("empty")
|
|
||||||
} else {
|
|
||||||
show.stack.set_visible_child_name("podcasts")
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(show)
|
Ok(show)
|
||||||
}
|
}
|
||||||
@ -70,24 +66,16 @@ impl ShowStack {
|
|||||||
.map_err(|_| format_err!("Failed to downcast stack child to a Box."))?;
|
.map_err(|_| format_err!("Failed to downcast stack child to a Box."))?;
|
||||||
debug!("Name: {:?}", WidgetExt::get_name(&old));
|
debug!("Name: {:?}", WidgetExt::get_name(&old));
|
||||||
|
|
||||||
let scrolled_window = old.get_children()
|
|
||||||
.first()
|
|
||||||
.ok_or_else(|| format_err!("Box container has no childs."))?
|
|
||||||
.clone()
|
|
||||||
.downcast::<gtk::ScrolledWindow>()
|
|
||||||
.map_err(|_| format_err!("Failed to downcast stack child to a ScrolledWindow."))?;
|
|
||||||
debug!("Name: {:?}", WidgetExt::get_name(&scrolled_window));
|
|
||||||
|
|
||||||
let pop = ShowsPopulated::new(self.sender.clone())?;
|
let pop = ShowsPopulated::new(self.sender.clone())?;
|
||||||
// Copy the vertical scrollbar adjustment from the old view into the new one.
|
// Copy the vertical scrollbar adjustment from the old view into the new one.
|
||||||
scrolled_window
|
// scrolled_window
|
||||||
.get_vadjustment()
|
// .get_vadjustment()
|
||||||
.map(|x| pop.set_vadjustment(&x));
|
// .map(|x| pop.set_vadjustment(&x));
|
||||||
|
|
||||||
self.stack.remove(&old);
|
self.stack.remove(&old);
|
||||||
self.stack.add_named(&pop.container, "podcasts");
|
self.stack.add_named(&pop.container, "podcasts");
|
||||||
|
|
||||||
if pop.is_empty() {
|
if !dbqueries::is_podcasts_populated()? {
|
||||||
self.stack.set_visible_child_name("empty");
|
self.stack.set_visible_child_name("empty");
|
||||||
} else if vis != "empty" {
|
} else if vis != "empty" {
|
||||||
self.stack.set_visible_child_name(&vis);
|
self.stack.set_visible_child_name(&vis);
|
||||||
@ -215,6 +203,17 @@ impl ShowStack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn set_stack_visible(stack: >k::Stack) -> Result<(), DataError> {
|
||||||
|
if dbqueries::is_podcasts_populated()? {
|
||||||
|
stack.set_visible_child_name("podcasts")
|
||||||
|
} else {
|
||||||
|
stack.set_visible_child_name("empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
// ATTENTION: EXPECTS THE SHOW WIDGET CONTAINER
|
// ATTENTION: EXPECTS THE SHOW WIDGET CONTAINER
|
||||||
fn save_alignment(oldid: i32, widget: >k::Box) -> Result<(), Error> {
|
fn save_alignment(oldid: i32, widget: >k::Box) -> Result<(), Error> {
|
||||||
let scrolled_window = widget
|
let scrolled_window = widget
|
||||||
|
|||||||
@ -64,6 +64,7 @@ use chrono::Duration;
|
|||||||
/// let list = gtk::ListBox::new();
|
/// let list = gtk::ListBox::new();
|
||||||
/// lazy_load(widgets, list, |w| w, || {});
|
/// lazy_load(widgets, list, |w| w, || {});
|
||||||
/// ```
|
/// ```
|
||||||
|
#[inline]
|
||||||
pub fn lazy_load<T, C, F, W, U>(data: T, container: C, mut contructor: F, callback: U)
|
pub fn lazy_load<T, C, F, W, U>(data: T, container: C, mut contructor: F, callback: U)
|
||||||
where
|
where
|
||||||
T: IntoIterator + 'static,
|
T: IntoIterator + 'static,
|
||||||
@ -83,6 +84,7 @@ where
|
|||||||
/// This is a more flexible version of `lazy_load` with less constrains.
|
/// This is a more flexible version of `lazy_load` with less constrains.
|
||||||
/// If you just want to lazy add `widgets` to a `container` check if
|
/// If you just want to lazy add `widgets` to a `container` check if
|
||||||
/// `lazy_load` fits your needs first.
|
/// `lazy_load` fits your needs first.
|
||||||
|
#[inline]
|
||||||
pub fn lazy_load_full<T, F, U>(data: T, mut func: F, finish_callback: U)
|
pub fn lazy_load_full<T, F, U>(data: T, mut func: F, finish_callback: U)
|
||||||
where
|
where
|
||||||
T: IntoIterator + 'static,
|
T: IntoIterator + 'static,
|
||||||
|
|||||||
@ -6,7 +6,7 @@ use hammond_data::dbqueries;
|
|||||||
use hammond_data::Podcast;
|
use hammond_data::Podcast;
|
||||||
|
|
||||||
use app::Action;
|
use app::Action;
|
||||||
use utils::{get_ignored_shows, set_image_from_path};
|
use utils::{get_ignored_shows, lazy_load, set_image_from_path};
|
||||||
|
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -58,17 +58,14 @@ impl ShowsPopulated {
|
|||||||
let ignore = get_ignored_shows()?;
|
let ignore = get_ignored_shows()?;
|
||||||
let podcasts = dbqueries::get_podcasts_filter(&ignore)?;
|
let podcasts = dbqueries::get_podcasts_filter(&ignore)?;
|
||||||
|
|
||||||
podcasts.iter().for_each(|parent| {
|
let flowbox = self.flowbox.clone();
|
||||||
let flowbox_child = ShowsChild::new(parent);
|
let constructor = |parent| ShowsChild::new(&parent).child;
|
||||||
self.flowbox.add(&flowbox_child.child);
|
let callback = move || flowbox.show_all();
|
||||||
});
|
|
||||||
self.flowbox.show_all();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
let flowbox = self.flowbox.clone();
|
||||||
pub fn is_empty(&self) -> bool {
|
lazy_load(podcasts, flowbox, constructor, callback);
|
||||||
self.flowbox.get_children().is_empty()
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user