TAChart: Prioritize Chart.MinDataSpace when plot size is too small. Issue #34896. Patch by Marcin Wiazowski.

git-svn-id: trunk@60311 -
This commit is contained in:
wp 2019-02-03 10:55:48 +00:00
parent 790027cd13
commit 33da110a2d
2 changed files with 18 additions and 17 deletions

View File

@ -252,7 +252,7 @@ type
function CalcScale(ASign: Integer): Double; function CalcScale(ASign: Integer): Double;
constructor Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer; constructor Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer;
AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer; AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer;
AHasMarksInMargin, AAxisIsVertical: Boolean; AMin, AMax: PDouble); AAxisIsVertical: Boolean; AMin, AMax: PDouble);
procedure UpdateMinMax(AConv: TAxisConvFunc); procedure UpdateMinMax(AConv: TAxisConvFunc);
end; end;
@ -1218,14 +1218,19 @@ end;
procedure EnsureGuaranteedSpace(var AValue1, AValue2: Integer; procedure EnsureGuaranteedSpace(var AValue1, AValue2: Integer;
AImage1, AImage2, AMargin1, AMargin2, AGuaranteed: Integer); AImage1, AImage2, AMargin1, AMargin2, AGuaranteed: Integer);
var var
HasMarksInMargin1, HasMarksInMargin2: Boolean;
delta1, delta2: Integer; delta1, delta2: Integer;
begin begin
if (AValue2 = AImage2 - AMargin2) then HasMarksInMargin1 := (AValue1 = AImage1 + AMargin1);
HasMarksInMargin2 := (AValue2 = AImage2 - AMargin2);
if HasMarksInMargin2 and not HasMarksInMargin1 then
AValue1 := AValue2 - AGuaranteed AValue1 := AValue2 - AGuaranteed
else else
if (AValue1 = AImage1 + AMargin1) then if HasMarksInMargin1 and not HasMarksInMargin2 then
AValue2 := AValue1 + AGuaranteed AValue2 := AValue1 + AGuaranteed
else begin else
begin
delta1 := AImage1 - AValue1; delta1 := AImage1 - AValue1;
delta2 := AImage2 - AValue2; delta2 := AImage2 - AValue2;
AValue1 := (AImage1 + AImage2 - AGuaranteed) div 2; AValue1 := (AImage1 + AImage2 - AGuaranteed) div 2;
@ -1243,7 +1248,7 @@ end;
constructor TAxisCoeffHelper.Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer; constructor TAxisCoeffHelper.Init(AAxis: TChartAxis; AImageLo, AImageHi: Integer;
AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer; AMarginLo, AMarginHi, ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace: Integer;
AHasMarksInMargin, AAxisIsVertical: Boolean; AMin, AMax: PDouble); AAxisIsVertical: Boolean; AMin, AMax: PDouble);
begin begin
FAxisIsFlipped := (AAxis <> nil) and AAxis.IsFlipped; FAxisIsFlipped := (AAxis <> nil) and AAxis.IsFlipped;
FImageLo := AImageLo; FImageLo := AImageLo;
@ -1253,7 +1258,6 @@ begin
FLo := FImageLo + AMarginLo; FLo := FImageLo + AMarginLo;
FHi := FImageHi + AMarginHi; FHi := FImageHi + AMarginHi;
if AHasMarksInMargin then begin
if AAxisIsVertical then begin if AAxisIsVertical then begin
if (FHi + AMinDataSpace >= FLo) then if (FHi + AMinDataSpace >= FLo) then
EnsureGuaranteedSpace(FHi, FLo, FImageHi, FImageLo, EnsureGuaranteedSpace(FHi, FLo, FImageHi, FImageLo,
@ -1263,7 +1267,6 @@ begin
EnsureGuaranteedSpace(FLo, FHi, FImageLo, FImageHi, EnsureGuaranteedSpace(FLo, FHi, FImageLo, FImageHi,
ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace); ARequiredMarginLo, ARequiredMarginHi, AMinDataSpace);
end; end;
end;
end; end;
function TAxisCoeffHelper.CalcScale(ASign: Integer): Double; function TAxisCoeffHelper.CalcScale(ASign: Integer): Double;

View File

@ -594,12 +594,10 @@ begin
rX.Init( rX.Init(
HorAxis, FClipRect.Left, FClipRect.Right, AMargin.Left, -AMargin.Right, HorAxis, FClipRect.Left, FClipRect.Right, AMargin.Left, -AMargin.Right,
AChartMargins.Left, AChartMargins.Right, AMinDataSpace, AChartMargins.Left, AChartMargins.Right, AMinDataSpace,
(AMargin.Left <> AChartMargins.Left) or (AMargin.Right <> AChartMargins.Right),
false, @FCurrentExtent.a.X, @FCurrentExtent.b.X); false, @FCurrentExtent.a.X, @FCurrentExtent.b.X);
rY.Init( rY.Init(
VertAxis, FClipRect.Bottom, FClipRect.Top, -AMargin.Bottom, AMargin.Top, VertAxis, FClipRect.Bottom, FClipRect.Top, -AMargin.Bottom, AMargin.Top,
AChartMargins.Bottom, AChartMargins.Top, AMinDataSpace, AChartMargins.Bottom, AChartMargins.Top, AMinDataSpace,
(AMargin.Top <> AChartMargins.Top) or (AMargin.Bottom <> AChartMargins.Bottom),
true, @FCurrentExtent.a.Y, @FCurrentExtent.b.Y); true, @FCurrentExtent.a.Y, @FCurrentExtent.b.Y);
FScale.X := rX.CalcScale(1); FScale.X := rX.CalcScale(1);