From 03a29a4554924c71f54915b48fd7b74f71cda370 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Tue, 20 Mar 2018 09:57:59 +0000 Subject: [PATCH] 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 --- .../examples/JvTabBar/JvTabBarDemo.lpi | 1 + .../jvcllaz/run/JvCustomControls/JvTabBar.pas | 79 +++++++++++-------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/components/jvcllaz/examples/JvTabBar/JvTabBarDemo.lpi b/components/jvcllaz/examples/JvTabBar/JvTabBarDemo.lpi index ced99fe6b..02c6553fa 100644 --- a/components/jvcllaz/examples/JvTabBar/JvTabBarDemo.lpi +++ b/components/jvcllaz/examples/JvTabBar/JvTabBarDemo.lpi @@ -42,6 +42,7 @@ + diff --git a/components/jvcllaz/run/JvCustomControls/JvTabBar.pas b/components/jvcllaz/run/JvCustomControls/JvTabBar.pas index a67727592..c072e20ac 100644 --- a/components/jvcllaz/run/JvCustomControls/JvTabBar.pas +++ b/components/jvcllaz/run/JvCustomControls/JvTabBar.pas @@ -26,7 +26,7 @@ Known Issues: unit JvTabBar; {$MODE objfpc}{$H+} -{$DEFINE JVCLThemesEnabled} +{.$DEFINE JVCLThemesEnabled} interface @@ -217,12 +217,12 @@ type procedure SetTabWidth(Value: Integer); protected 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 DrawMoveDivider(Canvas: TCanvas; Tab: TJvTabBarItem; MoveLeft: Boolean); override; function GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer; 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; public constructor Create(AOwner: TComponent); override; @@ -499,28 +499,28 @@ begin ACanvas.FillRect(R); if IsDown then begin ACanvas.Pen.Color := clBlack; - ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left - ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top + ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left + ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top ACanvas.Pen.Color := clBtnHighlight; - ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right - ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom + ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right + ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom InflateRect(R, -1, -1); ACanvas.Pen.Color := clBtnShadow; - ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left - ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top + ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left + ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top end else begin ACanvas.Pen.Color := clBlack; - ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right - ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom + ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right + ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom dec(R.Right); dec(R.Bottom); ACanvas.Pen.Color := clBtnHighlight; - ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom); // left - ACanvas.Line(R.Left, R.Top, R.Right, R.Top); // top + ACanvas.Line(R.Left, R.Top, R.Left, R.Bottom-1); // left + ACanvas.Line(R.Left, R.Top, R.Right-1, R.Top); // top Inc(R.Top); Inc(R.Left); - ACanvas.Line(R.Right, R.Top, R.Right, R.Bottom); // right - ACanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); // bottom + ACanvas.Line(R.Right-1, R.Top, R.Right-1, R.Bottom-1); // right + ACanvas.Line(R.Left, R.Bottom-1, R.Right-1, R.Bottom-1); // bottom end; end else begin ACanvas.Pen.Color := clWindowFrame; @@ -2228,10 +2228,14 @@ begin end; end; -procedure TJvModernTabBarPainter.DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem; R: TRect); +procedure TJvModernTabBarPainter.DrawTab(Canvas: TCanvas; Tab: TJvTabBarItem; + ATabRect: TRect); var - CloseR: TRect; + R, CloseR: TRect; + ts: TTextStyle; begin + R := ATabRect; + with Canvas do begin Brush.Style := bsSolid; @@ -2279,7 +2283,7 @@ begin else Brush.Color := CloseColor; - CloseR := GetCloseRect(Canvas, Tab, R); + CloseR := GetCloseRect(Canvas, Tab, ATabRect); Pen.Color := CloseRectColor; if not Tab.Enabled then Pen.Color := CloseRectColorDisabled; @@ -2301,7 +2305,8 @@ begin else Pen.Color := CloseCrossColorDisabled; - // close cross + // Draw close cross + MoveTo(CloseR.Left + 3, CloseR.Top + 3); MoveTo(CloseR.Left + 3, CloseR.Top + 3); LineTo(CloseR.Right - 3, CloseR.Bottom - 3); MoveTo(CloseR.Left + 4, CloseR.Top + 3); @@ -2316,17 +2321,20 @@ begin if Tab.Modified then 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; InflateRect(R, -1, -1); - if not Tab.TabBar.CloseButton then - Inc(R.Left, 2); + // if not Tab.TabBar.CloseButton then + Dec(R.Right, 2); +// Inc(R.Left, 2); if (Tab.ImageIndex <> -1) and (Tab.GetImages <> nil) then 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); Inc(R.Left, Tab.GetImages.Width + 2); end; @@ -2342,22 +2350,23 @@ begin Font.Assign(Self.DisabledFont); 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; -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 - (* - Result.Right := R.Right - 5; - Result.Top := R.Top + ((R.Bottom div 2) - 8); - Result.Left := Result.Right - 15; - 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; + Result.Right := ATabRect.Right - 5; + Result.Left := Result.Right - W; + Result.Top := (ATabRect.Top + ATabRect.Bottom - H) div 2; + Result.Bottom := Result.Top + W; end; function TJvModernTabBarPainter.GetDividerWidth(Canvas: TCanvas; LeftTab: TJvTabBarItem): Integer;