to run an specific Data Processor, even if not configured to run
automatically on import, over existing activities which pass the
filter expression using configured parameters.
Fixes#2037
Reproducible downloading/importing a PowerTap .raw file and
selecting an interval for the first time, _model->series is NULL
in this case, no model case added for safety
Stroke Rate: counting both arms for crawl/back corrected by 3m push-off when Pool Length is defined
Swim Pace: average swim pace in min/100m or min/100yd when Cadence>0, to avoid kick/drill sets
Strokes Per Length: counting only the arm with the watch, pool length defaults to 50m
SWolf: Strokes Per Length plus time in seconds, pool length defaults to 50m
Also moved Distance Swim and Pace Swim from BasicRideMetrics.cpp
.. when working with user data and user metrics its often
useful to work with arrays or index into the ride data.
.. a new variable INDEX is available that is the sample
number in the array of samples that make up the ride.
.. you can dereference samples in a ride using the []
operator so POWER[55] is the 55th sample for power.
.. when iterating you should consider the recording interval
so NN <- 1200 / RECINTSECS would set NN to the number of
samples in 20 minutes.
.. you can also use your own arrays: MYARRAY[44] <- 100 will
set the 44th item in MYARRAY to 100.
.. the old vector syntax [ date : date ] has been deprecated
since it is too complex !
.. a much simpler approach to aligning the xdata series
with the standard series, using a single index.
.. its faster and makes implementing the four different
merge algorithms much more straight forward.
.. committing alone to separate from the implementation
of separate algorithms.
.. for thread safety the Leaf tree must NOT be used for state
data when parsing / evaluating data filters -- the
DataFilterRuntime object should be used.
.. updated to use this for xcurrent/xnext during XDATA
processing which fixes UserMetric calculation using XDATA
for intervals
.. also added a 'print' function in the datafilter syntax to
help with debugging calculations.
.. now we return values when working with metrics and user data
.. you can now create user metrics and user data to plot on the
allplot or metrics charts
.. the XDATA function currently always returns a 'repeat' of the
last value used until a new value is available, will fix this
in commit 3 of 3
.. Filter rides for presence of XDATA by name using the syntax:
XDATA("XDATANAME", "SERIESNAME", sparse|repeat|interpolate|resample)
.. this is the first of 2 commits, in this one we have added XDATA to
the rideitem and rideDB.json so we can check if XDATA is present
without opening the ridefile
.. this allows us to return true or false for an XDATA(..) call when
working across rideitems (not data points) in DataFilter evaluate,
note that the join control (sparse,repeat etc) is ignored when you
are filtering ride items
.. in the next commit we will add the ability to get at the xdata
values when iterating in user data or user metrics
.. there are likely to be further refinements for the outer join
required to support interpolation and resampling in a third commit.
.. rather than using setTabBar() to keep resetting the view
for the XDATA tabs in RideEditor the model updates the
views correctly.
.. makes the editing of XDATA more responsive and doesn't
keep resizing columns on every change.
One record per length with 3 fields:
TYPE: 0-pause, 1-free, 2-back, 3-breast, 4-fly, 5-drill, 6-mixed, 7-IM
DURATION: seconds per length
STROKES: total strokes per length
Related to #2010
Added Specification parameter to AddIntervalDialog::findPeaks
So it can be used as a more general replacement for
BestIntervalDialog::findBests and findBestsKPH
.. context menu on xdata editor row/column headings now
adds functions to add/remove rows and columns
.. users can now manually create and maintain XDATA in the
ride editor
.. the UX is a bit naff and needs to be cleaned up; the
visual cues are missing on redo/undo and the performance
is poor since setTabBar is called too frequently. Will
look to fix these nits over the next few days.
Conflicts:
src/FileIO/XDataTableModel.cpp
.. get ride of the xdata by closing its tab at the bottom
of the chart. This is similar to how worksheets are
removed in Excel and should be intuitive to most people.
.. a warning is issued before removing the data, but it can
be undone as all data commands are performed on the
command stack
.. added the ability to edit point values with XDATA
series displayed as 'worksheets' within the ride editor,
in keeping with the 'Spreadsheet' UX
.. need to refine the cosmetics and work on more useful
functions like add/remove row/column etc but the basic
view and edit functions are in place.
.. add XDataDialog and tabs to the ride editor, so you can
add and remove xdata and the individual data series.
.. next commit will add editing of the xdata values.
.. there was a memory leak in RideFile and FitRideFile
.. added a test file with weather data that can be used to
test XDATA processing (it has 10 weather points with
wind, humidity etc).
.. added a new 'XDATA' element for the JsonRideFile and
RideFile classes.
.. this allows ride file readers to extract and load any
time series data that doesn't neccessarily fit into
the usual data points.
.. this was added to support weather data from FIT files
and also to support 3rd party merging data with the
GC supported data.
.. ** IMPORTANT ** the XDATA segment is added at the END
of the JSON format. So older parsers will fail to read
but will have loaded all data already (i.e. they will
fail gracefully enough)
This means files with XDATA can be read by earlier
versions of GC, but the XDATA will be discarded.
.. should be 'cycles' per minute (i.e. a pair of steps, one left
and one right)
.. previously it was number of 'steps' per minute (i.e. how many
footsteps did you take in one minute)
.. will pair and count strides to derive speed and cadence
.. this commit covers the ANT+ side of things, will now
update the config to enable the user to set stride length
When runs have power PMC metrics are inconsistent otherwise, better
to have separated rTSS/sTSS which could be added as builtin or user
defined metric.
.. it should be calculated in a data processor rather
than in the file processor.
.. Damien is looking to add one, so commenting it out
for now (so the code can be reused if needed).
Simpler and more robust lap alignment
Fixed for empty lengths due to false starts and
pauses in some devices s.t. Garmin 910xt
Added 2 contributed test files
... align terminology (upload/download vs. import/publish)
... make pushbuttons right-aligned (in sync with most GC dialogs)
... ask for confirmation before finally deleting a chart from CloudDB
.. use GcChartWindow as the base class for all charts -- so
we can truly upload *any* chart to the cloudDB
.. miscellaneous charts that were still defined as GcWindow
have been converted to GcChartWindow
.. GcChartWindow layout issues (using QGridLayout insted of
a QStackedLayout) are fixed which will also resolve a few
rendering issues related to NOWEBKIT.
.. Aerolab needed lots of cosmetic fixups once it became
a GcChartWindow
.. Added 'Upload Chart...' to mirror the 'Download Chart..'
option on the hamburger menu as users will instinctively
look for the option there instead of under the chart menu.
... add "Sport" metadata as filter option
... move "Import" from main menue to "add chart"
... make chart lists context sensitive on home, activities and diary
... import directly - without extra dialog
... add export support for the new .gchart format (allowing to post all chart types to CloudDB)
... add import in main menu for the new .gchart format
... allow to import multiple charts at once
... remove specific LTM Chart support (menu, db,... -since this is covered by general .gchart format)
.. you can now fetch activities as a list and split them
based upon gaps in recording (recording anomalies).
.. this is to support trackeR; data should already be cleaned
by the user, but thats not always the case (!)
.. completes the updates to RTool.cpp
.. as predicted by forming the pmc data.frame via an S3
list instead of a pair list the merge() function works
properly and column names are retained.
.. we should use a list not an old pair list when constructing
lists and data.frames.
.. to ensure better compatibility with coercion functions in R
and also possibly to resolve known issues with merge()
.. this is part 1 of 2, breaking up the mass changes to the many
data wrangling functions in RTool.cpp
.. it also contains an update to RLibrary to resolve the functions
used when working with lists (SET_VECTOR_ELT).
.. allow user to select target view for trends/diary charts
since they can be used on either
.. don't just add when only 1 chart imported, always let the
user confirm and adjust
.. use translated names for the views so they are more meaningful
to the end user
.. the default methods in QGraphicsView handle these
events; we don't want this since we handle them in
mainwindow
.. fixes drag-n-drop onto mainwindow as well as working
with the compare pane 'auto-open'.
.. A single .gchart file being dropped into MainWindow will
add and select it on the view.
.. still need to add a dialog when dropping multiple charts
to let user control if they want them all.
.. using mvjson not Qt Json classes, to avoid a dependency on
Qt5. The format was kept simple specifically to avoid that.
.. the chart ultimately is defined a list of properties with
a key and value.
.. export any chart to a file for sharing with others
.. the import functionality will come next (and will need to
determine property formats by querying the newly created
chart metatypes).
.. the ability to apply a datafilter to the data retrieved
is extended to the season.metrics, season.meanmax and
season.peaks methods
.. this helps to let GC filter out e.g. power data is present
before we do anything in R since GC is faster and it also
reduces the data being passed back etc.
.. clean it up, rather than resolve source (there is still a
problem in there somewhere).
.. at least now interval plots and model fits aren't skewed
by a trailing zero value
.. we really don't need 10k history on errors in the rchart
.. this is a hangover from the early development that should
have been reduced before being published
.. You can now specify which activity to retrieve by passing
a POSIXct date time representing the start time of the ride
.. this is mostly useful when used in conjunction with
GC.activities(filter=...) to select ride dates.
.. allow user to pass a data filter to evaluate when getting
a list of activities.
.. e.g. GC.activities('Workout_Code = "1L2")
will get a list of activity start times where the workout
code is 1L2.
.. when returning values we honour whatever filter is active
at the time from home sidebar or the search box
.. it is applied regardless of which view the chart is on.
This commit fixes the issue that the interval bars (in AllPlotInterval) are not correctly aligned
with the interval sections in the main plot (AllPlot). This is done by calculating the margins from
the main plotting area to the border and setting left and right margin of the interval plot
accordingly.
.. Add option to disable embedded R in preferences
.. Better diagnostics if load fails
.. If we find it in the usual place we load and set R_HOME
automatically without requiring R_HOME or config
.. The config option overrides R_HOME not the other way around
Use total duration for both length and lap messages to synch them,
even when using drill mode. Tested with Garmin Swim and 920xt files.
Garmin 310xt is special cased since it doesn't generate rest length messages
Add Pool Length in meters as metadata
.. added a checksum metric for an activity that can be used as a key
in R scripts to invalidate / reuse caches.
.. when R scripts are computationally expensive we can store the
results in a cache with a key for the activity involved -- then
the cache is tied to a particular activity (and state).
.. since caching in R has many options we may develop a 'basic'
cache function that can be guaranteed to be available to any
script so they can be shared.
.. get runtime version loaded and show on crash dialog and console
since the runtime may be different from compile time as it is
now dynamically loaded.
.. no need to define GC_WANT_R_DYNAMIC any more since it is now
working across all 3 supported platforms.
.. we need to improve the way R_HOME is configured and validated
for non-technical users.
.. fixed up to work on Windows too.
.. needed to add a couple of functions used by Windows;
getRUser(), get_R_HOME() and getDLLVersion().
.. also needed to add a path to the DLL that included the
address space (x64 or i386).
.. we can now load the installed dynamic library rather than
distributing with the version we built with.
.. the lib is loaded and symbols resolved at runtime.
.. need to fixup for Windows and remove GC_WANT_R_DYNAMIC option
and make it the way we integrate R for GC_WANT_R
.. add Graphics device entry points and almost done with defining
proxy functions to call at runtime
.. will need to create a QLibrary object to load and resolve
symbols for the proxies to call next.
.. if you add GC_WANT_R_DYNAMIC to gcconfig.pri it enables
this, but it will crash, this is a wip.
.. get peak values across rides in a season.
.. series="power", or series=c("power", "heart.rate") and
duration=1 or duration=c(1,10,100)
.. where series is a mean maximal series in the ride file cache
and duration is in seconds
.. will make this compare aware shortly.
.. get a dataframe with season details
.. all lists all seasons, compare lists those being compared and
if neither true returns the currently selected season
.. also renamed functions so we now have
GC.season.metrics -> GC.metrics
GC.season.pmc -> GC.pmc
but he old GC.metrics/pmc are retained for backward compatibility
.. some users get confused, so make the splitter sit
in the middle (ish) to help them
.. need to still fixup save/restore splitter position
to chart config.
.. instead of hacking the text to avoid a global world
transform we now transform y ourselves
.. it looks like text needs to be centered will test and
fix shortly.
.. was using invertColor and resulted in white on dark for the
default setup and was very jarring. The color is toned down
to a gray if it results in white.
.. add a new method to fetch a data.frame of PMC data
for the passed metric, by default it returns for the
selected date range, all=TRUE will fetch all dates.
.. GC.activity(compare=TRUE) will return a list of compares
.. If you are not in compare mode it will be 1 element long
and represent the currently selected ride
.. otherwise it will have one entry for each activity dropped
into the compare pane
.. each element has a $activity and a $color
Example:
df <- GC.activity()
.. do plot ..
Now:
compares <- GC.activity(compare=TRUE)
for (compare in compares) {
df <- compare$activity
col <- compare$color
.. do plot ...
}
.. you can pass all=TRUE|FALSE to GC.metrics if you want to
override the date range selection
.. also added connect to daterange select so a trend chart
will refresh when you select a date range
.. set a script to run when an activity is selected
.. this allows a plot to be generated and displayed when
you select a ride in analysis view
.. the script is stored with the chart settings
.. it now builds and runs on Windows
.. there is a runtime crash when embedded R is initialised
that needs to be reolved
** NOTE **
R is not distributed with a .lib that can be linked to
with the MS VC linker. Instead, we need to generate a
lib and exp file from the dll:
1. dumpbin /exports R.dll > R.def
2. edit the .def output to have EXPORTS at the top and
a list of functions only (last column, delete the rest)
3. lib /machine:x64 /def:R.def
After linking remember to copy the DLLs to the GoldenCheetah
build directory from the $R_HOME/bin/x64/*.dll
.. and a few more tidy ups.
.. never cease to be amazed at how some developers
will feel its OK to define generic symbols like
TRUE and FALSE in their code (!!)
.. R is a mess.
.. mostly startup issues when R_HOME is not known
.. need to think carefully about how we get the user to
register the R home. We could let them select the R
binary so we can run `R RHOME` and apply that (?)
.. we no longer need RInside or Rcpp as we use
100% R API calls to embed
.. the following need to be resolved:
1. R_HOME / Options *must* be set to startup
embedded R but we don't check / restart or
default via system("R HOME")
2. Output is not trapped - all output is sent
directly to the console you started GC on
.. will fixup the 2 above before finally:
3. Build for Windows using MSVC !
.. we can register routines when embedding via the
R_getEmbeddingDLLInfo()
.. so we just register our functions directly now
in RTool rather than needing a dynamic library.
.. its cleaner and there are no nasty casts and build
settings required
.. reimplemented with native R API
.. switched to .Call in R function since .C means all functions
return void and must return by a pass by reference parameter.
.. its not needed as the workaround of using an extern "C" function
to perform the function pointer cast conforms to standard.
.. this just simplifies src.pro that was getting heavy
.. fixup R SHLIB build and integration to work on OSX
**** WARNING ****
If you build for OSX with GC_WANT_R You will need to
manually copy RGoldenCheetah.so into the app bundle.
$ cp RGoldenCheetah.so ./GoldenCheetah.app/Contents/MacOS
*****************
.. phew. that was hard.
.. To register routines with R you need to place them in a shared
library.
.. The routines we want to register are part of the GC codebase so
cannot be linked into that shared library (it would be the whole
of GC).
.. So; we have a shared library (RGoldenCheetah.cpp) which has stubs
for all the registered functions and an array of pointers to the
actual functions.
.. We load the library (once R is embedded it is loaded in main.cpp)
.. After the library is loaded we then call one of its public
functions (GCInitialiseFunctions) to tell it where all the GC
functions are (we only have GCdisplay at present for this proof
of the concept).
.. Along the way we need to deref/cast DL_FUNC in RTool.cpp which
is not permitted in ISO C, so we also update qmake to add a
special rule to compile `dodgy' sources with -fpermissive. And
the only dodgy source is RTool.cpp.
.. This commmit will break GC_WANT_R builds on OSX, and will be
fixed up shortly.
.. The motivation behind this is to avoid RInside/Rcpp for Windows
builds -- enabling R support (which is not currently possible).
.. to use the R C API for to avoid use of Rcpp and RInside
.. the shlib doesn't do anything and isn't loaded in RTool
at this point. Need to get this working cross-platform
and iron out the build time nits.
.. so don't even try to build and warn via qmake
.. RInside/Rcpp do not suport MSVC
.. Microsoft Open R may help, but doesn't at this point
.. we can revisit at a later date.
.. not complete, but we now have a canvas (QGraphicsView)
to plot the R output without needing to use x11() or
quartz(), window() etc.
.. the primitives do not honour the graphic engine context so
all lines etc are white on black.
.. will fix and improve in followup commits, need to test
with QT4.8 and cross-platform.
.. since the R runtime is shared by charts we offer the ability
to prefix variables with $$ to ensure they don't conflict
across multiple RCharts.
.. $$d <- GC.activity() would actually be parsed within R as
gc0d <- GC.activity(). The next chart would get gc1 and so
on.
.. it is optional, so charts could share data structures (but
wonder why you might do that)
.. we still need to encapsulate the code to plot within a
script to ensure it is refreshed when the chart is selected
or underlying data changes.
.. believe it or not the R base code for plot (plot.c)
skipped plotting circles if they were white on white.
.. took me 4 hours to fix this by setting startcol and
startfill in DevDesc for the device.
.. But at least the R driver now works properly -- we can
now integrate with a qt widget.
.. the R graphics device now gets called for hist() so we can
work on the interaction with a QT widget now.
.. still have other problems to deal with (!)
.. GoldenCheetahGD is instantiated
.. GC.display() to create new GD
GC.activate() to activate the GD
NOTE: a fair amount of qDebug() in at present as
the graphics functions are being created.
.. don't crash when cannot initialise (e.g. when RInside not
available or R is not installed)
.. handle messaging via signals to trap 'late' messages from
the R Runtime
.. refactoring code to introduce an RTool for working
with RInside and Rcpp and move code away from main.cpp
.. get ready to write all the data accessors in a way
that supports multiple athlete windows.
.. now have a console in the RChart to issue R commands.
Its very basic and doesn't handle multi-line commands
well nor support up/down to cursor through history.
.. added a "GC" object with 3 variables
GC.version - a version string
GC.build - build id, later always higher
GC.home - root of all athlete directories
.. No access yet to athlete, metrics, models and rides.
This will come very shortly; need to decide on best
way to handle accessing different athletes within
a single global context.
.. of you cancel before opening an athlete you get a SEGV
on some platforms under some conditions (threads)
.. we now tidy up a little better and avoid deleting static
objects when application->exec() has not been called.
.. still working on the build/configuration to get things
started. main.cpp now creates an instance of RInside
that is shared by all athletes/charts.
.. not clear if this is going to work (!)
.. pushing to repo to test cross-platform support during
development. It /should/ not impact any code since it
will be an optional dependency.
.. first part just to get the configuration ready to
build out a chart for the trend and activity view
.. src.pro and gcconfig.pri are updated to link in with
the RInside/Rcpp package install (new dependency)
.. there is a script in util called install-packages.R
which can be run to install the packages so long as
R is available:
$ R CMD BATCH util/install-packages.R
.. if NOWEBKIT is set in gcconfig.pri when QT < 5 we unset it, since
it is only supported for QT versions > 5.0 where QWebEngine is
available
.. gcconfig.pri.in has also been updated to have a line to set
NOWEBKIT as a signpost to the user
.. we /could/ use the sed s/#DEFINES/DEFINES technique in .travis.yml
now to set NOWEBKIT always and it will only take effect if building
with QT5
... using AppVeyor.com
... only 64Bit builds with QT 5.6.0 / MSVC2015
... all libraries included (pre-compiled)
... using QtWebEngine configuration, not QtWebKit
When there are (planned) activities with future days it is
annoying to start at the latest planned activity, this change
try to select the latest which is not in the future.
.. in RideSummaryWindow we update to show
progress of the model estimates, but it
errors if the html is not set or is blank
and does not contain the div 'modhead'.
The following will always be located in the
source directories so we can find them across
the different trees:
* ../lib/libqwt.a
* ../kqoauth/libkqoauth.a (linux only)
* ./Resources
The references are made via $${PWD} which is
the directory for the currently processed
.pro file.
.. LYC set the date to 2000 from 2016 !
.. we check the date when downloading from a CERVO and if the year
is set to 2000 we set it to the current year.
.. if the date resulting is in the future (e.g download a ride in Jan
2017 from a ride in Dec 2016) then we subtract a year.
.. it will be interesting to see what happens in 2017 !
.. remove Webkit dependency if the user adds the following
to their gcconfig.pri: DEFINES += NOWEBKIT
.. at present the build disables:
* Bing map
* Google map
* Ride Window
* Street View
.. since QT 5.6 enables c++11 dependent libs may no longer
compile with c++11 enabled (e.g. qwtplot3d)
.. this is experimental and in place to enable further work
on deprecating the webkit dependency in GoldenCheetah v4.0
.. notably c++11 needed which breaks a few dependencies
.. WebKit is not available and breaks our builds
.. we will likely need to fixup WebEngine and c++11 in some
fashion. This may mean we deprecate qwtplot3d and we
pre-build WebKit for builds
.. there is a fixup for this in Qt 5.6 but not prior and
it causes horrible performance problems on the QXT
span slider on Linux, which is irritating when trying
to zoom into an area of a ride.
.. when searching for weight in withings readings there will
be measurements that do not include weight -- these are
now skipped to avoid returing a 0kg weight.
.. don't paint dots for cost > 100kJ. It was good for debugging
and checking the solver, but now its just distracting and a
very large performance overhead.
.. probability(), temperature() and neighbour() functions were
not implemented for a correct SA implementation.
.. results still need to be constrained to avoid solutions that
are implausible for the athlete status or history
.. added a solver using a simulated annealing algorithm.
.. the solver is constrained to physiologically plausible
values, but these may not be valid for the athlete. So
a second update is required to allow the user to constrain
the solver.
.. secondly, the algorithm cannot be halted and doesn't use
multiple CPUs/threads should they be available this should
be in a second update to part 2
.. finally, a visualisation is needed to show the solver progress
across the search space to give the user an indication of
where the best solutions were found (especially if they don't
constrain it themselves).
.. add the dialog to mainwindow, but not functioning.
.. Part 2 will add the Solver and Part 3 will add the
progress visualisation.
[this is a recommit after reverting the previous one
that borked line endings to MSDOS crlf]
For builtin metrics it shows the newly added description if available
and refers to the Glossary otherwise
For user defined metrics it is the text provided by the user
Complete descriptions for Running and Swimming metrics and partial
update for BasicMetrics, it defaults to a message referring to the wiki.
Fixes#1850
.. rather than only build with Google Drive support if
using QT5.4 just adapt the code to avoid issues with
QJsonObject -> operator present in QT5.x < 5.4.
.. see https://bugreports.qt.io/browse/QTBUG-29573
.. when saving weight/height the saveClicked() function was using the
value in context->athlete->useMetricUnits to decide if to perform
conversion of the values stored in the widgets -- BUT -- it will
reflect the value BEFORE our update since it has not been updated
yet (via the configChanged() signal.
.. instead we look at the pending value when deciding if the values
need conversion.
Fixes#1868
.. previously it was disabled via VLC, but if you're not running
with video then the screensaver will kick in on Windows.
.. we now disable it via the Windows API too
Fixes#1859
Introducing a directory structure to make it a bit less
daunting for new developers and perhaps even old hands.
The main folders all start with an upper character, so src
files are now located in;
* Core - Core data structures
* Gui - Main GUI elements
* Metrics - Models and Metrics
* FileIO - Device and File I/O
* Charts - All the chart types
* Cloud - Working with Web Resources
* Train - Anything Train View specific
* ANT - Our ANT+ Stack
* Resources - Images, Translations, Web etc
Apologies to anyone who needs to merge across this update.
.. using scatter plot of metrics as a basis to develop a class
hierarchy to replace all chart 'types' by a single suite of
classes
.. this is to enable easier additions of features like interval
analysis and UX as well as greater consistency (data that is
available, functions etc)
.. but for v4.0 we will just use this to introduce a scatter plot
for the trends view and develop it further in v4.1
.. this is the initial class design.
Helps startup time a bit more, mainly by removing
all of the QTextEdit controls used for html esacping
and moving them into a utils class.
also stopped excessive looping in setymax where axis height
was small.
simpler implementation of ceil used rather than calling qCeil.
G3 hubs intermittently broadcast battery status messages, which
were being treated as telemetry and saved into lastMessage. This
was then corrupting the ANT_WHEELTORQUE_POWER calculations for
speed & power after each battery message.
Note: don't have a G3 to verify this agaist, but this fix makes
sense given the supplied log files!
.. when zoomed if you highlight the qwkcode the view makes sure
the gui is visible and centered if poss.
.. also ensures 'now' is centred and visible when recording - makes
the view useful as a close-up view of 'whats coming up' during
recording.
.. zooming in / out now animates to make it less jarring.
.. we now need to add 'ensureVisible' for the cursor when
cursoring down the qwkcode to make sure block is visible
on the gui side when zoomed.
.. now user metrics will reference pre-computed metrics
during the computeMetrics() call, we need to NOT do
this when they're empty.
.. there is really only one time this happens - when we
are testing a metric in the preferences pane.
Changed EditUserMetricDialog parent so that Options/Preferences dialog doesn't get hidden by main window
Added double-click as an alternative to edit button
.. use the symbols computed for an interval when calculating
for an interval and not those calculated against the entire
ride.
.. we now use datafilters in a lot of contexts and should
consider moving to handling scope more formally within
the language grammar.
.. allow the user to create a new workout and also
to save as a new file, which are complementary functions.
.. we also now prompt the user if they have made changes that
have not been saved to make sure they don't lose them by
accident.
.. a few bits of code were not removed from the different
approaches taken whilst developing the splash progress
window before the last commit, so cleaning them away.
.. The eCP model keeps a note of the peak efforts used to derive the
model parameters. This is so we can work with them later, possibly
to store in the ride item and plot alongside the model etc
.. we may choose to use confidence intervals across them since they
will always represent the peak "anaerobic and/or aerobic" efforts
in each ride.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.