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