Browse Source

改成了单选按钮了

master
hejl 2 months ago
parent
commit
b49a222196
  1. 106
      win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart
  2. 52
      win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart
  3. 80
      win_text_editor/lib/modules/memory_table/controllers/index_data_source.dart
  4. 2
      win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart
  5. 2
      win_text_editor/lib/modules/memory_table/models/memory_table.dart
  6. 18
      win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart

106
win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:win_text_editor/modules/memory_table/models/memory_table.dart';
abstract class SelectableItem { abstract class SelectableItem {
bool isSelected = false; bool isSelected = false;
@ -21,28 +20,28 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo
items[i].isSelected = value; items[i].isSelected = value;
onSelectionChanged?.call(i, value); onSelectionChanged?.call(i, value);
} }
_updateSelectionState(); updateSelectionState();
notifyListeners(); notifyListeners();
} }
void toggleRowSelection(int index, bool? value) { void toggleRowSelection(int index, bool? value) {
final newValue = value ?? false; final newValue = value ?? false;
items[index].isSelected = newValue; items[index].isSelected = newValue;
_updateSelectionState(); updateSelectionState();
notifyListeners(); notifyListeners();
// //
onSelectionChanged?.call(index, newValue); onSelectionChanged?.call(index, newValue);
} }
void _updateSelectionState() { void updateSelectionState() {
final allSelected = items.isNotEmpty && items.every((item) => item.isSelected); final allSelected = items.isNotEmpty && items.every((item) => item.isSelected);
final someSelected = items.isNotEmpty && items.any((item) => item.isSelected); final someSelected = items.isNotEmpty && items.any((item) => item.isSelected);
_selectionNotifier.value = allSelected || someSelected; _selectionNotifier.value = allSelected || someSelected;
} }
void updateDataGridSource() { void updateDataGridSource() {
_updateSelectionState(); updateSelectionState();
notifyListeners(); notifyListeners();
} }
@ -51,100 +50,3 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo
notifyListeners(); notifyListeners();
} }
} }
class FieldsDataSource extends SelectableDataSource<Field> {
FieldsDataSource(
List<Field> fields, {
required Null Function(dynamic index, dynamic isSelected) onSelectionChanged,
}) : super(fields, onSelectionChanged: onSelectionChanged);
@override
List<DataGridRow> get rows =>
items
.map(
(field) => DataGridRow(
cells: [
DataGridCell<bool>(columnName: 'select', value: field.isSelected),
DataGridCell<String>(columnName: 'id', value: field.id),
DataGridCell<String>(columnName: 'name', value: field.name),
DataGridCell<String>(columnName: 'chineseName', value: field.chineseName),
DataGridCell<String>(columnName: 'type', value: field.type),
],
),
)
.toList();
get data => items;
@override
DataGridRowAdapter buildRow(DataGridRow row) {
final rowIndex = effectiveRows.indexOf(row);
return DataGridRowAdapter(
cells:
row.getCells().map<Widget>((cell) {
if (cell.columnName == 'select') {
return Center(
child: Checkbox(
value: items[rowIndex].isSelected,
onChanged: (value) => toggleRowSelection(rowIndex, value),
),
);
}
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis),
);
}).toList(),
);
}
}
//
class IndexesDataSource extends SelectableDataSource<Index> {
IndexesDataSource(
List<Index> indexes, {
required Null Function(dynamic index, dynamic isSelected) onSelectionChanged,
}) : super(indexes, onSelectionChanged: onSelectionChanged);
@override
List<DataGridRow> get rows =>
items
.map(
(index) => DataGridRow(
cells: [
DataGridCell<bool>(columnName: 'select', value: index.isSelected),
DataGridCell<String>(columnName: 'indexName', value: index.indexName),
DataGridCell<bool>(columnName: 'isPrimary', value: index.isPrimary),
DataGridCell<String>(columnName: 'indexFields', value: index.indexFields),
DataGridCell<String>(columnName: 'rule', value: index.rule),
],
),
)
.toList();
get data => items;
@override
DataGridRowAdapter buildRow(DataGridRow row) {
final rowIndex = effectiveRows.indexOf(row);
return DataGridRowAdapter(
cells:
row.getCells().map<Widget>((cell) {
if (cell.columnName == 'select') {
return Center(
child: Checkbox(
value: items[rowIndex].isSelected,
onChanged: (value) => toggleRowSelection(rowIndex, value),
),
);
}
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis),
);
}).toList(),
);
}
}

52
win_text_editor/lib/modules/memory_table/controllers/field_data_source.dart

