##// END OF EJS Templates
Set the first pie slice exploded and label visible in chartthemes demo
Set the first pie slice exploded and label visible in chartthemes demo

File last commit:

r695:c06fd37a314e
r699:367aeb7897cf
Show More
domain.cpp
257 lines | 6.1 KiB | text/x-c | CppLexer
Michal Klocek
Refactors qchart , adds line animation...
r131 #include "domain_p.h"
Michal Klocek
Adds loosenumber algorithm...
r678 #include <cmath>
Michal Klocek
Refactors qchart , adds line animation...
r131
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Michal Klocek
Refactor domain model...
r439 Domain::Domain(QObject* parent):QObject(parent),
m_minX(0),
m_maxX(0),
m_minY(0),
Michal Klocek
Adds scroll support...
r531 m_maxY(0),
m_tickXCount(5),
Michal Klocek
Adds loosenumber algorithm...
r678 m_tickYCount(5),
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 m_niceNumbers(false)
Michal Klocek
Refactors qchart , adds line animation...
r131 {
}
Domain::~Domain()
{
}
Michal Klocek
Refactor domain model...
r439 void Domain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY)
{
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(minX, maxX, minY, maxY,m_tickXCount,m_tickYCount);
}
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Adds loosenumber algorithm...
r678 void Domain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY,int tickXCount,int tickYCount)
{
bool domainChanged = false;
bool tickXChanged = false;
bool tickYChanged = false;
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Adds loosenumber algorithm...
r678 if(m_tickXCount!=tickXCount) {
m_tickXCount=tickXCount;
tickXChanged=true;
}
Michal Klocek
Refactor domain model...
r439
Michal Klocek
Bugfix extra signal emited when scroling verticaly in domain.cpp
r695 if(m_tickYCount!=tickYCount) {
Michal Klocek
Refactors barchart axis hadnling...
r679 m_tickYCount=tickYCount;
Michal Klocek
Adds loosenumber algorithm...
r678 tickYChanged=true;
}
if(m_minX!=minX || m_maxX!=maxX) {
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 if(m_niceNumbers) looseNiceNumbers(minX, maxX, m_tickXCount);
Michal Klocek
Adds loosenumber algorithm...
r678 m_minX=minX;
m_maxX=maxX;
domainChanged=true;
tickXChanged=false;
emit rangeXChanged(minX,maxX, m_tickXCount);
}
if(m_minY!=minY || m_maxY!=maxY) {
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 if(m_niceNumbers) looseNiceNumbers(minY, maxY, m_tickYCount);
Michal Klocek
Adds loosenumber algorithm...
r678 m_minY=minY;
m_maxY=maxY;
domainChanged=true;
tickYChanged=false;
emit rangeYChanged(minY,maxY, m_tickYCount);
}
if(domainChanged) {
emit this->domainChanged(m_minX, m_maxX, m_minY, m_maxY);
}
if(tickXChanged) {
emit rangeXChanged(minX,maxX, m_tickXCount);
}
if(tickYChanged) {
emit rangeYChanged(minY,maxY, m_tickYCount);
}
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Adds loosenumber algorithm...
r678
Michal Klocek
Refactor domain model...
r439 void Domain::setRangeX(qreal min, qreal max)
{
setRange(min,max,m_minY, m_maxY);
}
Michal Klocek
Refactors barchart axis hadnling...
r679
void Domain::setRangeX(qreal min, qreal max, int tickCount)
{
setRange(min,max,m_minY, m_maxY,tickCount,m_tickYCount);
}
Michal Klocek
Refactor domain model...
r439 void Domain::setRangeY(qreal min, qreal max)
{
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, m_maxX, min, max);
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Refactors barchart axis hadnling...
r679 void Domain::setRangeY(qreal min, qreal max,int tickCount)
{
setRange(m_minX, m_maxX, min, max,m_tickXCount,tickCount);
}
Michal Klocek
Refactor domain model...
r439 void Domain::setMinX(qreal min)
{
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(min, m_maxX, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
void Domain::setMaxX(qreal max)
{
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, max, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
void Domain::setMinY(qreal min)
{
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, m_maxX, min, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
void Domain::setMaxY(qreal max)
{
setRange(m_minX, m_maxX, m_minY, max);
}
Michal Klocek
Refactors qchart , adds line animation...
r131 qreal Domain::spanX() const
{
Michal Klocek
Refactor domain model...
r439 Q_ASSERT(m_maxX >= m_minX);
return m_maxX - m_minX;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
qreal Domain::spanY() const
{
Michal Klocek
Refactor domain model...
r439 Q_ASSERT(m_maxY >= m_minY);
return m_maxY - m_minY;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Michal Klocek
Adds isEmpty to domain
r388 bool Domain::isEmpty() const
{
return spanX()==0 || spanY()==0;
}
Michal Klocek
Refactor domain model...
r439 void Domain::zoomIn(const QRectF& rect, const QSizeF& size)
Michal Klocek
Refactors qchart , adds line animation...
r131 {
Michal Klocek
Refactor domain model...
r439 qreal dx = spanX() / size.width();
qreal dy = spanY() / size.height();
Michal Klocek
Refactors qchart , adds line animation...
r131
Michal Klocek
Refactor domain model...
r439 m_maxX = m_minX + dx * rect.right();
m_minX = m_minX + dx * rect.left();
m_minY = m_maxY - dy * rect.bottom();
m_maxY = m_maxY - dy * rect.top();
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 if(m_niceNumbers) {
looseNiceNumbers(m_minX, m_maxX, m_tickXCount);
looseNiceNumbers(m_minY, m_maxY, m_tickYCount);
}
Michal Klocek
Adds loosenumber algorithm...
r678
Michal Klocek
Refactor domain model...
r439 emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
Michal Klocek
Adds scroll support...
r531 emit rangeXChanged(m_minX, m_maxX, m_tickXCount);
emit rangeYChanged(m_minY, m_maxY, m_tickYCount);
Michal Klocek
Refactor domain model...
r439 }
void Domain::zoomOut(const QRectF& rect, const QSizeF& size)
{
qreal dx = spanX() / rect.width();
qreal dy = spanY() / rect.height();
Michal Klocek
Refactors qchart , adds line animation...
r131
Michal Klocek
Refactor domain model...
r439 m_minX = m_maxX - dx * rect.right();
m_maxX = m_minX + dx * size.width();
m_maxY = m_minY + dy * rect.bottom();
m_minY = m_maxY - dy * size.height();
Michal Klocek
Refactors qchart , adds line animation...
r131
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 if(m_niceNumbers) {
looseNiceNumbers(m_minX, m_maxX, m_tickXCount);
looseNiceNumbers(m_minY, m_maxY, m_tickYCount);
}
Michal Klocek
Adds loosenumber algorithm...
r678
Michal Klocek
Refactor domain model...
r439 emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
Michal Klocek
Adds scroll support...
r531 emit rangeXChanged(m_minX, m_maxX, m_tickXCount);
emit rangeYChanged(m_minY, m_maxY, m_tickYCount);
}
void Domain::move(int dx,int dy,const QSizeF& size)
{
qreal x = spanX() / size.width();
qreal y = spanY() / size.height();
Michal Klocek
Adds loosenumber algorithm...
r678 if(dx!=0) {
m_minX = m_minX + x * dx;
m_maxX = m_maxX + x * dx;
emit rangeXChanged(m_minX, m_maxX, m_tickXCount);
Michal Klocek
Adds scroll support...
r531 }
Michal Klocek
Adds loosenumber algorithm...
r678 if(dy!=0) {
m_minY = m_minY + y * dy;
m_maxY = m_maxY + y * dy;
emit rangeYChanged(m_minY, m_maxY, m_tickYCount);
Michal Klocek
Adds scroll support...
r531 }
emit domainChanged(m_minX, m_maxX, m_minY, m_maxY);
Michal Klocek
Refactor domain model...
r439 }
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 void Domain::handleAxisXChanged(qreal min,qreal max,int tickXCount,bool niceNumbers)
Michal Klocek
Adds loosenumber algorithm...
r678 {
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 m_niceNumbers=niceNumbers;
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(min,max,m_minY, m_maxY,tickXCount,m_tickYCount);
}
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 void Domain::handleAxisYChanged(qreal min,qreal max,int tickYCount,bool niceNumbers)
Michal Klocek
Adds missing ticks hadnling
r554 {
Michal Klocek
Changes public API for nice nuumbers -> setNiceNumbers(bool enabled)
r687 m_niceNumbers=niceNumbers;
Michal Klocek
Adds loosenumber algorithm...
r678 setRange(m_minX, m_maxX, min, max,m_tickXCount,tickYCount);
Michal Klocek
Adds missing ticks hadnling
r554 }
Michal Klocek
Adds loosenumber algorithm...
r678 //algorithm defined by Paul S.Heckbert GraphicalGems I
void Domain::looseNiceNumbers(qreal &min, qreal &max, int &ticksCount)
Michal Klocek
Refactor domain model...
r439 {
Michal Klocek
Adds loosenumber algorithm...
r678 qreal range = niceNumber(max-min,true); //range with ceiling
qreal step = niceNumber(range/(ticksCount-1),false);
min = floor(min/step);
max = ceil(max/step);
ticksCount = int(max-min) +1;
min*=step;
max*=step;
Michal Klocek
Adds missing ticks hadnling
r554 }
Michal Klocek
Adds loosenumber algorithm...
r678 //nice numbers can be expressed as form of 1*10^n, 2* 10^n or 5*10^n
qreal Domain::niceNumber(qreal x,bool ceiling)
Michal Klocek
Adds missing ticks hadnling
r554 {
Michal Klocek
Adds loosenumber algorithm...
r678 qreal z = pow(10,floor(log10(x))); //find corresponding number of the form of 10^n than is smaller than x
qreal q = x/z;//q<10 && q>=1;
if(ceiling) {
if(q <= 1.0) q=1;
else if(q <= 2.0) q=2;
else if(q <= 5.0) q=5;
else q=10;
}
else {
if(q < 1.5) q=1;
else if(q < 3.0) q=2;
else if(q < 7.0) q=5;
else q=10;
Michal Klocek
Adds missing ticks hadnling
r554 }
Michal Klocek
Adds loosenumber algorithm...
r678 return q*z;
Michal Klocek
Refactors qchart , adds line animation...
r131 }
Michal Klocek
Add overloaded comparison operators to domain
r220
bool operator== (const Domain &domain1, const Domain &domain2)
{
return (domain1.m_maxX == domain2.m_maxX &&
Michal Klocek
Refactor domain model...
r439 domain1.m_maxY == domain2.m_maxY &&
domain1.m_minX == domain2.m_minX &&
domain1.m_minY == domain2.m_minY);
Michal Klocek
Add overloaded comparison operators to domain
r220 }
bool operator!= (const Domain &domain1, const Domain &domain2)
{
return !(domain1 == domain2);
}
Michal Klocek
Adds debug operator to domain
r222 QDebug operator<<(QDebug dbg, const Domain &domain)
{
Michal Klocek
Refactors barchart axis hadnling...
r679 dbg.nospace() << "Domain("<<domain.m_minX<<','<<domain.m_maxX<<','<<domain.m_minY<<','<<domain.m_maxY<<')' << domain.m_tickXCount << "," << domain.m_tickYCount ;
Michal Klocek
Adds debug operator to domain
r222 return dbg.maybeSpace();
}
Michal Klocek
Refactor domain model...
r439 #include "moc_domain_p.cpp"
Michal Klocek
Refactors qchart , adds line animation...
r131 QTCOMMERCIALCHART_END_NAMESPACE