Browse Source

框架OK

master
hejl 2 months ago
parent
commit
ddd0f4d271
  1. 11
      win_text_editor/lib/framework/controllers/tab_items_controller.dart
  2. 4
      win_text_editor/lib/menus/app_menu.dart
  3. 5
      win_text_editor/lib/menus/menu_actions.dart
  4. 1
      win_text_editor/lib/menus/menu_constants.dart
  5. 2
      win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart
  6. 3
      win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart
  7. 15
      win_text_editor/lib/modules/memory_table/models/memory_table.dart
  8. 2
      win_text_editor/lib/modules/memory_table/services/memory_table_service.dart
  9. 5
      win_text_editor/lib/modules/module_router.dart
  10. 113
      win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart
  11. 40
      win_text_editor/lib/modules/uft_component/models/uft_component.dart
  12. 19
      win_text_editor/lib/modules/uft_component/services/uft_component_service.dart
  13. 70
      win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart
  14. 136
      win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart
  15. 76
      win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart
  16. 2
      win_text_editor/lib/shared/base/base_data_source.dart
  17. 15
      win_text_editor/lib/shared/models/std_filed.dart
  18. 71
      win_text_editor/lib/shared/uft_std_fields/field_data_service.dart
  19. 2
      win_text_editor/lib/shared/uft_std_fields/field_data_source.dart
  20. 2
      win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart

11
win_text_editor/lib/framework/controllers/tab_items_controller.dart

