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:
ondrej 2018-06-19 13:10:46 +00:00
parent ff4b08c050
commit 5ce635e1b2
2 changed files with 99 additions and 42 deletions

View File

@ -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;

View File

@ -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;