diff --git a/src/Charts/GenericLegend.cpp b/src/Charts/GenericLegend.cpp index e67520cfb..802c6f2ef 100644 --- a/src/Charts/GenericLegend.cpp +++ b/src/Charts/GenericLegend.cpp @@ -32,6 +32,7 @@ GenericLegendItem::GenericLegendItem(Context *context, QWidget *parent, QString value=0; enabled=true; + clickable=true; hasvalue=false; // set height and width, gets reset when configchanges @@ -93,7 +94,7 @@ GenericLegendItem::eventFilter(QObject *obj, QEvent *e) switch (e->type()) { case QEvent::MouseButtonRelease: // for now just one event, but may do more later { - if (underMouse()) { + if (clickable && underMouse()) { enabled=!enabled; if (!enabled) hasvalue=false; emit clicked(name, enabled); @@ -120,7 +121,7 @@ GenericLegendItem::paintEvent(QPaintEvent *) painter.drawRect(0,0,geometry().width()-1, geometry().height()-1); // under mouse show - if (underMouse()) { + if (clickable && underMouse()) { QColor mask=GCColor::invertColor(GColor(CPLOTBACKGROUND)); mask.setAlphaF(0.1); painter.setBrush(mask); @@ -161,16 +162,18 @@ GenericLegend::GenericLegend(Context *context, GenericPlot *plot) : context(cont layout->addStretch(); xname=""; + clickable=true; } void -GenericLegend::addSeries(QString name, QAbstractSeries *series) +GenericLegend::addSeries(QString name, QColor color) { // if it already exists remove it if (items.value(name,NULL) != NULL) removeSeries(name); - GenericLegendItem *add = new GenericLegendItem(context, this, name, GenericPlot::seriesColor(series)); + GenericLegendItem *add = new GenericLegendItem(context, this, name, color); + add->setClickable(clickable); layout->insertWidget(0, add); items.insert(name,add); @@ -188,6 +191,7 @@ GenericLegend::addX(QString name) if (items.value(name,NULL) != NULL) removeSeries(name); GenericLegendItem *add = new GenericLegendItem(context, this, name, GColor(CPLOTMARKER)); + add->setClickable(false); layout->insertWidget(0, add); items.insert(name,add); @@ -224,7 +228,7 @@ GenericLegend::removeAllSeries() } void -GenericLegend::hover(QPointF value, QString name, QAbstractSeries*) +GenericLegend::setValue(QPointF value, QString name) { GenericLegendItem *call = items.value(name, NULL); if (call) call->setValue(value.y()); @@ -234,6 +238,18 @@ GenericLegend::hover(QPointF value, QString name, QAbstractSeries*) if (xaxis) xaxis->setValue(value.x()); } +void +GenericLegend::setClickable(bool clickable) +{ + this->clickable=clickable; + QMapIterator i(items); + while (i.hasNext()) { + i.next(); + if (i.key() != xname) + i.value()->setClickable(clickable); + } +} + void GenericLegend::unhover(QString name) { diff --git a/src/Charts/GenericLegend.h b/src/Charts/GenericLegend.h index 0984b2998..4f24d020a 100644 --- a/src/Charts/GenericLegend.h +++ b/src/Charts/GenericLegend.h @@ -61,6 +61,7 @@ class GenericLegendItem : public QWidget { void paintEvent(QPaintEvent *event); void setValue(double p) { if (enabled) { hasvalue=true; value=p; update(); } } // set value to display void noValue() { if (enabled) { hasvalue=false; update(); } } // no value to display + void setClickable(bool x) { clickable=x; } void configChanged(qint32); // context changed private: @@ -70,6 +71,7 @@ class GenericLegendItem : public QWidget { bool hasvalue; bool enabled; + bool clickable; double value; // geometry for painting fast / updated on config changes @@ -84,7 +86,7 @@ class GenericLegend : public QWidget { public: GenericLegend(Context *context, GenericPlot *parent); - void addSeries(QString name, QAbstractSeries *series); + void addSeries(QString name, QColor color); void addX(QString name); void removeSeries(QString name); void removeAllSeries(); @@ -93,9 +95,10 @@ class GenericLegend : public QWidget { void clicked(QString name, bool enabled); // someone clicked on a legend and enabled/disabled it public slots: - void hover(QPointF value, QString name, QAbstractSeries*series); + void setValue(QPointF value, QString name); void unhover(QString name); void unhoverx(); + void setClickable(bool x); private: // a label has a unique name, not directly tide to @@ -105,6 +108,7 @@ class GenericLegend : public QWidget { QHBoxLayout *layout; QMap items; QString xname; + bool clickable; }; #endif diff --git a/src/Charts/GenericPlot.cpp b/src/Charts/GenericPlot.cpp index 1cf9d5346..635d3b1a2 100644 --- a/src/Charts/GenericPlot.cpp +++ b/src/Charts/GenericPlot.cpp @@ -73,7 +73,7 @@ GenericPlot::GenericPlot(QWidget *parent, Context *context) : QWidget(parent), c connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); // get notifications when values change - connect(selector, SIGNAL(hover(QPointF,QString,QAbstractSeries*)), legend, SLOT(hover(QPointF,QString,QAbstractSeries*))); + connect(selector, SIGNAL(hover(QPointF,QString,QAbstractSeries*)), legend, SLOT(setValue(QPointF,QString))); connect(selector, SIGNAL(unhover(QString)), legend, SLOT(unhover(QString))); connect(selector, SIGNAL(unhoverx()), legend, SLOT(unhoverx())); connect(legend, SIGNAL(clicked(QString,bool)), this, SLOT(setSeriesVisible(QString,bool))); @@ -131,8 +131,11 @@ GenericPlot::eventHandler(int, void *, QEvent *e) case QEvent::GraphicsSceneMouseMove: spos = static_cast(e)->scenePos(); //case QEvent::MouseMove: - //fprintf(stderr,"POS: %f:%f\n", spos.x(), spos.y()); - //fprintf(stderr,"%s: mouse MOVE for obj=%u\n", source ? "widget" : "scene", (void*)obj); fflush(stderr); + //fprintf(stderr,"POS: %f:%f SCENE: %d,%d to %d width %d height AREA: %f,%f %f width %f height\n", + //spos.x(), spos.y(), + //qchart->scene()->views()[0]->geometry().x(), qchart->scene()->views()[0]->geometry().y(), qchart->scene()->views()[0]->geometry().width(), qchart->scene()->views()[0]->geometry().height(), + //qchart->plotArea().x(), qchart->plotArea().y(), qchart->plotArea().width(), qchart->plotArea().height()); + //fflush(stderr); { // see if selection tool cares about new mouse position updatescene = selector->moved(spos); @@ -159,7 +162,7 @@ GenericPlot::eventHandler(int, void *, QEvent *e) case QEvent::GraphicsSceneHoverMove: { // debug info - //fprintf(stderr,"%s: HOVER scene item for obj=%u\n", source ? "widget" : "scene", (void*)obj); fflush(stderr); + //fprintf(stderr,"HOVER scene item for obj=%u\n", (void*)obj); fflush(stderr); } break; @@ -229,6 +232,15 @@ GenericPlot::setSeriesVisible(QString name, bool visible) } } +// handle hover on barset +void GenericPlot::barsetHover(bool status, int index, QBarSet *) +{ + foreach(QBarSet *barset, barsets) { + if (status) legend->setValue(QPointF(0, barset->at(index)), barset->label()); + else legend->unhover(barset->label()); + } +} + bool GenericPlot::initialiseChart(QString title, int type, bool animate) { @@ -345,6 +357,7 @@ GenericPlot::addCurve(QString name, QVector xseries, QVector yse // hardware support? chartview->setRenderHint(QPainter::Antialiasing); add->setUseOpenGL(opengl); // for scatter or line only apparently + qchart->setDropShadowEnabled(false); // chart qchart->addSeries(add); @@ -395,11 +408,10 @@ GenericPlot::addCurve(QString name, QVector xseries, QVector yse // hardware support? chartview->setRenderHint(QPainter::Antialiasing); add->setUseOpenGL(opengl); // for scatter or line only apparently + qchart->setDropShadowEnabled(false); // chart qchart->addSeries(add); - qchart->legend()->setMarkerShape(QLegend::MarkerShapeRectangle); - qchart->setDropShadowEnabled(false); // add to list of curves curves.insert(name,add); @@ -430,6 +442,9 @@ GenericPlot::addCurve(QString name, QVector xseries, QVector yse yaxis->type = GenericAxisInfo::CONTINUOUS; xaxis->type = GenericAxisInfo::CATEGORY; + // shadows on bar charts + qchart->setDropShadowEnabled(false); + // add to list of barsets barsets << add; } @@ -461,6 +476,9 @@ GenericPlot::addCurve(QString name, QVector xseries, QVector yse i++; } + // shadows on pie + qchart->setDropShadowEnabled(false); + // set the pie chart qchart->addSeries(add); @@ -531,8 +549,14 @@ GenericPlot::finaliseChart() add=caxis; // add the bar series - if (!barseries) { barseries = new QBarSeries(); qchart->addSeries(barseries); } - else barseries->clear(); + if (!barseries) { + barseries = new QBarSeries(); + qchart->addSeries(barseries); + + // connect hover events + connect(barseries, SIGNAL(hovered(bool,int,QBarSet*)), this, SLOT(barsetHover(bool,int,QBarSet*))); + + } else barseries->clear(); // add the new barsets foreach (QBarSet *bs, barsets) @@ -605,16 +629,24 @@ GenericPlot::finaliseChart() } // add to the legend xxx might make some hidden? - legend->addSeries(series->name(), series); + legend->addSeries(series->name(), GenericPlot::seriesColor(series)); } legend->show(); } - if (charttype ==GC_CHART_PIE || charttype== GC_CHART_BAR) { //XXX bar chart legend? - // pie, never want a legend - legend->hide(); + if (charttype== GC_CHART_PIE) { + foreach(QAbstractSeries *series, qchart->series()) { + if (series->type()== QAbstractSeries::SeriesTypePie) { + foreach (QPieSlice *slice, static_cast(series)->slices()) { + legend->addSeries(slice->label(), slice->color()); + legend->setValue(QPointF(0,slice->value()), slice->label()); + } + } + } + legend->setClickable(false); + legend->show(); } // barseries special case @@ -623,6 +655,13 @@ GenericPlot::finaliseChart() // need to attach barseries to the value axes foreach(QAbstractAxis *axis, qchart->axes(Qt::Vertical)) barseries->attachAxis(axis); + + // and legend + foreach(QBarSet *set, barsets) + legend->addSeries(set->label(), set->color()); + + legend->setClickable(false); + legend->show(); } // install event filters on thes scene objects for Pie and Bar diff --git a/src/Charts/GenericPlot.h b/src/Charts/GenericPlot.h index 44304edbc..370052469 100644 --- a/src/Charts/GenericPlot.h +++ b/src/Charts/GenericPlot.h @@ -128,6 +128,9 @@ class GenericPlot : public QWidget { // do we want to see this series? void setSeriesVisible(QString name, bool visible); + // bar hover, process and update legend + void barsetHover(bool status, int index, QBarSet *barset); + void configChanged(qint32); // set chart settings