Browse Source

将标准字段控件剥离成共享控件

master
hejl 2 months ago
parent
commit
4f40a7ab70
  1. 4
      win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart
  2. 5
      win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart
  3. 2
      win_text_editor/lib/modules/memory_table/services/memory_table_service.dart
  4. 101
      win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart
  5. 5
      win_text_editor/lib/shared/base/base_data_source.dart
  6. 5
      win_text_editor/lib/shared/models/memory_table.dart
  7. 4
      win_text_editor/lib/shared/uft_std_fields/field_data_source.dart
  8. 110
      win_text_editor/lib/shared/uft_std_fields/fields_data_grid.dart

4
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/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<Index> {

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

@ -1,10 +1,9 @@ @@ -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';

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/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;

101
win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart

@ -1,9 +1,9 @@ @@ -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 { @@ -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<bool>(
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<T extends SelectableItem>(
BuildContext context,
SelectableDataSource<T> 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 { @@ -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)),

5
win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart → win_text_editor/lib/shared/base/base_data_source.dart

@ -1,9 +1,6 @@ @@ -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<T extends SelectableItem> extends DataGridSource {
SelectableDataSource(this.items, {this.onSelectionChanged}) {

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

@ -1,4 +1,6 @@ @@ -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 { @@ -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]);

4
win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart → 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/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<Field> {
FieldsDataSource(

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

@ -0,0 +1,110 @@ @@ -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<T extends SelectableItem>(
BuildContext context,
SelectableDataSource<T> 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<bool>(
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,
);
}
}
},
),
);
},
),
),
],
),
);
}
}
Loading…
Cancel
Save