getSelectedRegisteredText method

String getSelectedRegisteredText()

Extracts the selected text across all registered participants.

Registered fragments are joined in reading order: top-to-bottom and then left-to-right, matching the behavior we want for shared drag selection inside a SelectionArea.

Implementation

String getSelectedRegisteredText() {
  if (!hasSelection || _participants.isEmpty) return '';

  final fragments = _participants.values.toList()
    ..sort((a, b) {
      final aOrigin = a.globalOrigin;
      final bOrigin = b.globalOrigin;
      final byY = aOrigin.y.compareTo(bOrigin.y);
      if (byY != 0) return byY;
      return aOrigin.x.compareTo(bOrigin.x);
    });

  final selected = <String>[];
  for (final fragment in fragments) {
    final origin = fragment.globalOrigin;
    final localStart = (
      x: _selectionStart!.x - origin.x,
      y: _selectionStart!.y - origin.y,
    );
    final localEnd = (
      x: _selectionEnd!.x - origin.x,
      y: _selectionEnd!.y - origin.y,
    );
    final text = extractSelectedText(
      fragment.getContentLines(),
      selectionStart: localStart,
      selectionEnd: localEnd,
    );
    if (text.isNotEmpty) {
      selected.add(text);
    }
  }

  return selected.join('\n');
}