From 6a30dafffdabcef0c77ca192039a4f0bb38a93fc Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Tue, 24 Feb 2015 11:09:59 +0000 Subject: [PATCH] cocoa: New implementation of TreeView arrow without obsolete HiTheme git-svn-id: trunk@47978 - --- lcl/interfaces/cocoa/cocoagdiobjects.pas | 10 ++++++ lcl/interfaces/cocoa/cocoathemes.pas | 41 +++++++++++++++++------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoagdiobjects.pas b/lcl/interfaces/cocoa/cocoagdiobjects.pas index c1fd68b4a3..0b7679be64 100644 --- a/lcl/interfaces/cocoa/cocoagdiobjects.pas +++ b/lcl/interfaces/cocoa/cocoagdiobjects.pas @@ -165,6 +165,7 @@ type constructor Create(const ALogPen: TLogPen; const AGlobal: Boolean = False); constructor Create(dwPenStyle, dwWidth: DWord; const lplb: TLogBrush; dwStyleCount: DWord; lpStyle: PDWord); constructor Create(const ABrush: TCocoaBrush; const AGlobal: Boolean = False); + constructor Create(const AColor: TColor; AGlobal: Boolean); procedure Apply(ADC: TCocoaContext; UseROP2: Boolean = True); property Width: Integer read FWidth; @@ -2592,6 +2593,15 @@ begin Dashes := nil; end; +constructor TCocoaPen.Create(const AColor: TColor; AGlobal: Boolean); +begin + inherited Create(AColor, True, AGlobal); + FStyle := PS_SOLID; + FWidth := 1; + FIsExtPen := False; + Dashes := nil; +end; + { TCocoaBrush } procedure DrawBitmapPattern(info: UnivPtr; c: CGContextRef); MWPascal; diff --git a/lcl/interfaces/cocoa/cocoathemes.pas b/lcl/interfaces/cocoa/cocoathemes.pas index ef2a75d8c5..a8b6066b9f 100644 --- a/lcl/interfaces/cocoa/cocoathemes.pas +++ b/lcl/interfaces/cocoa/cocoathemes.pas @@ -336,7 +336,10 @@ function TCocoaThemeServices.DrawTreeviewElement(DC: TCocoaContext; var ButtonDrawInfo: HIThemeButtonDrawInfo; LabelRect: HIRect; - b: TCocoaBrush; + lBrush: TCocoaBrush; + lOldBrush: HBRUSH; + lPen: TCocoaPen; + lOldPen: HGDIOBJ; lColor: NSColor; lPoints: array of TPoint; begin @@ -351,14 +354,14 @@ begin TREIS_SELECTEDNOTFOCUS: lColor := ColorToNSColor(ColorToRGB(clBtnFace)); TREIS_HOTSELECTED: lColor := ColorToNSColor(ColorToRGB(clHighlight)); end; - b := TCocoaBrush.Create(lColor, False); - DC.Rectangle(R.Left, R.Top, R.Right, R.Bottom, True, b); - b.Free; + lBrush := TCocoaBrush.Create(lColor, False); + DC.Rectangle(R.Left, R.Top, R.Right, R.Bottom, True, lBrush); + lBrush.Free; end; TVP_GLYPH, TVP_HOTGLYPH: begin // HIThemeDrawButton exists only in 32-bits and there is no Cocoa alternative =( - {$define CocoaUseHITheme} + {.$define CocoaUseHITheme} {$ifdef CocoaUseHITheme} {$ifdef CPU386} ButtonDrawInfo.version := 0; @@ -386,20 +389,34 @@ begin // face right if Details.State = GLPS_CLOSED then begin - lPoints[0] := Types.Point(R.Left, R.Top); - lPoints[1] := Types.Point(R.Left, R.Bottom); - lPoints[2] := Types.Point(R.Right, (R.Top + R.Bottom) div 2); + lPoints[0] := Types.Point(R.Left+1, R.Top); + lPoints[1] := Types.Point(R.Left+1, R.Bottom-2); + lPoints[2] := Types.Point(R.Right-1, (R.Top + R.Bottom-2) div 2); end // face down else begin lPoints[0] := Types.Point(R.Left, R.Top); - lPoints[1] := Types.Point(R.Right, R.Top); - lPoints[2] := Types.Point((R.Left + R.Right) div 2, R.Bottom); + lPoints[1] := Types.Point(R.Right-2, R.Top); + lPoints[2] := Types.Point((R.Left + R.Right-2) div 2, R.Bottom-2); end; - DC.Brush.SetColor(Graphics.RGBToColor(0, 0, 0), True); - DC.Polygon(lPoints, 3, False); + // select the appropriate brush & pen + lColor := ColorToNSColor(Graphics.RGBToColor(121, 121, 121)); + lBrush := TCocoaBrush.Create(lColor, False); + lOldBrush := LCLIntf.SelectObject(HDC(DC), HGDIOBJ(lBrush)); + + lPen := TCocoaPen.Create(Graphics.RGBToColor(121, 121, 121), False); + lOldPen := LCLIntf.SelectObject(HDC(DC), HGDIOBJ(lPen)); + + // Draw the triangle + DC.Polygon(lPoints, 3, True); + + // restore the old brush and pen + LCLIntf.SelectObject(HDC(DC), lOldBrush); + LCLIntf.SelectObject(HDC(DC), lOldPen); + lBrush.Free; + lPen.Free; Result := R; {$endif}