mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
Improved LTM legend click to toggle curve
.. does all labels etc and integrates in with the rest of the LTM chart and CurveColors classes. .. underMouse() seems weird when legend is updated, might need to find a better way to work out if/which legend was clicked.
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
#include <qwt_series_data.h>
|
||||
#include <qwt_scale_widget.h>
|
||||
#include <qwt_legend.h>
|
||||
#include <qwt_legend_label.h>
|
||||
#include <qwt_plot_curve.h>
|
||||
#include <qwt_plot_canvas.h>
|
||||
#include <qwt_curve_fitter.h>
|
||||
@@ -153,6 +154,10 @@ LTMPlot::configChanged(qint32)
|
||||
palette.setColor(QPalette::Text, GColor(CPLOTMARKER));
|
||||
setPalette(palette);
|
||||
|
||||
QPalette gray = palette; // same but with gray text for hidden curves
|
||||
gray.setColor(QPalette::WindowText, Qt::darkGray);
|
||||
gray.setColor(QPalette::Text, Qt::darkGray);
|
||||
|
||||
axesObject.clear();
|
||||
axesId.clear();
|
||||
foreach (QwtAxisId x, supportedAxes) {
|
||||
@@ -167,13 +172,21 @@ LTMPlot::configChanged(qint32)
|
||||
|
||||
}
|
||||
axisWidget(QwtPlot::xBottom)->setPalette(palette);
|
||||
|
||||
QwtLegend *l = static_cast<QwtLegend *>(this->legend());
|
||||
l->setPalette(palette);
|
||||
foreach(QwtPlotCurve *p, curves) {
|
||||
foreach (QWidget *w, l->legendWidgets(itemToInfo(p))) {
|
||||
w->setPalette(palette);
|
||||
for(int m=0; m< settings->metrics.count(); m++) {
|
||||
if (settings->metrics[m].curve == p)
|
||||
if (settings->metrics[m].hidden == false)
|
||||
w->setPalette(palette);
|
||||
else
|
||||
w->setPalette(gray);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// now save state
|
||||
curveColors->saveState();
|
||||
updateLegend();
|
||||
|
||||
@@ -404,6 +417,8 @@ LTMPlot::setData(LTMSettings *set)
|
||||
|
||||
// Create a curve
|
||||
QwtPlotCurve *current = new QwtPlotCurve(metricDetail.uname);
|
||||
current->setVisible(!metricDetail.hidden);
|
||||
settings->metrics[m].curve = current;
|
||||
if (metricDetail.type == METRIC_BEST)
|
||||
curves.insert(metricDetail.bestSymbol, current);
|
||||
else
|
||||
@@ -534,7 +549,9 @@ LTMPlot::setData(LTMSettings *set)
|
||||
// are painted in reverse order in a
|
||||
// loop before this one.
|
||||
stackcounter= 0;
|
||||
foreach (MetricDetail metricDetail, settings->metrics) {
|
||||
for(int m=0; m<settings->metrics.count(); m++) {
|
||||
|
||||
MetricDetail metricDetail = settings->metrics[m];
|
||||
|
||||
//
|
||||
// *ONLY* PLOT NON-STACKS
|
||||
@@ -553,6 +570,8 @@ LTMPlot::setData(LTMSettings *set)
|
||||
|
||||
// Create a curve
|
||||
QwtPlotCurve *current = new QwtPlotCurve(metricDetail.uname);
|
||||
current->setVisible(!metricDetail.hidden);
|
||||
settings->metrics[m].curve = current;
|
||||
if (metricDetail.type == METRIC_BEST)
|
||||
curves.insert(metricDetail.bestSymbol, current);
|
||||
else
|
||||
@@ -608,6 +627,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
metricDetail.bestSymbol : metricDetail.symbol);
|
||||
|
||||
QwtPlotCurve *trend = new QwtPlotCurve(trendName);
|
||||
trend->setVisible(!metricDetail.hidden);
|
||||
|
||||
// cosmetics
|
||||
QPen cpen = QPen(metricDetail.penColor.darker(200));
|
||||
@@ -644,6 +664,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
metricDetail.bestSymbol : metricDetail.symbol);
|
||||
|
||||
QwtPlotCurve *trend = new QwtPlotCurve(trendName);
|
||||
trend->setVisible(!metricDetail.hidden);
|
||||
|
||||
// cosmetics
|
||||
QPen cpen = QPen(metricDetail.penColor.darker(200));
|
||||
@@ -706,6 +727,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
QString outSymbol = QString("%1_outlier").arg(metricDetail.type == METRIC_BEST ?
|
||||
metricDetail.bestSymbol : metricDetail.symbol);
|
||||
QwtPlotCurve *out = new QwtPlotCurve(outName);
|
||||
out->setVisible(!metricDetail.hidden);
|
||||
curves.insert(outSymbol, out);
|
||||
|
||||
out->setRenderHint(QwtPlotItem::RenderAntialiased);
|
||||
@@ -791,6 +813,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
.arg(metricDetail.type == METRIC_BEST ?
|
||||
metricDetail.bestSymbol : metricDetail.symbol);
|
||||
QwtPlotCurve *top = new QwtPlotCurve(topName);
|
||||
top->setVisible(!metricDetail.hidden);
|
||||
curves.insert(topName, top);
|
||||
|
||||
top->setRenderHint(QwtPlotItem::RenderAntialiased);
|
||||
@@ -862,6 +885,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
|
||||
// make that mark -- always above with topN
|
||||
QwtPlotMarker *label = new QwtPlotMarker();
|
||||
label->setVisible(!metricDetail.hidden);
|
||||
label->setLabel(text);
|
||||
label->setValue(hxdata[i], hydata[i]);
|
||||
label->setYAxis(axisid);
|
||||
@@ -1023,6 +1047,7 @@ LTMPlot::setData(LTMSettings *set)
|
||||
|
||||
// make that mark
|
||||
QwtPlotMarker *label = new QwtPlotMarker();
|
||||
label->setVisible(!metricDetail.hidden);
|
||||
label->setLabel(text);
|
||||
label->setValue(xdata[i], ydata[i]);
|
||||
label->setYAxis(axisid);
|
||||
@@ -2820,7 +2845,7 @@ LTMPlot::eventFilter(QObject *obj, QEvent *event)
|
||||
{
|
||||
|
||||
// when clicking on a legend item, toggle if the curve is visible
|
||||
if (obj == legend() && event->type() == 2) {
|
||||
if (event->type() == QEvent::MouseButtonPress) {
|
||||
|
||||
bool replotNeeded = false;
|
||||
QwtLegend *l = static_cast<QwtLegend *>(this->legend());
|
||||
@@ -2828,26 +2853,19 @@ LTMPlot::eventFilter(QObject *obj, QEvent *event)
|
||||
foreach(QwtPlotCurve *p, curves) {
|
||||
foreach (QWidget *w, l->legendWidgets(itemToInfo(p))) {
|
||||
if (w->underMouse()) {
|
||||
QPalette palette;
|
||||
palette.setBrush(QPalette::Window, QBrush(GColor(CPLOTBACKGROUND)));
|
||||
|
||||
if (w->palette().color(QPalette::Text) == GColor(CPLOTMARKER)) {
|
||||
palette.setColor(QPalette::WindowText, Qt::darkGray);
|
||||
palette.setColor(QPalette::Text, Qt::darkGray);
|
||||
p->setVisible(false);
|
||||
} else {
|
||||
palette.setColor(QPalette::WindowText, GColor(CPLOTMARKER));
|
||||
palette.setColor(QPalette::Text, GColor(CPLOTMARKER));
|
||||
p->setVisible(true);
|
||||
//XXX this is a bit broken on a Mac (at least)
|
||||
//XXX qDebug()<<"under mouse="<<static_cast<QwtLegendLabel*>(w)->text().text();
|
||||
for(int m=0; m< settings->metrics.count(); m++) {
|
||||
if (settings->metrics[m].curve == p) {
|
||||
settings->metrics[m].hidden = !settings->metrics[m].hidden;
|
||||
replotNeeded = true;
|
||||
}
|
||||
}
|
||||
replotNeeded = true;
|
||||
w->setPalette(palette);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (replotNeeded) replot();
|
||||
return false;
|
||||
if (replotNeeded) setData(settings);
|
||||
}
|
||||
|
||||
// is it for other objects ?
|
||||
|
||||
@@ -77,16 +77,17 @@ class RideBest;
|
||||
class MetricDetail {
|
||||
public:
|
||||
|
||||
MetricDetail() : type(METRIC_DB), stack(false), model(""), name(""), metric(NULL), stressType(0),
|
||||
MetricDetail() : type(METRIC_DB), stack(false), hidden(false), model(""), name(""), metric(NULL), stressType(0),
|
||||
smooth(false), trendtype(0), topN(0), lowestN(0), topOut(0), baseline(0.0),
|
||||
curveStyle(QwtPlotCurve::Lines), symbolStyle(QwtSymbol::NoSymbol),
|
||||
penColor(Qt::black), penAlpha(0), penWidth(1.0), penStyle(0),
|
||||
brushColor(Qt::black), brushAlpha(0), fillCurve(false), labels(false) {}
|
||||
brushColor(Qt::black), brushAlpha(0), fillCurve(false), labels(false), curve(NULL) {}
|
||||
|
||||
bool operator< (MetricDetail right) const { return name < right.name; }
|
||||
|
||||
int type;
|
||||
bool stack; // should this be stacked?
|
||||
bool hidden; // should this be hidden ? (toggled via clicking on legend)
|
||||
|
||||
QString model; // short code for model selected
|
||||
int estimate; // 0-4 for W', CP, FTP, PMAX
|
||||
@@ -143,6 +144,9 @@ class MetricDetail {
|
||||
|
||||
// text labels against values
|
||||
bool labels;
|
||||
|
||||
// curve on the chart to spot this...
|
||||
QwtPlotCurve *curve;
|
||||
};
|
||||
|
||||
// so we can marshal and unmarshall LTMSettings when we save
|
||||
|
||||
Reference in New Issue
Block a user