diff --git a/lib/widgets/editor/editor_toolbar.dart b/lib/widgets/editor/editor_toolbar.dart index 042a34f..a54fcfe 100644 --- a/lib/widgets/editor/editor_toolbar.dart +++ b/lib/widgets/editor/editor_toolbar.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:logging/logging.dart'; @@ -62,6 +63,18 @@ extension on TextEditingController { text.getEndOfTheLine(selection.end)); } + void insertAtBeginningOfFirstSelectedLine(String s) { + final lines = TextLinesIterator.fromController(this)..moveNext(); + lines.current = s + lines.current; + value = value.copyWith( + text: lines.text, + selection: selection.copyWith( + baseOffset: selection.baseOffset + s.length, + extentOffset: selection.extentOffset + s.length, + ), + ); + } + void removeAtBeginningOfEverySelectedLine(String s) { final lines = TextLinesIterator.fromController(this); var linesCount = 0; @@ -123,6 +136,18 @@ extension on TextEditingController { reformat((selection) => Reformat(text: text)); } +enum HeaderLevel { + h1(1), + h2(2), + h3(3), + h4(4), + h5(5), + h6(6); + + const HeaderLevel(this.value); + final int value; +} + class Toolbar extends HookWidget { final TextEditingController controller; final String instanceHost; @@ -251,16 +276,31 @@ class _ToolbarBody extends HookWidget { }, icon: const Icon(Icons.home), ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.h_mobiledata), + PopupMenuButton( + itemBuilder: (context) => [ + for (final h in HeaderLevel.values) + PopupMenuItem( + value: h, + child: Text(describeEnum(h).toUpperCase()), + ), + ], + onSelected: (val) { + final header = '${'#' * val.value} '; + + if (!controller.firstSelectedLine.startsWith(header)) { + controller.insertAtBeginningOfFirstSelectedLine(header); + } + }, + child: const Icon(Icons.h_mobiledata), ), IconButton( onPressed: () => controller.surround('~~'), icon: const Icon(Icons.format_strikethrough), ), IconButton( - onPressed: () {}, + onPressed: () { + controller.insertAtBeginningOfEverySelectedLine('> '); + }, icon: const Icon(Icons.format_quote), ), IconButton(