Rich text editor for Flutter
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.
 
 
 
 
 

85 lines
2.5 KiB

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