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 @@ @@ -1,6 +1,5 @@
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;
@ -21,28 +20,28 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo @@ -21,28 +20,28 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo
items[i].isSelected = value;
onSelectionChanged?.call(i, value);
}
_updateSelectionState();
updateSelectionState();
notifyListeners();
}
void toggleRowSelection(int index, bool? value) {
final newValue = value ?? false;
items[index].isSelected = newValue;
_updateSelectionState();
updateSelectionState();
notifyListeners();
//
onSelectionChanged?.call(index, newValue);
}
void _updateSelectionState() {
void updateSelectionState() {
final allSelected = items.isNotEmpty && items.every((item) => item.isSelected);
final someSelected = items.isNotEmpty && items.any((item) => item.isSelected);
_selectionNotifier.value = allSelected || someSelected;
}
void updateDataGridSource() {
_updateSelectionState();
updateSelectionState();
notifyListeners();
}
@ -51,100 +50,3 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo @@ -51,100 +50,3 @@ abstract class SelectableDataSource<T extends SelectableItem> extends DataGridSo
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 @@ @@ -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 @@ @@ -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'; @@ -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/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/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/services/memory_table_service.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 { @@ -22,6 +22,8 @@ class Index implements SelectableItem {
@override
bool isSelected;
String get id => indexName;
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 @@ @@ -1,6 +1,8 @@
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';
class MemoryTableLeftSide extends StatelessWidget {
@ -139,9 +141,10 @@ class MemoryTableLeftSide extends StatelessWidget { @@ -139,9 +141,10 @@ class MemoryTableLeftSide extends StatelessWidget {
columns: [
GridColumn(
columnName: 'select',
label: ValueListenableBuilder<bool>(
valueListenable: indexesSource.selectionNotifier,
builder: (context, _, __) => _buildCheckboxHeader(context, indexesSource),
label: Container(
alignment: Alignment.center,
color: Colors.grey[200],
child: const Text('选择', style: TextStyle(fontWeight: FontWeight.bold)),
),
width: 60,
),
@ -170,10 +173,11 @@ class MemoryTableLeftSide extends StatelessWidget { @@ -170,10 +173,11 @@ class MemoryTableLeftSide extends StatelessWidget {
if (details.column.columnName == 'select') {
final rowIndex = details.rowColumnIndex.rowIndex - 1;
if (rowIndex >= 0 && rowIndex < indexesSource.items.length) {
indexesSource.toggleRowSelection(
rowIndex,
!indexesSource.items[rowIndex].isSelected,
);
//
for (var i = 0; i < indexesSource.items.length; i++) {
indexesSource.toggleRowSelection(i, false);
}
indexesSource.toggleRowSelection(rowIndex, true);
}
}
},

Loading…
Cancel
Save