handle method

  1. @override
KeyEventResult handle({
  1. required AffogatoAPI api,
  2. required EditorKeyEvent editorKeyEvent,
})
override

Implementation

@override
KeyEventResult handle({
  required AffogatoAPI api,
  required EditorKeyEvent editorKeyEvent,
}) {
  if (!editorKeyEvent.editingContext.selection.isCollapsed ||
      editorKeyEvent.editingContext.selection.start - 1 < 0) {
    return KeyEventResult.ignored;
  }
  if (editorKeyEvent.keyEvent is KeyDownEvent) {
    final String prevChar = editorKeyEvent.editingContext
        .content[editorKeyEvent.editingContext.selection.start - 1];
    if (triggerChars.containsKey(prevChar)) {
      final String precedentText = editorKeyEvent.editingContext.selection
          .textBefore(editorKeyEvent.editingContext.content);
      final int numSpaces =
          numSpacesBeforeFirstChar(precedentText.split('\n').last);

      final int tabSizeInSpaces =
          api.workspace.workspaceConfigs.stylingConfigs.tabSizeInSpaces;

      final String insertText =
          "\n${' ' * (numSpaces + tabSizeInSpaces)}\n${' ' * numSpaces}";

      final String succeedingText = editorKeyEvent.editingContext.selection
          .textAfter(editorKeyEvent.editingContext.content);

      final String newText = precedentText + insertText + succeedingText;

      api.vfs.documentRequestChange(
        VFSDocumentRequestChangeEvent(
          originId: name,
          entityId: api.workspace.workspaceConfigs.entitiesLocation.entries
              .firstWhere(
                  (entry) => entry.value.$1 == editorKeyEvent.instanceId)
              .key,
          editorAction: EditorAction(
            editingValue: TextEditingValue(
              text: newText,
              selection: TextSelection.collapsed(
                offset: precedentText.length +
                    1 +
                    numSpaces +
                    api.workspace.workspaceConfigs.stylingConfigs
                        .tabSizeInSpaces,
              ),
            ),
          ),
        ),
      );
      return KeyEventResult.handled;
    }
  } else if (editorKeyEvent.keyEvent is KeyRepeatEvent) {}
  return KeyEventResult.ignored;
}