@ -1,3 +1,5 @@ @@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_js/quickjs/ffi.dart';
import 'package:win_text_editor/framework/models/tab_model.dart';
@ -111,15 +113,20 @@ class TabItemsController with ChangeNotifier { @@ -111,15 +113,20 @@ class TabItemsController with ChangeNotifier {
void handleFileDoubleTap(String filePath) {
if (activeContentController == null) {
final fileExtension = _getFileExtension(filePath);
final fileName = filePath.split(Platform.pathSeparator).last;
if (fileName == "component.xml") {
openOrActivateTab("标准组件", RouterKey.uftComponent, Icons.extension);
} else {
final fileExtension = _getFileExtension(fileName);
switch (fileExtension) {
case 'uftstructure':
openOrActivateTab("内存表", RouterKey.memoryTable, Icons.drive_file_move);
openOrActivateTab("内存表", RouterKey.memoryTable, Icons.list);
break;
default:
Logger().error("没有活动的内容控制器", source: 'TabItemsController');
}
}
}
activeContentController?.onOpenFile(filePath);
}

4
win_text_editor/lib/menus/app_menu.dart

@ -56,6 +56,10 @@ class AppMenu extends StatelessWidget { @@ -56,6 +56,10 @@ class AppMenu extends StatelessWidget {
value: MenuConstants.memoryTable,
child: ListTile(leading: Icon(Icons.list), title: Text('内存表')),
),
const PopupMenuItem<String>(
value: MenuConstants.uftComponent,
child: ListTile(leading: Icon(Icons.extension), title: Text('标准组件')),
),
];
}

5
win_text_editor/lib/menus/menu_actions.dart

@ -16,6 +16,7 @@ class MenuActions { @@ -16,6 +16,7 @@ class MenuActions {
MenuConstants.dataFormat: _dataFormat,
MenuConstants.dataCompare: _dataCompare,
MenuConstants.memoryTable: _memoryTable,
MenuConstants.uftComponent: _uftComponent,
MenuConstants.demo: _demo,
MenuConstants.exit: _exitApplication,
};
@ -51,6 +52,10 @@ class MenuActions { @@ -51,6 +52,10 @@ class MenuActions {
await _openOrActivateTab(context, "内存表", RouterKey.memoryTable, Icons.drive_file_move);
}
static Future<void> _uftComponent(BuildContext context) async {
await _openOrActivateTab(context, "标准组件", RouterKey.uftComponent, Icons.extension);
}
static Future<void> _dataFormat(BuildContext context) async {
await _openOrActivateTab(context, "数据格式化", RouterKey.dataFormat, Icons.date_range);
}

1
win_text_editor/lib/menus/menu_constants.dart

@ -24,6 +24,7 @@ class MenuConstants { @@ -24,6 +24,7 @@ class MenuConstants {
//Uft菜单
static const String memoryTable = 'memory_table';
static const String uftComponent = 'uft_component';
static const String uftTools = 'uft_tools';
//

2
win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
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/modules/memory_table/models/memory_table.dart';
//
class IndexesDataSource extends SelectableDataSource<Index> {

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

@ -1,9 +1,10 @@ @@ -1,9 +1,10 @@
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/shared/models/std_filed.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/shared/models/memory_table.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';

15
win_text_editor/lib/shared/models/memory_table.dart → win_text_editor/lib/modules/memory_table/models/memory_table.dart

@ -1,17 +1,4 @@ @@ -1,17 +1,4 @@
abstract class SelectableItem {
bool isSelected = false;
}
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;
}
import 'package:win_text_editor/shared/models/std_filed.dart';
class Index implements SelectableItem {
Index(this.indexName, this.isPrimary, this.indexFields, this.rule, [this.isSelected = false]);

2
win_text_editor/lib/modules/memory_table/services/memory_table_service.dart

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
// memory_table_service.dart
import 'dart:io';
import 'package:win_text_editor/shared/models/memory_table.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;

5
win_text_editor/lib/modules/module_router.dart

@ -9,6 +9,8 @@ import 'package:win_text_editor/modules/demo/controllers/demo_controller.dart'; @@ -9,6 +9,8 @@ import 'package:win_text_editor/modules/demo/controllers/demo_controller.dart';
import 'package:win_text_editor/modules/demo/widgets/demo_view.dart';
import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart';
import 'package:win_text_editor/modules/memory_table/widgets/memory_table_view.dart';
import 'package:win_text_editor/modules/uft_component/controllers/uft_component_controller.dart';
import 'package:win_text_editor/modules/uft_component/widgets/uft_component_view.dart';
import 'package:win_text_editor/shared/base/base_content_controller.dart';
import 'package:win_text_editor/modules/content_search/controllers/content_search_controller.dart';
import 'package:win_text_editor/modules/template_parser/controllers/template_parser_controller.dart';
@ -22,6 +24,7 @@ class RouterKey { @@ -22,6 +24,7 @@ class RouterKey {
static const String textEditor = 'text_editor';
static const String dataCompare = 'data_compare';
static const String memoryTable = 'memory_table';
static const String uftComponent = 'uft_component';
static const String demo = 'demo';
}
@ -33,6 +36,7 @@ class ModuleRouter { @@ -33,6 +36,7 @@ class ModuleRouter {
RouterKey.dataFormat: (tab) => DataFormatController(),
RouterKey.dataCompare: (tab) => DataCompareController(),
RouterKey.memoryTable: (tab) => MemoryTableController(),
RouterKey.uftComponent: (tab) => UftComponentController(),
RouterKey.demo: (tab) => DemoController(),
};
@ -43,6 +47,7 @@ class ModuleRouter { @@ -43,6 +47,7 @@ class ModuleRouter {
RouterKey.dataFormat: (tab, controller) => DataFormatView(tabId: tab.id),
RouterKey.dataCompare: (tab, controller) => DataCompareView(tabId: tab.id),
RouterKey.memoryTable: (tab, controller) => MemoryTableView(tabId: tab.id),
RouterKey.uftComponent: (tab, controller) => UftComponentView(tabId: tab.id),
RouterKey.demo: (tab, controller) => DemoView(tabId: tab.id),
};

113
win_text_editor/lib/modules/uft_component/controllers/uft_component_controller.dart

@ -0,0 +1,113 @@ @@ -0,0 +1,113 @@
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/shared/models/std_filed.dart';
import 'package:win_text_editor/shared/uft_std_fields/field_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';
class UftComponentController extends BaseContentController {
String? _errorMessage;
String tableName = "";
String objectId = "";
String chineseName = "";
late DataGridSource fieldsSource;
final MemoryTableService _service;
final MacroTemplateService templateService = MacroTemplateService();
// MemoryTable对象
late MemoryTable _memoryTable;
UftComponentController() : _service = MemoryTableService(Logger()) {
//
final initialFields = [Field('1', '', '', '', false), Field('2', '', '', '', false)];
final initialIndexes = [Index('', false, '', '', false)];
fieldsSource = FieldsDataSource(
initialFields,
onSelectionChanged: (index, isSelected) {
updateFieldSelection(index, isSelected);
},
);
// MemoryTable
_memoryTable = MemoryTable(tableName: '', columns: initialFields, indexes: initialIndexes);
}
String? get errorMessage => _errorMessage;
// MemoryTable
MemoryTable get memoryTable => _memoryTable;
void initTemplateService() {
if (!templateService.inited) {
templateService.init();
}
}
String? genCodeString(List<String> macroList) {
initTemplateService();
return templateService.renderTemplate(macroList, _memoryTable.toMap());
}
@override
Future<void> onOpenFile(String filePath) async {
Logger().info("Opening file: $filePath");
try {
final tableData = await _service.parseStructureFile(filePath);
// Update controller state
tableName = tableData.tableName;
chineseName = tableData.chineseName;
objectId = tableData.objectId;
// Update data sources
(fieldsSource as FieldsDataSource).updateData(tableData.fields);
// MemoryTable对象
_memoryTable = MemoryTable(
tableName: tableName,
columns: tableData.fields,
indexes: tableData.indexes,
);
// Clear any previous error
_errorMessage = null;
// Notify UI to update
notifyListeners();
} catch (e) {
_errorMessage = e.toString();
notifyListeners();
Logger().error("Error opening file: $e");
}
}
//
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();
}
}
//
@override
void onOpenFolder(String folderPath) {
//
}
@override
void dispose() {
super.dispose();
}
}

40
win_text_editor/lib/modules/uft_component/models/uft_component.dart

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
import 'package:win_text_editor/shared/models/std_filed.dart';
class UftComponent {
final String componentName;
final List<Field> columns;
UftComponent({required this.componentName, required this.columns});
List<Field> get selectFields => columns.where((field) => field.isSelected).toList();
Map<String, dynamic> toMap() {
return {
'componentName': componentName,
'fields':
columns
.map(
(field) => {
'id': field.id,
'name': field.name,
'chineseName': field.chineseName,
'type': field.type,
'isLast': columns.indexOf(field) == columns.length - 1,
},
)
.toList(),
'selectedFields':
selectFields
.map(
(field) => {
'id': field.id,
'name': field.name,
'chineseName': field.chineseName,
'type': field.type,
'isLast': selectFields.indexOf(field) == selectFields.length - 1,
},
)
.toList(),
};
}
}

19
win_text_editor/lib/modules/uft_component/services/uft_component_service.dart

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
// memory_table_service.dart
import 'package:win_text_editor/shared/models/std_filed.dart';
import 'package:win_text_editor/framework/controllers/logger.dart';
class UftComponentService {
final Logger _logger;
UftComponentService(this._logger);
}
class ComponentData {
final String name;
final String chineseName;
final List<Field> fields;
ComponentData({required this.name, required this.chineseName, required this.fields});
}

70
win_text_editor/lib/modules/uft_component/widgets/uft_component_left_side.dart

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import 'package:win_text_editor/modules/uft_component/controllers/uft_component_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 UftComponentLeftSide extends StatelessWidget {
final UftComponentController controller;
const UftComponentLeftSide({super.key, required this.controller});
Widget _buildTextFieldRow(String label, String value) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Text('$label:'),
SizedBox(
width: 200,
child: TextField(
controller: TextEditingController(text: value),
readOnly: true,
decoration: const InputDecoration(isDense: true, contentPadding: EdgeInsets.all(8)),
),
),
],
);
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: double.infinity,
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Wrap(
spacing: 16,
runSpacing: 8,
children: [
_buildTextFieldRow('名称', controller.tableName),
_buildTextFieldRow('中文名', controller.chineseName),
_buildTextFieldRow('对象编号', controller.objectId),
],
),
),
),
),
const SizedBox(height: 8),
const Padding(
padding: EdgeInsets.all(8.0),
child: Text('字段列表', style: TextStyle(fontWeight: FontWeight.bold)),
),
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)),
),
],
);
}
}

