mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 09:16:16 +02:00
TAChart: Add KeyDown/KeyUp events to chart tools
git-svn-id: trunk@31139 -
This commit is contained in:
parent
3ecaf59d72
commit
5cf87bd0ee
@ -91,8 +91,6 @@ type
|
||||
|
||||
TSeriesClass = class of TBasicChartSeries;
|
||||
|
||||
TChartToolEvent = procedure (AChart: TChart; AX, AY: Integer) of object;
|
||||
|
||||
{ TBasicСhartTool }
|
||||
|
||||
TBasicChartTool = class(TIndexedComponent)
|
||||
@ -103,7 +101,8 @@ type
|
||||
procedure Deactivate; virtual;
|
||||
end;
|
||||
|
||||
TChartToolEventId = (evidMouseDown, evidMouseMove, evidMouseUp);
|
||||
TChartToolEventId = (
|
||||
evidKeyDown, evidKeyUp, evidMouseDown, evidMouseMove, evidMouseUp);
|
||||
|
||||
{ TBasicChartToolset }
|
||||
|
||||
@ -240,6 +239,8 @@ type
|
||||
procedure Clear(ADrawer: IChartDrawer; const ARect: TRect);
|
||||
procedure DisplaySeries(ADrawer: IChartDrawer);
|
||||
procedure DrawBackWall(ADrawer: IChartDrawer);
|
||||
procedure KeyDownAfterInterface(var AKey: Word; AShift: TShiftState); override;
|
||||
procedure KeyUpAfterInterface(var AKey: Word; AShift: TShiftState); override;
|
||||
procedure MouseDown(
|
||||
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
||||
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
||||
@ -980,7 +981,26 @@ begin
|
||||
InRange(AP.X, XGraphMin, XGraphMax) and InRange(AP.Y, YGraphMin, YGraphMax);
|
||||
end;
|
||||
|
||||
procedure TChart.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||
procedure TChart.KeyDownAfterInterface(var AKey: Word; AShift: TShiftState);
|
||||
begin
|
||||
if GetToolset.Dispatch(Self, evidKeyDown, AShift, Mouse.CursorPos) then exit;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TChart.KeyUpAfterInterface(var AKey: Word; AShift: TShiftState);
|
||||
begin
|
||||
// To find a tool, toolset must see the shift state with the key still down.
|
||||
case AKey of
|
||||
VK_CONTROL: AShift += [ssCtrl];
|
||||
VK_MENU: AShift += [ssAlt];
|
||||
VK_SHIFT: AShift += [ssShift];
|
||||
end;
|
||||
if GetToolset.Dispatch(Self, evidKeyUp, AShift, Mouse.CursorPos) then exit;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TChart.MouseDown(
|
||||
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
||||
begin
|
||||
if
|
||||
PtInRect(FClipRect, Point(X, Y)) and
|
||||
|
@ -30,7 +30,7 @@ type
|
||||
TChartToolset = class;
|
||||
TChartTool = class;
|
||||
|
||||
TChartToolMouseEvent = procedure (ATool: TChartTool; APoint: TPoint) of object;
|
||||
TChartToolEvent = procedure (ATool: TChartTool; APoint: TPoint) of object;
|
||||
|
||||
{ TChartTool }
|
||||
|
||||
@ -38,15 +38,18 @@ type
|
||||
private
|
||||
FActiveCursor: TCursor;
|
||||
FEnabled: Boolean;
|
||||
FMouseEvents: array [0..5] of TChartToolMouseEvent;
|
||||
FEventsAfter: array [TChartToolEventId] of TChartToolEvent;
|
||||
FEventsBefore: array [TChartToolEventId] of TChartToolEvent;
|
||||
FShift: TShiftState;
|
||||
FToolset: TChartToolset;
|
||||
procedure SetActiveCursor(const AValue: TCursor);
|
||||
procedure SetToolset(const AValue: TChartToolset);
|
||||
private
|
||||
FOldCursor: TCursor;
|
||||
function GetMouseEvent(AIndex: Integer): TChartToolMouseEvent;
|
||||
procedure SetMouseEvent(AIndex: Integer; AValue: TChartToolMouseEvent);
|
||||
function GetAfterEvent(AIndex: Integer): TChartToolEvent;
|
||||
function GetBeforeEvent(AIndex: Integer): TChartToolEvent;
|
||||
procedure SetAfterEvent(AIndex: Integer; AValue: TChartToolEvent);
|
||||
procedure SetBeforeEvent(AIndex: Integer; AValue: TChartToolEvent);
|
||||
protected
|
||||
procedure ReadState(Reader: TReader); override;
|
||||
procedure SetParentComponent(AParent: TComponent); override;
|
||||
@ -57,6 +60,8 @@ type
|
||||
AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint); overload;
|
||||
function GetIndex: Integer; override;
|
||||
function IsActive: Boolean;
|
||||
procedure KeyDown(APoint: TPoint); virtual;
|
||||
procedure KeyUp(APoint: TPoint); virtual;
|
||||
procedure MouseDown(APoint: TPoint); virtual;
|
||||
procedure MouseMove(APoint: TPoint); virtual;
|
||||
procedure MouseUp(APoint: TPoint); virtual;
|
||||
@ -79,18 +84,27 @@ type
|
||||
property Enabled: Boolean read FEnabled write FEnabled default true;
|
||||
property Shift: TShiftState read FShift write FShift;
|
||||
published
|
||||
property OnAfterMouseDown: TChartToolMouseEvent
|
||||
index 0 read GetMouseEvent write SetMouseEvent;
|
||||
property OnAfterMouseMove: TChartToolMouseEvent
|
||||
index 1 read GetMouseEvent write SetMouseEvent;
|
||||
property OnAfterMouseUp: TChartToolMouseEvent
|
||||
index 2 read GetMouseEvent write SetMouseEvent;
|
||||
property OnBeforeMouseDown: TChartToolMouseEvent
|
||||
index 3 read GetMouseEvent write SetMouseEvent;
|
||||
property OnBeforeMouseMove: TChartToolMouseEvent
|
||||
index 4 read GetMouseEvent write SetMouseEvent;
|
||||
property OnBeforeMouseUp: TChartToolMouseEvent
|
||||
index 5 read GetMouseEvent write SetMouseEvent;
|
||||
property OnAfterKeyDown: TChartToolEvent
|
||||
index 0 read GetAfterEvent write SetAfterEvent;
|
||||
property OnAfterKeyUp: TChartToolEvent
|
||||
index 1 read GetAfterEvent write SetAfterEvent;
|
||||
property OnAfterMouseDown: TChartToolEvent
|
||||
index 2 read GetAfterEvent write SetAfterEvent;
|
||||
property OnAfterMouseMove: TChartToolEvent
|
||||
index 3 read GetAfterEvent write SetAfterEvent;
|
||||
property OnAfterMouseUp: TChartToolEvent
|
||||
index 4 read GetAfterEvent write SetAfterEvent;
|
||||
|
||||
property OnBeforeKeyDown: TChartToolEvent
|
||||
index 0 read GetBeforeEvent write SetBeforeEvent;
|
||||
property OnBeforeKeyUp: TChartToolEvent
|
||||
index 1 read GetBeforeEvent write SetBeforeEvent;
|
||||
property OnBeforeMouseDown: TChartToolEvent
|
||||
index 2 read GetBeforeEvent write SetBeforeEvent;
|
||||
property OnBeforeMouseMove: TChartToolEvent
|
||||
index 3 read GetBeforeEvent write SetBeforeEvent;
|
||||
property OnBeforeMouseUp: TChartToolEvent
|
||||
index 4 read GetBeforeEvent write SetBeforeEvent;
|
||||
end;
|
||||
|
||||
TChartToolClass = class of TChartTool;
|
||||
@ -298,13 +312,13 @@ type
|
||||
TDataPointClickTool = class(TDataPointTool)
|
||||
private
|
||||
FMouseDownPoint: TPoint;
|
||||
FOnPointClick: TChartToolMouseEvent;
|
||||
FOnPointClick: TChartToolEvent;
|
||||
public
|
||||
procedure MouseDown(APoint: TPoint); override;
|
||||
procedure MouseUp(APoint: TPoint); override;
|
||||
published
|
||||
property ActiveCursor;
|
||||
property OnPointClick: TChartToolMouseEvent
|
||||
property OnPointClick: TChartToolEvent
|
||||
read FOnPointClick write FOnPointClick;
|
||||
end;
|
||||
|
||||
@ -524,25 +538,37 @@ end;
|
||||
procedure TChartTool.Dispatch(
|
||||
AChart: TChart; AEventId: TChartToolEventId; APoint: TPoint);
|
||||
var
|
||||
ev: TChartToolMouseEvent;
|
||||
ev: TChartToolEvent;
|
||||
begin
|
||||
if not Enabled or (FChart <> nil) and (FChart <> AChart) then exit;
|
||||
FChart := AChart;
|
||||
ev := FMouseEvents[Ord(AEventId) + Ord(High(AEventId)) + 1];
|
||||
ev := FEventsBefore[AEventId];
|
||||
if Assigned(ev) then begin
|
||||
ev(Self, APoint);
|
||||
if Toolset.FIsHandled then exit;
|
||||
end;
|
||||
case AEventId of
|
||||
evidKeyDown : KeyDown (APoint);
|
||||
evidKeyUp : KeyUp (APoint);
|
||||
evidMouseDown: MouseDown(APoint);
|
||||
evidMouseMove: MouseMove(APoint);
|
||||
evidMouseUp : MouseUp (APoint);
|
||||
end;
|
||||
ev := FMouseEvents[Ord(AEventId)];
|
||||
ev := FEventsAfter[AEventId];
|
||||
if Assigned(ev) then
|
||||
ev(Self, APoint);
|
||||
end;
|
||||
|
||||
function TChartTool.GetAfterEvent(AIndex: Integer): TChartToolEvent;
|
||||
begin
|
||||
Result := FEventsAfter[TChartToolEventId(AIndex)];
|
||||
end;
|
||||
|
||||
function TChartTool.GetBeforeEvent(AIndex: Integer): TChartToolEvent;
|
||||
begin
|
||||
Result := FEventsBefore[TChartToolEventId(AIndex)];
|
||||
end;
|
||||
|
||||
function TChartTool.GetIndex: Integer;
|
||||
begin
|
||||
if Toolset = nil then
|
||||
@ -551,11 +577,6 @@ begin
|
||||
Result := Toolset.Tools.IndexOf(Self);
|
||||
end;
|
||||
|
||||
function TChartTool.GetMouseEvent(AIndex: Integer): TChartToolMouseEvent;
|
||||
begin
|
||||
Result := FMouseEvents[AIndex];
|
||||
end;
|
||||
|
||||
function TChartTool.GetParentComponent: TComponent;
|
||||
begin
|
||||
Result := FToolset;
|
||||
@ -576,6 +597,16 @@ begin
|
||||
Result := (FChart <> nil) and (FChart.ActiveToolIndex = Index);
|
||||
end;
|
||||
|
||||
procedure TChartTool.KeyDown(APoint: TPoint);
|
||||
begin
|
||||
Unused(APoint);
|
||||
end;
|
||||
|
||||
procedure TChartTool.KeyUp(APoint: TPoint);
|
||||
begin
|
||||
Unused(APoint);
|
||||
end;
|
||||
|
||||
procedure TChartTool.MouseDown(APoint: TPoint);
|
||||
begin
|
||||
Unused(APoint);
|
||||
@ -614,6 +645,16 @@ begin
|
||||
SetCursor;
|
||||
end;
|
||||
|
||||
procedure TChartTool.SetAfterEvent(AIndex: Integer; AValue: TChartToolEvent);
|
||||
begin
|
||||
FEventsAfter[TChartToolEventId(AIndex)] := AValue;
|
||||
end;
|
||||
|
||||
procedure TChartTool.SetBeforeEvent(AIndex: Integer; AValue: TChartToolEvent);
|
||||
begin
|
||||
FEventsBefore[TChartToolEventId(AIndex)] := AValue;
|
||||
end;
|
||||
|
||||
procedure TChartTool.SetCursor;
|
||||
begin
|
||||
if ActiveCursor = crDefault then exit;
|
||||
@ -626,12 +667,6 @@ begin
|
||||
Toolset.Tools.Move(Index, EnsureRange(AValue, 0, Toolset.Tools.Count - 1));
|
||||
end;
|
||||
|
||||
procedure TChartTool.SetMouseEvent(
|
||||
AIndex: Integer; AValue: TChartToolMouseEvent);
|
||||
begin
|
||||
FMouseEvents[AIndex] := AValue;
|
||||
end;
|
||||
|
||||
procedure TChartTool.SetParentComponent(AParent: TComponent);
|
||||
begin
|
||||
if not (csLoading in ComponentState) then
|
||||
|
Loading…
Reference in New Issue
Block a user