Skip to content

Commit 7ff64cf

Browse files
timon-schellingKeavon
authored andcommitted
Reimplement quirky behavior of the web frontend
1 parent 7373b8e commit 7ff64cf

File tree

4 files changed

+42
-16
lines changed

4 files changed

+42
-16
lines changed

desktop/src/app.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,23 +177,29 @@ impl WinitApp {
177177
self.persistent_data.set_current_document(id);
178178
}
179179
DesktopFrontendMessage::PersistenceUpdateDocumentsList { ids } => {
180-
self.persistent_data.force_document_order(ids);
180+
self.persistent_data.set_document_order(ids);
181181
}
182182
DesktopFrontendMessage::PersistenceLoadCurrentDocument => {
183183
if let Some((id, document)) = self.persistent_data.get_current_document() {
184184
let message = DesktopWrapperMessage::LoadDocument { id, document, to_front: false };
185185
self.dispatch_desktop_wrapper_message(message);
186+
let message = DesktopWrapperMessage::SelectDocument { id };
187+
self.dispatch_desktop_wrapper_message(message);
186188
}
187189
}
188190
DesktopFrontendMessage::PersistenceLoadRemainingDocuments => {
189-
for (id, document) in self.persistent_data.get_documents_before_current() {
191+
for (id, document) in self.persistent_data.get_documents_before_current().into_iter().rev() {
190192
let message = DesktopWrapperMessage::LoadDocument { id, document, to_front: true };
191193
self.dispatch_desktop_wrapper_message(message);
192194
}
193195
for (id, document) in self.persistent_data.get_documents_after_current() {
194196
let message = DesktopWrapperMessage::LoadDocument { id, document, to_front: false };
195197
self.dispatch_desktop_wrapper_message(message);
196198
}
199+
if let Some(id) = self.persistent_data.get_current_document_id() {
200+
let message = DesktopWrapperMessage::SelectDocument { id };
201+
self.dispatch_desktop_wrapper_message(message);
202+
}
197203
}
198204
}
199205
}

desktop/src/persist.rs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ use graphite_desktop_wrapper::messages::{Document, DocumentId};
44
pub(crate) struct PersistentData {
55
documents: DocumentStore,
66
current_document: Option<DocumentId>,
7+
#[serde(skip)]
8+
document_order: Option<Vec<DocumentId>>,
79
}
810

911
impl PersistentData {
1012
pub(crate) fn write_document(&mut self, id: DocumentId, document: Document) {
1113
self.documents.write(id, document);
14+
if let Some(order) = &self.document_order {
15+
self.documents.force_order(order.clone());
16+
}
1217
self.flush();
1318
}
1419

@@ -20,13 +25,20 @@ impl PersistentData {
2025
self.flush();
2126
}
2227

28+
pub(crate) fn get_current_document_id(&self) -> Option<DocumentId> {
29+
match self.current_document {
30+
Some(id) => Some(id),
31+
None => Some(*self.documents.document_ids().first()?),
32+
}
33+
}
34+
2335
pub(crate) fn get_current_document(&self) -> Option<(DocumentId, Document)> {
24-
let current_id = self.current_document()?;
36+
let current_id = self.get_current_document_id()?;
2537
Some((current_id, self.documents.read(&current_id)?))
2638
}
2739

2840
pub(crate) fn get_documents_before_current(&self) -> Vec<(DocumentId, Document)> {
29-
let Some(current_id) = self.current_document() else {
41+
let Some(current_id) = self.get_current_document_id() else {
3042
return Vec::new();
3143
};
3244
self.documents
@@ -38,7 +50,7 @@ impl PersistentData {
3850
}
3951

4052
pub(crate) fn get_documents_after_current(&self) -> Vec<(DocumentId, Document)> {
41-
let Some(current_id) = self.current_document() else {
53+
let Some(current_id) = self.get_current_document_id() else {
4254
return Vec::new();
4355
};
4456
self.documents
@@ -55,18 +67,11 @@ impl PersistentData {
5567
self.flush();
5668
}
5769

58-
pub(crate) fn force_document_order(&mut self, order: Vec<DocumentId>) {
59-
self.documents.force_order(order);
70+
pub(crate) fn set_document_order(&mut self, order: Vec<DocumentId>) {
71+
self.document_order = Some(order);
6072
self.flush();
6173
}
6274

63-
fn current_document(&self) -> Option<DocumentId> {
64-
match self.current_document {
65-
Some(id) => Some(id),
66-
None => Some(*self.documents.document_ids().first()?),
67-
}
68-
}
69-
7075
fn flush(&self) {
7176
let data = match ron::to_string(self) {
7277
Ok(d) => d,
@@ -143,8 +148,18 @@ impl DocumentStore {
143148
})
144149
}
145150

146-
fn force_order(&mut self, order: Vec<DocumentId>) {
147-
self.0.sort_by_key(|meta| order.iter().position(|id| *id == meta.id).unwrap_or(usize::MAX));
151+
fn force_order(&mut self, desired_order: Vec<DocumentId>) {
152+
let mut ordered_prefix_len = 0;
153+
for id in desired_order {
154+
if let Some(offset) = self.0[ordered_prefix_len..].iter().position(|meta| meta.id == id) {
155+
let found_index = ordered_prefix_len + offset;
156+
if found_index != ordered_prefix_len {
157+
self.0[ordered_prefix_len..=found_index].rotate_right(1);
158+
}
159+
ordered_prefix_len += 1;
160+
}
161+
}
162+
self.0.truncate(ordered_prefix_len);
148163
}
149164

150165
fn document_ids(&self) -> Vec<DocumentId> {

desktop/wrapper/src/handle_desktop_wrapper_message.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,9 @@ pub(super) fn handle_desktop_wrapper_message(dispatcher: &mut DesktopWrapperMess
130130
};
131131
dispatcher.queue_editor_message(message.into());
132132
}
133+
DesktopWrapperMessage::SelectDocument { id } => {
134+
let message = PortfolioMessage::SelectDocument { document_id: id };
135+
dispatcher.queue_editor_message(message.into());
136+
}
133137
}
134138
}

desktop/wrapper/src/messages.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub enum DesktopWrapperMessage {
6565
PollNodeGraphEvaluation,
6666
UpdatePlatform(Platform),
6767
LoadDocument { id: DocumentId, document: Document, to_front: bool },
68+
SelectDocument { id: DocumentId },
6869
}
6970

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

0 commit comments

Comments
 (0)