136
win_text_editor/lib/modules/uft_component/widgets/uft_component_right_side.dart

@ -0,0 +1,136 @@ @@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:win_text_editor/modules/uft_component/controllers/uft_component_controller.dart';
class UftComponentRightSide extends StatefulWidget {
final UftComponentController controller;
final TextEditingController codeController;
const UftComponentRightSide({super.key, required this.controller, required this.codeController});
@override
State<UftComponentRightSide> createState() => _UftComponentRightSideState();
}
class _UftComponentRightSideState extends State<UftComponentRightSide> {
final List<String> _selectedOperations = [];
@override
void initState() {
super.initState();
widget.controller.initTemplateService();
widget.controller.addListener(_updateDisplay);
}
@override
void dispose() {
widget.controller.removeListener(_updateDisplay);
super.dispose();
}
void _updateDisplay() {
widget.codeController.text = widget.controller.genCodeString(_selectedOperations)!;
}
void _toggleOperation(String operation, bool? value) {
setState(() {
if (value == true) {
_selectedOperations.add(operation);
} else {
_selectedOperations.remove(operation);
}
_updateDisplay();
});
}
@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 (widget.codeController.text.isNotEmpty) {
Clipboard.setData(ClipboardData(text: widget.codeController.text));
ScaffoldMessenger.of(
context,
).showSnackBar(const SnackBar(content: Text('已复制到剪贴板')));
}
},
),
],
),
),
Flexible(child: _buildCodeEditor()),
],
);
}
Widget _buildCheckboxSection() {
final operations = ['获取记录', '获取记录数', '插入记录', '修改记录', '删除记录', '遍历记录'];
return SizedBox(
width: double.infinity,
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Wrap(
spacing: 16,
runSpacing: 8,
children: operations.map((op) => _buildCheckbox(op)).toList(),
),
],
),
),
),
);
}
Widget _buildCheckbox(String label) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Checkbox(
value: _selectedOperations.contains(label),
onChanged: (bool? value) => _toggleOperation(label, value),
),
Text(label),
],
);
}
Widget _buildCodeEditor() {
return Card(
child: Padding(
padding: const EdgeInsets.all(8),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(4),
),
child: TextField(
controller: widget.codeController,
maxLines: null,
expands: true,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.all(8),
),
style: const TextStyle(fontFamily: 'monospace', color: Colors.blueAccent),
),
),
),
);
}
}

