From b49a2221960d3cd3c0db6d8c253d37a6e83a7a03 Mon Sep 17 00:00:00 2001 From: hejl Date: Thu, 29 May 2025 15:22:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E6=88=90=E4=BA=86=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/base_data_source.dart | 106 +----------------- .../controllers/field_data_source.dart | 52 +++++++++ .../controllers/index_data_source.dart | 80 +++++++++++++ .../controllers/memory_table_controller.dart | 2 + .../memory_table/models/memory_table.dart | 2 + .../widgets/memory_table_left_side.dart | 18 +-- 6 files changed, 151 insertions(+), 109 deletions(-) create mode 100644 win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart create mode 100644 win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart diff --git a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart b/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart index 5744a9b..36ea2a5 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; -import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; abstract class SelectableItem { bool isSelected = false; @@ -21,28 +20,28 @@ abstract class SelectableDataSource extends DataGridSo items[i].isSelected = value; onSelectionChanged?.call(i, value); } - _updateSelectionState(); + updateSelectionState(); notifyListeners(); } void toggleRowSelection(int index, bool? value) { final newValue = value ?? false; items[index].isSelected = newValue; - _updateSelectionState(); + updateSelectionState(); notifyListeners(); // 新增:触发回调 onSelectionChanged?.call(index, newValue); } - void _updateSelectionState() { + void updateSelectionState() { final allSelected = items.isNotEmpty && items.every((item) => item.isSelected); final someSelected = items.isNotEmpty && items.any((item) => item.isSelected); _selectionNotifier.value = allSelected || someSelected; } void updateDataGridSource() { - _updateSelectionState(); + updateSelectionState(); notifyListeners(); } @@ -51,100 +50,3 @@ abstract class SelectableDataSource extends DataGridSo notifyListeners(); } } - -class FieldsDataSource extends SelectableDataSource { - FieldsDataSource( - List fields, { - required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, - }) : super(fields, onSelectionChanged: onSelectionChanged); - - @override - List get rows => - items - .map( - (field) => DataGridRow( - cells: [ - DataGridCell(columnName: 'select', value: field.isSelected), - DataGridCell(columnName: 'id', value: field.id), - DataGridCell(columnName: 'name', value: field.name), - DataGridCell(columnName: 'chineseName', value: field.chineseName), - DataGridCell(columnName: 'type', value: field.type), - ], - ), - ) - .toList(); - - get data => items; - - @override - DataGridRowAdapter buildRow(DataGridRow row) { - final rowIndex = effectiveRows.indexOf(row); - return DataGridRowAdapter( - cells: - row.getCells().map((cell) { - if (cell.columnName == 'select') { - return Center( - child: Checkbox( - value: items[rowIndex].isSelected, - onChanged: (value) => toggleRowSelection(rowIndex, value), - ), - ); - } - return Container( - alignment: Alignment.centerLeft, - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis), - ); - }).toList(), - ); - } -} - -// 索引数据源 -class IndexesDataSource extends SelectableDataSource { - IndexesDataSource( - List indexes, { - required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, - }) : super(indexes, onSelectionChanged: onSelectionChanged); - - @override - List get rows => - items - .map( - (index) => DataGridRow( - cells: [ - DataGridCell(columnName: 'select', value: index.isSelected), - DataGridCell(columnName: 'indexName', value: index.indexName), - DataGridCell(columnName: 'isPrimary', value: index.isPrimary), - DataGridCell(columnName: 'indexFields', value: index.indexFields), - DataGridCell(columnName: 'rule', value: index.rule), - ], - ), - ) - .toList(); - - get data => items; - - @override - DataGridRowAdapter buildRow(DataGridRow row) { - final rowIndex = effectiveRows.indexOf(row); - return DataGridRowAdapter( - cells: - row.getCells().map((cell) { - if (cell.columnName == 'select') { - return Center( - child: Checkbox( - value: items[rowIndex].isSelected, - onChanged: (value) => toggleRowSelection(rowIndex, value), - ), - ); - } - return Container( - alignment: Alignment.centerLeft, - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis), - ); - }).toList(), - ); - } -} diff --git a/win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart b/win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart new file mode 100644 index 0000000..1929784 --- /dev/null +++ b/win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; + +class FieldsDataSource extends SelectableDataSource { + FieldsDataSource( + List fields, { + required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, + }) : super(fields, onSelectionChanged: onSelectionChanged); + + @override + List get rows => + items + .map( + (field) => DataGridRow( + cells: [ + DataGridCell(columnName: 'select', value: field.isSelected), + DataGridCell(columnName: 'id', value: field.id), + DataGridCell(columnName: 'name', value: field.name), + DataGridCell(columnName: 'chineseName', value: field.chineseName), + DataGridCell(columnName: 'type', value: field.type), + ], + ), + ) + .toList(); + + get data => items; + + @override + DataGridRowAdapter buildRow(DataGridRow row) { + final rowIndex = effectiveRows.indexOf(row); + return DataGridRowAdapter( + cells: + row.getCells().map((cell) { + if (cell.columnName == 'select') { + return Center( + child: Checkbox( + value: items[rowIndex].isSelected, + onChanged: (value) => toggleRowSelection(rowIndex, value), + ), + ); + } + return Container( + alignment: Alignment.centerLeft, + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis), + ); + }).toList(), + ); + } +} diff --git a/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart b/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart new file mode 100644 index 0000000..d8bfd0b --- /dev/null +++ b/win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; + +// 索引数据源 +class IndexesDataSource extends SelectableDataSource { + // 新增:跟踪当前选中的索引ID + String? _selectedId; + + IndexesDataSource( + List indexes, { + required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, + }) : super(indexes, onSelectionChanged: onSelectionChanged); + + @override + List get rows => + items + .map( + (index) => DataGridRow( + cells: [ + DataGridCell(columnName: 'select', value: index.isSelected), + DataGridCell(columnName: 'indexName', value: index.indexName), + DataGridCell(columnName: 'isPrimary', value: index.isPrimary), + DataGridCell(columnName: 'indexFields', value: index.indexFields), + DataGridCell(columnName: 'rule', value: index.rule), + ], + ), + ) + .toList(); + + get data => items; + + @override + DataGridRowAdapter buildRow(DataGridRow row) { + final rowIndex = effectiveRows.indexOf(row); + final index = items[rowIndex]; + + return DataGridRowAdapter( + cells: + row.getCells().map((cell) { + if (cell.columnName == 'select') { + return Center( + child: Radio( + value: index.id, // 使用唯一标识作为value + groupValue: _selectedId, // 当前选中的ID + onChanged: (String? value) { + _selectedId = value; + toggleRowSelection(rowIndex, value != null); + notifyListeners(); // 必须通知更新 + }, + ), + ); + } + return Container( + alignment: Alignment.centerLeft, + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis), + ); + }).toList(), + ); + } + + // 修改单选逻辑 + @override + void toggleRowSelection(int index, bool? value) { + final newValue = value ?? false; + if (newValue) { + // 单选时先取消所有选择 + for (var item in items) { + item.isSelected = false; + } + _selectedId = items[index].id; // 记录选中的ID + } + items[index].isSelected = newValue; + updateSelectionState(); + notifyListeners(); + onSelectionChanged?.call(index, newValue); + } +} diff --git a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart index 3d466f6..332bc43 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart @@ -2,6 +2,8 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; import 'package:win_text_editor/framework/services/macro_template_service.dart'; import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/field_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/index_data_source.dart'; import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart'; diff --git a/win_text_editor/lib/modules/memory_table/models/memory_table.dart b/win_text_editor/lib/modules/memory_table/models/memory_table.dart index df91bd5..97c39dd 100644 --- a/win_text_editor/lib/modules/memory_table/models/memory_table.dart +++ b/win_text_editor/lib/modules/memory_table/models/memory_table.dart @@ -22,6 +22,8 @@ class Index implements SelectableItem { @override bool isSelected; + String get id => indexName; + List get fields => indexFields.split(',').map((e) => e.trim()).toList(); } diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart index d47538f..4c985ac 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/field_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/index_data_source.dart'; import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart'; class MemoryTableLeftSide extends StatelessWidget { @@ -139,9 +141,10 @@ class MemoryTableLeftSide extends StatelessWidget { columns: [ GridColumn( columnName: 'select', - label: ValueListenableBuilder( - valueListenable: indexesSource.selectionNotifier, - builder: (context, _, __) => _buildCheckboxHeader(context, indexesSource), + label: Container( + alignment: Alignment.center, + color: Colors.grey[200], + child: const Text('选择', style: TextStyle(fontWeight: FontWeight.bold)), ), width: 60, ), @@ -170,10 +173,11 @@ class MemoryTableLeftSide extends StatelessWidget { if (details.column.columnName == 'select') { final rowIndex = details.rowColumnIndex.rowIndex - 1; if (rowIndex >= 0 && rowIndex < indexesSource.items.length) { - indexesSource.toggleRowSelection( - rowIndex, - !indexesSource.items[rowIndex].isSelected, - ); + // 单选逻辑:先取消所有选择,再选中当前行 + for (var i = 0; i < indexesSource.items.length; i++) { + indexesSource.toggleRowSelection(i, false); + } + indexesSource.toggleRowSelection(rowIndex, true); } } },