Skip to content

RectangleSelection up to 150-200 lines slow #434

Open
@alex8900vbs

Description

@alex8900vbs

hi, sorry for english but i use a translator. i tried for two days to speed up the management of the rectangular selection but without success, you can replicate the problem as follows: paste a text of 1000 lines, press and hold ALT and also hold down shift and the down arrow, to create a rectangular selection, go down until the program slows down around the 150-200 line. I tracked down the source of the problem and it is this:

public override Selection SetEndpoint(TextViewPosition endPosition)
in ICSharpCode.AvalonEdit.Editing

basically as it is designed every time you go down a line it calls
void CalculateSegments()
for all the lines

this means that at the 10th line the calculation it will do will be 10 lines, at the 150th line it will have to recalculate 150 lines, so the more you go down the slower the selection becomes, I tried with the following code to change the individual segments of the selection with excellent results in terms of speed but terrible in terms of consistency with everything else, is there any way to do it?

void CalculateSegmentsExists(TextViewPosition endPosition, int previousEndLine)
{
	for (int i = 0; i < segments.Count; i++) {
		SelectionSegment item = segments[i];
		DocumentLine myLine = textArea.Document.GetLineByOffset(item.EndOffset);
		int NewVC = endPosition.VisualColumn - item.EndVisualColumn;
		TextViewPosition textViewPosition = new TextViewPosition(myLine.LineNumber, endPosition.VisualColumn);
		if (myLine.Length < textViewPosition.Location.Column) {
			NewVC = 0;
		}
		segments[i] = new SelectionSegment(item.StartOffset, item.StartVisualColumn, item.EndOffset + NewVC, endPosition.VisualColumn);
	}
	if (endPosition.Line > previousEndLine) {
		for (int i = previousEndLine + 1; i <= endPosition.Line; i++) {
			VisualLine vl = textArea.TextView.GetOrConstructVisualLine(nextLine);
			int startVC = vl.GetVisualColumn(new Point(startXPos, 0), true);
			int endVC = vl.GetVisualColumn(new Point(endXPos, 0), true);

			int baseOffset = vl.FirstDocumentLine.Offset;
			int startOffset = baseOffset + vl.GetRelativeOffset(startVC);
			int endOffset = baseOffset + vl.GetRelativeOffset(endVC);
			segments.Add(new SelectionSegment(startOffset, startVC, endOffset, endVC));
		}
	}
}
				

what I thought is: instead of recreating the rectangular selection every time if there was a way to do some sort of update maybe it would be faster, the problem is that I'm faced with too many things that remain unaligned

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @alex8900vbs

        Issue actions

          RectangleSelection up to 150-200 lines slow · Issue #434 · icsharpcode/AvalonEdit