diff --git a/src/Metrics/RideMetric.cpp b/src/Metrics/RideMetric.cpp index 402469b19..df8ca9f16 100644 --- a/src/Metrics/RideMetric.cpp +++ b/src/Metrics/RideMetric.cpp @@ -166,10 +166,17 @@ RideMetric::computeMetrics(RideItem *item, Specification spec, const QStringList // generate worklist from metrics we know // bear in mind this can change as users add // and remove user metrics - QStringList todo; + // builtin User metrics are computed after builtins + // since they don't have explicit dependencies set, yet. + QStringList builtin; + QStringList user; foreach(QString metric, metrics) - if (factory.haveMetric(metric)) - todo << metric; + if (factory.haveMetric(metric)) { + if (factory.rideMetric(metric)->isUser()) + user << metric; + else + builtin << metric; + } // this is what we've completed as we go QHash done; @@ -183,10 +190,11 @@ RideMetric::computeMetrics(RideItem *item, Specification spec, const QStringList item->metrics().resize(factory.metricCount()); // working through the todo list... - while (!todo.isEmpty()) { + while (!builtin.isEmpty() || !user.isEmpty()) { - // next one to do - QString symbol = todo.takeFirst(); + // next one to do, builtins first then user defined + QString symbol = builtin.isEmpty() ? user.takeFirst() : + builtin.takeFirst(); // doesn't exist ! if (!factory.haveMetric(symbol)) continue; @@ -200,8 +208,8 @@ RideMetric::computeMetrics(RideItem *item, Specification spec, const QStringList foreach (QString dep, deps) { if (!done.contains(dep)) { ready = false; - if (!todo.contains(dep)) - todo.append(dep); + if (!builtin.contains(dep)) + builtin.append(dep); } } @@ -232,8 +240,8 @@ RideMetric::computeMetrics(RideItem *item, Specification spec, const QStringList // we need to wait for our dependencies so add // to the back of the list - if (!todo.contains(symbol)) - todo.append(symbol); + if (!builtin.contains(symbol)) + builtin.append(symbol); } }