From 6807ed54972185c2373c95b68c08c762aaba1d83 Mon Sep 17 00:00:00 2001 From: wp Date: Sun, 1 Mar 2015 17:11:17 +0000 Subject: [PATCH] TAChart: new property "MouseInsideOnly" of TDatapointHintTool and TDataPointCrosshairTool to show the hint/crosshair only if mouse is inside the chart's extent. git-svn-id: trunk@48089 - --- components/tachart/tatools.pas | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/components/tachart/tatools.pas b/components/tachart/tatools.pas index da26290a99..a333873688 100644 --- a/components/tachart/tatools.pas +++ b/components/tachart/tatools.pas @@ -398,6 +398,7 @@ type FAffectedSeries: TPublishedIntegerSet; FDistanceMode: TChartDistanceMode; FGrabRadius: Integer; + FMouseInsideOnly: Boolean; function GetAffectedSeries: String; inline; function GetIsSeriesAffected(AIndex: Integer): Boolean; inline; procedure SetAffectedSeries(AValue: String); inline; @@ -407,6 +408,8 @@ type FPointIndex: Integer; FSeries: TBasicChartSeries; procedure FindNearestPoint(APoint: TPoint); + property MouseInsideOnly: Boolean + read FMouseInsideOnly write FMouseInsideOnly default false; public constructor Create(AOwner: TComponent); override; public @@ -504,11 +507,12 @@ type property OnHintLocation: TChartToolHintLocationEvent read FOnHintLocation write FOnHintLocation; property OnHintPosition: TChartToolHintPositionEvent - read FOnHintPosition write FOnHintPosition; //deprecated; + read FOnHintPosition write FOnHintPosition; property UseApplicationHint: Boolean read FUseApplicationHint write SetUseApplicationHint default false; property UseDefaultHintText: Boolean read FUseDefaultHintText write FUseDefaultHintText default true; + property MouseInsideOnly; end; { TDataPointDrawTool } @@ -534,6 +538,7 @@ type property DrawingMode; property GrabRadius default 20; property OnDraw: TChartDataPointDrawEvent read FOnDraw write FOnDraw; + property MouseInsideOnly; end; TChartCrosshairShape = (ccsNone, ccsVertical, ccsHorizontal, ccsCross); @@ -1570,9 +1575,19 @@ procedure TDataPointTool.FindNearestPoint(APoint: TPoint); function InBoundaryBox(ASeries: TCustomChartSeries): Boolean; var r, gr: TDoubleRect; + p: TDoublePoint; + ext: TDoubleRect; begin r := ASeries.GetGraphBounds; - if not RectIntersectsRect(r, FChart.CurrentExtent) then exit(false); + ext := FChart.CurrentExtent; + if not RectIntersectsRect(r, ext) then exit(false); + + if FMouseInsideOnly then begin + p := FChart.ImageToGraph(APoint); + if not (SafeInRange(p.x, ext.a.x, ext.b.x) and SafeInRange(p.y, ext.a.y, ext.b.y)) then + exit(false); + end; + case DistanceMode of cdmOnlyX: begin gr.a := DoublePoint(FChart.XImageToGraph(APoint.X - GrabRadius), NegInfinity);