link function
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),
);
}