void SKGTableWithGraph::redrawGraph()
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph");
ui.graphicView->hide();
//Recreate scene
if (scene) {
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-remove scene");
scene->clear();
delete scene;
}
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-create scene");
//Get current selection
int crow=ui.kTable->currentRow();
int ccolumn=ui.kTable->currentColumn();
int nbRows=ui.kTable->rowCount()-1; //Sum
int nbColumns=ui.kTable->columnCount();
int sumColumnIndex=nbColumns-1;
if (nbColumns>2) {
nbColumns=nbColumns-2; //Sum and average
--sumColumnIndex;
}
KLocale* locale=KGlobal::locale();
int mode=ui.kDisplayMode->currentIndex();
//Compute y limits
double minLimit=0;
double maxLimit=0;
if (mode==0) {
//STACK
for (int x=0; x<nbRows; ++x) {
if (tableItem) {
QString valstring
=tableItem
->text
();
double val=locale->readMoney(valstring);
minLimit=qMin(minLimit, val);
maxLimit=qMax(maxLimit, val);
}
}
} else if (mode==1) {
//HISTOGRAM
for (int x=0; x<nbRows; ++x) {
for (int y=0; y<nbColumns; ++y) {
if (tableItem) {
QString valstring
=tableItem
->text
();
double val=locale->readMoney(valstring);
minLimit=qMin(minLimit, val);
maxLimit=qMax(maxLimit, val);
}
}
}
}
//Compute
double width=10;
double margin=width;
double maxX=0;
if (nbRows) {
if (mode==0) {
width=(maxLimit-minLimit)/nbRows;
maxX=width*nbRows+margin;
} else if (mode==1) {
width=(maxLimit-minLimit)/(nbRows*nbColumns);
maxX=width*(nbColumns-1)*nbRows+margin;
}
}
scene->setSceneRect(-margin, margin-maxLimit, maxX-margin, maxLimit-minLimit+2*margin);
SKGTRACE << "Scene rect:" <<scene->sceneRect().x() << "," << scene->sceneRect().y()<< "," << scene->sceneRect().width()<< "," << scene->sceneRect().height() << endl;
SKGTRACE << "Items:" <<nbRows << "x" << (nbColumns-1) << "=" << nbRows*(nbColumns-1) << endl;
//Redraw scene
double ymin=0;
double ymax=0;
double histoPos=0;
for (int x=0; x<nbRows; ++x) {
QString xname
=ui.
kTable->item
(x,
0)->text
();
double yPlus=0;
double yMoins=0;
for (int j=1; j<nbColumns; ++j) {
//Get column name
QString yname
=ui.
kTable->horizontalHeaderItem
(j
)->text
();
//Get cell value
if (tableItem) {
QString valstring
=tableItem
->text
();
double val=locale->readMoney(valstring);
int color_h=359*x/nbRows;
int color_s=255-155*j/nbColumns;
int color_v=255-155*j/nbColumns;
else color
=QColor::fromHsv(color_h,color_s,color_v
);
if (mode==0) {
//STACK
if (val>0) {
graphItem
=scene
->addRect
(width
*x,
-yPlus, width,
-val,
QPen(),
QBrush(color
));
yPlus+=val;
if (yPlus>ymax) ymax=yPlus;
} else if (val<0) {
graphItem
=scene
->addRect
(width
*x,
-yMoins, width,
-val,
QPen(),
QBrush(color
));
yMoins+=val;
if (yMoins<ymin) ymin=yMoins;
}
} else if (mode==1) {
//HISTOGRAM
graphItem
=scene
->addRect
(width
*histoPos,
0, width,
-val,
QPen(),
QBrush(color
));
histoPos++;
if (val>ymax) ymax=val;
if (val<ymin) ymin=val;
}
if (graphItem) {
graphItem->setToolTip(xname+'\n'+yname+'\n'+valstring+'\n'+tableItem->toolTip());
graphItem->setData(1, x);
graphItem->setData(2, j);
graphItem->setData(11, color_h);
graphItem->setData(12, color_s);
graphItem->setData(13, color_v);
tableItem->setData(1, (qlonglong) graphItem);
}
}
}
}
//Draw axis
if (mode!=2) {
item=scene->addLine(0, -ymax-margin, margin/2, -ymax-margin/2);
item=scene->addLine(0, -ymax-margin, -margin/2, -ymax-margin/2);
item=scene->addLine(-margin, 0, maxX, 0);
item=scene->addLine(maxX, 0, maxX-margin/2, margin/2);
item=scene->addLine(maxX, 0, maxX-margin/2, -margin/2);
}
}
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-add scene to view");
ui.graphicView->setScene(scene);
ui.graphicView->onZoomOriginal();
ui.graphicView->show();
ui.
graphicView->graphicsView
()->setOptimizationFlag
(QGraphicsView::DontClipPainter,
true);
ui.
graphicView->graphicsView
()->setOptimizationFlag
(QGraphicsView::DontSavePainterState,
true);
ui.
graphicView->graphicsView
()->setOptimizationFlag
(QGraphicsView::DontAdjustForAntialiasing,
true);
//Add selection event on scene
connect(scene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChangedInGraph()), Qt::QueuedConnection);
}
}
void SKGTableWithGraph::redrawGraph()
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph");
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
ui.graphicView->hide();
//Recreate scene
if (scene) {
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-remove scene");
scene->clear();
delete scene;
}
scene=new QGraphicsScene();
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-create scene");
//Get current selection
int crow=ui.kTable->currentRow();
int ccolumn=ui.kTable->currentColumn();
int nbRows=ui.kTable->rowCount()-1; //Sum
int nbColumns=ui.kTable->columnCount();
int sumColumnIndex=nbColumns-1;
if (nbColumns>2) {
nbColumns=nbColumns-2; //Sum and average
--sumColumnIndex;
}
KLocale* locale=KGlobal::locale();
int mode=ui.kDisplayMode->currentIndex();
//Compute y limits
double minLimit=0;
double maxLimit=0;
if (mode==0) {
//STACK
for (int x=0; x<nbRows; ++x) {
QTableWidgetItem* tableItem=ui.kTable->item(x,sumColumnIndex);
if (tableItem) {
QString valstring=tableItem->text();
double val=locale->readMoney(valstring);
minLimit=qMin(minLimit, val);
maxLimit=qMax(maxLimit, val);
}
}
} else if (mode==1) {
//HISTOGRAM
for (int x=0; x<nbRows; ++x) {
for (int y=0; y<nbColumns; ++y) {
QTableWidgetItem* tableItem=ui.kTable->item(x,y);
if (tableItem) {
QString valstring=tableItem->text();
double val=locale->readMoney(valstring);
minLimit=qMin(minLimit, val);
maxLimit=qMax(maxLimit, val);
}
}
}
}
//Compute
double width=10;
double margin=width;
double maxX=0;
if (nbRows) {
if (mode==0) {
width=(maxLimit-minLimit)/nbRows;
maxX=width*nbRows+margin;
} else if (mode==1) {
width=(maxLimit-minLimit)/(nbRows*nbColumns);
maxX=width*(nbColumns-1)*nbRows+margin;
}
}
scene->setSceneRect(-margin, margin-maxLimit, maxX-margin, maxLimit-minLimit+2*margin);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
SKGTRACE << "Scene rect:" <<scene->sceneRect().x() << "," << scene->sceneRect().y()<< "," << scene->sceneRect().width()<< "," << scene->sceneRect().height() << endl;
SKGTRACE << "Items:" <<nbRows << "x" << (nbColumns-1) << "=" << nbRows*(nbColumns-1) << endl;
//Redraw scene
double ymin=0;
double ymax=0;
double histoPos=0;
for (int x=0; x<nbRows; ++x) {
QString xname=ui.kTable->item(x, 0)->text();
double yPlus=0;
double yMoins=0;
for (int j=1; j<nbColumns; ++j) {
//Get column name
QString yname=ui.kTable->horizontalHeaderItem(j)->text();
//Get cell value
QTableWidgetItem* tableItem=ui.kTable->item(x,j);
if (tableItem) {
QString valstring=tableItem->text();
double val=locale->readMoney(valstring);
int color_h=359*x/nbRows;
int color_s=255-155*j/nbColumns;
int color_v=255-155*j/nbColumns;
QColor color;
if (x==crow && j==ccolumn) color=QApplication::palette().color(QPalette::Highlight);
else color=QColor::fromHsv(color_h,color_s,color_v);
QAbstractGraphicsShapeItem* graphItem=NULL;
if (mode==0) {
//STACK
if (val>0) {
graphItem=scene->addRect(width*x, -yPlus, width, -val, QPen(), QBrush(color));
yPlus+=val;
if (yPlus>ymax) ymax=yPlus;
} else if (val<0) {
graphItem=scene->addRect(width*x, -yMoins, width, -val, QPen(), QBrush(color));
yMoins+=val;
if (yMoins<ymin) ymin=yMoins;
}
} else if (mode==1) {
//HISTOGRAM
graphItem=scene->addRect(width*histoPos, 0, width, -val, QPen(), QBrush(color));
histoPos++;
if (val>ymax) ymax=val;
if (val<ymin) ymin=val;
}
if (graphItem) {
graphItem->setToolTip(xname+'\n'+yname+'\n'+valstring+'\n'+tableItem->toolTip());
graphItem->setFlags(QGraphicsItem::ItemIsSelectable);
graphItem->setData(1, x);
graphItem->setData(2, j);
graphItem->setData(11, color_h);
graphItem->setData(12, color_s);
graphItem->setData(13, color_v);
tableItem->setData(1, (qlonglong) graphItem);
}
}
}
}
//Draw axis
if (mode!=2) {
QGraphicsLineItem* item=scene->addLine(0, -ymin+margin, 0, -ymax-margin);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
item=scene->addLine(0, -ymax-margin, margin/2, -ymax-margin/2);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
item=scene->addLine(0, -ymax-margin, -margin/2, -ymax-margin/2);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
item=scene->addLine(-margin, 0, maxX, 0);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
item=scene->addLine(maxX, 0, maxX-margin/2, margin/2);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
item=scene->addLine(maxX, 0, maxX-margin/2, -margin/2);
item->setFlag(QGraphicsItem::ItemIsSelectable, false);
}
}
{
SKGTRACEIN(10, "SKGTableWithGraph::redrawGraph-add scene to view");
ui.graphicView->setScene(scene);
ui.graphicView->onZoomOriginal();
ui.graphicView->show();
ui.graphicView->graphicsView()->setOptimizationFlag(QGraphicsView::DontClipPainter, true);
ui.graphicView->graphicsView()->setOptimizationFlag(QGraphicsView::DontSavePainterState, true);
ui.graphicView->graphicsView()->setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing, true);
//Add selection event on scene
connect(scene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChangedInGraph()), Qt::QueuedConnection);
}
QApplication::restoreOverrideCursor();
}
To copy to clipboard, switch view to plain text mode
Bookmarks