jvcllaz: Improved painting of TJvTabBar tabs by TJvModernTabBarPainter.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6261 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-03-20 09:57:59 +00:00
parent df4851ec84
commit 03a29a4554
2 changed files with 45 additions and 35 deletions

View File

@ -42,6 +42,7 @@
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<ComponentName Value="Form1"/> <ComponentName Value="Form1"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/> <UnitName Value="Main"/>
</Unit1> </Unit1>

View File

@ -26,7 +26,7 @@ Known Issues:
unit JvTabBar; unit JvTabBar;
{$MODE objfpc}{$H+} {$MODE objfpc}{$H+}
{$DEFINE JVCLThemesEnabled} {.$DEFINE JVCLThemesEnabled}
interface interface
@ -217,12 +217,12 @@ type
procedure SetTabWidth(Value: Integer); procedure SetTabWidth(Value: Integer);
protected protected
procedure DrawBackground(Canvas: TCanvas; TabBar: TJvCustomTabBar; R: TRect); override; procedure DrawBackground(Canvas: TCanvas; TabBar: TJvCustomTabBar; R: TRect); override;
procedure DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem; R: TRect); override; procedure DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem; ATabRect: TRect); override;
procedure DrawDivider(Canvas: TCanvas; LeftTab: TJvTabBarItem; R: TRect); override; procedure DrawDivider(Canvas: TCanvas; LeftTab: TJvTabBarItem; R: TRect); override;
procedure DrawMoveDivider(Canvas: TCanvas; Tab: TJvTabBarItem; MoveLeft: Boolean); override; procedure DrawMoveDivider(Canvas: TCanvas; Tab: TJvTabBarItem; MoveLeft: Boolean); override;
function GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer; override; function GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer; override;
function GetTabSize(Canvas: TCanvas; Tab: TJvTabBarItem): TSize; override; function GetTabSize(Canvas: TCanvas; Tab: TJvTabBarItem): TSize; override;
function GetCloseRect(Canvas: TCanvas; Tab: TJvTabBarItem; R: TRect): TRect; override; function GetCloseRect(Canvas: TCanvas; Tab: TJvTabBarItem; ATabRect: TRect): TRect; override;
function Options: TJvTabBarPainterOptions; override; function Options: TJvTabBarPainterOptions; override;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
@ -499,28 +499,28 @@ begin
ACanvas.FillRect(R); ACanvas.FillRect(R);
if IsDown then begin if IsDown then begin
ACanvas.Pen.Color := clBlack; ACanvas.Pen.Color := clBlack;
ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left
ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top
ACanvas.Pen.Color := clBtnHighlight; ACanvas.Pen.Color := clBtnHighlight;
ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right
ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom
InflateRect(R, -1, -1); InflateRect(R, -1, -1);
ACanvas.Pen.Color := clBtnShadow; ACanvas.Pen.Color := clBtnShadow;
ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left
ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top
end else begin end else begin
ACanvas.Pen.Color := clBlack; ACanvas.Pen.Color := clBlack;
ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right
ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom
dec(R.Right); dec(R.Right);
dec(R.Bottom); dec(R.Bottom);
ACanvas.Pen.Color := clBtnHighlight; ACanvas.Pen.Color := clBtnHighlight;
ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left
ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top
Inc(R.Top); Inc(R.Top);
Inc(R.Left); Inc(R.Left);
ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right
ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom
end; end;
end else begin end else begin
ACanvas.Pen.Color := clWindowFrame; ACanvas.Pen.Color := clWindowFrame;
@ -2228,10 +2228,14 @@ begin
end; end;
end; end;
procedure TJvModernTabBarPainter.DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem; R: TRect); procedure TJvModernTabBarPainter.DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem;
ATabRect: TRect);
var var
CloseR: TRect; R, CloseR: TRect;
ts: TTextStyle;
begin begin
R := ATabRect;
with Canvas do with Canvas do
begin begin
Brush.Style := bsSolid; Brush.Style := bsSolid;
@ -2279,7 +2283,7 @@ begin
else else
Brush.Color := CloseColor; Brush.Color := CloseColor;
CloseR := GetCloseRect(Canvas, Tab, R); CloseR := GetCloseRect(Canvas, Tab, ATabRect);
Pen.Color := CloseRectColor; Pen.Color := CloseRectColor;
if not Tab.Enabled then if not Tab.Enabled then
Pen.Color := CloseRectColorDisabled; Pen.Color := CloseRectColorDisabled;
@ -2301,7 +2305,8 @@ begin
else else
Pen.Color := CloseCrossColorDisabled; Pen.Color := CloseCrossColorDisabled;
// close cross // Draw close cross
MoveTo(CloseR.Left + 3, CloseR.Top + 3);
MoveTo(CloseR.Left + 3, CloseR.Top + 3); MoveTo(CloseR.Left + 3, CloseR.Top + 3);
LineTo(CloseR.Right - 3, CloseR.Bottom - 3); LineTo(CloseR.Right - 3, CloseR.Bottom - 3);
MoveTo(CloseR.Left + 4, CloseR.Top + 3); MoveTo(CloseR.Left + 4, CloseR.Top + 3);
@ -2316,17 +2321,20 @@ begin
if Tab.Modified then if Tab.Modified then
FillRect(Rect(CloseR.Left + 5, CloseR.Top + 4, CloseR.Right - 5, CloseR.Bottom - 4)); FillRect(Rect(CloseR.Left + 5, CloseR.Top + 4, CloseR.Right - 5, CloseR.Bottom - 4));
R.Left := CloseR.Right; R.Right := CloseR.Left;
// R.Left := CloseR.Right;
end; end;
InflateRect(R, -1, -1); InflateRect(R, -1, -1);
if not Tab.TabBar.CloseButton then // if not Tab.TabBar.CloseButton then
Inc(R.Left, 2); Dec(R.Right, 2);
// Inc(R.Left, 2);
if (Tab.ImageIndex <> -1) and (Tab.GetImages <> nil) then if (Tab.ImageIndex <> -1) and (Tab.GetImages <> nil) then
begin begin
Tab.GetImages.Draw(Canvas, R.Left, R.Top + (R.Bottom - R.Top - Tab.GetImages.Height) div 2, inc(R.Left, 2);
Tab.GetImages.Draw(Canvas, R.Left, (R.Top + R.Bottom - Tab.GetImages.Height) div 2,
Tab.ImageIndex, Tab.Enabled); Tab.ImageIndex, Tab.Enabled);
Inc(R.Left, Tab.GetImages.Width + 2); Inc(R.Left, Tab.GetImages.Width + 2);
end; end;
@ -2342,22 +2350,23 @@ begin
Font.Assign(Self.DisabledFont); Font.Assign(Self.DisabledFont);
Brush.Style := bsClear; Brush.Style := bsClear;
TextRect(R, R.Left + 3, R.Top + 3, Tab.Caption); ts := TextStyle;
ts.EndEllipsis := true;
ts.Clipping := true;
TextRect(R, R.Left, (R.Top + R.Bottom - TextHeight('Tg')) div 2, Tab.Caption, ts);
end; end;
end; end;
function TJvModernTabBarPainter.GetCloseRect(Canvas: TCanvas; Tab: TJvTabBarItem; R: TRect): TRect; function TJvModernTabBarPainter.GetCloseRect(Canvas: TCanvas; Tab: TJvTabBarItem;
ATabRect: TRect): TRect;
const
H = 12;
W = 12;
begin begin
(* Result.Right := ATabRect.Right - 5;
Result.Right := R.Right - 5; Result.Left := Result.Right - W;
Result.Top := R.Top + ((R.Bottom div 2) - 8); Result.Top := (ATabRect.Top + ATabRect.Bottom - H) div 2;
Result.Left := Result.Right - 15; Result.Bottom := Result.Top + W;
Result.Bottom := Result.Top + 15;
*)
Result.Left := R.Left + 5;
Result.Top := R.Top + 5;
Result.Right := Result.Left + 12;
Result.Bottom := Result.Top + 11;
end; end;
function TJvModernTabBarPainter.GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer; function TJvModernTabBarPainter.GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer;