Skip to content

Commit c0402a6

Browse files
committed
Remove cache_rev
Also does some minor changes to Document
1 parent 5b81d65 commit c0402a6

File tree

7 files changed

+83
-106
lines changed

7 files changed

+83
-106
lines changed

editor-core/src/buffer/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ impl InvalLines {
7676
new_count,
7777
}
7878
}
79+
80+
pub fn single(start_line: usize) -> Self {
81+
Self {
82+
start_line,
83+
inval_count: 1,
84+
new_count: 1,
85+
}
86+
}
7987
}
8088

8189
#[derive(Debug, Clone)]

examples/editor/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ fn app_view() -> impl View {
5252
stack((
5353
button(|| "Clear").on_click_stop(move |_| {
5454
doc.edit_single(
55+
None,
5556
Selection::region(0, doc.text().len()),
5657
"",
5758
EditType::DeleteSelection,

examples/syntax-editor/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ mod tests {
230230
stack((
231231
button(|| "Clear").on_click_stop(move |_| {
232232
doc.edit_single(
233+
None,
233234
Selection::region(0, doc.text().len()),
234235
"",
235236
EditType::DeleteSelection,

src/views/editor/mod.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use core::indent::IndentStyle;
1+
use core::{buffer::InvalLines, indent::IndentStyle};
22
use std::{cell::Cell, cmp::Ordering, collections::HashMap, rc::Rc, sync::Arc, time::Duration};
33

44
use crate::{
@@ -322,7 +322,7 @@ impl Editor {
322322
// Get rid of all the effects
323323
self.effects_cx.get().dispose();
324324

325-
self.lines.clear(0, None);
325+
self.lines.clear(None);
326326
self.doc.set(doc);
327327
if let Some(styling) = styling {
328328
self.style.set(styling);
@@ -342,7 +342,7 @@ impl Editor {
342342
// Get rid of all the effects
343343
self.effects_cx.get().dispose();
344344

345-
self.lines.clear(0, None);
345+
self.lines.clear(None);
346346

347347
self.style.set(styling);
348348

@@ -426,10 +426,10 @@ impl Editor {
426426
cursor,
427427
offset,
428428
}));
429-
430-
self.doc().cache_rev().update(|cache_rev| {
431-
*cache_rev += 1;
432-
});
429+
let line = self.rope_text().line_of_offset(offset);
430+
self.doc()
431+
.inval_lines_listener()
432+
.send(InvalLines::single(line));
433433
});
434434
}
435435

@@ -440,10 +440,17 @@ impl Editor {
440440
}
441441

442442
batch(|| {
443+
let offset = preedit
444+
.preedit
445+
.with_untracked(|p| p.as_ref().map(|p| p.offset));
443446
preedit.preedit.set(None);
444-
self.doc().cache_rev().update(|cache_rev| {
445-
*cache_rev += 1;
446-
});
447+
448+
if let Some(offset) = offset {
449+
let line = self.rope_text().line_of_offset(offset);
450+
self.doc()
451+
.inval_lines_listener()
452+
.send(InvalLines::single(line));
453+
}
447454
});
448455
}
449456

@@ -1036,15 +1043,12 @@ impl Editor {
10361043
}
10371044

10381045
pub fn text_layout_trigger(&self, line: usize, trigger: bool) -> Arc<TextLayoutLine> {
1039-
let cache_rev = self.doc().cache_rev().get_untracked();
10401046
self.lines
1041-
.get_init_text_layout(cache_rev, self.config_id(), self, line, trigger)
1047+
.get_init_text_layout(self.config_id(), self, line, trigger)
10421048
}
10431049

10441050
fn try_get_text_layout(&self, line: usize) -> Option<Arc<TextLayoutLine>> {
1045-
let cache_rev = self.doc().cache_rev().get_untracked();
1046-
self.lines
1047-
.try_get_text_layout(cache_rev, self.config_id(), line)
1051+
self.lines.try_get_text_layout(self.config_id(), line)
10481052
}
10491053

10501054
/// Create rendable whitespace layout by creating a new text layout
@@ -1380,9 +1384,6 @@ pub fn normal_compute_screen_lines(
13801384
let min_vline = VLine((y0 / line_height as f64).floor() as usize);
13811385
let max_vline = VLine((y1 / line_height as f64).ceil() as usize);
13821386

1383-
let cache_rev = editor.doc.get().cache_rev().get();
1384-
editor.lines.check_cache_rev(cache_rev);
1385-
13861387
let min_info = editor.iter_vlines(false, min_vline).next();
13871388

13881389
let mut rvlines = Vec::new();
@@ -1403,7 +1404,6 @@ pub fn normal_compute_screen_lines(
14031404
let iter = lines
14041405
.iter_rvlines_init(
14051406
editor.text_prov(),
1406-
cache_rev,
14071407
editor.config_id(),
14081408
min_info.rvline,
14091409
false,

src/views/editor/text.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ pub trait Document: DocumentPhantom + Downcast {
9797
RopeTextVal::new(self.text())
9898
}
9999

100-
fn cache_rev(&self) -> RwSignal<u64>;
101-
102100
// TODO(minor): visual line doesn't really need to know the old rope that `InvalLines` passes
103101
// around, should we just have a separate structure that doesn't have that field?
104102
fn inval_lines_listener(&self) -> Listener<InvalLines>;
@@ -179,7 +177,13 @@ pub trait Document: DocumentPhantom + Downcast {
179177
fn receive_char(&self, ed: &Editor, c: &str);
180178

181179
/// Perform a single edit.
182-
fn edit_single(&self, ed: &Editor, selection: Selection, content: &str, edit_type: EditType) {
180+
fn edit_single(
181+
&self,
182+
ed: Option<&Editor>,
183+
selection: Selection,
184+
content: &str,
185+
edit_type: EditType,
186+
) {
183187
let mut iter = std::iter::once((selection, content));
184188
self.edit(ed, &mut iter, edit_type);
185189
}
@@ -195,13 +199,13 @@ pub trait Document: DocumentPhantom + Downcast {
195199
/// editor,
196200
/// button(|| "Append 'Hello'").on_click_stop(move |_| {
197201
/// let text = doc.text();
198-
/// doc.edit_single(Selection::caret(text.len()), "Hello", EditType::InsertChars);
202+
/// doc.edit_single(None, Selection::caret(text.len()), "Hello", EditType::InsertChars);
199203
/// })
200204
/// ))
201205
/// ```
202206
fn edit(
203207
&self,
204-
ed: &Editor,
208+
ed: Option<&Editor>,
205209
iter: &mut dyn Iterator<Item = (Selection, &str)>,
206210
edit_type: EditType,
207211
);
@@ -466,10 +470,6 @@ where
466470
self.doc.rope_text()
467471
}
468472

469-
fn cache_rev(&self) -> RwSignal<u64> {
470-
self.doc.cache_rev()
471-
}
472-
473473
fn inval_lines_listener(&self) -> Listener<InvalLines> {
474474
self.doc.inval_lines_listener()
475475
}
@@ -516,13 +516,19 @@ where
516516
self.doc.receive_char(ed, c)
517517
}
518518

519-
fn edit_single(&self, ed: &Editor, selection: Selection, content: &str, edit_type: EditType) {
519+
fn edit_single(
520+
&self,
521+
ed: Option<&Editor>,
522+
selection: Selection,
523+
content: &str,
524+
edit_type: EditType,
525+
) {
520526
self.doc.edit_single(ed, selection, content, edit_type)
521527
}
522528

523529
fn edit(
524530
&self,
525-
ed: &Editor,
531+
ed: Option<&Editor>,
526532
iter: &mut dyn Iterator<Item = (Selection, &str)>,
527533
edit_type: EditType,
528534
) {

src/views/editor/text_document.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ impl<'a> OnUpdate<'a> {
5858
#[derive(Clone)]
5959
pub struct TextDocument {
6060
buffer: RwSignal<Buffer>,
61-
cache_rev: RwSignal<u64>,
6261
preedit: PreeditData,
6362

6463
/// Whether to keep the indent of the previous line when inserting a new line
@@ -84,25 +83,22 @@ impl TextDocument {
8483
let preedit = PreeditData {
8584
preedit: cx.create_rw_signal(None),
8685
};
87-
let cache_rev = cx.create_rw_signal(0);
86+
let inval_lines_listener = Listener::new_empty(cx);
8887

8988
let placeholders = cx.create_rw_signal(HashMap::new());
9089

91-
// Whenever the placeholders change, update the cache rev
90+
// Whenever the placeholders change, invalidate the first line
9291
create_effect(move |_| {
9392
placeholders.track();
94-
cache_rev.try_update(|cache_rev| {
95-
*cache_rev += 1;
96-
});
93+
inval_lines_listener.send(InvalLines::single(0));
9794
});
9895

9996
TextDocument {
10097
buffer: cx.create_rw_signal(buffer),
101-
cache_rev,
10298
preedit,
10399
keep_indent: Cell::new(true),
104100
auto_indent: Cell::new(false),
105-
inval_lines_listener: Listener::new_empty(cx),
101+
inval_lines_listener,
106102
placeholders,
107103
pre_command: Rc::new(RefCell::new(HashMap::new())),
108104
on_updates: Rc::new(RefCell::new(SmallVec::new())),
@@ -113,12 +109,6 @@ impl TextDocument {
113109
self.buffer
114110
}
115111

116-
pub fn update_cache_rev(&self) {
117-
self.cache_rev.try_update(|cache_rev| {
118-
*cache_rev += 1;
119-
});
120-
}
121-
122112
pub fn on_update(&self, ed: Option<&Editor>, deltas: &[(Rope, RopeDelta, InvalLinesR)]) {
123113
let on_updates = self.on_updates.borrow();
124114
let data = OnUpdate { editor: ed, deltas };
@@ -170,10 +160,6 @@ impl Document for TextDocument {
170160
self.buffer.with_untracked(|buffer| buffer.text().clone())
171161
}
172162

173-
fn cache_rev(&self) -> RwSignal<u64> {
174-
self.cache_rev
175-
}
176-
177163
fn inval_lines_listener(&self) -> Listener<InvalLines> {
178164
self.inval_lines_listener
179165
}
@@ -238,8 +224,6 @@ impl Document for TextDocument {
238224
buffer.set_cursor_before(old_cursor_mode);
239225
buffer.set_cursor_after(cursor.mode.clone());
240226
});
241-
// TODO: line specific invalidation
242-
self.update_cache_rev();
243227
self.on_update(Some(ed), &deltas);
244228
}
245229
ed.cursor.set(cursor);
@@ -248,7 +232,7 @@ impl Document for TextDocument {
248232

249233
fn edit(
250234
&self,
251-
ed: &Editor,
235+
ed: Option<&Editor>,
252236
iter: &mut dyn Iterator<Item = (Selection, &str)>,
253237
edit_type: EditType,
254238
) {
@@ -258,8 +242,7 @@ impl Document for TextDocument {
258242
let deltas = deltas.map(|x| [x]);
259243
let deltas = deltas.as_ref().map(|x| x as &[_]).unwrap_or(&[]);
260244

261-
self.update_cache_rev();
262-
self.on_update(Some(ed), deltas);
245+
self.on_update(ed, deltas);
263246
}
264247
}
265248
impl DocumentPhantom for TextDocument {
@@ -371,7 +354,6 @@ impl CommonAction for TextDocument {
371354
buffer.set_cursor_after(cursor.mode.clone());
372355
});
373356

374-
self.update_cache_rev();
375357
self.on_update(Some(ed), &deltas);
376358
}
377359

0 commit comments

Comments
 (0)