76
win_text_editor/lib/modules/uft_component/widgets/uft_component_view.dart

@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
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/uft_component/controllers/uft_component_controller.dart';
import 'uft_component_left_side.dart';
import 'uft_component_right_side.dart';
class UftComponentView extends StatefulWidget {
final String tabId;
const UftComponentView({super.key, required this.tabId});
@override
State<UftComponentView> createState() => _UftComponentViewState();
}
class _UftComponentViewState extends State<UftComponentView> {
late final UftComponentController _controller;
final TextEditingController _codeController = TextEditingController();
bool _isControllerFromTabManager = false;
get tabManager => Provider.of<TabItemsController>(context, listen: false);
@override
void initState() {
super.initState();
final controllerFromManager = tabManager.getController(widget.tabId);
if (controllerFromManager != null) {
_controller = controllerFromManager;
_isControllerFromTabManager = true;
} else {
_controller = UftComponentController();
_isControllerFromTabManager = false;
tabManager.registerController(widget.tabId, _controller);
}
}
@override
void dispose() {
if (!_isControllerFromTabManager) {
_controller.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider.value(
value: _controller,
child: Consumer<UftComponentController>(
builder: (context, controller, child) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// (50%)
Expanded(flex: 5, child: UftComponentLeftSide(controller: controller)),
const SizedBox(width: 8),
// (50%)
Expanded(
flex: 5,
child: UftComponentRightSide(
codeController: _codeController,
controller: controller,
),
),
],
),
);
},
),
);
}
}

2
win_text_editor/lib/shared/base/base_data_source.dart

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:win_text_editor/shared/models/memory_table.dart';
import 'package:win_text_editor/shared/models/std_filed.dart';
abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSource {
SelectableDataSource(this.items, {this.onSelectionChanged}) {

15
win_text_editor/lib/shared/models/std_filed.dart

@ -13,3 +13,18 @@ class StdField { @@ -13,3 +13,18 @@ class StdField {
StdField({required this.name, required this.chineseName, required this.dateType});
}
abstract class SelectableItem {
bool isSelected = false;
}
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;
}

71
win_text_editor/lib/shared/uft_std_fields/field_data_service.dart

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
import 'dart:io';
import 'package:win_text_editor/framework/controllers/logger.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;
class FieldDataService {
final Logger _logger;
FieldDataService(this._logger);
Future<File?> findMetadataFile(String filePath) async {
Directory currentDir = File(filePath).parent;
const targetDirName = 'metadata';
const targetFileName = 'stdfield.stdfield';
// metadata
while (true) {
final metadataDir = Directory('${currentDir.path}/$targetDirName');
if (await metadataDir.exists()) {
final stdFieldFile = File('${metadataDir.path}/$targetFileName');
if (await stdFieldFile.exists()) {
return stdFieldFile;
} else {
_logger.error("没找到标准字段文件 $targetFileName");
return null;
}
}
//
if (currentDir.path == currentDir.parent.path) {
_logger.error("没有找到元数据目录 $targetDirName");
return null;
}
currentDir = currentDir.parent;
}
}
//
Future<void> processStdFieldFile(File stdFieldFile) async {
try {
final content = await stdFieldFile.readAsString();
final document = xml.XmlDocument.parse(content);
final items = document.findAllElements('items');
for (final item in items) {
final name = item.getAttribute('name') ?? '';
final chineseName = item.getAttribute('chineseName') ?? '';
final dataType = item.getAttribute('dataType') ?? '';
if (name.isNotEmpty) {
final stdField = StdField(name: name, chineseName: chineseName, dateType: dataType);
await StdFieldsCache.setData(name, stdField);
}
}
} catch (e) {
_logger.error("处理标准字段文件时出错: $e");
}
}
List<Field> getDefaultFields() {
return [Field('1', '', '', ''), Field('2', '', '', ''), Field('3', '', '', '')];
}
List<Index> getDefaultIndexes() {
return [Index('', false, '', ''), Index('', false, '', '')];
}
}

2
win_text_editor/lib/shared/uft_std_fields/field_data_source.dart

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
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/models/std_filed.dart';
class FieldsDataSource extends SelectableDataSource<Field> {
FieldsDataSource(

2
win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
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/models/std_filed.dart';
import 'package:win_text_editor/shared/uft_std_fields/field_data_source.dart';
class FieldsDataGrid extends StatelessWidget {

Loading…
Cancel
Save