Browse Source

搜索优化

master
hejl 2 months ago
parent
commit
64ee70827a
  1. 29
      win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart
  2. 17
      win_text_editor/lib/modules/content_search/services/content_search_service.dart
  3. 4
      win_text_editor/lib/modules/content_search/widgets/results_view.dart
  4. 22
      win_text_editor/lib/modules/content_search/widgets/search_settings.dart

29
win_text_editor/lib/modules/content_search/controllers/content_search_controller.dart

@ -20,6 +20,8 @@ class ContentSearchController extends BaseContentController { @@ -20,6 +20,8 @@ class ContentSearchController extends BaseContentController {
bool _customRule = false;
SearchMode _searchMode = SearchMode.locate;
final List<SearchResult> _results = [];
List<SearchResult> _allResults = [];
bool _includeZeroCounts = false;
// Getters
String get searchQuery => _searchQuery;
@ -31,6 +33,7 @@ class ContentSearchController extends BaseContentController { @@ -31,6 +33,7 @@ class ContentSearchController extends BaseContentController {
bool get customRule => _customRule;
SearchMode get searchMode => _searchMode;
List<SearchResult> get results => _results;
bool get includeZeroCounts => _includeZeroCounts;
set customRule(bool value) {
_customRule = value;
@ -86,11 +89,30 @@ class ContentSearchController extends BaseContentController { @@ -86,11 +89,30 @@ class ContentSearchController extends BaseContentController {
void clearResults() {
results.clear();
_allResults.clear();
notifyListeners();
}
set includeZeroCounts(bool value) {
_includeZeroCounts = value;
_filterResults();
notifyListeners();
}
void _filterResults() {
_results.clear();
if (_searchMode == SearchMode.count) {
_results.addAll(
_includeZeroCounts ? _allResults : _allResults.where((r) => r.lineNumber > 0),
);
} else {
_results.addAll(_allResults);
}
}
Future<void> startSearch() async {
_results.clear();
_allResults.clear();
//
if (searchQuery.isEmpty) {
@ -112,7 +134,7 @@ class ContentSearchController extends BaseContentController { @@ -112,7 +134,7 @@ class ContentSearchController extends BaseContentController {
return;
}
_results.addAll(
_allResults.addAll(
await ContentSearchService.performCustomSearch(
directory: searchDirectory,
fileType: fileType,
@ -123,7 +145,7 @@ class ContentSearchController extends BaseContentController { @@ -123,7 +145,7 @@ class ContentSearchController extends BaseContentController {
} else {
try {
if (searchMode == SearchMode.locate) {
_results.addAll(
_allResults.addAll(
await ContentSearchService.performLocateSearch(
directory: searchDirectory,
query: searchQuery,
@ -144,7 +166,7 @@ class ContentSearchController extends BaseContentController { @@ -144,7 +166,7 @@ class ContentSearchController extends BaseContentController {
);
counts.forEach((keyword, count) {
_results.add(
_allResults.add(
SearchResult(
filePath: keyword,
lineNumber: count,
@ -158,6 +180,7 @@ class ContentSearchController extends BaseContentController { @@ -158,6 +180,7 @@ class ContentSearchController extends BaseContentController {
} catch (e) {
Logger().error("搜索出错: $e");
} finally {
_filterResults();
notifyListeners();
}
}

17
win_text_editor/lib/modules/content_search/services/content_search_service.dart

@ -22,7 +22,7 @@ class ContentSearchService { @@ -22,7 +22,7 @@ class ContentSearchService {
final results = <SearchResult>[];
final dir = Directory(directory);
final queries = _splitQuery(query); //
int speed = 0;
for (final q in queries) {
final pattern = _buildSearchPattern(
query: q,
@ -30,12 +30,15 @@ class ContentSearchService { @@ -30,12 +30,15 @@ class ContentSearchService {
wholeWord: wholeWord,
useRegex: useRegex,
);
Logger().info("搜索词 $q 开始[${++speed}/${queries.length}]");
int fileCount = 0;
await for (final entity in dir.list(recursive: true)) {
if (entity is File && _matchesFileType(entity.path, fileType)) {
fileCount++;
await _searchInFile(entity, pattern, results, q); //
}
}
Logger().info("搜索词 $q 结束[$speed/${queries.length}],搜索文件 $fileCount 个,");
}
return results;
@ -53,7 +56,7 @@ class ContentSearchService { @@ -53,7 +56,7 @@ class ContentSearchService {
final counts = <String, int>{};
final dir = Directory(directory);
final queries = _splitQuery(query); //
int speed = 0;
for (final q in queries) {
final pattern = _buildSearchPattern(
query: q,
@ -62,11 +65,17 @@ class ContentSearchService { @@ -62,11 +65,17 @@ class ContentSearchService {
useRegex: useRegex,
);
Logger().info("搜索词 $q 开始[${++speed}/${queries.length}]");
counts[q] = 0;
int fileCount = 0;
await for (final entity in dir.list(recursive: true)) {
if (entity is File && _matchesFileType(entity.path, fileType)) {
fileCount++;
await _countInFile(entity, pattern, counts, q); //
}
}
Logger().info("搜索词 $q 结束[$speed/${queries.length}],搜索文件 $fileCount 个,");
}
return counts;
@ -266,7 +275,7 @@ class ContentSearchService { @@ -266,7 +275,7 @@ class ContentSearchService {
}
}
} catch (e) {
print('Error reading file ${file.path}: $e');
Logger().error('Error reading file ${file.path}: $e');
}
}

4
win_text_editor/lib/modules/content_search/widgets/results_view.dart

@ -110,7 +110,7 @@ class ResultsView extends StatelessWidget { @@ -110,7 +110,7 @@ class ResultsView extends StatelessWidget {
columns: [
GridColumn(
columnName: 'file',
width: 300,
minimumWidth: 300,
label: Container(
alignment: Alignment.center,
color: Colors.grey[200],
@ -145,7 +145,7 @@ class ResultsView extends StatelessWidget { @@ -145,7 +145,7 @@ class ResultsView extends StatelessWidget {
columns: [
GridColumn(
columnName: 'keyword',
width: 300,
minimumWidth: 300,
label: Container(
alignment: Alignment.center,
color: Colors.grey[200],

22
win_text_editor/lib/modules/content_search/widgets/search_settings.dart

@ -84,6 +84,28 @@ class SearchSettings extends StatelessWidget { @@ -84,6 +84,28 @@ class SearchSettings extends StatelessWidget {
),
],
),
const SizedBox(height: 4),
Visibility(
visible: controller.searchMode == SearchMode.count,
child: Column(
children: [
CheckboxListTile(
dense: true,
contentPadding: EdgeInsets.zero,
controlAffinity: ListTileControlAffinity.leading,
title: const Text('包含匹配数量0', style: TextStyle(fontSize: 12)),
value: controller.includeZeroCounts,
onChanged:
controller.searchMode == SearchMode.count
? (value) {
controller.includeZeroCounts = value!;
}
: null,
),
const SizedBox(height: 4),
],
),
),
const SizedBox(height: 8),
//
const Text('匹配规则:', style: TextStyle(fontSize: 12)),

Loading…
Cancel
Save