From 2e1c192cd7393b241768561a15596c6a18cfce2f Mon Sep 17 00:00:00 2001 From: hejl Date: Wed, 21 May 2025 17:15:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8A=A0=E8=BD=BD=E5=92=8C?= =?UTF-8?q?=E8=BF=87=E6=BB=A4OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/filter_controller.dart | 15 ++-- .../template_parser/widgets/filter_panel.dart | 4 +- .../template_parser/widgets/grid_view.dart | 81 ++++--------------- 3 files changed, 28 insertions(+), 72 deletions(-) diff --git a/win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart b/win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart index ddefecd..d47209c 100644 --- a/win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart +++ b/win_text_editor/lib/modules/template_parser/controllers/filter_controller.dart @@ -1,5 +1,6 @@ // filter_controller.dart import 'package:flutter/foundation.dart'; +import 'package:win_text_editor/framework/controllers/logger.dart'; import 'package:win_text_editor/modules/template_parser/models/template_node.dart'; import 'template_notifier.dart'; @@ -96,23 +97,28 @@ class FilterController extends TemplateNotifier { return templateItems; } + Logger().info("过滤:$selectedFilterField $selectedFilterOperator $filterValue"); + List filteredItems = []; // 1. 找出所有匹配的主项 final primaryMatches = templateItems.where((item) { final nodeName = item.xPath.split('/').last; - return nodeName == selectedFilterField && _matchesCondition(item.value); + if (nodeName == selectedFilterField) { + return _matchesCondition(item.value); + } + return false; }); // 2. 收集这些主项的ID(同实例的所有项共享相同ID) - final matchedIds = primaryMatches.map((item) => item.id).toSet(); + final matchedRowIds = primaryMatches.map((item) => item.rowId).toSet(); // 3. 过滤出同实例的所有项 filteredItems.cast(); filteredItems.addAll( - filteredItems.where((item) { - return matchedIds.contains(item.id); + templateItems.where((item) { + return matchedRowIds.contains(item.rowId); }).toList(), ); @@ -125,7 +131,6 @@ class FilterController extends TemplateNotifier { if (selectedFilterOperator == null || filterValue.isEmpty) { return false; } - switch (selectedFilterOperator!) { case '==': return value == filterValue; diff --git a/win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart b/win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart index c7ad587..4e8c417 100644 --- a/win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart +++ b/win_text_editor/lib/modules/template_parser/widgets/filter_panel.dart @@ -125,9 +125,9 @@ class _TemplateFilterPanelState extends State { const SizedBox(width: 16), ElevatedButton( onPressed: () { - controller.applyFilter(); + controller.clearFilter(); }, - child: const Text('刷新'), + child: const Text('还原'), ), ], ), diff --git a/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart b/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart index 29e984c..701bbf3 100644 --- a/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart +++ b/win_text_editor/lib/modules/template_parser/widgets/grid_view.dart @@ -61,25 +61,30 @@ class TemplateGridView extends StatelessWidget { final selectedNodes = controller.getSelectedNodes(); if (selectedNodes.isEmpty) return; + // 直接从数据源获取数据 + final dataSource = _TemplateItemDataSource( + rows: _buildDataRows(selectedNodes, controller.displayedItems), + selectedNodes: selectedNodes, + ); + // 构建表头 String csvData = '序号\t'; - csvData += selectedNodes.map((node) => node.name).join('\t'); + csvData += selectedNodes + .map((node) => node.isAttribute ? node.name.substring(1) : node.name) + .join('\t'); csvData += '\n'; - // 获取所有行数据 - final rows = _getGroupedData(controller); - // 填充数据 - for (var i = 0; i < rows.length; i++) { - csvData += '${i + 1}\t'; - csvData += selectedNodes - .map((node) { - return rows[i][node.path] ?? ''; - }) - .join('\t'); + for (final row in dataSource.rows) { + csvData += '${row.getCells()[0].value}\t'; // 序号 + for (int i = 1; i < row.getCells().length; i++) { + csvData += row.getCells()[i].value.toString(); + if (i < row.getCells().length - 1) csvData += '\t'; + } csvData += '\n'; } + // 保存文件 final filePath = await FilePicker.platform.saveFile( dialogTitle: '保存导出结果', fileName: 'template_results.csv', @@ -165,60 +170,6 @@ class TemplateGridView extends StatelessWidget { return row; }).toList(); } - - // 辅助方法:根据父路径分组数据 - List> _getGroupedData(GridViewController controller) { - final selectedNodes = controller.getSelectedNodes(); - if (selectedNodes.isEmpty) return []; - - // 获取所有相关数据项 - final allItems = - controller.templateItems.where((item) { - return selectedNodes.any((node) => item.xPath == node.path); - }).toList(); - - // 按父路径分组 - final parentPaths = - selectedNodes.map((node) { - return node.path.substring(0, node.path.lastIndexOf('/')); - }).toSet(); - - final groupedData = >[]; - - for (final parentPath in parentPaths) { - // 获取该父路径下的所有项 - final items = - allItems.where((item) { - return item.xPath.startsWith(parentPath) || - item.xPath == parentPath || - (item.xPath.contains('@') && - item.xPath.substring(0, item.xPath.lastIndexOf('@')) == parentPath); - }).toList(); - - // 按实例分组(对于重复节点) - final instanceGroups = >{}; - - for (final item in items) { - // 提取实例标识(如对于重复节点) - final instanceId = _getInstanceId(item.xPath, parentPath); - - if (!instanceGroups.containsKey(instanceId)) { - instanceGroups[instanceId] = {'_parent': parentPath}; - } - - instanceGroups[instanceId]![item.xPath] = item.value; - } - - groupedData.addAll(instanceGroups.values); - } - - return groupedData; - } - - String _getInstanceId(String fullPath, String parentPath) { - // 简单实现:使用父路径后的部分作为实例ID - return fullPath.substring(parentPath.length); - } } class _TemplateItemDataSource extends DataGridSource {