From 3e2f73fc56ed980cb20459cb5d6ea8a514b26221 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sat, 24 Apr 2021 18:38:23 +0200 Subject: [PATCH] backend: New library update mechanism --- backend/src/lib.rs | 9 +++++++++ backend/src/library.rs | 11 ++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/backend/src/lib.rs b/backend/src/lib.rs index eff03a9..499ab73 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -55,6 +55,12 @@ pub struct Backend { /// is guaranteed to be Some, when the state is set to BackendState::Ready. music_library_path: RefCell>, + /// The receiver to which library update notifications are sent. + library_updated_receiver: RefCell>, + + /// The sender for sending library update notifications. + library_updated_sender: RefCell>, + /// The database. This can be assumed to exist, when the state is set to BackendState::Ready. database: RefCell>>, @@ -71,12 +77,15 @@ impl Backend { /// and call init() afterwards. pub fn new() -> Self { let (state_sender, state_stream) = mpsc::channel(1024); + let (library_updated_sender, library_updated_receiver) = mpsc::channel(1024); Backend { state_stream: RefCell::new(state_stream), state_sender: RefCell::new(state_sender), settings: gio::Settings::new("de.johrpan.musicus"), music_library_path: RefCell::new(None), + library_updated_sender: RefCell::new(library_updated_sender), + library_updated_receiver: RefCell::new(library_updated_receiver), database: RefCell::new(None), player: RefCell::new(None), client: Client::new(), diff --git a/backend/src/library.rs b/backend/src/library.rs index 7348cb4..407ff82 100644 --- a/backend/src/library.rs +++ b/backend/src/library.rs @@ -1,7 +1,8 @@ use crate::{Backend, BackendState, Player, Result}; -use musicus_database::DbThread; +use futures::prelude::*; use gio::prelude::*; use log::warn; +use musicus_database::DbThread; use std::path::PathBuf; use std::rc::Rc; @@ -72,10 +73,14 @@ impl Backend { self.player.borrow().clone() } + /// Wait for the next library update. + pub async fn library_update(&self) { + self.library_updated_receiver.borrow_mut().next().await; + } + /// Notify the frontend that the library was changed. pub fn library_changed(&self) { - self.set_state(BackendState::Loading); - self.set_state(BackendState::Ready); + self.library_updated_sender.borrow_mut().try_send(()).unwrap(); } /// Get an interface to the player and panic if there is none.