mirror of
https://github.com/slint-ui/slint.git
synced 2025-10-01 06:11:16 +00:00

As discussed, don't use the persistent context approach for single shot timers but store the callback directly in the global object and "delete" it afterwards.
43 lines
1.5 KiB
Rust
43 lines
1.5 KiB
Rust
/* LICENSE BEGIN
|
|
This file is part of the SixtyFPS Project -- https://sixtyfps.io
|
|
Copyright (c) 2020 Olivier Goffart <olivier.goffart@sixtyfps.io>
|
|
Copyright (c) 2020 Simon Hausmann <simon.hausmann@sixtyfps.io>
|
|
|
|
SPDX-License-Identifier: GPL-3.0-only
|
|
This file is also available under commercial licensing terms.
|
|
Please contact info@sixtyfps.io for more information.
|
|
LICENSE END */
|
|
/*!
|
|
Since neon do not allow to have Persistant handle, use this hack.
|
|
*/
|
|
|
|
use neon::prelude::*;
|
|
pub struct PersistentContext<'a>(Handle<'a, JsArray>);
|
|
|
|
const KEY: &'static str = "$__persistent_context";
|
|
|
|
/// Since neon do not allow to have Persistant handle, this allocates property in an array.
|
|
/// And this array is gonna be kept as a property somewhere.
|
|
impl<'a> PersistentContext<'a> {
|
|
pub fn new(cx: &mut impl Context<'a>) -> Self {
|
|
PersistentContext(JsArray::new(cx, 0))
|
|
}
|
|
|
|
pub fn allocate(&self, cx: &mut impl Context<'a>, value: Handle<'a, JsValue>) -> u32 {
|
|
let idx = self.0.len();
|
|
self.0.set(cx, idx, value).unwrap();
|
|
idx
|
|
}
|
|
|
|
pub fn get(&self, cx: &mut impl Context<'a>, idx: u32) -> JsResult<'a, JsValue> {
|
|
self.0.get(cx, idx)
|
|
}
|
|
|
|
pub fn save_to_object(&self, cx: &mut impl Context<'a>, o: Handle<'a, JsObject>) {
|
|
o.set(cx, KEY, self.0).unwrap();
|
|
}
|
|
|
|
pub fn from_object(cx: &mut impl Context<'a>, o: Handle<'a, JsObject>) -> NeonResult<Self> {
|
|
Ok(PersistentContext(o.get(cx, KEY)?.downcast_or_throw(cx)?))
|
|
}
|
|
}
|