Browse Source

Scroll current search hit into view

devmil 4 years ago
parent
commit
44a0ad51c9
2 changed files with 37 additions and 4 deletions
  1. 21 3
      lib/terminal/terminal.dart
  2. 16 1
      lib/terminal/terminal_search.dart

+ 21 - 3
lib/terminal/terminal.dart

@@ -739,14 +739,15 @@ class Terminal with Observable implements TerminalUiInteraction {
   TerminalSearchResult get userSearchResult => _userSearchTask.searchResult;
   TerminalSearchResult get userSearchResult => _userSearchTask.searchResult;
 
 
   @override
   @override
-  int get numberOfSearchHits => userSearchResult.allHits.length;
+  int get numberOfSearchHits => _userSearchTask.numberOfSearchHits;
 
 
   @override
   @override
-  int get currentSearchHit => userSearchResult.currentSearchHit;
+  int get currentSearchHit => _userSearchTask.currentSearchHit;
 
 
   @override
   @override
   void set currentSearchHit(int currentSearchHit) {
   void set currentSearchHit(int currentSearchHit) {
-    userSearchResult.currentSearchHit = currentSearchHit;
+    _userSearchTask.currentSearchHit = currentSearchHit;
+    _scrollCurrentHitIntoView();
     refresh();
     refresh();
   }
   }
 
 
@@ -756,6 +757,7 @@ class Terminal with Observable implements TerminalUiInteraction {
   @override
   @override
   void set userSearchOptions(TerminalSearchOptions options) {
   void set userSearchOptions(TerminalSearchOptions options) {
     _userSearchTask.options = options;
     _userSearchTask.options = options;
+    _scrollCurrentHitIntoView();
     refresh();
     refresh();
   }
   }
 
 
@@ -765,6 +767,7 @@ class Terminal with Observable implements TerminalUiInteraction {
   @override
   @override
   void set userSearchPattern(String? newValue) {
   void set userSearchPattern(String? newValue) {
     _userSearchTask.pattern = newValue;
     _userSearchTask.pattern = newValue;
+    _scrollCurrentHitIntoView();
     refresh();
     refresh();
   }
   }
 
 
@@ -774,5 +777,20 @@ class Terminal with Observable implements TerminalUiInteraction {
   @override
   @override
   void set isUserSearchActive(bool isUserSearchActive) {
   void set isUserSearchActive(bool isUserSearchActive) {
     _userSearchTask.isActive = isUserSearchActive;
     _userSearchTask.isActive = isUserSearchActive;
+    _scrollCurrentHitIntoView();
+    refresh();
+  }
+
+  void _scrollCurrentHitIntoView() {
+    if (!_userSearchTask.isActive) {
+      return;
+    }
+    final currentHit = _userSearchTask.currentSearchHitObject;
+
+    if (currentHit != null) {
+      final desiredScrollOffsetFromTop =
+          currentHit.startLineIndex + (terminalHeight / 2).floor();
+      setScrollOffsetFromBottom(buffer.height - desiredScrollOffsetFromTop);
+    }
   }
   }
 }
 }

+ 16 - 1
lib/terminal/terminal_search.dart

@@ -25,7 +25,7 @@ class TerminalSearchResult {
       }
       }
     }
     }
     if (_allHits.length > 0) {
     if (_allHits.length > 0) {
-      _currentSearchHit = 1;
+      _currentSearchHit = _allHits.length;
     } else {
     } else {
       _currentSearchHit = 0;
       _currentSearchHit = 0;
     }
     }
@@ -192,9 +192,24 @@ class TerminalSearchTask {
     _invalidate();
     _invalidate();
   }
   }
 
 
+  TerminalSearchHit? get currentSearchHitObject {
+    if (searchResult.allHits.length >= searchResult.currentSearchHit &&
+        searchResult.currentSearchHit > 0) {
+      return searchResult.allHits[searchResult.currentSearchHit - 1];
+    }
+    return null;
+  }
+
+  int get numberOfSearchHits => searchResult.allHits.length;
+  int get currentSearchHit => searchResult.currentSearchHit;
+  void set currentSearchHit(int currentSearchHit) {
+    searchResult.currentSearchHit = currentSearchHit;
+  }
+
   void _invalidate() {
   void _invalidate() {
     _isPatternDirty = true;
     _isPatternDirty = true;
     _searchRegexp = null;
     _searchRegexp = null;
+    _lastSearchResult = null;
   }
   }
 
 
   TerminalSearchResult get searchResult {
   TerminalSearchResult get searchResult {