From bd97e46bc614bb86ff18ab493240dc9be2dabd05 Mon Sep 17 00:00:00 2001 From: Zufu Liu Date: Wed, 29 Oct 2025 17:10:25 +1100 Subject: Feature [feature-requests:#1567]. Fix bug when indenting rectangular selection. --- doc/ScintillaHistory.html | 4 ++++ src/Editor.cxx | 8 ++++++++ test/simpleTests.py | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 65d6b9fcb..342a87d51 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -610,6 +610,10 @@ Bug #2487.
  • + Fix bug when indenting rectangular selection. + Feature #1567. +
  • +
  • On Win32, force autocompletion list colours to be opaque. Enlarge bitmap to avoid visible blank background between items. Bug #2482. diff --git a/src/Editor.cxx b/src/Editor.cxx index 9f3999b08..eb31d40f9 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -4155,6 +4155,12 @@ int Editor::KeyDownWithModifiers(Keys key, KeyMod modifiers, bool *consumed) { void Editor::Indent(bool forwards, bool lineIndent) { UndoGroup ug(pdoc); + // Avoid problems with recalculating rectangular range multiple times by temporarily + // treating rectangular selection as multiple stream selection. + const Selection::SelTypes selType = sel.selType; + if (sel.IsRectangular()) { + sel.selType = Selection::SelTypes::stream; + } for (size_t r=0; rSciLineFromPosition(sel.Range(r).anchor.Position()); @@ -4231,6 +4237,8 @@ void Editor::Indent(bool forwards, bool lineIndent) { } } } + sel.selType = selType; // Restore rectangular mode + ThinRectangularRange(); ContainerNeedsUpdate(Update::Selection); } diff --git a/test/simpleTests.py b/test/simpleTests.py index 0389d6dbc..020b72e99 100644 --- a/test/simpleTests.py +++ b/test/simpleTests.py @@ -312,6 +312,24 @@ class TestSimple(unittest.TestCase): self.assertEqual(self.ed.Contents(), b"\tx\tb") self.assertEqual(self.ed.GetLineIndentPosition(0), 1) + def testRectangularIndent(self): + self.ed.VirtualSpaceOptions = 3 + self.ed.AddText(3, b"\n\n\n") + self.ed.RectangularSelectionAnchor = 2 + self.ed.RectangularSelectionCaret = 0 + self.ed.TabIndents = 0 + self.ed.UseTabs = 1 + self.ed.Tab() + self.assertEqual(self.ed.Contents(), b"\t\n\t\n\t\n") + self.assertEqual(self.ed.GetSelectionSerialized(), b'T#2,5-1') + self.assertEqual(self.ed.GetSelectionNAnchor(0), 5) + self.assertEqual(self.ed.GetSelectionNCaret(0), 5) + self.assertEqual(self.ed.GetSelectionNAnchor(1), 3) + self.assertEqual(self.ed.GetSelectionNCaret(1), 3) + self.assertEqual(self.ed.GetSelectionNAnchor(2), 1) + self.assertEqual(self.ed.GetSelectionNCaret(2), 1) + self.ed.VirtualSpaceOptions = 0 + def testGetCurLine(self): self.ed.AddText(1, b"x") data = ctypes.create_string_buffer(b"\0" * 100) -- cgit v1.2.3