ScatterDraw: All destructors are virtual

git-svn-id: svn://ultimatepp.org/upp/trunk@11778 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
koldo 2018-02-10 22:39:51 +00:00
parent 2157e3ddc7
commit 4dd87b7fe7
2 changed files with 346 additions and 58 deletions

View file

@ -369,70 +369,138 @@ ScatterDraw &ScatterDraw::SetXYMin(double xmin, double ymin, double ymin2) {
}
void ScatterDraw::ZoomToFit(bool horizontal, bool vertical, double factor) {
ZoomToFit(horizontal, Null, Null, vertical, Null, Null, vertical, Null, Null, factor);
}
void ScatterDraw::ZoomToFit(bool horizontal, double minx, double maxx, bool vertical, double miny,
double maxy, bool vertical2, double miny2, double maxy2, double factor) {
if (linkedMaster) {
linkedMaster->ZoomToFit(horizontal, vertical);
return;
}
DoFitToData(horizontal, vertical, factor);
DoFitToData(horizontal, minx, maxx, vertical, miny, maxy, vertical2, miny2, maxy2, factor);
if (!linkedCtrls.IsEmpty()) {
for (int i = 0; i < linkedCtrls.GetCount(); ++i)
linkedCtrls[i]->DoFitToData(horizontal, vertical, factor);
linkedCtrls[i]->DoFitToData(horizontal, minx, maxx, vertical, miny, maxy, vertical2, miny2, maxy2, factor);
}
}
void ScatterDraw::DoFitToData(bool horizontal, bool vertical, double factor) {
double minx, maxx, miny, miny2, maxy, maxy2;
minx = miny = miny2 = -DOUBLE_NULL;
maxx = maxy = maxy2 = DOUBLE_NULL;
void ScatterDraw::DoFitToData(bool horizontal, double minx, double maxx, bool vertical, double miny,
double maxy, bool vertical2, double miny2, double maxy2, double factor) {
bool calcminx, calcmaxx, calcminy, calcminy2, calcmaxy, calcmaxy2;
if (IsNull(minx)) {
minx = -DOUBLE_NULL;
calcminx = true;
} else
calcminx = false;
if (IsNull(miny)) {
miny = -DOUBLE_NULL;
calcminy = true;
} else
calcminy = false;
if (IsNull(miny2)) {
miny2 = -DOUBLE_NULL;
calcminy2 = true;
} else
calcminy2 = false;
if (IsNull(maxx)) {
maxx = DOUBLE_NULL;
calcmaxx = true;
} else
calcmaxx = false;
if (IsNull(maxy)) {
maxy = DOUBLE_NULL;
calcmaxy = true;
} else
calcmaxy = false;
if (IsNull(maxy2)) {
maxy2 = DOUBLE_NULL;
calcmaxy2 = true;
} else
calcmaxy2 = false;
try {
if (horizontal) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
minx = min(minx, series[j].PointsData()->MinX());
maxx = max(maxx, series[j].PointsData()->MaxX());
if (calcminx) {
double mn = series[j].PointsData()->MinX();
if (!IsNull(mn))
minx = min(minx, mn);
}
if (calcmaxx) {
double mx = series[j].PointsData()->MaxX();
if (!IsNull(mx))
maxx = max(maxx, mx);
}
}
if (minx != -DOUBLE_NULL) {
if (maxx != DOUBLE_NULL && minx != -DOUBLE_NULL) {
if (maxx < minx)
Swap(maxx, minx);
double deltaX = (maxx - minx)*factor;
minx -= deltaX;
maxx += deltaX;
if (calcminx)
minx -= deltaX;
if (calcmaxx)
maxx += deltaX;
}
}
if (vertical) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
for (int64 i = 0; i < series[j].PointsData()->GetCount(); i++) {
double py = series[j].PointsData()->y(i);
if (IsNull(py))
continue;
if (series[j].primaryY) {
if (py < miny)
miny = py;
if (py > maxy)
maxy = py;
} else {
if (py < miny2)
miny2 = py;
if (py > maxy2)
maxy2 = py;
if (series[j].primaryY) {
if (calcminy) {
double mn = series[j].PointsData()->MinY();
if (!IsNull(mn))
miny = min(miny, mn);
}
if (calcmaxx) {
double mx = series[j].PointsData()->MaxY();
if (!IsNull(mx))
maxy = max(maxy, mx);
}
}
}
if (miny != -DOUBLE_NULL) {
if (maxy != DOUBLE_NULL && miny != -DOUBLE_NULL) {
if (maxy < miny)
Swap(maxy, miny);
double deltaY = (maxy - miny)*factor;
miny -= deltaY;
maxy += deltaY;
if (calcminy)
miny -= deltaY;
if (calcmaxy)
maxy += deltaY;
}
if (miny2 != -DOUBLE_NULL) {
}
if (vertical2) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
if (!series[j].primaryY) {
if (calcminy2) {
double mn = series[j].PointsData()->MinY();
if (!IsNull(mn))
miny2 = min(miny2, mn);
}
if (calcmaxy2) {
double mx = series[j].PointsData()->MaxY();
if (!IsNull(mx))
maxy2 = max(maxy2, mx);
}
}
}
if (maxy2 != DOUBLE_NULL && miny2 != -DOUBLE_NULL) {
if (maxy2 < miny2)
Swap(maxy2, miny2);
double deltaY2 = (maxy2 - miny2)*factor;
miny2 -= deltaY2;
maxy2 += deltaY2;
if (calcminy2)
miny2 -= deltaY2;
if (calcmaxy2)
maxy2 += deltaY2;
}
}
if (horizontal) {
if (minx != -DOUBLE_NULL) {
if (maxx != DOUBLE_NULL && minx != -DOUBLE_NULL) {
if (maxx == minx) {
if (maxx == 0) {
xRange = 2;
@ -449,7 +517,7 @@ void ScatterDraw::DoFitToData(bool horizontal, bool vertical, double factor) {
}
}
if (vertical) {
if (miny != -DOUBLE_NULL) {
if (maxy != DOUBLE_NULL && miny != -DOUBLE_NULL) {
if (maxy == miny)
yRange = maxy > 0 ? 2*maxy : 1;
else
@ -460,7 +528,185 @@ void ScatterDraw::DoFitToData(bool horizontal, bool vertical, double factor) {
yMajorUnit = yRange/10;
AdjustMinUnitY();
}
if (miny2 != -DOUBLE_NULL) {
}
if (vertical2) {
if (maxy2 != DOUBLE_NULL && miny2 != -DOUBLE_NULL) {
if (maxy2 == miny2)
yRange2 = maxy2 > 0 ? 2*maxy2 : 1;
else
yRange2 = maxy2 - miny2;
double deltaY2 = yMin2 - miny2;
yMin2 -= deltaY2;
yMinUnit2 += deltaY2;
yMajorUnit2 = yRange2/10;
AdjustMinUnitY2();
}
}
} catch (ValueTypeError err) {
ASSERT_(true, err);
return;
}
WhenSetRange();
WhenSetXYMin();
Refresh();
}
void ScatterDraw::ZoomToFitSmart(bool horizontal, double minx, double maxx, bool vertical, double miny,
double maxy, bool vertical2, double miny2, double maxy2, double factor) {
if (linkedMaster) {
linkedMaster->ZoomToFit(horizontal, vertical);
return;
}
DoFitToDataSmart(horizontal, minx, maxx, vertical, miny, maxy, vertical2, miny2, maxy2, factor);
if (!linkedCtrls.IsEmpty()) {
for (int i = 0; i < linkedCtrls.GetCount(); ++i)
linkedCtrls[i]->DoFitToDataSmart(horizontal, minx, maxx, vertical, miny, maxy, vertical2, miny2, maxy2, factor);
}
}
void ScatterDraw::DoFitToDataSmart(bool horizontal, double minx, double maxx, bool vertical, double miny,
double maxy, bool vertical2, double miny2, double maxy2, double factor) {
bool calcminx, calcmaxx, calcminy, calcminy2, calcmaxy, calcmaxy2;
if (IsNull(minx)) {
minx = -DOUBLE_NULL;
calcminx = true;
} else
calcminx = false;
if (IsNull(miny)) {
miny = -DOUBLE_NULL;
calcminy = true;
} else
calcminy = false;
if (IsNull(miny2)) {
miny2 = -DOUBLE_NULL;
calcminy2 = true;
} else
calcminy2 = false;
if (IsNull(maxx)) {
maxx = DOUBLE_NULL;
calcmaxx = true;
} else
calcmaxx = false;
if (IsNull(maxy)) {
maxy = DOUBLE_NULL;
calcmaxy = true;
} else
calcmaxy = false;
if (IsNull(maxy2)) {
maxy2 = DOUBLE_NULL;
calcmaxy2 = true;
} else
calcmaxy2 = false;
try {
if (horizontal) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
double av = series[j].PointsData()->AvgX();
if (calcminx) {
if (!IsNull(av))
minx = min(minx, av);
}
if (calcmaxx) {
if (!IsNull(av))
maxx = max(maxx, av);
}
}
if (maxx != DOUBLE_NULL && minx != -DOUBLE_NULL) {
if (maxx < minx)
Swap(maxx, minx);
double deltaX = (maxx - minx)*factor;
if (calcminx)
minx -= deltaX;
if (calcmaxx)
maxx += deltaX;
}
}
if (vertical) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
if (series[j].primaryY) {
double av = series[j].PointsData()->AvgY();
if (calcminy) {
if (!IsNull(av))
miny = min(miny, av);
}
if (calcmaxx) {
if (!IsNull(av))
maxy = max(maxy, av);
}
}
}
if (maxy != DOUBLE_NULL && miny != -DOUBLE_NULL) {
if (maxy < miny)
Swap(maxy, miny);
double deltaY = (maxy - miny)*factor;
if (calcminy)
miny -= deltaY;
if (calcmaxy)
maxy += deltaY;
}
}
if (vertical2) {
for (int j = 0; j < series.GetCount(); j++) {
if (series[j].opacity == 0 || series[j].PointsData()->IsExplicit())
continue;
if (!series[j].primaryY) {
double av = series[j].PointsData()->AvgY();
if (calcminy2) {
if (!IsNull(av))
miny2 = min(miny2, av);
}
if (calcmaxy2) {
if (!IsNull(av))
maxy2 = max(maxy2, av);
}
}
}
if (maxy2 != DOUBLE_NULL && miny2 != -DOUBLE_NULL) {
if (maxy2 < miny2)
Swap(maxy2, miny2);
double deltaY2 = (maxy2 - miny2)*factor;
if (calcminy2)
miny2 -= deltaY2;
if (calcmaxy2)
maxy2 += deltaY2;
}
}
if (horizontal) {
if (maxx != DOUBLE_NULL && minx != -DOUBLE_NULL) {
if (maxx == minx) {
if (maxx == 0) {
xRange = 2;
xMin = -1;
} else
xRange = 2*maxx;
} else
xRange = maxx - minx;
double deltaX = xMin - minx;
xMin -= deltaX;
xMinUnit += deltaX;
xMajorUnit = xRange/10;
AdjustMinUnitX();
}
}
if (vertical) {
if (maxy != DOUBLE_NULL && miny != -DOUBLE_NULL) {
if (maxy == miny)
yRange = maxy > 0 ? 2*maxy : 1;
else
yRange = maxy - miny;
double deltaY = yMin - miny;
yMin -= deltaY;
yMinUnit += deltaY;
yMajorUnit = yRange/10;
AdjustMinUnitY();
}
}
if (vertical2) {
if (maxy2 != DOUBLE_NULL && miny2 != -DOUBLE_NULL) {
if (maxy2 == miny2)
yRange2 = maxy2 > 0 ? 2*maxy2 : 1;
else
@ -1237,37 +1483,71 @@ double ScatterDraw::GetYPointByValue(double y) {
ScatterDraw &ScatterDraw::SetRangeLinked(double rx, double ry, double ry2) {
if (linkedMaster) {
linkedMaster->SetRangeLinked(rx, ry, ry2);
linkedMaster->Refresh();
return *this;
}
SetRange(rx, ry, ry2);
if (!linkedCtrls.IsEmpty()) {
for (int i = 0; i < linkedCtrls.GetCount(); ++i) {
linkedCtrls[i]->SetRange(rx, ry, ry2);
linkedCtrls[i]->Refresh();
}
}
double actual_rx = GetXRange();
double actual_ry = GetYRange();
double actual_ry2 = GetY2Range();
SetRangeLinkedEach(rx, actual_rx, ry, actual_ry, ry2, actual_ry2);
return *this;
}
ScatterDraw &ScatterDraw::SetXYMinLinked(double xmin, double ymin, double ymin2) {
void ScatterDraw::SetRangeLinkedEach(double rx, double rx0, double ry, double ry0, double ry2, double ry20) {
if (linkedMaster) {
linkedMaster->SetXYMinLinked(xmin, ymin, ymin2);
linkedMaster->SetRangeLinkedEach(rx, rx0, ry, ry0, ry2, ry20);
linkedMaster->Refresh();
return *this;
}
SetXYMin(xmin, ymin, ymin2);
double actual_rx = GetXRange();
double actual_ry = GetYRange();
double actual_ry2 = GetY2Range();
SetRange(actual_rx == rx0 ? rx : Null,
actual_ry == ry0 ? ry : Null,
actual_ry2 == ry20 ? ry2 : Null);
if (!linkedCtrls.IsEmpty()) {
for (int i = 0; i < linkedCtrls.GetCount(); ++i) {
linkedCtrls[i]->SetXYMin(xmin, ymin, ymin2);
double linked_rx = linkedCtrls[i]->GetXRange();
double linked_ry = linkedCtrls[i]->GetYRange();
double linked_ry2 = linkedCtrls[i]->GetY2Range();
linkedCtrls[i]->SetRange(rx0 == linked_rx ? rx : Null,
ry0 == linked_ry ? ry : Null,
ry20 == linked_ry2 ? ry2 : Null);
linkedCtrls[i]->Refresh();
}
}
}
ScatterDraw &ScatterDraw::SetXYMinLinked(double xmin, double ymin, double ymin2) {
double actual_xmin = GetXMin();
double actual_ymin = GetYMin();
double actual_ymin2 = GetY2Min();
SetXYMinLinkedEach(xmin, actual_xmin, ymin, actual_ymin, ymin2, actual_ymin2);
return *this;
}
void ScatterDraw::SetXYMinLinkedEach(double xmin, double xmin0, double ymin, double ymin0, double ymin2, double ymin20) {
if (linkedMaster) {
linkedMaster->SetXYMinLinkedEach(xmin, xmin0, ymin, ymin0, ymin2, ymin20);
linkedMaster->Refresh();
}
double actual_xmin = GetXMin();
double actual_ymin = GetYMin();
double actual_ymin2 = GetY2Min();
SetXYMin(actual_xmin == xmin0 ? xmin : Null,
actual_ymin == ymin0 ? ymin : Null,
actual_ymin2 == ymin20 ? ymin2 : Null);
if (!linkedCtrls.IsEmpty()) {
for (int i = 0; i < linkedCtrls.GetCount(); ++i) {
double linked_xmin = linkedCtrls[i]->GetXMin();
double linked_ymin = linkedCtrls[i]->GetYMin();
double linked_ymin2 = linkedCtrls[i]->GetY2Min();
linkedCtrls[i]->SetXYMin(xmin0 == linked_xmin ? xmin : Null,
ymin0 == linked_ymin ? ymin : Null,
ymin20 == linked_ymin2 ? ymin2 : Null);
linkedCtrls[i]->Refresh();
}
}
}
ScatterDraw &ScatterDraw::SetMouseHandling(bool valx, bool valy)
{
mouseHandlingX = valx;

View file

@ -369,6 +369,10 @@ public:
//void FitToData(bool vertical = false, double factor = 0); // Deprecated
void ZoomToFit(bool horizontal = true, bool vertical = false, double factor = 0);
void ZoomToFit(bool horizontal, double minx, double maxx, bool vertical, double minxy, double maxy,
bool vertical2, double miny2, double maxy2, double factor);
void ZoomToFitSmart(bool horizontal, double minx, double maxx, bool vertical, double minxy, double maxy,
bool vertical2, double miny2, double maxy2, double factor);
void Zoom(double scale, bool hor = true, bool ver = true);
void Scroll(double factorX, double factorY);
@ -377,9 +381,6 @@ public:
ScatterDraw &SetZoomStyleY(ZoomStyle style = TO_CENTER) {zoomStyleY = style; return *this;}
ScatterDraw& SetRange(double rx, double ry = Null, double ry2 = Null);
//double GetRangeX() {return xRange;}
//double GetRangeY() {return yRange;}
//double GetRangeY2() {return yRange2;}
ScatterDraw& SetRangeLinked(double rx, double ry, double ry2 = 100);
double GetXRange()const {return xRange;}
double GetYRange()const {return yRange;}
@ -827,6 +828,10 @@ public:
s % series;
}
String VariableFormatX(double d) const {return VariableFormat(xRange, d);}
String VariableFormatY(double d) const {return VariableFormat(yRange, d);}
String VariableFormatY2(double d) const {return VariableFormat(yRange2, d);}
protected:
ScatterDraw &_AddSeries(DataSource *data);
virtual void Refresh() {};
@ -895,9 +900,6 @@ protected:
void DyFormat(String& s, int i, double d) {s = Format("%Dy", int(d));}
static String VariableFormat(double range, double d);
String VariableFormatX(double d) const {return VariableFormat(xRange, d);}
String VariableFormatY(double d) const {return VariableFormat(yRange, d);}
String VariableFormatY2(double d) const {return VariableFormat(yRange2, d);}
template<class T>
void SetDrawing(T& w, const Size &size, int scale, bool ctrl = false);
@ -927,10 +929,16 @@ private:
static void ParseTextMultiline(const String &text, Upp::Font fnt,
Upp::Array <String> &texts, Upp::Array <Size> &sizes);
void DoFitToData(bool horizontal, bool vertical, double factor = 0);
void DoFitToData(bool horizontal, double minx, double maxx, bool vertical, double minxy, double maxy,
bool vertical2, double miny2, double maxy2, double factor = 0);
void DoFitToDataSmart(bool horizontal, double minx, double maxx, bool vertical, double minxy, double maxy,
bool vertical2, double miny2, double maxy2, double factor = 0);
void DoZoom(double scale, bool hor, bool ver);
void DoScroll(double factorX, double factorY);
void SetXYMinLinkedEach(double xmin, double xmin0, double ymin, double ymin0, double ymin2, double ymin20);
void SetRangeLinkedEach(double rx, double rx0, double ry, double ry0, double ry2, double ry20);
int plotW, plotH;
bool labelsChanged;
bool stacked;