@ -0,0 +1,52 @@
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';
class FieldsDataSource extends SelectableDataSource<Field> {
FieldsDataSource(
List<Field> fields, {
required Null Function(dynamic index, dynamic isSelected) onSelectionChanged,
}) : super(fields, onSelectionChanged: onSelectionChanged);
@override
List<DataGridRow> get rows =>
items
.map(
(field) => DataGridRow(
cells: [
DataGridCell<bool>(columnName: 'select', value: field.isSelected),
DataGridCell<String>(columnName: 'id', value: field.id),
DataGridCell<String>(columnName: 'name', value: field.name),
DataGridCell<String>(columnName: 'chineseName', value: field.chineseName),
DataGridCell<String>(columnName: 'type', value: field.type),
],
),
)
.toList();
get data => items;
@override
DataGridRowAdapter buildRow(DataGridRow row) {
final rowIndex = effectiveRows.indexOf(row);
return DataGridRowAdapter(
cells:
row.getCells().map<Widget>((cell) {
if (cell.columnName == 'select') {
return Center(
child: Checkbox(
value: items[rowIndex].isSelected,
onChanged: (value) => toggleRowSelection(rowIndex, value),
),
);
}
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis),
);
}).toList(),
);
}
}

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

@ -0,0 +1,80 @@
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';
//
class IndexesDataSource extends SelectableDataSource<Index> {
// ID
String? _selectedId;
IndexesDataSource(
List<Index> indexes, {
required Null Function(dynamic index, dynamic isSelected) onSelectionChanged,
}) : super(indexes, onSelectionChanged: onSelectionChanged);
@override
List<DataGridRow> get rows =>
items
.map(
(index) => DataGridRow(
cells: [
DataGridCell<bool>(columnName: 'select', value: index.isSelected),
DataGridCell<String>(columnName: 'indexName', value: index.indexName),
DataGridCell<bool>(columnName: 'isPrimary', value: index.isPrimary),
DataGridCell<String>(columnName: 'indexFields', value: index.indexFields),
DataGridCell<String>(columnName: 'rule', value: index.rule),
],
),
)
.toList();
get data => items;
@override
DataGridRowAdapter buildRow(DataGridRow row) {
final rowIndex = effectiveRows.indexOf(row);
final index = items[rowIndex];
return DataGridRowAdapter(
cells:
row.getCells().map<Widget>((cell) {
if (cell.columnName == 'select') {
return Center(
child: Radio<String>(
value: index.id, // 使value
groupValue: _selectedId, // ID
onChanged: (String? value) {
_selectedId = value;
toggleRowSelection(rowIndex, value != null);
notifyListeners(); //
},
),
);
}
return Container(
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 8),
child: Text(cell.value.toString(), overflow: TextOverflow.ellipsis),
);
}).toList(),
);
}
//
@override
void toggleRowSelection(int index, bool? value) {
final newValue = value ?? false;
if (newValue) {
//
for (var item in items) {
item.isSelected = false;
}
_selectedId = items[index].id; // ID
}
items[index].isSelected = newValue;
updateSelectionState();
notifyListeners();
onSelectionChanged?.call(index, newValue);
}
}

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

@ -2,6 +2,8 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart';
import 'package:win_text_editor/framework/controllers/logger.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/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/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/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/modules/memory_table/services/memory_table_service.dart';
import 'package:win_text_editor/shared/base/base_content_controller.dart'; import 'package:win_text_editor/shared/base/base_content_controller.dart';

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

@ -22,6 +22,8 @@ class Index implements SelectableItem {
@override @override
bool isSelected; bool isSelected;
String get id => indexName;
List<String> get fields => indexFields.split(',').map((e) => e.trim()).toList(); List<String> get fields => indexFields.split(',').map((e) => e.trim()).toList();
} }

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

@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datagrid/datagrid.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/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/modules/memory_table/controllers/memory_table_controller.dart';
class MemoryTableLeftSide extends StatelessWidget { class MemoryTableLeftSide extends StatelessWidget {
@ -139,9 +141,10 @@ class MemoryTableLeftSide extends StatelessWidget {
columns: [ columns: [
GridColumn( GridColumn(
columnName: 'select', columnName: 'select',
label: ValueListenableBuilder<bool>( label: Container(
valueListenable: indexesSource.selectionNotifier, alignment: Alignment.center,
builder: (context, _, __) => _buildCheckboxHeader(context, indexesSource), color: Colors.grey[200],
child: const Text('选择', style: TextStyle(fontWeight: FontWeight.bold)),
), ),
width: 60, width: 60,
), ),
@ -170,10 +173,11 @@ class MemoryTableLeftSide extends StatelessWidget {
if (details.column.columnName == 'select') { if (details.column.columnName == 'select') {
final rowIndex = details.rowColumnIndex.rowIndex - 1; final rowIndex = details.rowColumnIndex.rowIndex - 1;
if (rowIndex >= 0 && rowIndex < indexesSource.items.length) { if (rowIndex >= 0 && rowIndex < indexesSource.items.length) {
indexesSource.toggleRowSelection( //
rowIndex, for (var i = 0; i < indexesSource.items.length; i++) {
!indexesSource.items[rowIndex].isSelected, indexesSource.toggleRowSelection(i, false);
); }
indexesSource.toggleRowSelection(rowIndex, true);
} }
} }
}, },

Loading…
Cancel
Save