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; procedure Init; override;
function PreferedWidth: Integer; override; function PreferedWidth: Integer; override;
function GetImgListRes(const ACanvas: TCanvas; 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 // PaintMarks: True, if it has any Mark, that is *not* a bookmark
function PaintMarks(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect; function PaintMarks(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect;
var aFirstCustomColumnIdx: integer): Boolean; var aFirstCustomColumnIdx: integer): Boolean;

View File

@ -275,6 +275,7 @@ type
function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide; function CreateGutter(AOwner : TSynEditBase; ASide: TSynGutterSide;
ATextDrawer: TheTextDrawer): TSynGutter; override; ATextDrawer: TheTextDrawer): TSynGutter; override;
procedure SetHighlighter(const Value: TSynCustomHighlighter); override; procedure SetHighlighter(const Value: TSynCustomHighlighter); override;
procedure FontChanged(Sender: TObject); override;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -436,6 +437,9 @@ type
procedure CheckTextBuffer; // Todo: Add a notification, when TextBuffer Changes procedure CheckTextBuffer; // Todo: Add a notification, when TextBuffer Changes
Procedure PaintLine(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect); override; Procedure PaintLine(aScreenLine: Integer; Canvas : TCanvas; AClip : TRect); override;
function PreferedWidth: Integer; override; function PreferedWidth: Integer; override;
function GetImgListRes(const ACanvas: TCanvas;
const AImages: TCustomImageList): TScaledImageListResolution; override;
public public
destructor Destroy; override; destructor Destroy; override;
procedure BeginSetDebugMarks; procedure BeginSetDebugMarks;
@ -1538,6 +1542,13 @@ begin
{$pop} {$pop}
end; end;
procedure TIDESynEditor.FontChanged(Sender: TObject);
begin
FLeftGutterArea.Gutter.DoAutoSize;
FRightGutterArea.Gutter.DoAutoSize;
inherited FontChanged(Sender);
end;
procedure TIDESynEditor.GetTopInfoMarkupForLine(Sender: TObject; Line: integer; procedure TIDESynEditor.GetTopInfoMarkupForLine(Sender: TObject; Line: integer;
var Special: boolean; aMarkup: TSynSelectedColor); var Special: boolean; aMarkup: TSynSelectedColor);
begin begin
@ -2165,47 +2176,52 @@ end;
procedure TIDESynGutter.CreateDefaultGutterParts; procedure TIDESynGutter.CreateDefaultGutterParts;
begin begin
if Side = gsLeft then begin IncChangeLock;
with TIDESynGutterMarks.Create(Parts) do try
Name := 'SynGutterMarks1'; if Side = gsLeft then begin
with TSynGutterLineNumber.Create(Parts) do with TIDESynGutterMarks.Create(Parts) do
Name := 'SynGutterLineNumber1'; Name := 'SynGutterMarks1';
with TSynGutterChanges.Create(Parts) do with TSynGutterLineNumber.Create(Parts) do
Name := 'SynGutterChanges1'; Name := 'SynGutterLineNumber1';
with TSynGutterSeparator.Create(Parts) do with TSynGutterChanges.Create(Parts) do
Name := 'SynGutterSeparator1'; Name := 'SynGutterChanges1';
with TIDESynGutterCodeFolding.Create(Parts) do with TSynGutterSeparator.Create(Parts) do
Name := 'SynGutterCodeFolding1'; Name := 'SynGutterSeparator1';
end with TIDESynGutterCodeFolding.Create(Parts) do
else begin Name := 'SynGutterCodeFolding1';
{$IFDEF WithSynDebugGutter} end
with TSynGutterSeparator.Create(Parts) do else begin
Name := 'SynGutterSeparatorR1'; {$IFDEF WithSynDebugGutter}
DebugGutter := TIDESynGutterDebugHL.Create(Parts); with TSynGutterSeparator.Create(Parts) do
with DebugGutter do Name := 'SynGutterSeparatorR1';
Name := 'TIDESynGutterDebugHL'; DebugGutter := TIDESynGutterDebugHL.Create(Parts);
{$ENDIF} with DebugGutter do
with TSynGutterSeparator.Create(Parts) do Name := 'TIDESynGutterDebugHL';
Name := 'SynGutterSeparatorR2'; {$ENDIF}
with TSynGutterLineOverview.Create(Parts) do begin with TSynGutterSeparator.Create(Parts) do
Name := 'SynGutterLineOverview1'; Name := 'SynGutterSeparatorR2';
with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do with TSynGutterLineOverview.Create(Parts) do begin
Priority := 20; Name := 'SynGutterLineOverview1';
with TSynGutterLOvProviderModifiedLines.Create(Providers) do with TIDESynGutterLOvProviderIDEMarks.Create(Providers) do
Priority := 9; Priority := 20;
with TSynGutterLOvProviderCurrentPage.Create(Providers) do begin with TSynGutterLOvProviderModifiedLines.Create(Providers) do
Priority := 1; Priority := 9;
FoldedTextBuffer := TSynEditFoldedView(TIDESynEditor(Self.SynEdit).FoldedTextBuffer); 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; end;
with TIDESynGutterLOvProviderPascal.Create(Providers) do
Priority := 0;
end;
with TSynGutterSeparator.Create(Parts) do begin
Name := 'SynGutterSeparatorR3';
AutoSize := False;
Width := 1;
LineWidth := 0;
end; end;
finally
DecChangeLock;
end; end;
end; end;
@ -2265,10 +2281,14 @@ begin
end; end;
function TIDESynGutterMarks.PreferedWidth: Integer; function TIDESynGutterMarks.PreferedWidth: Integer;
var
img: TScaledImageListResolution;
begin begin
if Assigned(SourceEditorMarks) and Assigned(SourceEditorMarks.ImgList) then if Assigned(SourceEditorMarks) and Assigned(SourceEditorMarks.ImgList) then
Result := SourceEditorMarks.ImgList.Width * 2 + FBookMarkOpt.LeftMargin begin
else img := GetImgListRes(nil, SourceEditorMarks.ImgList);
Result := SynEdit.ScaleFontTo96(img.Width * 2) + FBookMarkOpt.LeftMargin; // PreferedWidth needs width at 96 PPI
end else
Result := inherited PreferedWidth; Result := inherited PreferedWidth;
end; end;
@ -2300,6 +2320,43 @@ begin
TSynEdit(SynEdit).InvalidateGutter; TSynEdit(SynEdit).InvalidateGutter;
end; 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); procedure TIDESynGutterMarks.SetDebugMarks(AFirstLinePos, ALastLinePos: Integer);
var var
i: LongInt; i: LongInt;