Make Arc<EguiState> persistable
This commit is contained in:
parent
b9c1a4e5e1
commit
b6720383a3
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -2423,6 +2423,7 @@ dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"nih_plug",
|
"nih_plug",
|
||||||
"parking_lot 0.12.1",
|
"parking_lot 0.12.1",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -21,3 +21,5 @@ egui = "0.17"
|
||||||
egui-baseview = { git = "https://github.com/robbert-vdh/egui-baseview.git", branch = "fix/update-dependencies" }
|
egui-baseview = { git = "https://github.com/robbert-vdh/egui-baseview.git", branch = "fix/update-dependencies" }
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
|
# To make the state persistable
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
|
|
@ -10,8 +10,10 @@ use baseview::{Size, WindowHandle, WindowOpenOptions, WindowScalePolicy};
|
||||||
use crossbeam::atomic::AtomicCell;
|
use crossbeam::atomic::AtomicCell;
|
||||||
use egui::Context;
|
use egui::Context;
|
||||||
use egui_baseview::EguiWindow;
|
use egui_baseview::EguiWindow;
|
||||||
|
use nih_plug::param::internals::PersistentField;
|
||||||
use nih_plug::prelude::{Editor, GuiContext, ParamSetter, ParentWindowHandle};
|
use nih_plug::prelude::{Editor, GuiContext, ParamSetter, ParentWindowHandle};
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
@ -57,13 +59,30 @@ where
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Once we add resizing, we may want to be able to remember the GUI size. In that case we need
|
/// State for an `nih_plug_egui` editor.
|
||||||
// to make this serializable (only restoring the size of course) so it can be persisted.
|
#[derive(Serialize, Deserialize)]
|
||||||
pub struct EguiState {
|
pub struct EguiState {
|
||||||
|
/// The window's size in logical pixels before applying `scale_factor`.
|
||||||
|
#[serde(with = "nih_plug::param::internals::serialize_atomic_cell")]
|
||||||
size: AtomicCell<(u32, u32)>,
|
size: AtomicCell<(u32, u32)>,
|
||||||
|
/// Whether the editor's window is currently open.
|
||||||
|
#[serde(skip)]
|
||||||
open: AtomicBool,
|
open: AtomicBool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> PersistentField<'a, EguiState> for Arc<EguiState> {
|
||||||
|
fn set(&self, new_value: EguiState) {
|
||||||
|
self.size.store(new_value.size.load());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn map<F, R>(&self, f: F) -> R
|
||||||
|
where
|
||||||
|
F: Fn(&EguiState) -> R,
|
||||||
|
{
|
||||||
|
f(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl EguiState {
|
impl EguiState {
|
||||||
/// Initialize the GUI's state. This value can be passed to [`create_egui_editor()`]. The window
|
/// Initialize the GUI's state. This value can be passed to [`create_egui_editor()`]. The window
|
||||||
/// size is in logical pixels, so before it is multiplied by the DPI scaling factor.
|
/// size is in logical pixels, so before it is multiplied by the DPI scaling factor.
|
||||||
|
|
Loading…
Reference in a new issue