diff --git a/components/tachart/tagraph.pas b/components/tachart/tagraph.pas index 03e31c3a72..61a235a9c9 100644 --- a/components/tachart/tagraph.pas +++ b/components/tachart/tagraph.pas @@ -159,6 +159,7 @@ type FClipRect: TRect; FCurrentExtent: TDoubleRect; FIsZoomed: Boolean; + FLogicalExtent: TDoubleRect; FOffset: TDoublePoint; // Coordinates transformation FReticuleMode: TReticuleMode; FReticulePos: TPoint; @@ -227,6 +228,7 @@ type procedure CopyToClipboardBitmap; procedure DeleteSeries(ASeries: TBasicChartSeries); procedure PaintOnCanvas(ACanvas: TCanvas; ARect: TRect); + procedure Pan(const ADelta: TPoint); procedure SaveToBitmapFile(const AFileName: String); inline; procedure SaveToFile(AClass: TRasterImageClass; const AFileName: String); function SaveToImage(AClass: TRasterImageClass): TRasterImage; @@ -463,6 +465,7 @@ begin if not FIsZoomed then UpdateExtent; + FLogicalExtent := FCurrentExtent; DrawTitleFoot(ACanvas); PrepareLegend(ACanvas, legendItems, legendRect); try @@ -478,6 +481,21 @@ begin Series[i].AfterDraw; end; +procedure TChart.Pan(const ADelta: TPoint); +var + d: TDoublePoint; +begin + d.X := ADelta.X / FScale.X; + d.Y := ADelta.Y / FScale.Y; + with FLogicalExtent do begin + a += d; + b += d; + end; + FIsZoomed := true; + FCurrentExtent := FLogicalExtent; + Invalidate; +end; + procedure TChart.PrepareLegend( ACanvas: TCanvas; out ALegendItems: TChartLegendItems; out ARect: TRect); var diff --git a/components/tachart/tatools.pas b/components/tachart/tatools.pas index 0d18f670f7..8eb784f3da 100644 --- a/components/tachart/tatools.pas +++ b/components/tachart/tatools.pas @@ -113,6 +113,18 @@ type read FZoomFactor write FZoomFactor stored ZoomFactorIsStored; end; + { TPanDragTool } + + TPanDragTool = class(TChartTool) + private + FOrigin: TPoint; + public + constructor Create(AOwner: TComponent); override; + procedure MouseDown(APoint: TPoint); override; + procedure MouseMove(APoint: TPoint); override; + procedure MouseUp(APoint: TPoint); override; + end; + { TReticuleTool } TReticuleTool = class(TChartTool) @@ -528,12 +540,38 @@ begin Result := FZoomFactor <> 1.0; end; +constructor TPanDragTool.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +{ TPanDragTool } + +procedure TPanDragTool.MouseDown(APoint: TPoint); +begin + Activate; + FOrigin := APoint; +end; + +procedure TPanDragTool.MouseMove(APoint: TPoint); +begin + FChart.Pan(APoint - FOrigin); + FOrigin := APoint; +end; + +procedure TPanDragTool.MouseUp(APoint: TPoint); +begin + Unused(APoint); + Deactivate; +end; + initialization ToolsClassRegistry := TStringList.Create; OnInitBuiltinTools := @InitBuitlinTools; RegisterChartToolClass(TZoomDragTool, 'Zoom drag tool'); RegisterChartToolClass(TZoomClickTool, 'Zoom click tool'); + RegisterChartToolClass(TPanDragTool, 'Panning drag tool'); RegisterChartToolClass(TReticuleTool, 'Reticule tool'); finalization