diff --git a/win_text_editor/assets/config/uft_macro_list.yaml b/win_text_editor/assets/config/uft_macro_list.yaml new file mode 100644 index 0000000..ee4e8c5 --- /dev/null +++ b/win_text_editor/assets/config/uft_macro_list.yaml @@ -0,0 +1,13 @@ + +获取记录:| + [获取记录][{{tableName}}({{keyName}}) + ][ + {{#keyFields}} + {{.}} = @{{.}}{{^@last}}, {{/@last}} + {{/keyFields}} + ] + [继续执行] + [记录为空][{{tableName}}] + { + [报错返回][][{{#keyFields}}{{.}} = @{{.}}{{^@last}}, {{/@last}}{{/keyFields}}] + } \ No newline at end of file diff --git a/win_text_editor/lib/framework/services/uft_macro_service.dart b/win_text_editor/lib/framework/services/uft_macro_service.dart new file mode 100644 index 0000000..e6b58fa --- /dev/null +++ b/win_text_editor/lib/framework/services/uft_macro_service.dart @@ -0,0 +1,51 @@ +import 'package:flutter/services.dart' show rootBundle; +import 'package:yaml/yaml.dart'; + +class UftMacroService { + static final UftMacroService _instance = UftMacroService._internal(); + factory UftMacroService() => _instance; + UftMacroService._internal(); + + late Map _config; + + static bool _isInitialized = false; + + // 初始化配置 + Future init() async { + if (_isInitialized) return; + final configString = await rootBundle.loadString('assets/config/uft_macro_list.yaml'); + final yamlMap = loadYaml(configString) as YamlMap; + + final globalConfig = yamlMap['global'] as YamlMap? ?? {}; + + _config = {...globalConfig}; + + _isInitialized = true; + } + + // 获取配置值 + dynamic get(String key) { + return _config[key]; + } + + // 获取字符串值 + String getString(String key) { + return _config[key] as String; + } + + // 获取布尔值 + bool getBool(String key) { + return _config[key] as bool; + } + + // 获取整数 + int getInt(String key) { + return _config[key] as int; + } + + // 获取列表 + List getList(String key) { + final list = _config[key] as List; + return list.cast(); + } +} 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 8838d52..10e89e0 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,16 +1,18 @@ 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; } abstract class SelectableDataSource extends DataGridSource { - SelectableDataSource(this.items) { + SelectableDataSource(this.items, {this.onSelectionChanged}) { _selectionNotifier = ValueNotifier(false); } List items; + final void Function(int index, bool isSelected)? onSelectionChanged; late final ValueNotifier _selectionNotifier; ValueNotifier get selectionNotifier => _selectionNotifier; @@ -23,9 +25,13 @@ abstract class SelectableDataSource extends DataGridSo } void toggleRowSelection(int index, bool? value) { - items[index].isSelected = value ?? false; + final newValue = value ?? false; + items[index].isSelected = newValue; _updateSelectionState(); notifyListeners(); + + // 新增:触发回调 + onSelectionChanged?.call(index, newValue); } void _updateSelectionState() { @@ -45,31 +51,11 @@ abstract class SelectableDataSource extends DataGridSo } } -class Field implements SelectableItem { - Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); - - final String id; - final String name; - final String chineseName; - final String type; - @override - bool isSelected; -} - -// 索引数据模型 -class Index implements SelectableItem { - Index(this.indexName, this.isPrimary, this.indexFields, this.rule, [this.isSelected = false]); - - final String indexName; - final String isPrimary; - final String indexFields; - final String rule; - @override - bool isSelected; -} - class FieldsDataSource extends SelectableDataSource { - FieldsDataSource(List fields) : super(fields); + FieldsDataSource( + List fields, { + required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, + }) : super(fields, onSelectionChanged: onSelectionChanged); @override List get rows => @@ -87,6 +73,8 @@ class FieldsDataSource extends SelectableDataSource { ) .toList(); + get data => items; + @override DataGridRowAdapter buildRow(DataGridRow row) { final rowIndex = effectiveRows.indexOf(row); @@ -113,7 +101,10 @@ class FieldsDataSource extends SelectableDataSource { // 索引数据源 class IndexesDataSource extends SelectableDataSource { - IndexesDataSource(List indexes) : super(indexes); + IndexesDataSource( + List indexes, { + required Null Function(dynamic index, dynamic isSelected) onSelectionChanged, + }) : super(indexes, onSelectionChanged: onSelectionChanged); @override List get rows => @@ -123,7 +114,7 @@ class IndexesDataSource extends SelectableDataSource { cells: [ DataGridCell(columnName: 'select', value: index.isSelected), DataGridCell(columnName: 'indexName', value: index.indexName), - DataGridCell(columnName: 'isPrimary', value: index.isPrimary), + DataGridCell(columnName: 'isPrimary', value: index.isPrimary), DataGridCell(columnName: 'indexFields', value: index.indexFields), DataGridCell(columnName: 'rule', value: index.rule), ], @@ -131,6 +122,8 @@ class IndexesDataSource extends SelectableDataSource { ) .toList(); + get data => items; + @override DataGridRowAdapter buildRow(DataGridRow row) { final rowIndex = effectiveRows.indexOf(row); 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 5ebf132..84db131 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,6 +1,7 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/framework/controllers/logger.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/modules/memory_table/services/memory_table_service.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart'; @@ -12,24 +13,40 @@ class MemoryTableController extends BaseContentController { late DataGridSource fieldsSource; late DataGridSource indexesSource; - late MemoryTableService _service; + final MemoryTableService _service; + + // 新增:维护MemoryTable对象 + late MemoryTable _memoryTable; MemoryTableController() : _service = MemoryTableService(Logger()) { // 初始化空数据 - fieldsSource = FieldsDataSource([ - Field('1', '', '', ''), // 序号1的空字段 - Field('2', '', '', ''), // 序号2的空字段 - Field('3', '', '', ''), // 序号3的空字段 - ]); - - indexesSource = IndexesDataSource([ - Index('', '', '', ''), // 空索引1 - Index('', '', '', ''), // 空索引2 - ]); + final initialFields = [Field('1', '', '', '', false), Field('2', '', '', '', false)]; + + final initialIndexes = [Index('', false, '', '', false)]; + + fieldsSource = FieldsDataSource( + initialFields, + onSelectionChanged: (index, isSelected) { + updateFieldSelection(index, isSelected); + }, + ); + + indexesSource = IndexesDataSource( + initialIndexes, + onSelectionChanged: (index, isSelected) { + updateIndexSelection(index, isSelected); + }, + ); + + // 初始化MemoryTable + _memoryTable = MemoryTable(tableName: '', columns: initialFields, indexes: initialIndexes); } String? get errorMessage => _errorMessage; + // 新增:获取当前MemoryTable + MemoryTable get memoryTable => _memoryTable; + @override Future onOpenFile(String filePath) async { Logger().info("Opening file: $filePath"); @@ -45,6 +62,13 @@ class MemoryTableController extends BaseContentController { (fieldsSource as FieldsDataSource).updateData(tableData.fields); (indexesSource as IndexesDataSource).updateData(tableData.indexes); + // 更新MemoryTable对象 + _memoryTable = MemoryTable( + tableName: tableName, + columns: tableData.fields, + indexes: tableData.indexes, + ); + // Clear any previous error _errorMessage = null; @@ -57,6 +81,32 @@ class MemoryTableController extends BaseContentController { } } + // 新增:更新字段选择状态 + void updateFieldSelection(int index, bool isSelected) { + final fields = (fieldsSource as FieldsDataSource).data; + if (index >= 0 && index < fields.length) { + fields[index].isSelected = isSelected; + fieldsSource.notifyListeners(); + + // 同步更新MemoryTable + _memoryTable.columns[index].isSelected = isSelected; + notifyListeners(); + } + } + + // 新增:更新索引选择状态 + void updateIndexSelection(int index, bool isSelected) { + final indexes = (indexesSource as IndexesDataSource).data; + if (index >= 0 && index < indexes.length) { + indexes[index].isSelected = isSelected; + indexesSource.notifyListeners(); + + // 同步更新MemoryTable + _memoryTable.indexes[index].isSelected = isSelected; + notifyListeners(); + } + } + @override void onOpenFolder(String folderPath) { // 不支持打开文件夹 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 new file mode 100644 index 0000000..28cbd2d --- /dev/null +++ b/win_text_editor/lib/modules/memory_table/models/memory_table.dart @@ -0,0 +1,34 @@ +import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; + +class Field implements SelectableItem { + Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); + + final String id; + final String name; + final String chineseName; + final String type; + @override + bool isSelected; +} + +// 索引数据模型 +class Index implements SelectableItem { + Index(this.indexName, this.isPrimary, this.indexFields, this.rule, [this.isSelected = false]); + + final String indexName; + final bool isPrimary; + final String indexFields; + final String rule; + @override + bool isSelected; + + List get fields => indexFields.split(',').map((e) => e.trim()).toList(); +} + +class MemoryTable { + final String tableName; + final List columns; + final List indexes; + + MemoryTable({required this.tableName, required this.columns, required this.indexes}); +} 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 9e9babd..9e91ee0 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/controllers/base_data_source.dart'; +import 'package:win_text_editor/modules/memory_table/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; @@ -71,7 +71,7 @@ class MemoryTableService { for (final indexNode in indexes) { final name = indexNode.getAttribute('name') ?? ''; final containerType = indexNode.getAttribute('containerType'); - final isPrimary = containerType == null ? '是' : '否'; + final isPrimary = containerType == null; final rule = containerType ?? ''; // Get all index fields @@ -165,7 +165,7 @@ class MemoryTableService { } List _getDefaultIndexes() { - return [Index('', '', '', ''), Index('', '', '', '')]; + return [Index('', false, '', ''), Index('', false, '', '')]; } } diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart index c66388f..80e7b92 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart @@ -1,9 +1,99 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:win_text_editor/framework/controllers/logger.dart'; +import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart'; +import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; -class MemoryTableRightSide extends StatelessWidget { +class MemoryTableRightSide extends StatefulWidget { + final MemoryTableController controller; final TextEditingController codeController; - const MemoryTableRightSide({super.key, required this.codeController}); + + const MemoryTableRightSide({super.key, required this.controller, required this.codeController}); + + @override + State createState() => _MemoryTableRightSideState(); +} + +class _MemoryTableRightSideState extends State { + @override + void initState() { + super.initState(); + // 添加监听器 + widget.controller.addListener(_updateDisplay); + _updateDisplay(); + } + + @override + void dispose() { + widget.controller.removeListener(_updateDisplay); + super.dispose(); + } + + void _updateDisplay() { + final table = widget.controller.memoryTable; + widget.codeController.text = _formatMemoryTable(table); + } + + String _formatMemoryTable(MemoryTable table) { + final buffer = StringBuffer(); + + buffer.writeln('tableName = ${table.tableName}'); + buffer.writeln(); + + buffer.writeln('columns:'); + for (final field in table.columns) { + buffer.writeln(' name = ${field.name}'); + buffer.writeln(' chineseName = ${field.chineseName}'); + buffer.writeln(' dataType = ${field.type}'); + buffer.writeln(' isSelected = ${field.isSelected}'); + buffer.writeln(); + } + + buffer.writeln('indexes:'); + for (final index in table.indexes) { + buffer.writeln(' name = ${index.indexName}'); + buffer.writeln(' isPrimary = ${index.isPrimary}'); + buffer.writeln(' isSelected = ${index.isSelected}'); + buffer.writeln(' fields:'); + for (final field in index.fields) { + buffer.writeln(' name = $field'); + } + buffer.writeln(); + } + + return buffer.toString(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _buildCheckboxSection(), + Padding( + padding: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text('MemoryTable 数据:', style: TextStyle(fontWeight: FontWeight.bold)), + IconButton( + icon: const Icon(Icons.content_copy, size: 20), + tooltip: '复制代码', + onPressed: () { + if (widget.codeController.text.isNotEmpty) { + Clipboard.setData(ClipboardData(text: widget.codeController.text)); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('已复制到剪贴板'))); + } + }, + ), + ], + ), + ), + Flexible(child: _buildCodeEditor()), + ], + ); + } Widget _buildCheckboxSection() { return SizedBox( @@ -36,15 +126,7 @@ class MemoryTableRightSide extends StatelessWidget { Widget _buildCheckbox(String label) { return Row( mainAxisSize: MainAxisSize.min, - children: [ - Checkbox( - value: false, // Replace with your actual value - onChanged: (bool? value) { - // Handle checkbox change - }, - ), - Text(label), - ], + children: [Checkbox(value: false, onChanged: (bool? value) {}), Text(label)], ); } @@ -52,14 +134,13 @@ class MemoryTableRightSide extends StatelessWidget { return Card( child: Padding( padding: const EdgeInsets.all(8), - // 保留内部的Expanded child: Container( decoration: BoxDecoration( border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(4), ), child: TextField( - controller: codeController, + controller: widget.codeController, maxLines: null, expands: true, decoration: const InputDecoration( @@ -72,35 +153,4 @@ class MemoryTableRightSide extends StatelessWidget { ), ); } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _buildCheckboxSection(), - Padding( - padding: const EdgeInsets.only(left: 8.0, right: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text('生成代码:', style: TextStyle(fontWeight: FontWeight.bold)), - IconButton( - icon: const Icon(Icons.content_copy, size: 20), - tooltip: '复制代码', - onPressed: () { - if (codeController.text.isNotEmpty) { - Clipboard.setData(ClipboardData(text: codeController.text)); - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('已复制到剪贴板'))); - } - }, - ), - ], - ), - ), - Flexible(child: _buildCodeEditor()), - ], - ); - } } diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart index 7e9bd91..6433ea8 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart @@ -58,7 +58,13 @@ class _MemoryTableViewState extends State { Expanded(flex: 5, child: MemoryTableLeftSide(controller: controller)), const SizedBox(width: 8), // 右侧部分 (50%) - Expanded(flex: 5, child: MemoryTableRightSide(codeController: _codeController)), + Expanded( + flex: 5, + child: MemoryTableRightSide( + codeController: _codeController, + controller: controller, + ), + ), ], ), ); diff --git a/win_text_editor/pubspec.lock b/win_text_editor/pubspec.lock index 97b1813..3aa3e8c 100644 --- a/win_text_editor/pubspec.lock +++ b/win_text_editor/pubspec.lock @@ -589,6 +589,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + yaml: + dependency: "direct main" + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" sdks: dart: ">=3.7.0 <4.0.0" flutter: ">=3.27.0" diff --git a/win_text_editor/pubspec.yaml b/win_text_editor/pubspec.yaml index c1cc95b..5ad7e00 100644 --- a/win_text_editor/pubspec.yaml +++ b/win_text_editor/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: shared_preferences: ^2.2.1 hive: ^2.2.3 hive_flutter: ^1.1.0 + yaml: ^3.1.1 dev_dependencies: flutter_test: @@ -34,3 +35,5 @@ dev_dependencies: flutter: uses-material-design: true + assets: + - assets/config/