mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 20:36:09 +02:00
IDE: sourceeditor: change gutter glyph size (and left gutter width) according to editor line height
git-svn-id: trunk@58332 -
This commit is contained in:
parent
ff4b08c050
commit
5ce635e1b2
@ -24,7 +24,7 @@ type
|
||||
procedure Init; override;
|
||||
function PreferedWidth: Integer; override;
|
||||
function GetImgListRes(const ACanvas: TCanvas;
|
||||
const AImages: TCustomImageList): TScaledImageListResolution;
|
||||
const AImages: TCustomImageList): TScaledImageListResolution; virtual;
|
||||
// PaintMarks: True, if it has any Mark, that is *not* a bookmark
|
||||
function PaintMarks(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect;
|
||||
var aFirstCustomColumnIdx: integer): Boolean;
|
||||
|
@ -275,6 +275,7 @@ type
|
||||
function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide;
|
||||
ATextDrawer: TheTextDrawer): TSynGutter; override;
|
||||
procedure SetHighlighter(const Value: TSynCustomHighlighter); override;
|
||||
procedure FontChanged(Sender: TObject); override;
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
@ -436,6 +437,9 @@ type
|
||||
procedure CheckTextBuffer; // Todo: Add a notification, when TextBuffer Changes
|
||||
Procedure PaintLine(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect); override;
|
||||
function PreferedWidth: Integer; override;
|
||||
|
||||
function GetImgListRes(const ACanvas: TCanvas;
|
||||
const AImages: TCustomImageList): TScaledImageListResolution; override;
|
||||
public
|
||||
destructor Destroy; override;
|
||||
procedure BeginSetDebugMarks;
|
||||
@ -1538,6 +1542,13 @@ begin
|
||||
{$pop}
|
||||
end;
|
||||
|
||||
procedure TIDESynEditor.FontChanged(Sender: TObject);
|
||||
begin
|
||||
FLeftGutterArea.Gutter.DoAutoSize;
|
||||
FRightGutterArea.Gutter.DoAutoSize;
|
||||
inherited FontChanged(Sender);
|
||||
end;
|
||||
|
||||
procedure TIDESynEditor.GetTopInfoMarkupForLine(Sender: TObject; Line: integer;
|
||||
var Special: boolean; aMarkup: TSynSelectedColor);
|
||||
begin
|
||||
@ -2165,47 +2176,52 @@ end;
|
||||
|
||||
procedure TIDESynGutter.CreateDefaultGutterParts;
|
||||
begin
|
||||
if Side = gsLeft then begin
|
||||
with TIDESynGutterMarks.Create(Parts) do
|
||||
Name := 'SynGutterMarks1';
|
||||
with TSynGutterLineNumber.Create(Parts) do
|
||||
Name := 'SynGutterLineNumber1';
|
||||
with TSynGutterChanges.Create(Parts) do
|
||||
Name := 'SynGutterChanges1';
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparator1';
|
||||
with TIDESynGutterCodeFolding.Create(Parts) do
|
||||
Name := 'SynGutterCodeFolding1';
|
||||
end
|
||||
else begin
|
||||
{$IFDEF WithSynDebugGutter}
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparatorR1';
|
||||
DebugGutter := TIDESynGutterDebugHL.Create(Parts);
|
||||
with DebugGutter do
|
||||
Name := 'TIDESynGutterDebugHL';
|
||||
{$ENDIF}
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparatorR2';
|
||||
with TSynGutterLineOverview.Create(Parts) do begin
|
||||
Name := 'SynGutterLineOverview1';
|
||||
with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do
|
||||
Priority := 20;
|
||||
with TSynGutterLOvProviderModifiedLines.Create(Providers) do
|
||||
Priority := 9;
|
||||
with TSynGutterLOvProviderCurrentPage.Create(Providers) do begin
|
||||
Priority := 1;
|
||||
FoldedTextBuffer := TSynEditFoldedView(TIDESynEditor(Self.SynEdit).FoldedTextBuffer);
|
||||
IncChangeLock;
|
||||
try
|
||||
if Side = gsLeft then begin
|
||||
with TIDESynGutterMarks.Create(Parts) do
|
||||
Name := 'SynGutterMarks1';
|
||||
with TSynGutterLineNumber.Create(Parts) do
|
||||
Name := 'SynGutterLineNumber1';
|
||||
with TSynGutterChanges.Create(Parts) do
|
||||
Name := 'SynGutterChanges1';
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparator1';
|
||||
with TIDESynGutterCodeFolding.Create(Parts) do
|
||||
Name := 'SynGutterCodeFolding1';
|
||||
end
|
||||
else begin
|
||||
{$IFDEF WithSynDebugGutter}
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparatorR1';
|
||||
DebugGutter := TIDESynGutterDebugHL.Create(Parts);
|
||||
with DebugGutter do
|
||||
Name := 'TIDESynGutterDebugHL';
|
||||
{$ENDIF}
|
||||
with TSynGutterSeparator.Create(Parts) do
|
||||
Name := 'SynGutterSeparatorR2';
|
||||
with TSynGutterLineOverview.Create(Parts) do begin
|
||||
Name := 'SynGutterLineOverview1';
|
||||
with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do
|
||||
Priority := 20;
|
||||
with TSynGutterLOvProviderModifiedLines.Create(Providers) do
|
||||
Priority := 9;
|
||||
with TSynGutterLOvProviderCurrentPage.Create(Providers) do begin
|
||||
Priority := 1;
|
||||
FoldedTextBuffer := TSynEditFoldedView(TIDESynEditor(Self.SynEdit).FoldedTextBuffer);
|
||||
end;
|
||||
with TIDESynGutterLOvProviderPascal.Create(Providers) do
|
||||
Priority := 0;
|
||||
end;
|
||||
with TSynGutterSeparator.Create(Parts) do begin
|
||||
Name := 'SynGutterSeparatorR3';
|
||||
AutoSize := False;
|
||||
Width := 1;
|
||||
LineWidth := 0;
|
||||
end;
|
||||
with TIDESynGutterLOvProviderPascal.Create(Providers) do
|
||||
Priority := 0;
|
||||
end;
|
||||
with TSynGutterSeparator.Create(Parts) do begin
|
||||
Name := 'SynGutterSeparatorR3';
|
||||
AutoSize := False;
|
||||
Width := 1;
|
||||
LineWidth := 0;
|
||||
end;
|
||||
finally
|
||||
DecChangeLock;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -2265,10 +2281,14 @@ begin
|
||||
end;
|
||||
|
||||
function TIDESynGutterMarks.PreferedWidth: Integer;
|
||||
var
|
||||
img: TScaledImageListResolution;
|
||||
begin
|
||||
if Assigned(SourceEditorMarks) and Assigned(SourceEditorMarks.ImgList) then
|
||||
Result := SourceEditorMarks.ImgList.Width * 2 + FBookMarkOpt.LeftMargin
|
||||
else
|
||||
begin
|
||||
img := GetImgListRes(nil, SourceEditorMarks.ImgList);
|
||||
Result := SynEdit.ScaleFontTo96(img.Width * 2) + FBookMarkOpt.LeftMargin; // PreferedWidth needs width at 96 PPI
|
||||
end else
|
||||
Result := inherited PreferedWidth;
|
||||
end;
|
||||
|
||||
@ -2300,6 +2320,43 @@ begin
|
||||
TSynEdit(SynEdit).InvalidateGutter;
|
||||
end;
|
||||
|
||||
function TIDESynGutterMarks.GetImgListRes(const ACanvas: TCanvas;
|
||||
const AImages: TCustomImageList): TScaledImageListResolution;
|
||||
const
|
||||
AllowedHeights: array[0..5] of Integer = (8, 11, 16, 22, 33, 44);
|
||||
var
|
||||
Scale: Double;
|
||||
PPI, LineHeight, I, ImageHeight: Integer;
|
||||
begin
|
||||
// image height must be equal to width
|
||||
if AImages.Width<>AImages.Height then
|
||||
raise Exception.Create('Internal error: AImages.Width<>AImages.Height');
|
||||
|
||||
Scale := 1;
|
||||
PPI := 96;
|
||||
if SynEdit is TSynEdit then
|
||||
begin
|
||||
LineHeight := TSynEdit(SynEdit).LineHeight;
|
||||
ImageHeight := Low(AllowedHeights);
|
||||
for I := High(AllowedHeights) downto Low(AllowedHeights) do
|
||||
if AllowedHeights[I]<LineHeight then
|
||||
begin
|
||||
ImageHeight := AllowedHeights[I];
|
||||
break;
|
||||
end;
|
||||
// don't set PPI here -> we don't want to scale the image anymore
|
||||
end else
|
||||
begin
|
||||
ImageHeight := AImages.Height;
|
||||
if ACanvas is TControlCanvas then
|
||||
PPI := TControlCanvas(ACanvas).Control.Font.PixelsPerInch;
|
||||
end;
|
||||
|
||||
if ACanvas is TControlCanvas then
|
||||
Scale := TControlCanvas(ACanvas).Control.GetCanvasScaleFactor;
|
||||
Result := AImages.ResolutionForPPI[ImageHeight, PPI, Scale];
|
||||
end;
|
||||
|
||||
procedure TIDESynGutterMarks.SetDebugMarks(AFirstLinePos, ALastLinePos: Integer);
|
||||
var
|
||||
i: LongInt;
|
||||
|
Loading…
Reference in New Issue
Block a user