Skip to content

Commit 50be135

Browse files
Desktop: Move preferences persistence to native (#3138)
* Move preference persistence to native * Pass preferences as struct instead of serialized to string
1 parent 4261b7d commit 50be135

File tree

12 files changed

+80
-20
lines changed

12 files changed

+80
-20
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

desktop/src/app.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,15 @@ impl WinitApp {
214214
self.dispatch_desktop_wrapper_message(message);
215215
}
216216
}
217+
DesktopFrontendMessage::PersistenceWritePreferences { preferences } => {
218+
self.persistent_data.write_preferences(preferences);
219+
}
220+
DesktopFrontendMessage::PersistenceLoadPreferences => {
221+
if let Some(preferences) = self.persistent_data.load_preferences() {
222+
let message = DesktopWrapperMessage::LoadPreferences { preferences };
223+
self.dispatch_desktop_wrapper_message(message);
224+
}
225+
}
217226
}
218227
}
219228

desktop/src/consts.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
pub(crate) static APP_NAME: &str = "Graphite";
22
pub(crate) static APP_ID: &str = "rs.graphite.GraphiteEditor";
3+
34
pub(crate) static APP_DIRECTORY_NAME: &str = "graphite-editor";
4-
pub(crate) static APP_AUTOSAVE_DIRECTORY_NAME: &str = "documents";
5+
pub(crate) static APP_STATE_FILE_NAME: &str = "state.ron";
6+
pub(crate) static APP_PREFERENCES_FILE_NAME: &str = "preferences.ron";
7+
pub(crate) static APP_DOCUMENTS_DIRECTORY_NAME: &str = "documents";
58

69
// CEF configuration constants
710
pub(crate) const CEF_WINDOWLESS_FRAME_RATE: i32 = 60;

desktop/src/dirs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::fs::create_dir_all;
22
use std::path::PathBuf;
33

4-
use crate::consts::{APP_AUTOSAVE_DIRECTORY_NAME, APP_DIRECTORY_NAME};
4+
use crate::consts::{APP_DIRECTORY_NAME, APP_DOCUMENTS_DIRECTORY_NAME};
55

