Skip to content

Commit 60803ed

Browse files
[SuperEditor] - Tasks are now indentable (Resolves #1895) (#2101)
1 parent 1bf2a8b commit 60803ed

File tree

8 files changed

+1077
-462
lines changed

8 files changed

+1077
-462
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import 'package:flutter/painting.dart';
2+
3+
/// A function that calculates the pixels to indent a text block in a document, given
4+
/// the [blockTextStyle], and the [indent] level.
5+
///
6+
/// A text block is a document block that contains text, e.g., paragraph, list item, task.
7+
typedef TextBlockIndentCalculator = double Function(TextStyle blockTextStyle, int indent);

super_editor/lib/src/default_editor/default_document_editor.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,15 @@ final defaultRequestHandlers = List.unmodifiable(<EditRequestHandler>[
164164
isComplete: request.isComplete,
165165
)
166166
: null,
167+
(request) => request is IndentTaskRequest //
168+
? IndentTaskCommand(request.nodeId)
169+
: null,
170+
(request) => request is UnIndentTaskRequest //
171+
? UnIndentTaskCommand(request.nodeId)
172+
: null,
173+
(request) => request is SetTaskIndentRequest //
174+
? SetTaskIndentCommand(request.nodeId, request.indent)
175+
: null,
167176
(request) => request is SplitExistingTaskRequest
168177
? SplitExistingTaskCommand(
169178
nodeId: request.existingNodeId,
@@ -234,4 +243,6 @@ final defaultEditorReactions = List.unmodifiable([
234243
const ImageUrlConversionReaction(),
235244
const DashConversionReaction(),
236245
//---- End Content Conversions ---
246+
247+
UpdateSubTaskIndentAfterTaskDeletionReaction(),
237248
]);

super_editor/lib/src/default_editor/list_items.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:super_editor/src/core/edit_context.dart';
66
import 'package:super_editor/src/core/editor.dart';
77
import 'package:super_editor/src/core/styles.dart';
88
import 'package:super_editor/src/default_editor/attributions.dart';
9+
import 'package:super_editor/src/default_editor/blocks/indentation.dart';
910
import 'package:super_editor/src/infrastructure/_logging.dart';
1011
import 'package:super_editor/src/infrastructure/attributed_text_styles.dart';
1112
import 'package:super_editor/src/infrastructure/keyboard.dart';
@@ -399,7 +400,7 @@ class UnorderedListItemComponent extends StatefulWidget {
399400
this.dotBuilder = _defaultUnorderedListItemDotBuilder,
400401
this.dotStyle,
401402
this.indent = 0,
402-
this.indentCalculator = _defaultIndentCalculator,
403+
this.indentCalculator = defaultListItemIndentCalculator,
403404
this.textSelection,
404405
this.selectionColor = Colors.lightBlueAccent,
405406
this.showCaret = false,
@@ -563,7 +564,7 @@ class OrderedListItemComponent extends StatefulWidget {
563564
this.numeralBuilder = _defaultOrderedListItemNumeralBuilder,
564565
this.numeralStyle = OrderedListNumeralStyle.arabic,
565566
this.indent = 0,
566-
this.indentCalculator = _defaultIndentCalculator,
567+
this.indentCalculator = defaultListItemIndentCalculator,
567568
this.textSelection,
568569
this.selectionColor = Colors.lightBlueAccent,
569570
this.showCaret = false,
@@ -581,7 +582,7 @@ class OrderedListItemComponent extends StatefulWidget {
581582
final OrderedListItemNumeralBuilder numeralBuilder;
582583
final OrderedListNumeralStyle numeralStyle;
583584
final int indent;
584-
final double Function(TextStyle, int indent) indentCalculator;
585+
final TextBlockIndentCalculator indentCalculator;
585586
final TextSelection? textSelection;
586587
final Color selectionColor;
587588
final bool showCaret;
@@ -659,7 +660,8 @@ class _OrderedListItemComponentState extends State<OrderedListItemComponent> {
659660

660661
typedef OrderedListItemNumeralBuilder = Widget Function(BuildContext, OrderedListItemComponent);
661662

662-
double _defaultIndentCalculator(TextStyle textStyle, int indent) {
663+
/// The standard [TextBlockIndentCalculator] used by list items in `SuperEditor`.
664+
double defaultListItemIndentCalculator(TextStyle textStyle, int indent) {
663665
return (textStyle.fontSize! * 0.60) * 4 * (indent + 1);
664666
}
665667

super_editor/lib/src/default_editor/super_editor.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,6 +1207,9 @@ final defaultKeyboardActions = <DocumentKeyboardAction>[
12071207
tabToIndentListItem,
12081208
shiftTabToUnIndentListItem,
12091209
backspaceToUnIndentListItem,
1210+
tabToIndentTask,
1211+
shiftTabToUnIndentTask,
1212+
backspaceToUnIndentTask,
12101213
backspaceToConvertTaskToParagraph,
12111214
backspaceToClearParagraphBlockType,
12121215
cmdBToToggleBold,
@@ -1244,6 +1247,9 @@ final defaultImeKeyboardActions = <DocumentKeyboardAction>[
12441247
cmdIToToggleItalics,
12451248
doNothingWithBackspaceOnWeb,
12461249
doNothingWithCtrlOrCmdAndZOnWeb,
1250+
tabToIndentTask,
1251+
shiftTabToUnIndentTask,
1252+
backspaceToUnIndentTask,
12471253
backspaceToConvertTaskToParagraph,
12481254
backspaceToUnIndentListItem,
12491255
backspaceToClearParagraphBlockType,

0 commit comments

Comments
 (0)