mirror of
https://github.com/emilk/egui.git
synced 2026-08-30 05:10:03 -04:00
eframe: Add NativeOptions::persistence_path (#4423)
This allows customizing the persistence path in NativeOptions. Previously, persistence wouldn't work with android because directories-next doesn't support android so eframe would just fail to find a place where it could store its config. * Closes #4098 (android users can now specify a path that works with android, by e.g. using app_dirs2, which supports android)
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
//! Common tools used by [`super::glow_integration`] and [`super::wgpu_integration`].
|
||||
|
||||
use web_time::Instant;
|
||||
|
||||
use std::path::PathBuf;
|
||||
use winit::event_loop::EventLoopWindowTarget;
|
||||
|
||||
use raw_window_handle::{HasDisplayHandle as _, HasWindowHandle as _};
|
||||
@@ -132,6 +134,16 @@ pub fn create_storage(_app_name: &str) -> Option<Box<dyn epi::Storage>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[allow(clippy::unnecessary_wraps)]
|
||||
pub fn create_storage_with_file(_file: impl Into<PathBuf>) -> Option<Box<dyn epi::Storage>> {
|
||||
#[cfg(feature = "persistence")]
|
||||
return Some(Box::new(
|
||||
super::file_storage::FileStorage::from_ron_filepath(_file),
|
||||
));
|
||||
#[cfg(not(feature = "persistence"))]
|
||||
None
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/// Everything needed to make a winit-based integration for [`epi`].
|
||||
|
||||
@@ -41,7 +41,7 @@ impl Drop for FileStorage {
|
||||
|
||||
impl FileStorage {
|
||||
/// Store the state in this .ron file.
|
||||
fn from_ron_filepath(ron_filepath: impl Into<PathBuf>) -> Self {
|
||||
pub(crate) fn from_ron_filepath(ron_filepath: impl Into<PathBuf>) -> Self {
|
||||
crate::profile_function!();
|
||||
let ron_filepath: PathBuf = ron_filepath.into();
|
||||
log::debug!("Loading app state from {:?}…", ron_filepath);
|
||||
|
||||
@@ -195,13 +195,17 @@ impl GlowWinitApp {
|
||||
) -> Result<&mut GlowWinitRunning> {
|
||||
crate::profile_function!();
|
||||
|
||||
let storage = epi_integration::create_storage(
|
||||
self.native_options
|
||||
.viewport
|
||||
.app_id
|
||||
.as_ref()
|
||||
.unwrap_or(&self.app_name),
|
||||
);
|
||||
let storage = if let Some(file) = &self.native_options.persistence_path {
|
||||
epi_integration::create_storage_with_file(file)
|
||||
} else {
|
||||
epi_integration::create_storage(
|
||||
self.native_options
|
||||
.viewport
|
||||
.app_id
|
||||
.as_ref()
|
||||
.unwrap_or(&self.app_name),
|
||||
)
|
||||
};
|
||||
|
||||
let egui_ctx = create_egui_context(storage.as_deref());
|
||||
|
||||
|
||||
@@ -406,13 +406,17 @@ impl WinitApp for WgpuWinitApp {
|
||||
self.recreate_window(event_loop, running);
|
||||
running
|
||||
} else {
|
||||
let storage = epi_integration::create_storage(
|
||||
self.native_options
|
||||
.viewport
|
||||
.app_id
|
||||
.as_ref()
|
||||
.unwrap_or(&self.app_name),
|
||||
);
|
||||
let storage = if let Some(file) = &self.native_options.persistence_path {
|
||||
epi_integration::create_storage_with_file(file)
|
||||
} else {
|
||||
epi_integration::create_storage(
|
||||
self.native_options
|
||||
.viewport
|
||||
.app_id
|
||||
.as_ref()
|
||||
.unwrap_or(&self.app_name),
|
||||
)
|
||||
};
|
||||
let egui_ctx = winit_integration::create_egui_context(storage.as_deref());
|
||||
let (window, builder) = create_window(
|
||||
&egui_ctx,
|
||||
|
||||
Reference in New Issue
Block a user