66
pub(crate) fn ensure_dir_exists(path: &PathBuf) {
77
if !path.exists() {
@@ -16,7 +16,7 @@ pub(crate) fn graphite_data_dir() -> PathBuf {
1616
}
1717

1818
pub(crate) fn graphite_autosave_documents_dir() -> PathBuf {
19-
let path = graphite_data_dir().join(APP_AUTOSAVE_DIRECTORY_NAME);
19+
let path = graphite_data_dir().join(APP_DOCUMENTS_DIRECTORY_NAME);
2020
ensure_dir_exists(&path);
2121
path
2222
}

desktop/src/persist.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use graphite_desktop_wrapper::messages::{Document, DocumentId};
1+
use graphite_desktop_wrapper::messages::{Document, DocumentId, Preferences};
22

33
#[derive(Default, serde::Serialize, serde::Deserialize)]
44
pub(crate) struct PersistentData {
55
documents: DocumentStore,
66
current_document: Option<DocumentId>,
77
#[serde(skip)]
88
document_order: Option<Vec<DocumentId>>,
9+
preferences: Option<Preferences>,
910
}
1011

1112
impl PersistentData {
@@ -72,21 +73,37 @@ impl PersistentData {
7273
self.flush();
7374
}
7475

76+
pub(crate) fn write_preferences(&mut self, preferences: Preferences) {
77+
let Ok(preferences) = ron::ser::to_string_pretty(&preferences, Default::default()) else {
78+
tracing::error!("Failed to serialize preferences");
79+
return;
80+
};
81+
std::fs::write(Self::preferences_file_path(), &preferences).unwrap_or_else(|e| {
82+
tracing::error!("Failed to write preferences to disk: {e}");
83+
});
84+
}
85+
86+
pub(crate) fn load_preferences(&self) -> Option<Preferences> {
87+
let data = std::fs::read_to_string(Self::preferences_file_path()).ok()?;
88+
let preferences = ron::from_str(&data).ok()?;
89+
Some(preferences)
90+
}
91+
7592
fn flush(&self) {
76-
let data = match ron::to_string(self) {
93+
let data = match ron::ser::to_string_pretty(self, Default::default()) {
7794
Ok(d) => d,
7895
Err(e) => {
7996
tracing::error!("Failed to serialize persistent data: {e}");
8097
return;
8198
}
8299
};
83-
if let Err(e) = std::fs::write(Self::persistence_file_path(), data) {
100+
if let Err(e) = std::fs::write(Self::state_file_path(), data) {
84101
tracing::error!("Failed to write persistent data to disk: {e}");
85102
}
86103
}
87104

88105
pub(crate) fn load_from_disk(&mut self) {
89-
let path = Self::persistence_file_path();
106+
let path = Self::state_file_path();
90107
let data = match std::fs::read_to_string(&path) {
91108
Ok(d) => d,
92109
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
@@ -108,9 +125,15 @@ impl PersistentData {
108125
*self = loaded;
109126
}
110127

111-
fn persistence_file_path() -> std::path::PathBuf {
128+
fn state_file_path() -> std::path::PathBuf {
129+
let mut path = crate::dirs::graphite_data_dir();
130+
path.push(crate::consts::APP_STATE_FILE_NAME);
131+
path
132+
}
133+
134+
fn preferences_file_path() -> std::path::PathBuf {
112135
let mut path = crate::dirs::graphite_data_dir();
113-
path.push(format!("{}.ron", crate::consts::APP_AUTOSAVE_DIRECTORY_NAME));
136+
path.push(crate::consts::APP_PREFERENCES_FILE_NAME);
114137
path
115138
}
116139
}

desktop/wrapper/src/handle_desktop_wrapper_message.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use graphene_std::Color;
22
use graphene_std::raster::Image;
33
use graphite_editor::messages::app_window::app_window_message_handler::AppWindowPlatform;
4-
use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, PortfolioMessage};
4+
use graphite_editor::messages::prelude::{AppWindowMessage, DocumentMessage, PortfolioMessage, PreferencesMessage};
55

66
use crate::messages::Platform;
77

@@ -140,5 +140,9 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess
140140
let message = PortfolioMessage::SelectDocument { document_id: id };
141141
dispatcher.queue_editor_message(message.into());
142142
}
143+
DesktopWrapperMessage::LoadPreferences { preferences } => {
144+
let message = PreferencesMessage::Load { preferences };
145+
dispatcher.queue_editor_message(message.into());
146+
}
143147
}
144148
}

desktop/wrapper/src/intercept_frontend_message.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
107107
FrontendMessage::TriggerLoadRestAutoSaveDocuments => {
108108
dispatcher.respond(DesktopFrontendMessage::PersistenceLoadRemainingDocuments);
109109
}
110+
FrontendMessage::TriggerSavePreferences { preferences } => {
111+
dispatcher.respond(DesktopFrontendMessage::PersistenceWritePreferences { preferences });
112+
}
113+
FrontendMessage::TriggerLoadPreferences => {
114+
dispatcher.respond(DesktopFrontendMessage::PersistenceLoadPreferences);
115+
}
110116
m => return Some(m),
111117
}
112118
None

desktop/wrapper/src/messages.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
pub use graphite_editor::messages::prelude::DocumentId;
22
use graphite_editor::messages::prelude::FrontendMessage;
3-
pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage;
43
use std::path::PathBuf;
54

5+
pub(crate) use graphite_editor::messages::prelude::Message as EditorMessage;
6+
7+
pub use graphite_editor::messages::prelude::PreferencesMessageHandler as Preferences;
8+
69
pub enum DesktopFrontendMessage {
710
ToWeb(Vec<FrontendMessage>),
811
OpenFileDialog {
@@ -48,6 +51,10 @@ pub enum DesktopFrontendMessage {
4851
PersistenceUpdateDocumentsList {
4952
ids: Vec<DocumentId>,
5053
},
54+
PersistenceWritePreferences {
55+
preferences: Preferences,
56+
},
57+
PersistenceLoadPreferences,
5158
CloseWindow,
5259
}
5360

@@ -93,6 +100,9 @@ pub enum DesktopWrapperMessage {
93100
SelectDocument {
94101
id: DocumentId,
95102
},
103+
LoadPreferences {
104+
preferences: Preferences,
105+
},
96106
}
97107

98108
#[derive(Clone, serde::Serialize, serde::Deserialize, Debug)]

editor/src/messages/preferences/preferences_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::messages::prelude::*;
66
#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
77
pub enum PreferencesMessage {
88
// Management messages
9-
Load { preferences: String },
9+
Load { preferences: PreferencesMessageHandler },
1010
ResetToDefaults,
1111

1212
// Per-preference messages

editor/src/messages/preferences/preferences_message_handler.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,13 @@ impl MessageHandler<PreferencesMessage, ()> for PreferencesMessageHandler {
5050
match message {
5151
// Management messages
5252
PreferencesMessage::Load { preferences } => {
53-
if let Ok(deserialized_preferences) = serde_json::from_str::<PreferencesMessageHandler>(&preferences) {
54-
*self = deserialized_preferences;
53+
*self = preferences;
5554

56-
responses.add(PortfolioMessage::EditorPreferences);
57-
responses.add(PortfolioMessage::UpdateVelloPreference);
58-
responses.add(PreferencesMessage::ModifyLayout {
59-
zoom_with_scroll: self.zoom_with_scroll,
60-
});
61-
}
55+
responses.add(PortfolioMessage::EditorPreferences);
56+
responses.add(PortfolioMessage::UpdateVelloPreference);
57+
responses.add(PreferencesMessage::ModifyLayout {
58+
zoom_with_scroll: self.zoom_with_scroll,
59+
});
6260
}
6361
PreferencesMessage::ResetToDefaults => {
6462
refresh_dialog(responses);

0 commit comments

Comments
 (0)