Browse Source

模板加载OK

master
hejl 2 months ago
parent
commit
e7129dadec
  1. 27
      win_text_editor/assets/config/uft_macro_list.yaml
  2. 68
      win_text_editor/lib/framework/services/macro_template_service.dart
  3. 51
      win_text_editor/lib/framework/services/uft_macro_service.dart
  4. 10
      win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart
  5. 62
      win_text_editor/lib/modules/memory_table/models/memory_table.dart
  6. 64
      win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart
  7. 1
      win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart

27
win_text_editor/assets/config/uft_macro_list.yaml

@ -1,13 +1,16 @@ @@ -1,13 +1,16 @@
获取记录:|
<M>[获取记录][{{tableName}}({{keyName}})
][
{{#keyFields}}
{{.}} = @{{.}}{{^@last}}, {{/@last}}
{{/keyFields}}
]
[继续执行]
[记录为空][{{tableName}}]
{
[报错返回][][{{#keyFields}}{{.}} = @{{.}}{{^@last}}, {{/@last}}{{/keyFields}}]
}
templates:
获取记录:
header: "<M>[获取记录][{{tableName}}({{keyName}})"
body: |
][
{{#keyFields}}
{{value}} = @{{value}} {{^isLast}}, {{/isLast}}
{{/keyFields}}
]
footer: |
[继续执行]
[记录为空][{{tableName}}]
{
[报错返回][ERR_???][{{#keyFields}}{{value}} = @{{value}}{{^isLast}}, {{/isLast}}{{/keyFields}}]
}

68
win_text_editor/lib/framework/services/macro_template_service.dart

@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
import 'package:flutter/services.dart' show rootBundle;
import 'package:yaml/yaml.dart';
import 'package:mustache_template/mustache_template.dart' as mustache;
class MacroTemplateService {
final Map<String, dynamic> _templates = {};
bool _inited = false;
bool get inited => _inited;
Future<void> init() async {
try {
final configString = await rootBundle.loadString('assets/config/uft_macro_list.yaml');
final yamlMap = loadYaml(configString);
if (yamlMap is! YamlMap) {
throw const FormatException('Invalid YAML structure: root should be a map');
}
final templates = yamlMap['templates'];
if (templates is YamlMap) {
_templates.clear();
templates.forEach((key, value) {
if (value is YamlMap) {
_templates[key] = {
'header': value['header']?.toString() ?? '',
'body': value['body']?.toString() ?? '',
'footer': value['footer']?.toString() ?? '',
};
}
});
}
_inited = true;
} catch (e) {
throw Exception('Failed to load macro templates: $e');
}
}
Map<String, dynamic>? getTemplate(String templateName) {
return _templates[templateName] is Map
? Map<String, dynamic>.from(_templates[templateName])
: null;
}
String renderTemplate(List<String> templateList, Map<String, dynamic> context) {
StringBuffer buffer = StringBuffer();
for (var templateName in templateList) {
final template = getTemplate(templateName);
if (template == null) throw Exception('Template $templateName not found');
buffer.writeln(
[
_render(template['header'], context),
_render(template['body'], context),
_render(template['footer'], context),
].join('\n'),
);
buffer.writeln();
}
return buffer.toString();
}
String _render(String template, Map<String, dynamic> context) {
final t = mustache.Template(template);
return t.renderString(context);
}
}

51
win_text_editor/lib/framework/services/uft_macro_service.dart

@ -1,51 +0,0 @@ @@ -1,51 +0,0 @@
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<String, dynamic> _config;
static bool _isInitialized = false;
//
Future<void> 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<T> getList<T>(String key) {
final list = _config[key] as List;
return list.cast<T>();
}
}

10
win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
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/models/memory_table.dart';
import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart';
@ -14,6 +15,7 @@ class MemoryTableController extends BaseContentController { @@ -14,6 +15,7 @@ class MemoryTableController extends BaseContentController {
late DataGridSource fieldsSource;
late DataGridSource indexesSource;
final MemoryTableService _service;
final MacroTemplateService templateService = MacroTemplateService();
// MemoryTable对象
late MemoryTable _memoryTable;
@ -47,6 +49,14 @@ class MemoryTableController extends BaseContentController { @@ -47,6 +49,14 @@ class MemoryTableController extends BaseContentController {
// MemoryTable
MemoryTable get memoryTable => _memoryTable;
String? genCodeString(List<String> macroList) {
if (!templateService.inited) {
templateService.init();
}
return templateService.renderTemplate(macroList, _memoryTable.toMap());
}
@override
Future<void> onOpenFile(String filePath) async {
Logger().info("Opening file: $filePath");

62
win_text_editor/lib/modules/memory_table/models/memory_table.dart

@ -31,4 +31,66 @@ class MemoryTable { @@ -31,4 +31,66 @@ class MemoryTable {
final List<Index> indexes;
MemoryTable({required this.tableName, required this.columns, required this.indexes});
//,
String? get keyName {
Index? index;
for (var i in indexes) {
if (!i.isPrimary) continue;
if (index == null) {
index = i;
if (i.isSelected) break;
} else if (i.isSelected) {
index = i;
}
}
return index?.indexName;
}
//
List<String> get keyFields {
var name = keyName;
if (name!.isEmpty) return [];
for (var index in indexes) {
if (index.indexName == name) {
return index.fields;
}
}
return [];
}
Map<String, dynamic> toMap() {
return {
'tableName': tableName,
'fields':
columns
.map(
(field) => {
'id': field.id,
'name': field.name,
'chineseName': field.chineseName,
'type': field.type,
'isSelected': field.isSelected,
},
)
.toList(),
'indexes':
indexes
.map(
(index) => {
'indexName': index.indexName,
'isPrimary': index.isPrimary,
'indexFields': index.indexFields,
'rule': index.rule,
'isSelected': index.isSelected,
},
)
.toList(),
'keyName': keyName,
'keyFields':
keyFields.asMap().entries.map((entry) {
return {'value': entry.value, 'isLast': entry.key == keyFields.length - 1};
}).toList(),
};
}
}

64
win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.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 StatefulWidget {
final MemoryTableController controller;
@ -14,12 +13,12 @@ class MemoryTableRightSide extends StatefulWidget { @@ -14,12 +13,12 @@ class MemoryTableRightSide extends StatefulWidget {
}
class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
final List<String> _selectedOperations = [];
@override
void initState() {
super.initState();
//
widget.controller.addListener(_updateDisplay);
_updateDisplay();
}
@override
@ -29,38 +28,18 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> { @@ -29,38 +28,18 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
}
void _updateDisplay() {
final table = widget.controller.memoryTable;
widget.codeController.text = _formatMemoryTable(table);
widget.codeController.text = widget.controller.genCodeString(_selectedOperations)!;
}
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');
void _toggleOperation(String operation, bool? value) {
setState(() {
if (value == true) {
_selectedOperations.add(operation);
} else {
_selectedOperations.remove(operation);
}
buffer.writeln();
}
return buffer.toString();
_updateDisplay();
});
}
@override
@ -73,7 +52,7 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> { @@ -73,7 +52,7 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('MemoryTable 数据:', style: TextStyle(fontWeight: FontWeight.bold)),
const Text('生成代码:', style: TextStyle(fontWeight: FontWeight.bold)),
IconButton(
icon: const Icon(Icons.content_copy, size: 20),
tooltip: '复制代码',
@ -95,6 +74,8 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> { @@ -95,6 +74,8 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
}
Widget _buildCheckboxSection() {
final operations = ['获取记录', '获取记录数', '插入记录', '修改记录', '删除记录', '遍历记录'];
return SizedBox(
width: double.infinity,
child: Card(
@ -106,14 +87,7 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> { @@ -106,14 +87,7 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
Wrap(
spacing: 16,
runSpacing: 8,
children: [
_buildCheckbox('获取记录'),
_buildCheckbox('获取记录数'),
_buildCheckbox('插入记录'),
_buildCheckbox('修改记录'),
_buildCheckbox('删除记录'),
_buildCheckbox('遍历记录'),
],
children: operations.map((op) => _buildCheckbox(op)).toList(),
),
],
),
@ -125,7 +99,13 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> { @@ -125,7 +99,13 @@ class _MemoryTableRightSideState extends State<MemoryTableRightSide> {
Widget _buildCheckbox(String label) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [Checkbox(value: false, onChanged: (bool? value) {}), Text(label)],
children: [
Checkbox(
value: _selectedOperations.contains(label),
onChanged: (bool? value) => _toggleOperation(label, value),
),
Text(label),
],
);
}

1
win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart

@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:win_text_editor/framework/controllers/tab_items_controller.dart';
import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart';
import 'memory_table_left_side.dart';
import 'memory_table_right_side.dart';

Loading…
Cancel
Save