mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-10-28 09:51:44 +01:00
TAChart: Initial implementation of chart styles
git-svn-id: trunk@27270 -
This commit is contained in:
parent
f2e1d9f50b
commit
a1d8b1a7e8
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -2213,6 +2213,7 @@ components/tachart/tamultiseries.pas svneol=native#text/pascal
|
|||||||
components/tachart/taseries.pas svneol=native#text/plain
|
components/tachart/taseries.pas svneol=native#text/plain
|
||||||
components/tachart/taserieseditor.pas svneol=native#text/plain
|
components/tachart/taserieseditor.pas svneol=native#text/plain
|
||||||
components/tachart/tasources.pas svneol=native#text/pascal
|
components/tachart/tasources.pas svneol=native#text/pascal
|
||||||
|
components/tachart/tastyles.pas svneol=native#text/pascal
|
||||||
components/tachart/tasubcomponentseditor.lfm svneol=native#text/plain
|
components/tachart/tasubcomponentseditor.lfm svneol=native#text/plain
|
||||||
components/tachart/tasubcomponentseditor.pas svneol=native#text/pascal
|
components/tachart/tasubcomponentseditor.pas svneol=native#text/pascal
|
||||||
components/tachart/tatools.pas svneol=native#text/pascal
|
components/tachart/tatools.pas svneol=native#text/pascal
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
for details about the copyright.
|
for details about the copyright.
|
||||||
"/>
|
"/>
|
||||||
<Version Major="1"/>
|
<Version Major="1"/>
|
||||||
<Files Count="15">
|
<Files Count="16">
|
||||||
<Item1>
|
<Item1>
|
||||||
<Filename Value="tachartaxis.pas"/>
|
<Filename Value="tachartaxis.pas"/>
|
||||||
<UnitName Value="TAChartAxis"/>
|
<UnitName Value="TAChartAxis"/>
|
||||||
@ -92,6 +92,11 @@
|
|||||||
<Filename Value="talegend.pas"/>
|
<Filename Value="talegend.pas"/>
|
||||||
<UnitName Value="TALegend"/>
|
<UnitName Value="TALegend"/>
|
||||||
</Item15>
|
</Item15>
|
||||||
|
<Item16>
|
||||||
|
<Filename Value="tastyles.pas"/>
|
||||||
|
<HasRegisterProc Value="True"/>
|
||||||
|
<UnitName Value="TAStyles"/>
|
||||||
|
</Item16>
|
||||||
</Files>
|
</Files>
|
||||||
<LazDoc Paths="$(LazarusDir)\components\tachart\fpdoc\"/>
|
<LazDoc Paths="$(LazarusDir)\components\tachart\fpdoc\"/>
|
||||||
<Type Value="RunAndDesignTime"/>
|
<Type Value="RunAndDesignTime"/>
|
||||||
|
|||||||
@ -9,7 +9,7 @@ interface
|
|||||||
uses
|
uses
|
||||||
TAChartAxis, TAChartUtils, TACustomSeries, TADbSource, TAGraph, TASeries,
|
TAChartAxis, TAChartUtils, TACustomSeries, TADbSource, TAGraph, TASeries,
|
||||||
TASeriesEditor, TASources, TASubcomponentsEditor, TATools,
|
TASeriesEditor, TASources, TASubcomponentsEditor, TATools,
|
||||||
TATransformations, TATypes, TADrawUtils, TAMultiSeries, TALegend,
|
TATransformations, TATypes, TADrawUtils, TAMultiSeries, TALegend, TAStyles,
|
||||||
LazarusPackageIntf;
|
LazarusPackageIntf;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -22,6 +22,7 @@ begin
|
|||||||
RegisterUnit('TASources', @TASources.Register);
|
RegisterUnit('TASources', @TASources.Register);
|
||||||
RegisterUnit('TATools', @TATools.Register);
|
RegisterUnit('TATools', @TATools.Register);
|
||||||
RegisterUnit('TATransformations', @TATransformations.Register);
|
RegisterUnit('TATransformations', @TATransformations.Register);
|
||||||
|
RegisterUnit('TAStyles', @TAStyles.Register);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
|||||||
@ -24,7 +24,7 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, Graphics, SysUtils,
|
Classes, Graphics, SysUtils,
|
||||||
TAChartAxis, TAChartUtils, TAGraph, TASources, TATypes;
|
TAChartAxis, TAChartUtils, TAGraph, TASources, TAStyles, TATypes;
|
||||||
|
|
||||||
const
|
const
|
||||||
DEF_AXIS_INDEX = -1;
|
DEF_AXIS_INDEX = -1;
|
||||||
@ -88,12 +88,15 @@ type
|
|||||||
FMarks: TChartMarks;
|
FMarks: TChartMarks;
|
||||||
FOnGetMark: TChartGetMarkEvent;
|
FOnGetMark: TChartGetMarkEvent;
|
||||||
FSource: TCustomChartSource;
|
FSource: TCustomChartSource;
|
||||||
|
FStyles: TChartStyles;
|
||||||
|
FStylesListener: TListener;
|
||||||
|
|
||||||
function GetSource: TCustomChartSource;
|
function GetSource: TCustomChartSource;
|
||||||
function IsSourceStored: boolean;
|
function IsSourceStored: boolean;
|
||||||
procedure SetMarks(const AValue: TChartMarks);
|
procedure SetMarks(const AValue: TChartMarks);
|
||||||
procedure SetOnGetMark(const AValue: TChartGetMarkEvent);
|
procedure SetOnGetMark(const AValue: TChartGetMarkEvent);
|
||||||
procedure SetSource(AValue: TCustomChartSource);
|
procedure SetSource(AValue: TCustomChartSource);
|
||||||
|
procedure SetStyles(AValue: TChartStyles);
|
||||||
protected
|
protected
|
||||||
procedure AfterAdd; override;
|
procedure AfterAdd; override;
|
||||||
procedure AfterDraw; override;
|
procedure AfterDraw; override;
|
||||||
@ -107,6 +110,8 @@ type
|
|||||||
function GetXMaxVal: Integer;
|
function GetXMaxVal: Integer;
|
||||||
procedure VisitSources(
|
procedure VisitSources(
|
||||||
AVisitor: TChartOnSourceVisitor; AAxis: TChartAxis; var AData); override;
|
AVisitor: TChartOnSourceVisitor; AAxis: TChartAxis; var AData); override;
|
||||||
|
protected
|
||||||
|
property Styles: TChartStyles read FStyles write SetStyles;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -411,6 +416,7 @@ begin
|
|||||||
FBuiltinSource.Name := BUILTIN_SOURCE_NAME;
|
FBuiltinSource.Name := BUILTIN_SOURCE_NAME;
|
||||||
FBuiltinSource.Broadcaster.Subscribe(FListener);
|
FBuiltinSource.Broadcaster.Subscribe(FListener);
|
||||||
FMarks := TChartMarks.Create(FChart);
|
FMarks := TChartMarks.Create(FChart);
|
||||||
|
FStylesListener := TListener.Create(@FStyles, @StyleChanged);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TChartSeries.Delete(AIndex: Integer);
|
procedure TChartSeries.Delete(AIndex: Integer);
|
||||||
@ -423,6 +429,7 @@ begin
|
|||||||
FreeAndNil(FListener);
|
FreeAndNil(FListener);
|
||||||
FreeAndNil(FBuiltinSource);
|
FreeAndNil(FBuiltinSource);
|
||||||
FreeAndNil(FMarks);
|
FreeAndNil(FMarks);
|
||||||
|
FreeAndNil(FStylesListener);
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -586,6 +593,16 @@ begin
|
|||||||
UpdateParentChart;
|
UpdateParentChart;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TChartSeries.SetStyles(AValue: TChartStyles);
|
||||||
|
begin
|
||||||
|
if FStyles = AValue then exit;
|
||||||
|
if FStylesListener.IsListening then
|
||||||
|
Styles.Broadcaster.Unsubscribe(FStylesListener);
|
||||||
|
FStyles := AValue;
|
||||||
|
Styles.Broadcaster.Subscribe(FStylesListener);
|
||||||
|
UpdateParentChart;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TChartSeries.SetXValue(AIndex: Integer; AValue: Double); inline;
|
procedure TChartSeries.SetXValue(AIndex: Integer; AValue: Double); inline;
|
||||||
begin
|
begin
|
||||||
ListSource.SetXValue(AIndex, AValue);
|
ListSource.SetXValue(AIndex, AValue);
|
||||||
|
|||||||
226
components/tachart/tastyles.pas
Normal file
226
components/tachart/tastyles.pas
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
*****************************************************************************
|
||||||
|
* *
|
||||||
|
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
|
||||||
|
* for details about the copyright. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* *
|
||||||
|
*****************************************************************************
|
||||||
|
|
||||||
|
Authors: Alexander Klenin
|
||||||
|
|
||||||
|
}
|
||||||
|
unit TAStyles;
|
||||||
|
|
||||||
|
{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, Graphics, SysUtils, TAChartUtils;
|
||||||
|
|
||||||
|
type
|
||||||
|
{ TChartStyle }
|
||||||
|
|
||||||
|
TChartStyle = class(TCollectionItem)
|
||||||
|
private
|
||||||
|
FBrush: TBrush;
|
||||||
|
FPen: TPen;
|
||||||
|
FRepeatCount: Cardinal;
|
||||||
|
procedure SetBrush(const AValue: TBrush);
|
||||||
|
procedure SetPen(const AValue: TPen);
|
||||||
|
procedure SetRepeatCount(AValue: Cardinal);
|
||||||
|
procedure StyleChanged(ASender: TObject);
|
||||||
|
protected
|
||||||
|
function GetDisplayName: string; override;
|
||||||
|
public
|
||||||
|
constructor Create(ACollection: TCollection); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
public
|
||||||
|
procedure Assign(Source: TPersistent); override;
|
||||||
|
procedure Apply(ACanvas: TCanvas);
|
||||||
|
published
|
||||||
|
property Brush: TBrush read FBrush write SetBrush;
|
||||||
|
property Pen: TPen read FPen write SetPen;
|
||||||
|
property RepeatCount: Cardinal
|
||||||
|
read FRepeatCount write SetRepeatCount default 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TChartStyles = class;
|
||||||
|
|
||||||
|
{ TChartStyleList }
|
||||||
|
|
||||||
|
TChartStyleList = class(TCollection)
|
||||||
|
private
|
||||||
|
FOwner: TChartStyles;
|
||||||
|
function GetStyle(AIndex: Integer): TChartStyle;
|
||||||
|
protected
|
||||||
|
function GetOwner: TPersistent; override;
|
||||||
|
procedure Changed;
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TChartStyles);
|
||||||
|
property Style[AIndex: Integer]: TChartStyle read GetStyle; default;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TChartStyles }
|
||||||
|
|
||||||
|
TChartStyles = class(TComponent)
|
||||||
|
private
|
||||||
|
FBroadcaster: TBroadcaster;
|
||||||
|
FStyles: TChartStyleList;
|
||||||
|
procedure SetStyles(const AValue: TChartStyleList);
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent); override;
|
||||||
|
destructor Destroy; override;
|
||||||
|
public
|
||||||
|
procedure Apply(ACanvas: TCanvas; AIndex: Cardinal);
|
||||||
|
property Broadcaster: TBroadcaster read FBroadcaster;
|
||||||
|
published
|
||||||
|
property Styles: TChartStyleList read FStyles write SetStyles;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Register;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure Register;
|
||||||
|
begin
|
||||||
|
RegisterComponents(CHART_COMPONENT_IDE_PAGE, [TChartStyles]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TChartStyle }
|
||||||
|
|
||||||
|
procedure TChartStyle.Apply(ACanvas: TCanvas);
|
||||||
|
begin
|
||||||
|
ACanvas.Brush := Brush;
|
||||||
|
ACanvas.Pen := Pen;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyle.Assign(Source: TPersistent);
|
||||||
|
begin
|
||||||
|
if Source is TChartStyle then
|
||||||
|
with Source as TChartStyle do begin
|
||||||
|
Self.Brush := Brush;
|
||||||
|
Self.Pen := Pen;
|
||||||
|
end;
|
||||||
|
inherited Assign(Source);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TChartStyle.Create(ACollection: TCollection);
|
||||||
|
begin
|
||||||
|
inherited Create(ACollection);
|
||||||
|
FBrush := TBrush.Create;
|
||||||
|
FBrush.OnChange := @StyleChanged;
|
||||||
|
FPen := TPen.Create;
|
||||||
|
FPen.OnChange := @StyleChanged;
|
||||||
|
FRepeatCount := 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TChartStyle.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FBrush);
|
||||||
|
FreeAndNil(FPen);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TChartStyle.GetDisplayName: string;
|
||||||
|
begin
|
||||||
|
Result := inherited GetDisplayName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyle.SetBrush(const AValue: TBrush);
|
||||||
|
begin
|
||||||
|
if FBrush = AValue then exit;
|
||||||
|
FBrush := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyle.SetPen(const AValue: TPen);
|
||||||
|
begin
|
||||||
|
if FPen = AValue then exit;
|
||||||
|
FPen := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyle.SetRepeatCount(AValue: Cardinal);
|
||||||
|
begin
|
||||||
|
if FRepeatCount = AValue then exit;
|
||||||
|
FRepeatCount := AValue;
|
||||||
|
StyleChanged(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyle.StyleChanged(ASender: TObject);
|
||||||
|
begin
|
||||||
|
Unused(ASender);
|
||||||
|
TChartStyleList(Collection).Changed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TChartStyleList }
|
||||||
|
|
||||||
|
procedure TChartStyleList.Changed;
|
||||||
|
begin
|
||||||
|
TChartStyles(Owner).Broadcaster.Broadcast(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TChartStyleList.Create(AOwner: TChartStyles);
|
||||||
|
begin
|
||||||
|
inherited Create(TChartStyle);
|
||||||
|
FOwner := AOwner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TChartStyleList.GetOwner: TPersistent;
|
||||||
|
begin
|
||||||
|
Result := FOwner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TChartStyleList.GetStyle(AIndex: Integer): TChartStyle;
|
||||||
|
begin
|
||||||
|
Result := Items[AIndex] as TChartStyle;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TChartStyles }
|
||||||
|
|
||||||
|
procedure TChartStyles.Apply(ACanvas: TCanvas; AIndex: Cardinal);
|
||||||
|
var
|
||||||
|
totalRepeatCount: Cardinal = 0;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to Styles.Count - 1 do
|
||||||
|
totalRepeatCount += Styles[i].RepeatCount;
|
||||||
|
if totalRepeatCount = 0 then exit;
|
||||||
|
AIndex := AIndex mod totalRepeatCount;
|
||||||
|
totalRepeatCount := 0;
|
||||||
|
for i := 0 to Styles.Count - 1 do begin
|
||||||
|
totalRepeatCount += Styles[i].RepeatCount;
|
||||||
|
if AIndex < totalRepeatCount then begin
|
||||||
|
Styles[i].Apply(ACanvas);
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TChartStyles.Create(AOwner: TComponent);
|
||||||
|
begin
|
||||||
|
inherited Create(AOwner);
|
||||||
|
FBroadcaster := TBroadcaster.Create;
|
||||||
|
FStyles := TChartStyleList.Create(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TChartStyles.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FBroadcaster);
|
||||||
|
FreeAndNil(FStyles);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TChartStyles.SetStyles(const AValue: TChartStyleList);
|
||||||
|
begin
|
||||||
|
if FStyles = AValue then exit;
|
||||||
|
FStyles := AValue;
|
||||||
|
Broadcaster.Broadcast(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user