mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-30 13:51:13 +00:00

Since we do not have persistent handle, I need to find a place to save the callback, so i save them in a property of the component
34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
/*!
|
|
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)?))
|
|
}
|
|
}
|