per carousel semaphore
This commit is contained in:
parent
abfd5ab568
commit
720b73f2a8
1 changed files with 13 additions and 5 deletions
|
@ -2,7 +2,8 @@ use crate::model;
|
||||||
use adw::gdk;
|
use adw::gdk;
|
||||||
use adw::{prelude::*, subclass::prelude::*};
|
use adw::{prelude::*, subclass::prelude::*};
|
||||||
use glib::subclass::InitializingObject;
|
use glib::subclass::InitializingObject;
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, OnceCell, RefCell};
|
||||||
|
use std::rc::Rc;
|
||||||
use tokio::sync::Semaphore;
|
use tokio::sync::Semaphore;
|
||||||
use tracing::{event, Level};
|
use tracing::{event, Level};
|
||||||
|
|
||||||
|
@ -20,6 +21,8 @@ mod imp {
|
||||||
cover_art: RefCell<Option<gdk::Paintable>>,
|
cover_art: RefCell<Option<gdk::Paintable>>,
|
||||||
|
|
||||||
pub cover_art_loading: Cell<Option<glib::JoinHandle<()>>>,
|
pub cover_art_loading: Cell<Option<glib::JoinHandle<()>>>,
|
||||||
|
|
||||||
|
pub semaphore: OnceCell<Rc<Semaphore>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
@ -45,9 +48,6 @@ mod imp {
|
||||||
impl BinImpl for Album {}
|
impl BinImpl for Album {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// only fetch 10 thumbnails at a time
|
|
||||||
static SEM: Semaphore = Semaphore::const_new(10);
|
|
||||||
|
|
||||||
glib::wrapper! {
|
glib::wrapper! {
|
||||||
pub struct Album(ObjectSubclass<imp::Album>)
|
pub struct Album(ObjectSubclass<imp::Album>)
|
||||||
@extends adw::Bin, gtk::Widget,
|
@extends adw::Bin, gtk::Widget,
|
||||||
|
@ -55,6 +55,13 @@ glib::wrapper! {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Album {
|
impl Album {
|
||||||
|
fn semaphore(&self) -> &Rc<Semaphore> {
|
||||||
|
// only load 5 at a time
|
||||||
|
self.imp()
|
||||||
|
.semaphore
|
||||||
|
.get_or_init(|| Rc::new(Semaphore::new(5)))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn bind(&self, client: &crate::wrappers::Client, album: &model::Album) {
|
pub fn bind(&self, client: &crate::wrappers::Client, album: &model::Album) {
|
||||||
self.set_item(Some(album));
|
self.set_item(Some(album));
|
||||||
|
|
||||||
|
@ -62,8 +69,9 @@ impl Album {
|
||||||
let id = album.id();
|
let id = album.id();
|
||||||
let this = self.downgrade();
|
let this = self.downgrade();
|
||||||
let scale_factor = self.scale_factor() as u32;
|
let scale_factor = self.scale_factor() as u32;
|
||||||
|
let sem = Rc::clone(self.semaphore());
|
||||||
let handle = glib::spawn_future_local(async move {
|
let handle = glib::spawn_future_local(async move {
|
||||||
let _permit = SEM.acquire().await.unwrap();
|
let _permit = sem.acquire().await.unwrap();
|
||||||
|
|
||||||
// see pixel-size in album_carousel_album.blp
|
// see pixel-size in album_carousel_album.blp
|
||||||
let pixbuf = match client.cover_art(&id, Some(160 * scale_factor)).await {
|
let pixbuf = match client.cover_art(&id, Some(160 * scale_factor)).await {
|
||||||
|
|
Loading…
Reference in a new issue