Selaa lähdekoodia

Generalizes dirty handling on a BufferLine

Now anyone can define a Tag (String) to mark a line as "clean". The clean / dirty state can be retrieved by also providing that tag.
The Bufferline will remove that clean marker whenever the content of that line changes.
This way we can get rid of the Function handlers that set and query each dirty state separately from a line and replace that by just expecting a unique tag name.
devmil 4 vuotta sitten
vanhempi
sitoutus
e3fdb95206
3 muutettua tiedostoa jossa 25 lisäystä ja 23 poistoa
  1. 7 5
      lib/buffer/line/line.dart
  2. 1 2
      lib/terminal/terminal.dart
  3. 17 16
      lib/terminal/terminal_search.dart

+ 7 - 5
lib/buffer/line/line.dart

@@ -17,12 +17,14 @@ class BufferLine {
   }
 
   late BufferLineData _data;
-  var _isSearchDirty = true;
+  final _nonDirtyTags = Set<String>();
 
-  bool get isSearchDirty => _isSearchDirty;
+  void markTagAsNonDirty(String tag) {
+    _nonDirtyTags.add(tag);
+  }
 
-  void markSearchDone() {
-    _isSearchDirty = false;
+  bool isTagDirty(String tag) {
+    return !_nonDirtyTags.contains(tag);
   }
 
   BufferLineData get data => _data;
@@ -141,7 +143,7 @@ class BufferLine {
 
   void _invalidateCaches() {
     _searchStringCache = null;
-    _isSearchDirty = true;
+    _nonDirtyTags.clear();
   }
 
   String? _searchStringCache;

+ 1 - 2
lib/terminal/terminal.dart

@@ -45,8 +45,7 @@ class Terminal with Observable implements TerminalUiInteraction {
     required int maxLines,
   }) : _maxLines = maxLines {
     _search = TerminalSearch(this);
-    _userSearchTask = _search.createSearchTask(
-        (line) => line.markSearchDone(), (line) => line.isSearchDirty);
+    _userSearchTask = _search.createSearchTask("UserSearch");
     //TODO: remove and tie to the API
     _userSearchTask.pattern = "test";
     backend?.init();

+ 17 - 16
lib/terminal/terminal_search.dart

@@ -1,4 +1,3 @@
-import 'package:meta/meta.dart';
 import 'package:xterm/buffer/line/line.dart';
 import 'package:xterm/terminal/terminal.dart';
 
@@ -64,20 +63,15 @@ class TerminalSearchHit {
   }
 }
 
-typedef MarkSearchDoneFunc = void Function(BufferLine line);
-typedef IsSearchDirtyFunc = bool Function(BufferLine line);
-
 class TerminalSearchTask {
-  TerminalSearchTask(this._search, this._terminal, this._markSearchDoneFunc,
-      this._isSearchDirtyFunc);
+  TerminalSearchTask(this._search, this._terminal, this._dirtyTagName);
 
   final TerminalSearch _search;
   final Terminal _terminal;
   String? _pattern = null;
   bool _isPatternDirty = true;
   RegExp? _searchRegexp = null;
-  final MarkSearchDoneFunc _markSearchDoneFunc;
-  final IsSearchDirtyFunc _isSearchDirtyFunc;
+  final String _dirtyTagName;
 
   bool? _hasBeenUsingAltBuffer;
   TerminalSearchResult? _lastSearchResult = null;
@@ -85,13 +79,20 @@ class TerminalSearchTask {
   bool _isAnyLineDirty() {
     final bufferLength = _terminal.buffer.lines.length;
     for (var i = 0; i < bufferLength; i++) {
-      if (_isSearchDirtyFunc(_terminal.buffer.lines[i])) {
+      if (_terminal.buffer.lines[i].isTagDirty(_dirtyTagName)) {
         return true;
       }
     }
     return false;
   }
 
+  void _markLinesForSearchDone() {
+    final bufferLength = _terminal.buffer.lines.length;
+    for (var i = 0; i < bufferLength; i++) {
+      _terminal.buffer.lines[i].markTagAsNonDirty(_dirtyTagName);
+    }
+  }
+
   bool _isTerminalStateDirty() {
     if (_isAnyLineDirty()) {
       return true;
@@ -103,7 +104,7 @@ class TerminalSearchTask {
     return false;
   }
 
-  bool get isDirty {
+  bool get _isDirty {
     if (_isPatternDirty) {
       return true;
     }
@@ -123,10 +124,9 @@ class TerminalSearchTask {
     if (_pattern == null) {
       return TerminalSearchResult.empty();
     }
-    if (_lastSearchResult != null && !isDirty) {
+    if (_lastSearchResult != null && !_isDirty) {
       return _lastSearchResult!;
     }
-    _isPatternDirty = false;
 
     final terminalWidth = _terminal.terminalWidth;
 
@@ -156,6 +156,9 @@ class TerminalSearchTask {
       );
     }
 
+    _markLinesForSearchDone();
+
+    _isPatternDirty = false;
     _lastSearchResult = TerminalSearchResult.fromHits(hits);
     _hasBeenUsingAltBuffer = _terminal.isUsingAltBuffer();
     return _lastSearchResult!;
@@ -169,10 +172,8 @@ class TerminalSearch {
   String? _cachedSearchString;
   int? _lastTerminalWidth;
 
-  TerminalSearchTask createSearchTask(MarkSearchDoneFunc markSearchDoneFunc,
-      IsSearchDirtyFunc isSearchDirtyFunc) {
-    return TerminalSearchTask(
-        this, _terminal, markSearchDoneFunc, isSearchDirtyFunc);
+  TerminalSearchTask createSearchTask(String dirtyTagName) {
+    return TerminalSearchTask(this, _terminal, dirtyTagName);
   }
 
   String get terminalSearchString {