Skip to content

Commit 1ffbb07

Browse files
Pass preferences as struct instead of serialized to string
1 parent 4cd5625 commit 1ffbb07

File tree

14 files changed

+60
-39
lines changed

14 files changed

+60
-39
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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,12 @@ impl WinitApp {
214214
self.dispatch_desktop_wrapper_message(message);
215215
}
216216
}
217-
DesktopFrontendMessage::PersistenceWritePreferences { content } => {
218-
self.persistent_data.write_preferences(content);
217+
DesktopFrontendMessage::PersistenceWritePreferences { preferences } => {
218+
self.persistent_data.write_preferences(preferences);
219219
}
220220
DesktopFrontendMessage::PersistenceLoadPreferences => {
221-
if let Some(content) = self.persistent_data.load_preferences() {
222-
let message = DesktopWrapperMessage::LoadPreferences { content };
221+
if let Some(preferences) = self.persistent_data.load_preferences() {
222+
let message = DesktopWrapperMessage::LoadPreferences { preferences };
223223
self.dispatch_desktop_wrapper_message(message);
224224
}
225225
}

desktop/src/consts.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
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";
45
pub(crate) static APP_STATE_FILE_NAME: &str = "state.ron";
6+
pub(crate) static APP_PREFERENCES_FILE_NAME: &str = "preferences.ron";
57
pub(crate) static APP_DOCUMENTS_DIRECTORY_NAME: &str = "documents";
68

79
// CEF configuration constants

desktop/src/persist.rs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +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<String>,
9+
preferences: Option<Preferences>,
1010
}
1111

1212
impl PersistentData {
@@ -73,30 +73,37 @@ impl PersistentData {
7373
self.flush();
7474
}
7575

76-
pub(crate) fn write_preferences(&mut self, content: String) {
77-
self.preferences = Some(content);
78-
self.flush();
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+
});
7984
}
8085

81-
pub(crate) fn load_preferences(&self) -> Option<String> {
82-
self.preferences.clone()
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)
8390
}
8491

8592
fn flush(&self) {
86-
let data = match ron::to_string(self) {
93+
let data = match ron::ser::to_string_pretty(self, Default::default()) {
8794
Ok(d) => d,
8895
Err(e) => {
8996
tracing::error!("Failed to serialize persistent data: {e}");
9097
return;
9198
}
9299
};
93-
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) {
94101
tracing::error!("Failed to write persistent data to disk: {e}");
95102
}
96103
}
97104

98105
pub(crate) fn load_from_disk(&mut self) {
99-
let path = Self::persistence_file_path();
106+
let path = Self::state_file_path();
100107
let data = match std::fs::read_to_string(&path) {
101108
Ok(d) => d,
102109
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
@@ -118,11 +125,17 @@ impl PersistentData {
118125
*self = loaded;
119126
}
120127

121-
fn persistence_file_path() -> std::path::PathBuf {
128+
fn state_file_path() -> std::path::PathBuf {
122129
let mut path = crate::dirs::graphite_data_dir();
123130
path.push(crate::consts::APP_STATE_FILE_NAME);
124131
path
125132
}
133+
134+
fn preferences_file_path() -> std::path::PathBuf {
135+
let mut path = crate::dirs::graphite_data_dir();
136+
path.push(crate::consts::APP_PREFERENCES_FILE_NAME);
137+
path
138+
}
126139
}
127140

128141
#[derive(Default, serde::Serialize, serde::Deserialize)]

desktop/wrapper/src/handle_desktop_wrapper_message.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ 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 { content } => {
144-
let message = PreferencesMessage::Load { preferences: content };
143+
DesktopWrapperMessage::LoadPreferences { preferences } => {
144+
let message = PreferencesMessage::Load { preferences };
145145
dispatcher.queue_editor_message(message.into());
146146
}
147147
}

desktop/wrapper/src/intercept_frontend_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ pub(super) fn intercept_frontend_message(dispatcher: &mut DesktopWrapperMessageD
108108
dispatcher.respond(DesktopFrontendMessage::PersistenceLoadRemainingDocuments);
109109
}
110110
FrontendMessage::TriggerSavePreferences { preferences } => {
111-
dispatcher.respond(DesktopFrontendMessage::PersistenceWritePreferences { content: preferences });
111+
dispatcher.respond(DesktopFrontendMessage::PersistenceWritePreferences { preferences });
112112
}
113113
FrontendMessage::TriggerLoadPreferences => {
114114
dispatcher.respond(DesktopFrontendMessage::PersistenceLoadPreferences);

desktop/wrapper/src/messages.rs

Lines changed: 7 additions & 4 deletions
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 {
@@ -49,7 +52,7 @@ pub enum DesktopFrontendMessage {
4952
ids: Vec<DocumentId>,
5053
},
5154
PersistenceWritePreferences {
52-
content: String,
55+
preferences: Preferences,
5356
},
5457
PersistenceLoadPreferences,
5558
CloseWindow,
@@ -98,8 +101,8 @@ pub enum DesktopWrapperMessage {
98101
id: DocumentId,
99102
},
100103
LoadPreferences {
101-
content: String,
102-
}
104+
preferences: Preferences,
105+
},
103106
}
104107

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

editor/src/messages/frontend/frontend_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ pub enum FrontendMessage {
106106
TriggerOpenDocument,
107107
TriggerPaste,
108108
TriggerSavePreferences {
109-
preferences: String,
109+
preferences: PreferencesMessageHandler,
110110
},
111111
TriggerSaveActiveDocument {
112112
#[serde(rename = "documentId")]

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: 7 additions & 11 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);
@@ -95,9 +93,7 @@ impl MessageHandler<PreferencesMessage, ()> for PreferencesMessageHandler {
9593
}
9694
}
9795

98-
if let Ok(preferences) = serde_json::to_string(&self) {
99-
responses.add(FrontendMessage::TriggerSavePreferences { preferences });
100-
}
96+
responses.add(FrontendMessage::TriggerSavePreferences { preferences: self.clone() });
10197
}
10298

10399
advertise_actions!(PreferencesMessageDiscriminant;

0 commit comments

Comments
 (0)