From 4f40a7ab7059c85a88795e910442385b1e094de3 Mon Sep 17 00:00:00 2001 From: hejl Date: Thu, 29 May 2025 16:19:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=A0=87=E5=87=86=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E5=89=A5=E7=A6=BB=E6=88=90=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/index_data_source.dart | 4 +- .../controllers/memory_table_controller.dart | 5 +- .../services/memory_table_service.dart | 2 +- .../widgets/memory_table_left_side.dart | 101 ++-------------- .../base}/base_data_source.dart | 5 +- .../models/memory_table.dart | 5 +- .../uft_std_fields}/field_data_source.dart | 4 +- .../uft_std_fields/fields_data_grid.dart | 110 ++++++++++++++++++ 8 files changed, 132 insertions(+), 104 deletions(-) rename win_text_editor/lib/{modules/memory_table/controllers => shared/base}/base_data_source.dart (95%) rename win_text_editor/lib/{modules/memory_table => shared}/models/memory_table.dart (96%) rename win_text_editor/lib/{modules/memory_table/controllers => shared/uft_std_fields}/field_data_source.dart (91%) create mode 100644 win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart 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 index d8bfd0b..03c1194 100644 --- 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 @@ -1,7 +1,7 @@ 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'; +import 'package:win_text_editor/shared/base/base_data_source.dart'; +import 'package:win_text_editor/shared/models/memory_table.dart'; // 索引数据源 class IndexesDataSource extends SelectableDataSource { 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 332bc43..ffae63a 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 @@ -1,10 +1,9 @@ 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/shared/uft_std_fields/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/shared/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/services/memory_table_service.dart b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart index 9e91ee0..458275e 100644 --- a/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart +++ b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart @@ -1,7 +1,7 @@ // memory_table_service.dart import 'dart:io'; -import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; +import 'package:win_text_editor/shared/models/memory_table.dart'; import 'package:win_text_editor/shared/data/std_fields_cache.dart'; import 'package:win_text_editor/shared/models/std_filed.dart'; import 'package:xml/xml.dart' as xml; 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 4c985ac..1a2c0fd 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,9 +1,9 @@ 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'; +import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; +import 'package:win_text_editor/shared/uft_std_fields/fields_data_grid.dart'; class MemoryTableLeftSide extends StatelessWidget { final MemoryTableController controller; @@ -34,93 +34,6 @@ class MemoryTableLeftSide extends StatelessWidget { ); } - Widget _buildFieldsDataGrid(MemoryTableController controller) { - final fieldsSource = controller.fieldsSource as FieldsDataSource; - - return Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: LayoutBuilder( - builder: (context, constraints) { - return SizedBox( - width: constraints.maxWidth, - child: SfDataGrid( - source: fieldsSource, - gridLinesVisibility: GridLinesVisibility.both, - headerGridLinesVisibility: GridLinesVisibility.both, - columnWidthMode: ColumnWidthMode.fitByCellValue, - selectionMode: SelectionMode.none, - columns: [ - GridColumn( - columnName: 'select', - label: ValueListenableBuilder( - valueListenable: fieldsSource.selectionNotifier, - builder: (context, _, __) => _buildCheckboxHeader(context, fieldsSource), - ), - width: 60, - ), - GridColumn(columnName: 'id', label: _buildGridHeader('序号'), minimumWidth: 80), - GridColumn( - columnName: 'name', - label: _buildGridHeader('名称'), - minimumWidth: 120, - ), - GridColumn( - columnName: 'chineseName', - label: _buildGridHeader('中文名'), - minimumWidth: 120, - ), - GridColumn( - columnName: 'type', - label: _buildGridHeader('类型'), - minimumWidth: 120, - ), - ], - onCellTap: (details) { - if (details.column.columnName == 'select') { - final rowIndex = details.rowColumnIndex.rowIndex - 1; - if (rowIndex >= 0 && rowIndex < fieldsSource.items.length) { - fieldsSource.toggleRowSelection( - rowIndex, - !fieldsSource.items[rowIndex].isSelected, - ); - } - } - }, - ), - ); - }, - ), - ), - ], - ), - ); - } - - Widget _buildCheckboxHeader( - BuildContext context, - SelectableDataSource dataSource, - ) { - final allSelected = - dataSource.items.isNotEmpty && dataSource.items.every((item) => item.isSelected); - final someSelected = - dataSource.items.isNotEmpty && - dataSource.items.any((item) => item.isSelected) && - !allSelected; - - return Container( - alignment: Alignment.center, - color: Colors.grey[200], - child: Checkbox( - value: allSelected, - tristate: someSelected, - onChanged: (value) => dataSource.toggleAllSelection(value ?? false), - ), - ); - } - Widget _buildIndexesDataGrid(MemoryTableController controller) { final indexesSource = controller.indexesSource as IndexesDataSource; @@ -218,7 +131,15 @@ class MemoryTableLeftSide extends StatelessWidget { padding: EdgeInsets.all(8.0), child: Text('字段列表', style: TextStyle(fontWeight: FontWeight.bold)), ), - Expanded(flex: 6, child: _buildFieldsDataGrid(controller)), + Expanded( + flex: 6, + child: FieldsDataGrid( + fieldsSource: controller.fieldsSource as FieldsDataSource, + onSelectionChanged: (index, isSelected) { + controller.updateFieldSelection(index, isSelected); + }, + ), + ), const Padding( padding: EdgeInsets.all(8.0), child: Text('索引列表', style: TextStyle(fontWeight: FontWeight.bold)), diff --git a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart b/win_text_editor/lib/shared/base/base_data_source.dart similarity index 95% rename from win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart rename to win_text_editor/lib/shared/base/base_data_source.dart index 36ea2a5..d338542 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart +++ b/win_text_editor/lib/shared/base/base_data_source.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; - -abstract class SelectableItem { - bool isSelected = false; -} +import 'package:win_text_editor/shared/models/memory_table.dart'; abstract class SelectableDataSource extends DataGridSource { SelectableDataSource(this.items, {this.onSelectionChanged}) { diff --git a/win_text_editor/lib/modules/memory_table/models/memory_table.dart b/win_text_editor/lib/shared/models/memory_table.dart similarity index 96% rename from win_text_editor/lib/modules/memory_table/models/memory_table.dart rename to win_text_editor/lib/shared/models/memory_table.dart index 97c39dd..7ed706c 100644 --- a/win_text_editor/lib/modules/memory_table/models/memory_table.dart +++ b/win_text_editor/lib/shared/models/memory_table.dart @@ -1,4 +1,6 @@ -import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +abstract class SelectableItem { + bool isSelected = false; +} class Field implements SelectableItem { Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); @@ -11,7 +13,6 @@ class Field implements SelectableItem { bool isSelected; } -// 索引数据模型 class Index implements SelectableItem { Index(this.indexName, this.isPrimary, this.indexFields, this.rule, [this.isSelected = false]); diff --git a/win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart b/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart similarity index 91% rename from win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart rename to win_text_editor/lib/shared/uft_std_fields/field_data_source.dart index 1929784..05d5b93 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart +++ b/win_text_editor/lib/shared/uft_std_fields/field_data_source.dart @@ -1,7 +1,7 @@ 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'; +import 'package:win_text_editor/shared/base/base_data_source.dart'; +import 'package:win_text_editor/shared/models/memory_table.dart'; class FieldsDataSource extends SelectableDataSource { FieldsDataSource( diff --git a/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart b/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart new file mode 100644 index 0000000..ca9ea82 --- /dev/null +++ b/win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; +import 'package:win_text_editor/shared/base/base_data_source.dart'; +import 'package:win_text_editor/shared/models/memory_table.dart'; +import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart'; + +class FieldsDataGrid extends StatelessWidget { + final FieldsDataSource fieldsSource; + final Function(int index, bool isSelected)? onSelectionChanged; + + const FieldsDataGrid({super.key, required this.fieldsSource, this.onSelectionChanged}); + + Container _buildGridHeader(String text) { + return Container( + alignment: Alignment.center, + color: Colors.grey[200], + child: Text(text, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + ); + } + + Widget _buildCheckboxHeader( + BuildContext context, + SelectableDataSource dataSource, + ) { + final allSelected = + dataSource.items.isNotEmpty && dataSource.items.every((item) => item.isSelected); + final someSelected = + dataSource.items.isNotEmpty && + dataSource.items.any((item) => item.isSelected) && + !allSelected; + + return Container( + alignment: Alignment.center, + color: Colors.grey[200], + child: Checkbox( + value: allSelected, + tristate: someSelected, + onChanged: (value) => dataSource.toggleAllSelection(value ?? false), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + return SizedBox( + width: constraints.maxWidth, + child: SfDataGrid( + source: fieldsSource, + gridLinesVisibility: GridLinesVisibility.both, + headerGridLinesVisibility: GridLinesVisibility.both, + columnWidthMode: ColumnWidthMode.fitByCellValue, + selectionMode: SelectionMode.none, + columns: [ + GridColumn( + columnName: 'select', + label: ValueListenableBuilder( + valueListenable: fieldsSource.selectionNotifier, + builder: (context, _, __) => _buildCheckboxHeader(context, fieldsSource), + ), + width: 60, + ), + GridColumn(columnName: 'id', label: _buildGridHeader('序号'), minimumWidth: 80), + GridColumn( + columnName: 'name', + label: _buildGridHeader('名称'), + minimumWidth: 120, + ), + GridColumn( + columnName: 'chineseName', + label: _buildGridHeader('中文名'), + minimumWidth: 120, + ), + GridColumn( + columnName: 'type', + label: _buildGridHeader('类型'), + minimumWidth: 120, + ), + ], + onCellTap: (details) { + if (details.column.columnName == 'select') { + final rowIndex = details.rowColumnIndex.rowIndex - 1; + if (rowIndex >= 0 && rowIndex < fieldsSource.items.length) { + fieldsSource.toggleRowSelection( + rowIndex, + !fieldsSource.items[rowIndex].isSelected, + ); + onSelectionChanged?.call( + rowIndex, + fieldsSource.items[rowIndex].isSelected, + ); + } + } + }, + ), + ); + }, + ), + ), + ], + ), + ); + } +}