link function

ToolbarItem link({
  1. String uriHintText = 'google.com',
})

Toolbar item that applies a LinkAttribute. Shows a dialog with a text field for the url.

Implementation

ToolbarItem link({String uriHintText = 'google.com'}) {
  return ToolbarItem(
    title: const Icon(Icons.link),
    tooltip: 'Link',
    onPressed: (context, controller) async {
      final line = controller.focusedLine;
      if (line != null) {
        final c = line.controller;
        if (c.selection.isValid) {
          final canApply = !c.selection.isCollapsed ||
              c.getAppliedSpansWithType<LinkAttribute>().isNotEmpty;

          if (canApply) {
            final attrs = c.getAppliedSpansWithType<LinkAttribute>();
            final initialSpan = attrs.firstOrNull;
            final initialUri =
                (initialSpan?.attribute as LinkAttribute?)?.uri ?? '';
            final range = initialSpan?.range ?? c.selectionRange;
            // Show the dialog. Null means do nothing, empty string means remove.
            var link = await showDialog<String>(
              context: context,
              builder: (context) {
                return _LinkDialog(text: initialUri, hintText: uriHintText);
              },
            );
            if (link != null) {
              var spans = c.spans;

              spans = spans.removeTypeFrom<LinkAttribute>(range);
              if (link.isNotEmpty) {
                if (!link.startsWith('https://')) {
                  link = 'https://$link';
                }

                final uri = Uri.parse(link);
                final attr = LinkAttribute(uri.toString());
                final span = AttributeSpan(attr, range.start, range.end);
                spans = spans.merge(span);
              }

              c.spans = spans;
            }
          }
        }
      }
    },
    builder: (context, controller, item) =>
        _LinkToolbarItem(controller: controller, toolbarItem: item),
  );
}