mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-26 12:03:51 +02:00
SynEdit: fix wrong right-gutter pos, if scrollbars were changed during handle creation / reduce some double calculation during resize
This commit is contained in:
parent
3d50451e87
commit
f3d1f63432
@ -218,6 +218,7 @@ type
|
||||
sfPreventScrollAfterSelect,
|
||||
sfIgnoreNextChar, sfPainting, sfHasPainted, sfHasScrolled,
|
||||
sfScrollbarChanged, sfHorizScrollbarVisible, sfVertScrollbarVisible,
|
||||
sfGutterResized,
|
||||
sfAfterLoadFromFileNeeded,
|
||||
// Mouse-states
|
||||
sfLeftGutterClick, sfRightGutterClick,
|
||||
@ -535,7 +536,7 @@ type
|
||||
FUndoBlockAtPaintLock: Integer;
|
||||
FStatusChangeLock: Integer;
|
||||
FRecalcCharsAndLinesLock: Integer;
|
||||
FScrollBarUpdateLock: Integer;
|
||||
FDoingResizeLock: Integer;
|
||||
FInvalidateRect: TRect;
|
||||
FIsInDecPaintLock: Boolean;
|
||||
FScrollBars: TScrollStyle;
|
||||
@ -2198,7 +2199,7 @@ begin
|
||||
inherited Create(AOwner);
|
||||
SetInline(True);
|
||||
ControlStyle:=ControlStyle+[csOwnedChildrenNotSelectable];
|
||||
FScrollBarUpdateLock := 0;
|
||||
FDoingResizeLock := 0;
|
||||
FPaintLock := 0;
|
||||
FStatusChangeLock := 0;
|
||||
FUndoBlockAtPaintLock := 0;
|
||||
@ -4932,15 +4933,29 @@ end;
|
||||
procedure TCustomSynEdit.CreateHandle;
|
||||
begin
|
||||
Application.RemoveOnIdleHandler(@IdleScanRanges);
|
||||
DoIncPaintLock(nil);
|
||||
DoIncPaintLock(nil); // prevent calculations during inherited and ONLY during inherited
|
||||
try
|
||||
inherited CreateHandle; //SizeOrFontChanged will be called
|
||||
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible];
|
||||
UpdateScrollBars; // just set sfScrollbarChanged
|
||||
finally
|
||||
DoDecPaintLock(nil); // run UpdateScrollBars
|
||||
|
||||
inc(FDoingResizeLock);
|
||||
try
|
||||
FLeftGutter.RecalcBounds;
|
||||
FRightGutter.RecalcBounds;
|
||||
fStateFlags := fStateFlags - [sfHorizScrollbarVisible, sfVertScrollbarVisible];
|
||||
UpdateScrollBars;
|
||||
finally
|
||||
DoDecPaintLock(nil);
|
||||
finally
|
||||
dec(FDoingResizeLock);
|
||||
if sfGutterResized in fStateFlags then begin
|
||||
Exclude(fStateFlags, sfGutterResized);
|
||||
RecalcCharsAndLinesInWin(False);
|
||||
UpdateScrollBars;
|
||||
end
|
||||
else
|
||||
if sfScrollbarChanged in fStateFlags then
|
||||
UpdateScrollBars;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -5135,8 +5150,7 @@ procedure TCustomSynEdit.UpdateScrollBars;
|
||||
var
|
||||
ScrollInfo: TScrollInfo;
|
||||
begin
|
||||
if FScrollBarUpdateLock <> 0 then exit;
|
||||
if not HandleAllocated or (PaintLock <> 0) then
|
||||
if (not HandleAllocated) or (PaintLock <> 0) or (FDoingResizeLock <> 0) then
|
||||
Include(fStateFlags, sfScrollbarChanged)
|
||||
else begin
|
||||
Exclude(fStateFlags, sfScrollbarChanged);
|
||||
@ -5356,18 +5370,19 @@ begin
|
||||
inherited;
|
||||
if (not HandleAllocated) then
|
||||
exit;
|
||||
inc(FScrollBarUpdateLock);
|
||||
inc(FDoingResizeLock);
|
||||
FScreenCaret.Lock;
|
||||
try
|
||||
FLeftGutter.RecalcBounds;
|
||||
FRightGutter.RecalcBounds;
|
||||
// SizeOrFontChanged will call RecalcCharsAndLinesInWin which may have been skipped in GutterResized
|
||||
SizeOrFontChanged(FALSE);
|
||||
if sfEnsureCursorPosAtResize in fStateFlags then
|
||||
EnsureCursorPosVisible;
|
||||
Exclude(fStateFlags, sfEnsureCursorPosAtResize);
|
||||
finally
|
||||
FScreenCaret.UnLock;
|
||||
dec(FScrollBarUpdateLock);
|
||||
dec(FDoingResizeLock);
|
||||
UpdateScrollBars;
|
||||
end;
|
||||
//debugln('TCustomSynEdit.Resize ',dbgs(Width),',',dbgs(Height),',',dbgs(ClientWidth),',',dbgs(ClientHeight));
|
||||
@ -8035,6 +8050,11 @@ begin
|
||||
|
||||
GutterChanged(Sender);
|
||||
|
||||
if (FDoingResizeLock <> 0) then begin
|
||||
Include(fStateFlags, sfGutterResized);
|
||||
exit
|
||||
end;
|
||||
|
||||
if HandleAllocated then begin
|
||||
RecalcCharsAndLinesInWin(False);
|
||||
UpdateScrollBars;
|
||||
|
Loading…
Reference in New Issue
Block a user