SynEdit: fix wrong right-gutter pos, if scrollbars were changed during handle creation / reduce some double calculation during resize

This commit is contained in:
Martin 2024-04-15 16:38:34 +02:00
parent 3d50451e87
commit f3d1f63432

View File

@ -218,6 +218,7 @@ type
sfPreventScrollAfterSelect, sfPreventScrollAfterSelect,
sfIgnoreNextChar, sfPainting, sfHasPainted, sfHasScrolled, sfIgnoreNextChar, sfPainting, sfHasPainted, sfHasScrolled,
sfScrollbarChanged, sfHorizScrollbarVisible, sfVertScrollbarVisible, sfScrollbarChanged, sfHorizScrollbarVisible, sfVertScrollbarVisible,
sfGutterResized,
sfAfterLoadFromFileNeeded, sfAfterLoadFromFileNeeded,
// Mouse-states // Mouse-states
sfLeftGutterClick, sfRightGutterClick, sfLeftGutterClick, sfRightGutterClick,
@ -535,7 +536,7 @@ type
FUndoBlockAtPaintLock: Integer; FUndoBlockAtPaintLock: Integer;
FStatusChangeLock: Integer; FStatusChangeLock: Integer;
FRecalcCharsAndLinesLock: Integer; FRecalcCharsAndLinesLock: Integer;
FScrollBarUpdateLock: Integer; FDoingResizeLock: Integer;
FInvalidateRect: TRect; FInvalidateRect: TRect;
FIsInDecPaintLock: Boolean; FIsInDecPaintLock: Boolean;
FScrollBars: TScrollStyle; FScrollBars: TScrollStyle;
@ -2198,7 +2199,7 @@ begin
inherited Create(AOwner); inherited Create(AOwner);
SetInline(True); SetInline(True);
ControlStyle:=ControlStyle+[csOwnedChildrenNotSelectable]; ControlStyle:=ControlStyle+[csOwnedChildrenNotSelectable];
FScrollBarUpdateLock := 0; FDoingResizeLock := 0;
FPaintLock := 0; FPaintLock := 0;
FStatusChangeLock := 0; FStatusChangeLock := 0;
FUndoBlockAtPaintLock := 0; FUndoBlockAtPaintLock := 0;
@ -4932,15 +4933,29 @@ end;
procedure TCustomSynEdit.CreateHandle; procedure TCustomSynEdit.CreateHandle;
begin begin
Application.RemoveOnIdleHandler(@IdleScanRanges); Application.RemoveOnIdleHandler(@IdleScanRanges);
DoIncPaintLock(nil); DoIncPaintLock(nil); // prevent calculations during inherited and ONLY during inherited
try try
inherited CreateHandle; //SizeOrFontChanged will be called inherited CreateHandle; //SizeOrFontChanged will be called
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible];
UpdateScrollBars; // just set sfScrollbarChanged
finally
DoDecPaintLock(nil); // run UpdateScrollBars
inc(FDoingResizeLock);
try
FLeftGutter.RecalcBounds; FLeftGutter.RecalcBounds;
FRightGutter.RecalcBounds; FRightGutter.RecalcBounds;
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible]; finally
UpdateScrollBars; dec(FDoingResizeLock);
finally if sfGutterResized in fStateFlags then begin
DoDecPaintLock(nil); Exclude(fStateFlags, sfGutterResized);
RecalcCharsAndLinesInWin(False);
UpdateScrollBars;
end
else
if sfScrollbarChanged in fStateFlags then
UpdateScrollBars;
end;
end; end;
end; end;
@ -5135,8 +5150,7 @@ procedure TCustomSynEdit.UpdateScrollBars;
var var
ScrollInfo: TScrollInfo; ScrollInfo: TScrollInfo;
begin begin
if FScrollBarUpdateLock <> 0 then exit; if (not HandleAllocated) or (PaintLock <> 0) or (FDoingResizeLock <> 0) then
if not HandleAllocated or (PaintLock <> 0) then
Include(fStateFlags, sfScrollbarChanged) Include(fStateFlags, sfScrollbarChanged)
else begin else begin
Exclude(fStateFlags, sfScrollbarChanged); Exclude(fStateFlags, sfScrollbarChanged);
@ -5356,18 +5370,19 @@ begin
inherited; inherited;
if (not HandleAllocated) then if (not HandleAllocated) then
exit; exit;
inc(FScrollBarUpdateLock); inc(FDoingResizeLock);
FScreenCaret.Lock; FScreenCaret.Lock;
try try
FLeftGutter.RecalcBounds; FLeftGutter.RecalcBounds;
FRightGutter.RecalcBounds; FRightGutter.RecalcBounds;
// SizeOrFontChanged will call RecalcCharsAndLinesInWin which may have been skipped in GutterResized
SizeOrFontChanged(FALSE); SizeOrFontChanged(FALSE);
if sfEnsureCursorPosAtResize in fStateFlags then if sfEnsureCursorPosAtResize in fStateFlags then
EnsureCursorPosVisible; EnsureCursorPosVisible;
Exclude(fStateFlags, sfEnsureCursorPosAtResize); Exclude(fStateFlags, sfEnsureCursorPosAtResize);
finally finally
FScreenCaret.UnLock; FScreenCaret.UnLock;
dec(FScrollBarUpdateLock); dec(FDoingResizeLock);
UpdateScrollBars; UpdateScrollBars;
end; end;
//debugln('TCustomSynEdit.Resize ',dbgs(Width),',',dbgs(Height),',',dbgs(ClientWidth),',',dbgs(ClientHeight)); //debugln('TCustomSynEdit.Resize ',dbgs(Width),',',dbgs(Height),',',dbgs(ClientWidth),',',dbgs(ClientHeight));
@ -8035,6 +8050,11 @@ begin
GutterChanged(Sender); GutterChanged(Sender);
if (FDoingResizeLock <> 0) then begin
Include(fStateFlags, sfGutterResized);
exit
end;
if HandleAllocated then begin if HandleAllocated then begin
RecalcCharsAndLinesInWin(False); RecalcCharsAndLinesInWin(False);
UpdateScrollBars; UpdateScrollBars;