dartlangeditorflutterflutter-appsflutter-examplesflutter-packageflutter-widgetquillquill-deltaquilljsreactquillrich-textrich-text-editorwysiwygwysiwyg-editor
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.5 KiB
86 lines
2.5 KiB
10 months ago
|
import 'package:flutter/widgets.dart'
|
||
|
show
|
||
|
BuildContext,
|
||
|
MediaQuery,
|
||
|
Offset,
|
||
|
Overlay,
|
||
|
Rect,
|
||
|
RelativeRect,
|
||
|
RenderBox,
|
||
|
Size,
|
||
|
TextSelection;
|
||
|
import 'package:flutter_quill/flutter_quill.dart';
|
||
|
import 'package:flutter_quill/quill_delta.dart';
|
||
|
|
||
|
enum TableOperation {
|
||
|
addColumn,
|
||
|
addRow,
|
||
|
removeColumn,
|
||
|
removeRow,
|
||
|
}
|
||
|
|
||
|
RelativeRect renderPosition(BuildContext context, [Size? size]) {
|
||
|
size ??= MediaQuery.sizeOf(context);
|
||
|
final overlay = Overlay.of(context).context.findRenderObject() as RenderBox;
|
||
|
final button = context.findRenderObject() as RenderBox;
|
||
|
final position = RelativeRect.fromRect(
|
||
|
Rect.fromPoints(
|
||
|
button.localToGlobal(const Offset(0, -65), ancestor: overlay),
|
||
|
button.localToGlobal(
|
||
|
button.size.bottomRight(Offset.zero) + const Offset(-50, 0),
|
||
|
ancestor: overlay),
|
||
|
),
|
||
|
Offset.zero & size * 0.40,
|
||
|
);
|
||
|
return position;
|
||
|
}
|
||
|
|
||
|
void insertTable(int rows, int columns, QuillController quillController,
|
||
|
ChangeSource? changeFrom) {
|
||
|
final tableData = _createTableData(rows, columns);
|
||
|
final delta = Delta()..insert({'table': tableData});
|
||
|
final selection = quillController.selection;
|
||
|
final replacedLength = selection.extentOffset - selection.baseOffset;
|
||
|
final newBaseOffset = selection.baseOffset;
|
||
|
final newExtentOffsetCandidate =
|
||
|
(selection.baseOffset + 1 - replacedLength).toInt();
|
||
|
final newExtentOffsetAdjusted =
|
||
|
newExtentOffsetCandidate < 0 ? 0 : newExtentOffsetCandidate;
|
||
|
quillController.replaceText(
|
||
|
newBaseOffset,
|
||
|
replacedLength,
|
||
|
delta,
|
||
|
TextSelection(
|
||
|
baseOffset: newBaseOffset, extentOffset: newExtentOffsetAdjusted),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Map<String, dynamic> _createTableData(int rows, int columns) {
|
||
|
// Crear el mapa para las columnas
|
||
|
final columnsData = <String, dynamic>{};
|
||
|
for (var col = 0; col < columns; col++) {
|
||
|
final columnId = '${col + 1}';
|
||
|
columnsData[columnId] = {'id': columnId, 'position': col};
|
||
|
}
|
||
|
|
||
|
// Crear el mapa para las filas
|
||
|
final rowsData = <String, dynamic>{};
|
||
|
for (var row = 0; row < rows; row++) {
|
||
|
final rowId = '${row + 1}';
|
||
|
rowsData[rowId] = {'id': rowId, 'cells': {}};
|
||
|
|
||
|
for (var col = 0; col < columns; col++) {
|
||
|
final columnId = '${col + 1}';
|
||
|
rowsData[rowId]['cells'][columnId] = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Combinar las columnas y filas en una estructura de tabla
|
||
|
final tableData = <String, dynamic>{
|
||
|
'columns': columnsData,
|
||
|
'rows': rowsData,
|
||
|
};
|
||
|
|
||
|
return tableData;
|
||
|
}
|