IDE, SourceEdit: keep topline when folding comment and similar via context menu. Issue #41227

(cherry picked from commit beb2505039)
This commit is contained in:
Martin 2025-01-25 17:31:13 +01:00
parent 5ae99331c1
commit e474818093

View File

@ -287,6 +287,7 @@ type
procedure SrcSynCaretChanged(Sender: TObject); procedure SrcSynCaretChanged(Sender: TObject);
function GetHighlighter: TSynCustomFoldHighlighter; function GetHighlighter: TSynCustomFoldHighlighter;
protected protected
procedure RestoreTopLineAfterFold(AnOldTopLine: integer);
procedure DoOnStatusChange(Changes: TSynStatusChanges); override; procedure DoOnStatusChange(Changes: TSynStatusChanges); override;
function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide; function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide;
ATextDrawer: TheTextDrawer): TSynGutter; override; ATextDrawer: TheTextDrawer): TSynGutter; override;
@ -294,7 +295,7 @@ type
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
function TextIndexToViewPos(aTextIndex : Integer) : Integer; function TextIndexToViewPos(aTextIndex : Integer) : Integer; // Wrong name: argument is TextPos, not TextIdx
property IDEGutterMarks: TIDESynGutterMarks read GetIDEGutterMarks; property IDEGutterMarks: TIDESynGutterMarks read GetIDEGutterMarks;
property TopView; property TopView;
property TextBuffer; property TextBuffer;
@ -1594,6 +1595,16 @@ begin
Result := nil; Result := nil;
end; end;
procedure TIDESynEditor.RestoreTopLineAfterFold(AnOldTopLine: integer);
var
tv: Integer;
begin
tv := TextIndexToViewPos(AnOldTopLine);
if not TextView.IsTextIdxVisible(ToIdx(AnOldTopLine)) then
tv := tv + 1;
TopView := tv;
end;
procedure TIDESynEditor.DoOnStatusChange(Changes: TSynStatusChanges); procedure TIDESynEditor.DoOnStatusChange(Changes: TSynStatusChanges);
begin begin
inherited DoOnStatusChange(Changes); inherited DoOnStatusChange(Changes);
@ -2718,12 +2729,13 @@ end;
procedure TIDESynGutterCodeFolding.UnFoldIfdef(AInclDisabled, AInclEnabled: Boolean); procedure TIDESynGutterCodeFolding.UnFoldIfdef(AInclDisabled, AInclEnabled: Boolean);
var var
i, j, k, y1, y2: Integer; i, j, k, y1, y2, CurTopLine: Integer;
FldInf: TSynFoldNodeInfo; FldInf: TSynFoldNodeInfo;
Tree: TSynMarkupHighIfDefLinesTree; Tree: TSynMarkupHighIfDefLinesTree;
IfLineNode: TSynMarkupHighIfDefLinesNodeInfo; IfLineNode: TSynMarkupHighIfDefLinesNodeInfo;
IsDisabled: Boolean; IsDisabled: Boolean;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if TSynEdit(SynEdit).SelAvail then begin if TSynEdit(SynEdit).SelAvail then begin
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
y2 := TSynEdit(SynEdit).BlockEnd.Y; y2 := TSynEdit(SynEdit).BlockEnd.Y;
@ -2760,15 +2772,17 @@ begin
end; //FoldView.IsFoldedAtTextIndex(i,j) end; //FoldView.IsFoldedAtTextIndex(i,j)
end; end;
end; end;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.FoldIfdef(AInclTemp: Boolean); procedure TIDESynGutterCodeFolding.FoldIfdef(AInclTemp: Boolean);
var var
i, j, k, y1, y2: Integer; i, j, k, y1, y2, CurTopLine: Integer;
FldInf: TSynFoldNodeInfo; FldInf: TSynFoldNodeInfo;
Tree: TSynMarkupHighIfDefLinesTree; Tree: TSynMarkupHighIfDefLinesTree;
IfLineNode: TSynMarkupHighIfDefLinesNodeInfo; IfLineNode: TSynMarkupHighIfDefLinesNodeInfo;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if TSynEdit(SynEdit).SelAvail then begin if TSynEdit(SynEdit).SelAvail then begin
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
y2 := TSynEdit(SynEdit).BlockEnd.Y; y2 := TSynEdit(SynEdit).BlockEnd.Y;
@ -2799,14 +2813,17 @@ begin
end; end;
end; end;
end; end;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.PopClickedUnfoldAll(Sender: TObject); procedure TIDESynGutterCodeFolding.PopClickedUnfoldAll(Sender: TObject);
var var
i, y1, y2: Integer; i, y1, y2, CurTopLine: Integer;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if not TSynEdit(SynEdit).SelAvail then begin if not TSynEdit(SynEdit).SelAvail then begin
FoldView.UnfoldAll; FoldView.UnfoldAll;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
exit; exit;
end; end;
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
@ -2814,13 +2831,15 @@ begin
if TSynEdit(SynEdit).BlockEnd.X = 1 then dec(y2); if TSynEdit(SynEdit).BlockEnd.X = 1 then dec(y2);
for i := y1-1 to y2-1 do for i := y1-1 to y2-1 do
FoldView.UnFoldAtTextIndex(i); FoldView.UnFoldAtTextIndex(i);
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.PopClickedUnfoldComment(Sender: TObject); procedure TIDESynGutterCodeFolding.PopClickedUnfoldComment(Sender: TObject);
var var
i, j, y1, y2: Integer; i, j, y1, y2, CurTopLine: Integer;
FldInf: TSynFoldNodeInfo; FldInf: TSynFoldNodeInfo;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if TSynEdit(SynEdit).SelAvail then begin if TSynEdit(SynEdit).SelAvail then begin
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
y2 := TSynEdit(SynEdit).BlockEnd.Y; y2 := TSynEdit(SynEdit).BlockEnd.Y;
@ -2846,13 +2865,15 @@ begin
end; end;
end; end;
end; end;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.PopClickedFoldComment(Sender: TObject); procedure TIDESynGutterCodeFolding.PopClickedFoldComment(Sender: TObject);
var var
i, j, y1, y2: Integer; i, j, y1, y2, CurTopLine: Integer;
FldInf: TSynFoldNodeInfo; FldInf: TSynFoldNodeInfo;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if TSynEdit(SynEdit).SelAvail then begin if TSynEdit(SynEdit).SelAvail then begin
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
y2 := TSynEdit(SynEdit).BlockEnd.Y; y2 := TSynEdit(SynEdit).BlockEnd.Y;
@ -2876,13 +2897,15 @@ begin
end; end;
end; end;
end; end;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.PopClickedHideComment(Sender: TObject); procedure TIDESynGutterCodeFolding.PopClickedHideComment(Sender: TObject);
var var
i, j, y1, y2: Integer; i, j, y1, y2, CurTopLine: Integer;
FldInf: TSynFoldNodeInfo; FldInf: TSynFoldNodeInfo;
begin begin
CurTopLine := TSynEdit(SynEdit).TopLine;
if TSynEdit(SynEdit).SelAvail then begin if TSynEdit(SynEdit).SelAvail then begin
y1 := TSynEdit(SynEdit).BlockBegin.Y; y1 := TSynEdit(SynEdit).BlockBegin.Y;
y2 := TSynEdit(SynEdit).BlockEnd.Y; y2 := TSynEdit(SynEdit).BlockEnd.Y;
@ -2906,6 +2929,7 @@ begin
end; end;
end; end;
end; end;
TIDESynEditor(SynEdit).RestoreTopLineAfterFold(CurTopLine);
end; end;
procedure TIDESynGutterCodeFolding.CreatePopUpMenuEntries(var APopUp: TPopupMenu; ALine: Integer); procedure TIDESynGutterCodeFolding.CreatePopUpMenuEntries(var APopUp: TPopupMenu; ALine: Integer);