You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
|
Feb
(1) |
Mar
(15) |
Apr
(20) |
May
(2) |
Jun
(9) |
Jul
(3) |
Aug
(2) |
Sep
(17) |
Oct
(16) |
Nov
(38) |
Dec
(40) |
2010 |
Jan
(51) |
Feb
(11) |
Mar
(24) |
Apr
(31) |
May
(24) |
Jun
(3) |
Jul
(9) |
Aug
(1) |
Sep
(29) |
Oct
(33) |
Nov
(81) |
Dec
(6) |
2011 |
Jan
(2) |
Feb
(4) |
Mar
(13) |
Apr
(4) |
May
(24) |
Jun
(4) |
Jul
(19) |
Aug
(46) |
Sep
(10) |
Oct
(28) |
Nov
(31) |
Dec
|
From: <ilo...@us...> - 2011-05-08 20:11:07
|
Revision: 793 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=793&view=rev Author: ilovesquigly Date: 2011-05-08 20:11:00 +0000 (Sun, 08 May 2011) Log Message: ----------- Division by zero bug fix Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-08 17:26:44 UTC (rev 792) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-08 20:11:00 UTC (rev 793) @@ -1310,10 +1310,11 @@ c += 1 store.set (iter, c, s['total_'+f]) c += 1 - store.set (iter, c, s['total_distance'] / s['total_duration'] * 3600.) - for f in data['fields']: - c += 1 - store.set (iter, c, s[f]) + if s['total_duration']!=0: # Avoid division by zero if 0 length sport activity exists in DB + store.set (iter, c, s['total_distance'] / s['total_duration'] * 3600.) + for f in data['fields']: + c += 1 + store.set (iter, c, s[f]) self.statsTreeView.set_model(store) self.statsTreeView.set_rules_hint(True) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ilo...@us...> - 2011-05-08 17:26:50
|
Revision: 792 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=792&view=rev Author: ilovesquigly Date: 2011-05-08 17:26:44 +0000 (Sun, 08 May 2011) Log Message: ----------- New option in open street maps to select the area to be anonymized (removed) from GPX file before uploading Added Paths: ----------- pytrainer/trunk/extensions/openstreetmap/OSM_AnonSelection.glade Added: pytrainer/trunk/extensions/openstreetmap/OSM_AnonSelection.glade =================================================================== --- pytrainer/trunk/extensions/openstreetmap/OSM_AnonSelection.glade (rev 0) +++ pytrainer/trunk/extensions/openstreetmap/OSM_AnonSelection.glade 2011-05-08 17:26:44 UTC (rev 792) @@ -0,0 +1,77 @@ +<?xml version="1.0"?> +<glade-interface> + <!-- interface-requires gtk+ 2.16 --> + <!-- interface-naming-policy project-wide --> + <widget class="GtkWindow" id="OSM_AnonSelection"> + <property name="title" translatable="yes">Select your private area</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <property name="default_width">600</property> + <property name="default_height">400</property> + <property name="destroy_with_parent">True</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <widget class="GtkVBox" id="mapBox"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="spacing">3</property> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkButton" id="buttonOk"> + <property name="label" translatable="yes">_Ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_buttonOk_clicked" object=""BLA2""/> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <widget class="GtkButton" id="buttonCancel"> + <property name="label" translatable="yes">_Cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_buttonCancel_clicked" object=""BLA""/> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ilo...@us...> - 2011-05-08 17:26:05
|
Revision: 791 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=791&view=rev Author: ilovesquigly Date: 2011-05-08 17:25:59 +0000 (Sun, 08 May 2011) Log Message: ----------- New option in open street maps to select the area to be anonymized (removed) from GPX file before uploading Modified Paths: -------------- pytrainer/trunk/extensions/openstreetmap/conf.xml pytrainer/trunk/extensions/openstreetmap/openstreetmap.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/extensions/openstreetmap/conf.xml =================================================================== --- pytrainer/trunk/extensions/openstreetmap/conf.xml 2011-05-08 15:41:16 UTC (rev 790) +++ pytrainer/trunk/extensions/openstreetmap/conf.xml 2011-05-08 17:25:59 UTC (rev 791) @@ -10,4 +10,5 @@ > <conf-values variable="username" value=""/> <conf-values variable="password" value=""/> +<conf-values variable="privPolygon" value=""/> </pytrainer-extension> Modified: pytrainer/trunk/extensions/openstreetmap/openstreetmap.py =================================================================== --- pytrainer/trunk/extensions/openstreetmap/openstreetmap.py 2011-05-08 15:41:16 UTC (rev 790) +++ pytrainer/trunk/extensions/openstreetmap/openstreetmap.py 2011-05-08 17:25:59 UTC (rev 791) @@ -11,7 +11,11 @@ import httplib, httplib2 import urllib2 import mimetools, mimetypes +from json import dumps, loads # for deserializing JSON data form javascript +from pytrainer.extensions.mapviewer import MapViewer +from pytrainer.extensions.osm import Osm + class openstreetmap: def __init__(self, parent = None, pytrainer_main = None, conf_dir = None, options = None): self.parent = parent @@ -21,22 +25,21 @@ self.description = " " self.tags = "" self.visibility = "private" + self.mozTitle="" # Keeps embedded mozilla document title while displaying map for private area selection + self.privBounds=[] # Bounds of areas to be anonymized def run(self, id, activity=None): #TODO Convert to use activity... logging.debug(">>") - uri = "http://api.openstreetmap.org/api/0.6/gpx/create" #URI for uploading traces to OSM - if 'username' not in self.options or self.options['username'] == "" or 'password' not in self.options or self.options['password'] == "": - logging.error("Must have username and password configured") - msg = _("Must have username and password configured") - md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) - md.set_title(_("Openstreetmap Extension Error")) - md.run() - md.destroy() - return - username = self.options['username'] - password = self.options['password'] - gpx_file = "%s/gpx/%s.gpx" % (self.conf_dir, id) - if os.path.isfile(gpx_file): + try: + uri = "http://api.openstreetmap.org/api/0.6/gpx/create" #URI for uploading traces to OSM + if 'username' not in self.options or self.options['username'] == "" or 'password' not in self.options or self.options['password'] == "": + logging.error("Must have username and password configured") + raise Exception("Must have username and password configured") + username = self.options['username'] + password = self.options['password'] + gpx_file = "%s/gpx/%s.gpx" % (self.conf_dir, id) + if not os.path.isfile(gpx_file): + raise Exception(str(gps_file) + ' File not found') #GPX file is ok and found, so open it logging.debug("GPX file: %s found, size: %d" % (gpx_file, os.path.getsize(gpx_file))) f = open(gpx_file, 'r') @@ -57,7 +60,7 @@ logging.debug("User abort") return if self.makeanon: - logging.debug("User requested anonymising of GPX data") + logging.debug("User requested anonymizing of GPX data") f.close() #Close standard gpxfile gpx_file = self.make_gpx_private(gpx_file) f = open(gpx_file, 'r') #Open anonymous gpxfile in readonly mode @@ -100,15 +103,20 @@ md.set_modal(False) md.run() md.destroy() + except Exception as e: + msg = _("Error while uploading file to OSM: " + str(e)) + md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) + md.set_title(_("Openstreetmap Extension Error")) + md.run() + md.destroy() + return + finally: + logging.debug("<<") - else: - logging.error("GPX file: %s NOT found!!!" % (gpx_file)) - logging.debug("<<") - def display_options_window(self): self.prefwindow = gtk.Dialog(title=_("Please add any additional information for this upload"), parent=None, flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) self.prefwindow.set_modal(False) - table = gtk.Table(1,2) + table = gtk.Table(1,3) self.entryList = [] #Add description label = gtk.Label("<b>Description</b>") @@ -143,7 +151,12 @@ checkbutton = gtk.CheckButton() table.attach(checkbutton,1,2,3,4) self.entryList.append(checkbutton) - #Buld dialog and show + #Add anon area selection button + button = gtk.Button("Area selection") + button.connect("clicked",self.areaSelect) + table.attach(button,1,2,4,5) + self.entryList.append(button) + #Build dialog and show self.prefwindow.vbox.pack_start(table) self.prefwindow.show_all() self.prefwindow.connect("response", self.on_options_ok_clicked) @@ -163,6 +176,80 @@ self.makeanon = self.entryList[3].get_active() logging.debug("Description: %s, tags: %s, visibility: %s, makeanon: %s" % ( self.description, self.tags, self.visibility, self.makeanon) ) + def areaSelect(self,dc): + """ + Open a window with OSM map so user could select his private/anonymized area - + all GPX dots in this area will be removed before uploading to OSM + """ + try: + wTree = gtk.glade.XML(self.pytrainer_main.data_path+"extensions/openstreetmap/OSM_AnonSelection.glade") + self.privAreaWindow = wTree.get_widget("OSM_AnonSelection") + dic = { + "on_buttonOk_clicked" : self.privArea_Ok, + "on_buttonCancel_clicked" : self.privArea_Cancel + } + wTree.signal_autoconnect( dic ) + mapviewer = MapViewer(self.pytrainer_main.data_path, pytrainer_main=self.pytrainer_main, box=wTree.get_widget("mapBox")) + json=None + if self.options.has_key('privPolygon'): + json=self.options['privPolygon'] + htmlfile = Osm(data_path=self.pytrainer_main.data_path, waypoint=json, pytrainer_main=self.pytrainer_main).selectArea() + mapviewer.display_map(htmlfile=htmlfile) + mapviewer.moz.connect('title', self.parseTitle) + self.privAreaWindow.show() + + except Exception as e: + msg = "Could not init map selection screen, Error: " + str(e) + md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) + md.set_title(_("Error")) + md.run() + md.destroy() + return + + def parseTitle(self, moz): + "Event fired when document title was changed -> meaning polygon was changed" + if moz.get_title() != "": + self.mozTitle=str(moz.get_title()) + + def privArea_Cancel(self,button): + "Event fired when cancel button was pressed" + self.privAreaWindow.destroy() + + def privArea_Ok(self,button): + "Event fired when ok button was pressed" + logging.debug(">> privArea_Ok") + # save new private area polygon if changed + if self.mozTitle=="": + return + # try parsing JSON + try: + # verify json is correct by deserializing and serializing it + polygonString=dumps(loads(self.mozTitle)) + # try saving + extensionDir = self.pytrainer_main.data_path + "/extensions" + "/openstreetmap" + if not os.path.isdir(extensionDir): + loggin.error(str(e)) + print ("Could not find extension path: " + str(extensionDir)) + raise Exception("Could not find extension path: " + str(extensionDir)) + # save new options + self.options['privPolygon'] = polygonString + # convert dictionary to a lists set + savedOptions = [] + for key in self.options: + savedOptions.append((key,self.options[key])) + # write new xml config file + self.parent.setExtensionConfParams(extensionDir, savedOptions) + except Exception as e: + logging.error(str(e)) + print "Error while saving extension configuration: " + str(e) + msg = _(str(e)) + md = gtk.MessageDialog(self.pytrainer_main.windowmain.window1, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, msg) + md.set_title(_("Error while saving extension configuration")) + md.run() + md.destroy() + finally: + self.privAreaWindow.destroy() + def multipart_encode(self, fields, files, boundary = None, buffer = None): ''' Multipart encode data for posting @@ -176,7 +263,6 @@ buffer += '--%s\r\n' % boundary buffer += 'Content-Disposition: form-data; name="%s"' % key buffer += '\r\n\r\n' + value + '\r\n' - print files for (key, fd) in files: file_size = os.fstat(fd.fileno())[stat.ST_SIZE] filename = os.path.basename(fd.name) @@ -202,15 +288,19 @@ filen = os.path.basename(gpx_file) tmpdir = self.pytrainer_main.profile.tmpdir anon_gpx_file = "%s/%s" % (tmpdir, filen) - - # Filtered home area, example Berlin - # corners NorthEast and SouthWest - #TODO This needs to be a config item.... - NE_LAT = 52.518 - NE_LON = 13.408 - SW_LAT = 52.4 - SW_LON = 13.3 + # get saved private area polygon + pP=loads(self.options['privPolygon']) + pP=pP['geometry']['coordinates'][0] + # converts polygon's 2D matrix into a vector of just the lats or lons + vector = lambda lonLat: [pP[i][lonLat] for i in range(len(pP))] # 0:lon, 1:lat + # try reading private area's bounds, stored as [lon,lat] + NE_LAT = max([pP[i][1] for i in range(len(pP))]) + NE_LON = max([pP[i][0] for i in range(len(pP))]) + SW_LAT = min([pP[i][1] for i in range(len(pP))]) + SW_LON = min([pP[i][0] for i in range(len(pP))]) + logging.info("Anonymizing Area: NE:%f,%f -> SW: %f,%f" % (NE_LON, NE_LAT, SW_LON, SW_LAT)) + # Config parameters, not used yet FILTER_BOX = True ERASE_TIME = True Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-05-08 15:41:16 UTC (rev 790) +++ pytrainer/trunk/pytrainer/main.py 2011-05-08 17:25:59 UTC (rev 791) @@ -54,7 +54,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.8.0-svn#787" + self.version ="1.8.0-svn#791" self.DB_version = 9 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ilo...@us...> - 2011-05-08 15:41:23
|
Revision: 790 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=790&view=rev Author: ilovesquigly Date: 2011-05-08 15:41:16 +0000 (Sun, 08 May 2011) Log Message: ----------- New local caching option Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/osm.py Modified: pytrainer/trunk/pytrainer/extensions/osm.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/osm.py 2011-05-07 23:10:02 UTC (rev 789) +++ pytrainer/trunk/pytrainer/extensions/osm.py 2011-05-08 15:41:16 UTC (rev 790) @@ -1,255 +1,481 @@ -# Open Street Map -# TODO: store OpenLayers.js locally (1MB file) -# TODO: Add google satelite images layers ? +# Open Street Maps -import gtkmozembed +# TODO: Add Google satellite images layers ? +# TODO: Create map class/interface that osm/googlemaps will inherit from ? + +import gtkmozembed # embedded mozilla import os import re import logging - +import urllib # for downloading cached versions of openlayers.js and openstreetmaps.js +import time # Used for checking if local cached file is current + from pytrainer.lib.gpx import Gpx import pytrainer.lib.points as Points from pytrainer.lib.fileUtils import fileUtils from pytrainer.record import Record class Osm: - def __init__(self, data_path = None, waypoint = None, pytrainer_main=None): - logging.debug(">>") - self.data_path = data_path - self.waypoint = waypoint - self.pytrainer_main = pytrainer_main - self.htmlfile = "%s/osm.html" % (self.pytrainer_main.profile.tmpdir) - logging.debug("<<") + # Default URLS + URLS = {'OpenLayers.js' : "http://openlayers.org/api/OpenLayers.js", + 'OpenStreetMap.js' : "http://www.openstreetmap.org/openlayers/OpenStreetMap.js"} + # URLS that will not be cached + staticURLS = {'OpenLayers' : 'http://openlayers.org/api/'} #openlayers default location - def drawMap(self, activity, linetype): - '''Draw osm map - create html file using Open Layers and Open Street Map - render using embedded Mozilla + def __init__(self, data_path = None, waypoint = None, pytrainer_main=None): + logging.debug(">>") + self.data_path = data_path + self.waypoint = waypoint + self.pytrainer_main = pytrainer_main + self.tmpdir = (self.pytrainer_main.profile.tmpdir) + self.htmlfile = "%s/osm.html" % (self.tmpdir) + logging.debug("<<") - info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html - ''' - logging.debug(">>") - points = [] - levels = [] - pointlist = [] - polyline = [] - attrlist = [] + def download(self,url,localfile): + """Copy the contents of a file from a given URL to pytrainer's tmpdir + """ + logging.debug(">>") + print "Downloading %s" % (url) + webFile = urllib.urlopen(url) + # always store downloaded files in tmpdir/cache + localFile = open(self.tmpdir + '/cache/' + localfile, 'w') + localFile.write(webFile.read()) + webFile.close() + localFile.close() + logging.debug("<<") + + def cacheUrls(self): + ''' Store URL copies of needed files locally, + download new versions every ~14 days or if files does'nt exists + ''' + #TODO: open a msg/progress bar while downloading the new files to inform the user + logging.debug(">>") + # create cache subfolder in tmpdir if not already there + try: + cachedir = self.tmpdir + '/cache'; + if not os.path.isdir(cachedir): + print "Creating %s folder" % (cachedir) + os.mkdir(cachedir) + + for localfile in self.URLS: + # local cached file does not exists? download it + if not os.path.isfile(cachedir + '/' + localfile): + self.download(self.URLS[localfile],localfile) + else: + creationTime = os.path.getctime(cachedir + '/' + localfile) # read file creation time + if creationTime > time.time(): # file is in the future?! download it again + self.download(self.URLS[localfile],localfile) + elif creationTime + 14*24*60*60 < time.time(): # 14 (days) * 24 hours * 60 minutes * 60 seconds = 14 days + self.download(self.URLS[localfile],localfile) + # No exception was thrown, assuming local cache file exists and current + self.URLS[localfile]='file://' + cachedir + '/' + localfile; + logging.info("Using %s file " % (self.URLS[localfile])) + except Exception as e: + loggin.error("(%s) Error while downloading %s to local cache, using default hosted file instaed." \ + % (str(e), self.URLS[localfile])) + logging.debug("<<") + + def drawMap(self, activity, linetype): + '''Draw OSM map + create HTML file using Open Layers and Open Street Map + render using embedded Mozilla - list_values = activity.tracks - if list_values is not None and list_values != [] and len(list_values) > 0: - for i in list_values: - lat, lon = float(i[4]), float(i[5]) - pointlist.append((lat,lon)) - polyline.append("[%s, %s]" % (lon, lat)) - attrlist.append((i[3],i[6])) # (Speed, HR) - points,levels = Points.encodePoints(pointlist) - points = points.replace("\\","\\\\") - laps = activity.laps - timeHours = int(activity.time) / 3600 - timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 - time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) - startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) - finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), time, _("Distance"), activity.distance, activity.distance_unit) - startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html - finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html + ''' + logging.debug(">>") + points = [] + levels = [] + pointlist = [] + polyline = [] + attrlist = [] - self.createHtml_osm(polyline, startinfo, finishinfo, laps, attrlist, linetype) - else: - self.createErrorHtml() - return self.htmlfile - logging.debug("<<") + try : + list_values = activity.tracks + if list_values is not None and list_values != [] and len(list_values) > 0: + for i in list_values: + lat, lon = float(i[4]), float(i[5]) + pointlist.append((lat,lon)) + polyline.append("[%s, %s]" % (lon, lat)) + attrlist.append((i[3],i[6])) # (Speed, HR) + points,levels = Points.encodePoints(pointlist) + points = points.replace("\\","\\\\") + laps = activity.laps + timeHours = int(activity.time) / 3600 + timeMin = (float(activity.time) / 3600.0 - timeHours) * 60 + time = "%d%s %02d%s" % (timeHours, _("h"), timeMin, _("min")) + startinfo = "<div class='info_content'>%s: %s</div>" % (activity.sport_name, activity.title) + finishinfo = "<div class='info_content'>%s: %s<br>%s: %s%s</div>" % (_("Time"), \ + time, _("Distance"), activity.distance, activity.distance_unit) + startinfo = startinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html + finishinfo = finishinfo.encode('ascii', 'xmlcharrefreplace') #Encode for html - def createHtml_osm(self, polyline, startinfo, finishinfo, laps, attrlist, linetype): - ''' - Generate OSM map html file using MapLayers - ''' - logging.debug(">>") - content = '''<html> - <head> - <!-- bring in the OpenLayers javascript library - (here we bring it from the remote site, but you could - easily serve up this javascript yourself) --> - <script src="http://www.openlayers.org/api/OpenLayers.js"></script> - <!-- bring in the OpenStreetMap OpenLayers layers. - Using this hosted file will make sure we are kept up - to date with any necessary changes --> - <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> + self.createHtml_osm(polyline, startinfo, finishinfo, laps, attrlist, linetype) + else: + self.createErrorHtml() + except Exception as e: + self.createErrorHtml(e) + + return self.htmlfile + logging.debug("<<") - <script type="text/javascript"> - //complex object of type OpenLayers.Map - var map; + def selectArea(self,dc=None): + + # try using local cached versions of JS files for faster rendering + self.cacheUrls(); - //icons data object - var icons = { - iconSize : new OpenLayers.Size(30,30)''' + content = ''' + <html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <link rel="stylesheet" href="../theme/default/style.css" type="text/css" /> + <link rel="stylesheet" href="style.css" type="text/css" /> + <style type="text/css"> + p { + width: 512px; + } + #config { + margin-top: 1em; + width: 512px; + position: relative; + height: 8em; + } + #controls { + padding-left: 2em; + margin-left: 0; + width: 12em; + } + #controls li { + padding-top: 0.5em; + list-style: none; + } + #options { + font-size: 1em; + top: 0; + margin-left: 15em; + position: absolute; + } - # If have laps data insert markers here - try: - lapsContent='' - for lap in laps[:500]: # OpenLayers with firefox is limited to 500 markers -> TODO: Transfer to a constant somewhere ? - lapNumber = int(lap['lap_number'])+1 - elapsedTime = float(lap['elapsed_time']) - elapsedTimeHours = int(elapsedTime/3600) - elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) - elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) - if elapsedTimeHours > 0: - strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) - elif elapsedTimeMins > 0: - strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) - else: - strElapsedTime = "%0.0fs" % (elapsedTimeSecs) - #process lat and lon for this lap - lapLat = float(lap['end_lat']) - lapLon = float(lap['end_lon']) - #build laps content string - lapsContent+=',\n' - lapsContent+='\t\t\t\t\tlap%d: { url : "/waypoint.png", coordinates : [%f,%f], popupInfo: "%s" }' % \ - (lapNumber, lapLon, lapLat, \ - "<div class='info_content'>End of lap:%d<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>" % \ - (lapNumber, strElapsedTime, float(lap['distance'])/1000, lap['calories']) - ) - content+=lapsContent - except Exception as e: - # If something breaks here just skip laps data - logging.error('Error formating laps data: ' + str(e)) - # Insert start/finish track markers - content+=''',\n start : { url : "/start.png", coordinates : %s, popupInfo : "%s" }, - finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" }, - url : "file://%s/glade"''' \ - % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path)) + /* avoid pink tiles */ + .olImageLoadError { + background-color: transparent !important; + } + </style> - content+='''};\n - function init() { + <!-- Load libraries from remote or local cache --> + <script src="''' + self.URLS['OpenLayers.js'] + '''"></script> + <script src="''' + self.URLS['OpenStreetMap.js'] + '''"></script> - // for transforming WGS 1984 to Spherical Mercator Projection - pWGS = new OpenLayers.Projection("EPSG:4326"); - pMP = new OpenLayers.Projection("EPSG:900913"); + <script type="text/javascript"> + var map, polygonControl; + function init(){ - map = new OpenLayers.Map ("map", { - controls:[ - new OpenLayers.Control.Navigation(), - new OpenLayers.Control.PanZoomBar(), - new OpenLayers.Control.LayerSwitcher(), - new OpenLayers.Control.Attribution()], - maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), - maxResolution: 156543.0399, - numZoomLevels: 19, - units: 'm', - projection: pMP, - displayProjection: pWGS - } ); + //"fix" locations + OpenLayers.ImgPath="''' + self.staticURLS['OpenLayers'] + '''img/"; + OpenLayers.scriptLocation="''' + self.staticURLS['OpenLayers'] + '''"; + OpenLayers._getScriptLocation=function() { return "''' + self.staticURLS['OpenLayers'] + '''";}; + + // for transforming WGS 1984 to Spherical Mercator Projection + pWGS = new OpenLayers.Projection("EPSG:4326"); + pMP = new OpenLayers.Projection("EPSG:900913"); - // Track painting style - var trackStyle = { - strokeColor: "#33DDDD", - strokeWidth: 3, - strokeDashstyle: "solid", - strokeOpacity: 0.6, - pointRadius: 6, - }; + map = new OpenLayers.Map ("map", { + controls:[ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.LayerSwitcher(), + new OpenLayers.Control.Attribution(), + new OpenLayers.Control.MousePosition()], + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + maxResolution: 156543.0399, + numZoomLevels: 19, + units: 'm', + projection: pMP, + displayProjection: pWGS + } ); - //Build track object - var track = - { - "type":"Feature", - "id":"OpenLayers.Feature.Vector_259", - "properties":{}, - "geometry": - { - "type":"LineString", - "coordinates": - [''' - #Insert track points here - content+=",".join(polyline); - content+='''] - }, - "crs": - { - "type":"OGC", - "properties": - { - "urn":"urn:ogc:def:crs:OGC:1.3:CRS84" - } - } - } + //Add open street maps layers + layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); + map.addLayer(layerMapnik); + layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); + map.addLayer(layerTilesAtHome); - //Add open street maps layers - layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); - map.addLayer(layerMapnik); - layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); - map.addLayer(layerTilesAtHome); + //Add polygon drawing layer + var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer"); + map.addLayer(polygonLayer); + + polyOptions = {sides: 4, irregular: true}; + polygonControl = new OpenLayers.Control.DrawFeature(polygonLayer, + OpenLayers.Handler.RegularPolygon, + {handlerOptions: polyOptions}); - //Create vector layer to add the data on to - var vector_layer = new OpenLayers.Layer.Vector(); - vector_layer.setName('Track'); + // For desrializings + var out_options = { + 'internalProjection': map.baseLayer.projection, + 'externalProjection': pWGS + }; - var geojson_format = new OpenLayers.Format.GeoJSON(); - var feature = geojson_format.read(track,"Feature"); + // allow only one feature to be drawn + polygonLayer.events.register("beforefeatureadded", polygonLayer, function(f) { polygonLayer.removeAllFeatures(true)}); + // Change title after draw + polygonLayer.events.register("featureadded", polygonLayer, function(f) { + var title=(new OpenLayers.Format.GeoJSON(out_options).write(f.feature,false)); + document.title=title; + }); + + //prepaint saved polygon + savedPolygon = \'''' + str(self.waypoint) + '''\'; + if ((savedPolygon) && (savedPolygon!=='None')) { + // deserialize + var geojson_format = new OpenLayers.Format.GeoJSON(out_options); + var feature = geojson_format.read(savedPolygon); + // make sure it's an array + if(feature.constructor != Array) + feature = [feature]; + if (feature && feature.length>0) { + var bounds = feature[0].geometry.getBounds(); + polygonLayer.addFeatures(feature); + map.zoomToExtent(bounds); + } + } else { + map.setCenter(new OpenLayers.LonLat(0, 0), 3); + } - // transform from WGS 1984 to Spherical Mercator Projection - feature.geometry.transform(pWGS, pMP); + map.addControl(polygonControl); + + document.getElementById('noneToggle').checked = true; + + } + + function setOptions(options) { + polygonControl.handler.setOptions(options); + } + + function setSize(fraction) { + var radius = fraction * map.getExtent().getHeight(); + polygonControl.handler.setOptions({radius: radius, + angle: 0}); + } + </script> + </head> - feature.geometry.calculateBounds(); - var vector=new OpenLayers.Feature.Vector(); - vector.geometry = feature.geometry; - vector.style=trackStyle; + <body onload="init()"> + <input type="radio" name="type" + value="none" id="noneToggle" + onclick="polygonControl.deactivate()" + checked="checked" /> + <label for="noneToggle">Navigate</label> + <input type="radio" name="type" + value="polygon" id="polygonToggle" + onclick="polygonControl.activate()" /> + <label for="polygonToggle">Draw polygon</label> + <div id="map" class="smallmap"></div> + </body> + </html>''' - vector_layer.addFeatures(vector); - map.addLayer(vector_layer); + file = fileUtils(self.htmlfile,content) + file.run() + return self.htmlfile + + def createHtml_osm(self, polyline, startinfo, finishinfo, laps, attrlist, linetype): + ''' + Generate OSM map html file using MapLayers + ''' + logging.debug(">>") - // Insert start/finish markers - layerMarkers = new OpenLayers.Layer.Markers("Markers"); - var offset = new OpenLayers.Pixel(-(icons.iconSize.w/2), -icons.iconSize.h); - for (var i in icons) { - if (icons[i].coordinates) { - icons[i].icon = new OpenLayers.Icon(icons.url + icons[i].url,icons.iconSize,offset); - icons[i].lonLat = new OpenLayers.LonLat(icons[i].coordinates[0],icons[i].coordinates[1]); - icons[i].lonLat.transform(pWGS,pMP); - icons[i].marker = new OpenLayers.Marker(icons[i].lonLat,icons[i].icon); - icons[i].popup = new OpenLayers.Popup.FramedCloud("Info", - icons[i].lonLat, - null, - icons[i].popupInfo, - icons[i].icon, - true, - null - ); - icons[i].onClick = function(e) { map.addPopup(this.popup); this.popup.show(); } - icons[i].marker.events.register("mousedown", icons[i], function(e) { this.onClick(e)} ) - layerMarkers.addMarker(icons[i].marker); - } - } - map.addLayer(layerMarkers); + # try using local cached versions of JS files for faster rendering + self.cacheUrls(); + + content = '''<html> + <head> + <!-- bring in the OpenLayers javascript library + (here we bring it from the remote site, but you could + easily serve up this javascript yourself) --> + <script src="''' + self.URLS['OpenLayers.js'] + '''"></script> + <!-- bring in the OpenStreetMap OpenLayers layers. + Using this hosted file will make sure we are kept up + to date with any necessary changes --> + <script src="''' + self.URLS['OpenStreetMap.js'] + '''"></script> - //zoom and center to the track layouts - map.zoomToExtent(feature.geometry.getBounds()); + <script type="text/javascript"> + //complex object of type OpenLayers.Map + var map; - } - </script> + //icons data object + var icons = { + iconSize : new OpenLayers.Size(30,30)''' - </head> - <!-- body.onload is called once the page is loaded (call the 'init' function) --> - <body onload="init();"> - <!-- define a DIV into which the map will appear. Make it take up the whole window --> - <div style="width:100%; height:100%" id="map"></div> - </body> - </html> - ''' - file = fileUtils(self.htmlfile,content) - file.run() - logging.debug("<<") + # If have laps data insert markers here + try: + lapsContent='' + for lap in laps[:500]: # OpenLayers with firefox is limited to 500 markers -> TODO: Transfer to a constant somewhere ? + lapNumber = int(lap['lap_number'])+1 + elapsedTime = float(lap['elapsed_time']) + elapsedTimeHours = int(elapsedTime/3600) + elapsedTimeMins = int((elapsedTime - (elapsedTimeHours * 3600)) / 60) + elapsedTimeSecs = elapsedTime - (elapsedTimeHours * 3600) - (elapsedTimeMins * 60) + if elapsedTimeHours > 0: + strElapsedTime = "%0.0dh:%0.2dm:%0.2fs" % (elapsedTimeHours, elapsedTimeMins, elapsedTimeSecs) + elif elapsedTimeMins > 0: + strElapsedTime = "%0.0dm:%0.2fs" % (elapsedTimeMins, elapsedTimeSecs) + else: + strElapsedTime = "%0.0fs" % (elapsedTimeSecs) + #process lat and lon for this lap + lapLat = float(lap['end_lat']) + lapLon = float(lap['end_lon']) + #build laps content string + lapsContent+=',\n' + lapsContent+='\t\t\t\t\tlap%d: { url : "/waypoint.png", coordinates : [%f,%f], popupInfo: "%s" }' % \ + (lapNumber, lapLon, lapLat, \ + "<div class='info_content'>End of lap:%d<br>Elapsed time:%s<br>Distance:%0.2f km<br>Calories:%s</div>" % \ + (lapNumber, strElapsedTime, float(lap['distance'])/1000, lap['calories']) + ) + content+=lapsContent + except Exception as e: + # If something breaks here just skip laps data + logging.error('Error formating laps data: ' + str(e)) + # Insert start/finish track markers + content+=''',\n start : { url : "/start.png", coordinates : %s, popupInfo : "%s" }, + finish : { url : "/finish.png", coordinates : %s, popupInfo : "%s" }, + url : "file://%s/glade"''' \ + % (polyline[0], startinfo, polyline[-1], finishinfo, os.path.abspath(self.data_path)) - def createErrorHtml(self): - logging.debug(">>") - content = ''' - <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> - <body> - No Gpx Data - </body> - </html> - ''' - file = fileUtils(self.htmlfile,content) - file.run() - logging.debug("<<") + content+='''};\n + function init() { + // fool openlayers scripts so it will download images and themes from the web instead of local folder if cached + OpenLayers.ImgPath="''' + self.staticURLS['OpenLayers'] + '''img/"; + OpenLayers.scriptLocation="''' + self.staticURLS['OpenLayers'] + '''"; + OpenLayers._getScriptLocation=function() { return "''' + self.staticURLS['OpenLayers'] + '''";}; + + // for transforming WGS 1984 to Spherical Mercator Projection + pWGS = new OpenLayers.Projection("EPSG:4326"); + pMP = new OpenLayers.Projection("EPSG:900913"); + + map = new OpenLayers.Map ("map", { + controls:[ + new OpenLayers.Control.Navigation(), + new OpenLayers.Control.PanZoomBar(), + new OpenLayers.Control.LayerSwitcher(), + new OpenLayers.Control.Attribution()], + maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34), + maxResolution: 156543.0399, + numZoomLevels: 19, + units: 'm', + projection: pMP, + displayProjection: pWGS + } ); + + // Track painting style + var trackStyle = { + strokeColor: "#33DDDD", + strokeWidth: 3, + strokeDashstyle: "solid", + strokeOpacity: 0.6, + pointRadius: 6, + }; + + //Build track object + var track = + { + "type":"Feature", + "id":"OpenLayers.Feature.Vector_259", + "properties":{}, + "geometry": + { + "type":"LineString", + "coordinates": + [''' + #Insert track points here + content+=",".join(polyline); + content+='''] + }, + "crs": + { + "type":"OGC", + "properties": + { + "urn":"urn:ogc:def:crs:OGC:1.3:CRS84" + } + } + } + + //Add open street maps layers + layerMapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); + map.addLayer(layerMapnik); + layerTilesAtHome = new OpenLayers.Layer.OSM.Osmarender("Osmarender"); + map.addLayer(layerTilesAtHome); + + //Create vector layer to add the data on to + var vector_layer = new OpenLayers.Layer.Vector(); + vector_layer.setName('Track'); + + var geojson_format = new OpenLayers.Format.GeoJSON(); + var feature = geojson_format.read(track,"Feature"); + + // transform from WGS 1984 to Spherical Mercator Projection + feature.geometry.transform(pWGS, pMP); + + feature.geometry.calculateBounds(); + var vector=new OpenLayers.Feature.Vector(); + vector.geometry = feature.geometry; + vector.style=trackStyle; + + vector_layer.addFeatures(vector); + map.addLayer(vector_layer); + + // Insert start/finish markers + layerMarkers = new OpenLayers.Layer.Markers("Markers"); + var offset = new OpenLayers.Pixel(-(icons.iconSize.w/2), -icons.iconSize.h); + for (var i in icons) { + if (icons[i].coordinates) { + icons[i].icon = new OpenLayers.Icon(icons.url + icons[i].url,icons.iconSize,offset); + icons[i].lonLat = new OpenLayers.LonLat(icons[i].coordinates[0],icons[i].coordinates[1]); + icons[i].lonLat.transform(pWGS,pMP); + icons[i].marker = new OpenLayers.Marker(icons[i].lonLat,icons[i].icon); + icons[i].popup = new OpenLayers.Popup.FramedCloud("Info", + icons[i].lonLat, + null, + icons[i].popupInfo, + icons[i].icon, + true, + null + ); + icons[i].onClick = function(e) { map.addPopup(this.popup); this.popup.show(); } + icons[i].marker.events.register("mousedown", icons[i], function(e) { this.onClick(e)} ) + layerMarkers.addMarker(icons[i].marker); + } + } + map.addLayer(layerMarkers); + + //zoom and center to the track layouts + map.zoomToExtent(feature.geometry.getBounds()); + + } + </script> + + </head> + <!-- body.onload is called once the page is loaded (call the 'init' function) --> + <body onload="init();"> + <!-- define a DIV into which the map will appear. Make it take up the whole window --> + <div style="width:100%; height:100%" id="map"></div> + </body> + </html> + ''' + file = fileUtils(self.htmlfile,content) + file.run() + logging.debug("<<") + + def createErrorHtml(self,errMsg=None): + logging.debug(">>") + errMsg = errMsg or '' # convert None to empty string + content = ''' + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> + <body> + No GPX Data (''' + str(errMsg) + ''') + </body> + </html> + ''' + file = fileUtils(self.htmlfile,content) + file.run() + logging.debug("<<") + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-05-07 23:10:08
|
Revision: 789 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=789&view=rev Author: siggipals Date: 2011-05-07 23:10:02 +0000 (Sat, 07 May 2011) Log Message: ----------- Fixed #123 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/drawArea.py Modified: pytrainer/trunk/pytrainer/gui/drawArea.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawArea.py 2011-05-07 23:01:12 UTC (rev 788) +++ pytrainer/trunk/pytrainer/gui/drawArea.py 2011-05-07 23:10:02 UTC (rev 789) @@ -210,6 +210,9 @@ xvals = [x+barOffset for x in range(0, numCols)] cellText = [] self.showGraph=False + + for k in colors: + if colors[k]==None: colors[k]='' #Display first axis xticks = [] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-05-07 23:01:19
|
Revision: 788 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=788&view=rev Author: siggipals Date: 2011-05-07 23:01:12 +0000 (Sat, 07 May 2011) Log Message: ----------- #122 - Added comments for laps Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/glade/pytrainer.glade 2011-05-07 23:01:12 UTC (rev 788) @@ -1003,6 +1003,7 @@ <widget class="GtkTreeView" id="lapsTreeView"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="has_tooltip">True</property> </widget> </child> </widget> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-07 23:01:12 UTC (rev 788) @@ -158,6 +158,7 @@ {'name':_("Max HR"), 'xalign':1.0}, {'name':_("Calories"), 'xalign':1.0}, {'name':_("Intensity"), 'visible':False}, + {'name':_("Comments"), 'xalign':0.0}, ] self.create_treeview(self.lapsTreeView,columns) @@ -427,6 +428,7 @@ gobject.TYPE_INT, gobject.TYPE_INT, gobject.TYPE_STRING, + gobject.TYPE_STRING, ) for lap in activity.laps: t = lap['elapsed_time'] @@ -450,16 +452,56 @@ pic = gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/trigger_%s.png" % lap['trigger']) iter = store.append() - store.set(iter, 0, lap['lap_number']+1, 1, pic, 2, m/1000, 3, str(int(float(t))), 4, s, 5, max_speed, 6, pace, 7, max_pace, 8, lap['avg_hr'] if lap['avg_hr'] else 0, 9, lap['max_hr'] if lap['max_hr'] else 0, 10, lap['calories'], 11, color[lap['intensity']]) + store.set(iter, + 0, lap['lap_number']+1, + 1, pic, + 2, m/1000, + 3, str(int(float(t))), + 4, s, + 5, max_speed, + 6, pace, + 7, max_pace, + 8, lap['avg_hr'] if lap['avg_hr'] else 0, + 9, lap['max_hr'] if lap['max_hr'] else 0, + 10, lap['calories'], + 11, color[lap['intensity']], + 12, '' if not lap['comments'] else (lap['comments'] if len(lap['comments'])<40 else "%s..." % lap['comments'][:40]), + ) self.lapsTreeView.set_model(store) self.lapsTreeView.set_rules_hint(True) # Use grey color for "rest" laps - for c in self.lapsTreeView.get_columns()[:-1]: + for c in self.lapsTreeView.get_columns(): for cr in c.get_cell_renderers(): if type(cr)==gtk.CellRendererText: c.add_attribute(cr, 'foreground', 11) - + + def edited_cb(cell, path, new_text, (liststore, activity)): + liststore[path][12] = new_text + activity.laps[int(path)]['comments'] = new_text + self.pytrainer_main.ddbb.update("laps", "comments", [new_text,], "record=%s and lap_number=%s" % (activity.id, path)) + + def show_tooltip(widget, x, y, keyboard_mode, tooltip, user_param1): + path = self.lapsTreeView.get_path_at_pos(x,y-20) + if not path: return False + if path[1] != self.lapsTreeView.get_columns()[12]: return False + comments = activity.laps[path[0][0]]['comments'] + if comments and len(comments)>40: + tooltip.set_text(comments) + return True + return False + + self.lapsTreeView.connect('query-tooltip', show_tooltip, (store, activity)) + i = 0 + for cr in self.lapsTreeView.get_columns()[12].get_cell_renderers(): + cr.set_property('editable', True) + if getattr(self, 'lapview_handler_id', None): + cr.disconnect(self.lapview_handler_id) + self.lapview_handler_id = cr.connect('edited', edited_cb, (store, activity)) + tooltip = gtk.Tooltip() + tooltip.set_text(activity.laps[i]['comments']) + self.lapsTreeView.set_tooltip_cell(tooltip, i, self.lapsTreeView.get_columns()[12], cr) + i += 1 self.frame_laps.show() else: self.frame_laps.hide() Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/pytrainer/lib/activity.py 2011-05-07 23:01:12 UTC (rev 788) @@ -285,7 +285,7 @@ raise Exception( "Error - multiple results from DB for id: %s" % self.id ) #Get lap information laps = self.pytrainer_main.ddbb.select_dict("laps", - ("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number", "intensity", "avg_hr", "max_hr", "max_speed", "trigger"), + ("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number", "intensity", "avg_hr", "max_hr", "max_speed", "trigger", "comments"), "record=\"%s\"" % self.id) if laps is None or laps == [] or len(laps) < 1: #No laps found logging.debug("No laps in DB for record %d" % self.id) Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2011-05-07 23:01:12 UTC (rev 788) @@ -80,6 +80,7 @@ "max_speed": "float", "avg_hr": "int", "max_hr": "int", + "comments":"text", }, "athletestats": { "id_athletestat": "integer primary key autoincrement", Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/pytrainer/main.py 2011-05-07 23:01:12 UTC (rev 788) @@ -54,8 +54,8 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.8.0-svn#786" - self.DB_version = 8 + self.version ="1.8.0-svn#787" + self.DB_version = 9 #Process command line options self.startup_options = self.get_options() self.environment = Environment(platform.get_platform(), self.startup_options.conf_dir) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-05-06 16:37:47 UTC (rev 787) +++ pytrainer/trunk/pytrainer/record.py 2011-05-07 23:01:12 UTC (rev 788) @@ -242,6 +242,7 @@ tmp_lap['max_hr'] = lap[9] tmp_lap['max_speed'] = lap[10] tmp_lap['trigger'] = lap[11] + tmp_lap['comments'] = "" laps.append(tmp_lap) logging.debug('<<') return laps @@ -351,7 +352,7 @@ def getLaps(self, id_record): logging.debug('--') laps = self.pytrainer_main.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger, comments", "record=\"%s\"" % id_record) if laps is None or laps == []: #No laps stored - update DB logging.debug("No laps in DB for record %d" % id_record) @@ -368,7 +369,7 @@ self.insertLaps(lap_keys,lap.values()) #Try to get lap info again #TODO? refactor laps = self.pytrainer_main.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger, comments", "record=\"%s\"" % id_record) return laps This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-05-06 16:37:53
|
Revision: 787 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=787&view=rev Author: dgranda Date: 2011-05-06 16:37:47 +0000 (Fri, 06 May 2011) Log Message: ----------- Skipping entries with no date (empty) value Modified Paths: -------------- pytrainer/trunk/pytrainer/timegraph.py Modified: pytrainer/trunk/pytrainer/timegraph.py =================================================================== --- pytrainer/trunk/pytrainer/timegraph.py 2011-05-05 10:35:43 UTC (rev 786) +++ pytrainer/trunk/pytrainer/timegraph.py 2011-05-06 16:37:47 UTC (rev 787) @@ -17,6 +17,7 @@ #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import datetime, calendar +import logging from gui.drawArea import DrawArea class TimeGraph(object): @@ -53,19 +54,22 @@ sportColors = {} for record in values: - day = unicode(datetime.datetime.strptime(record[0], "%Y-%m-%d").strftime(key_format)) # Gives year for this record - sport = record[sportfield] - value = self.getValue(record, value_selected) - if sport in valueDict: #Already got this sport - if day in valueDict[sport]: #Already got this sport on this day - valueDict[sport][day] += value - valueCount[sport][day] += 1 - else: #New day for this sport - valueDict[sport][day] = value - valueCount[sport][day] = 1 - else: #New sport - valueDict[sport] = {day: value} - valueCount[sport] = {day: 1} + if record[0]: + day = unicode(datetime.datetime.strptime(record[0], "%Y-%m-%d").strftime(key_format)) # Gives year for this record + sport = record[sportfield] + value = self.getValue(record, value_selected) + if sport in valueDict: #Already got this sport + if day in valueDict[sport]: #Already got this sport on this day + valueDict[sport][day] += value + valueCount[sport][day] += 1 + else: #New day for this sport + valueDict[sport][day] = value + valueCount[sport][day] = 1 + else: #New sport + valueDict[sport] = {day: value} + valueCount[sport] = {day: 1} + else: + logging.debug("No date string found, skipping entry: " + str(record)) if value_selected in (2, 3): total = {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-05-05 10:35:49
|
Revision: 786 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=786&view=rev Author: dgranda Date: 2011-05-05 10:35:43 +0000 (Thu, 05 May 2011) Log Message: ----------- #118 - Preventing pytrainer to fail when time tag in gox file has no value Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-05-05 01:28:51 UTC (rev 785) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-05-05 10:35:43 UTC (rev 786) @@ -234,9 +234,12 @@ logging.debug("%d trkpoints in file" % len(trkpoints)) date_ = tree.find(timeTag).text - #mk_time = self.getDateTime(date_)[0] #UTC Date - mk_time = self.getDateTime(date_)[1] #Local Date - self.date = mk_time.strftime("%Y-%m-%d") + if date_ is None: + logging.info("time tag is blank") + self.date = None + else: + mk_time = self.getDateTime(date_)[1] #Local Date + self.date = mk_time.strftime("%Y-%m-%d") waiting_points = [] Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-05-05 01:28:51 UTC (rev 785) +++ pytrainer/trunk/pytrainer/main.py 2011-05-05 10:35:43 UTC (rev 786) @@ -54,7 +54,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.8.0-svn#784" + self.version ="1.8.0-svn#786" self.DB_version = 8 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-05-05 01:28:57
|
Revision: 785 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=785&view=rev Author: siggipals Date: 2011-05-05 01:28:51 +0000 (Thu, 05 May 2011) Log Message: ----------- #116 - Add rank list to new analytics page in record view. Fixed a date selection bug. Fixed integer formatting for running/resting times. Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/date.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2011-05-03 22:35:33 UTC (rev 784) +++ pytrainer/trunk/glade/pytrainer.glade 2011-05-05 01:28:51 UTC (rev 785) @@ -2800,7 +2800,7 @@ <property name="left_padding">12</property> <child> <widget class="GtkVBox" id="vbox_ranking"> - <property name="visible">True</property> + <property name="visible">True</property> <child> <widget class="GtkLabel" id="label11125"> <property name="visible">True</property> @@ -2809,190 +2809,213 @@ <property name="use_markup">True</property> </widget> </child> - <child> - <widget class="GtkHScale" id="slider_ranking"> - <property name="visible">True</property> - <property name="sensitive">True</property> - <property name="adjustment">5 0 20 1 0 0</property> - <signal name="value-changed" handler="on_change_rank_percentage"/> - </widget> - <packing> - <property name="expand">False</property> - </packing> - </child> - <child> - <widget class="GtkTable" id="table_ranking"> - <property name="visible">True</property> - <property name="border_width">10</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="column_spacing">3</property> - <property name="row_spacing">5</property> - <child> - <widget class="GtkLabel" id="label11125"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Range:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">0</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label11125"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Rank:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label11127"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Speed: </b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="wssdadadsada"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Avg speed:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label-2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Standard deviation:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label-3"> - <property name="width_request">90</property> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Deviation:</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="top_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_range"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_rank"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_speed"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_avg"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_stddev"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_ranking_dev"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label"></property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> + <child> + <widget class="GtkHBox" id="hbox_ranking"> + <property name="visible">True</property> + <child> + <widget class="GtkVBox" id="alignment_ranking2"> + <property name="visible">True</property> + <child> + <widget class="GtkHScale" id="slider_ranking"> + <property name="visible">True</property> + <property name="sensitive">True</property> + <property name="adjustment">5 0 20 1 0 0</property> + <signal name="value-changed" handler="on_change_rank_percentage"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkTable" id="table_ranking"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">5</property> + <property name="n_columns">2</property> + <property name="column_spacing">3</property> + <property name="row_spacing">5</property> + <child> + <widget class="GtkLabel" id="label11125"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Range:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">0</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11125"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Rank:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11127"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Speed: </b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="wssdadadsada"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Avg speed:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label-2"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Standard deviation:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label-3"> + <property name="width_request">90</property> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Deviation:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_range"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_rank"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_speed"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_avg"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_stddev"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_dev"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkTreeView" id="rankingTreeView"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers-clickable">False</property> + </widget> + <packing> + <property name="padding">10</property> + </packing> + </child> + </widget> + </child> </widget> </child> </widget> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-03 22:35:33 UTC (rev 784) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-05 01:28:51 UTC (rev 785) @@ -170,6 +170,18 @@ ] self.create_treeview(self.analyticsTreeView,columns,sortable=False) + #create the columns for the rank treeview + columns=[ + {'name':_("id"), 'visible':False}, + {'name':_("Rank"), 'visible':True}, + {'name':_("Date"), 'xalign':1.0}, + {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, + {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, + {'name':_("Speed"), 'format_float':'%.2f', 'quantity':'speed'}, + {'name':_("Color"), 'visible':False}, + ] + self.create_treeview(self.rankingTreeView,columns,sortable=False) + self.fileconf = self.pytrainer_main.profile.confdir+"/listviewmenu.xml" if not os.path.isfile(self.fileconf): self._createXmlListView(self.fileconf) @@ -298,10 +310,8 @@ cell.set_property('text', new) def render_float(self, column, cell, model, iter, data): - _format, _quantity = data - col = column.get_sort_column_id() - if col == -1: col = 0 - _val = model.get_value(iter, col) + _format, _quantity, _idx = data + _val = model.get_value(iter, _idx) _val = self.uc.sys2usr(_quantity, _val) _val_str = _format % float(_val) cell.set_property('text', _val_str) @@ -325,11 +335,11 @@ if 'visible' in column_dict: column.set_visible(column_dict['visible']) if 'format_float' in column_dict: - column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity']]) + column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity'], column_index]) if 'format_duration' in column_dict and column_dict['format_duration']: column.set_cell_data_func(renderer, self.render_duration) if sortable: - column.set_sort_column_id(column_index) + column.set_sort_column_id(column_index) treeview.append_column(column) def actualize_recordview(self,activity): @@ -461,7 +471,7 @@ pauseTime = activity.time - runTime hrun,mrun,srun = self.pytrainer_main.date.second2time(runTime) hpause,mpause,spause = self.pytrainer_main.date.second2time(pauseTime) - self.record_runrest.set_text("%d:%d:%d / %d:%d:%d" %(hrun,mrun,srun,hpause,mpause,spause) ) + self.record_runrest.set_text("%02d:%02d:%02d / %02d:%02d:%02d" %(hrun,mrun,srun,hpause,mpause,spause) ) logging.debug("<<") def actualize_recordgraph(self,activity): @@ -783,22 +793,62 @@ percentage = widget.get_value() / 100 else: percentage = .05 - records = self.pytrainer_main.ddbb.select_dict("records", ["distance","time"], "distance > %f AND distance < %f AND sport=%d" % (activity.distance * (1-percentage), activity.distance * (1+percentage), activity.sport_id)) + records = self.pytrainer_main.ddbb.select_dict("records", ["distance","time","id_record","date","average"], "distance > %f AND distance < %f AND sport=%d order by average desc" % (activity.distance * (1-percentage), activity.distance * (1+percentage), activity.sport_id)) count = 1 for r in records: - if r['distance']/int(r['time']) > activity.distance/activity.time: + if r['average'] > activity.average: count += 1 import numpy - speeds = [r['distance']/int(r['time'])*3600 for r in records] + speeds = [r['average'] for r in records] self.label_ranking_range.set_text("%.2f - %.2f" % (activity.distance * (1-percentage), activity.distance * (1+percentage))) self.label_ranking_rank.set_text("%s/%s" % (count, len(records))) - self.label_ranking_avg.set_text("%.4f" % numpy.average(speeds)) - self.label_ranking_speed.set_text("%.4f" % (activity.distance/activity.time*3600)) + self.label_ranking_avg.set_text("%.2f" % numpy.average(speeds)) + self.label_ranking_speed.set_text("%.2f" % activity.average) self.label_ranking_stddev.set_text("%.4f" % numpy.std(speeds)) - self.label_ranking_dev.set_text("%+f" % ((activity.distance/activity.time*3600 - numpy.average(speeds)) / numpy.std(speeds))) + self.label_ranking_dev.set_text("%+f" % ((activity.average - numpy.average(speeds)) / numpy.std(speeds))) + rank_store = gtk.ListStore( + gobject.TYPE_INT, #id + gobject.TYPE_INT, #rank + gobject.TYPE_STRING, #date + gobject.TYPE_STRING, #distance + gobject.TYPE_STRING, #time + gobject.TYPE_STRING, #speed + gobject.TYPE_STRING, #color + ) + + length = len(records) + rec_set = [0,] + for r in xrange(max(count-3, 1) if count>1 else count, min(count+3, length-2) if count < length else count): + rec_set.append(r) + if length>1 and count!=length: + rec_set.append(-1) + + for i in rec_set: + r = records[i] + iter = rank_store.append() + rank = length if i==-1 else i+1 + rank_store.set ( + iter, + 0, i, + 1, rank, + 2, r['date'], + 3, r['distance'], + 4, str(r['time']), + 5, r['average'], + 6, '#3AA142' if rank==count else '#000000', + ) + + # Use grey color for "rest" laps + for c in self.rankingTreeView.get_columns()[:-1]: + for cr in c.get_cell_renderers(): + if type(cr)==gtk.CellRendererText: + c.add_attribute(cr, 'foreground', 6) + + self.rankingTreeView.set_model(rank_store) + def actualize_dayview(self,record_list=None, activity_list=None): logging.debug(">>") if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": Modified: pytrainer/trunk/pytrainer/lib/date.py =================================================================== --- pytrainer/trunk/pytrainer/lib/date.py 2011-05-03 22:35:33 UTC (rev 784) +++ pytrainer/trunk/pytrainer/lib/date.py 2011-05-05 01:28:51 UTC (rev 785) @@ -121,7 +121,7 @@ dayOfWeek += 7 #print "Adjusted today is %s day of the week:" % dayOfWeek date_ini = weekDate + datetime.timedelta(days=0-dayOfWeek) - date_end = weekDate + datetime.timedelta(days=6-dayOfWeek) + date_end = weekDate + datetime.timedelta(days=7-dayOfWeek) #print "weekrange", date_ini.strftime("%A"), date_end.strftime("%A") #print "dates", date_ini.strftime("%Y-%m-%d"), date_end.strftime("%Y-%m-%d") return date_ini.strftime("%Y-%m-%d"), date_end.strftime("%Y-%m-%d") Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-05-03 22:35:33 UTC (rev 784) +++ pytrainer/trunk/pytrainer/record.py 2011-05-05 01:28:51 UTC (rev 785) @@ -398,9 +398,9 @@ #TODO This is essentially the same as getrecordPeriodSport (except date ranges) - need to look at merging the two tables = "records,sports" if not sport: - condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end) + condition = "date>=\"%s\" and date<\"%s\" and records.sport=sports.id_sports" %(date_ini,date_end) else: - condition = "date>=\"%s\" and date<=\"%s\" and records.sport=sports.id_sports and sports.id_sports=\"%s\"" %(date_ini,date_end, sport) + condition = "date>=\"%s\" and date<\"%s\" and records.sport=sports.id_sports and sports.id_sports=\"%s\"" %(date_ini,date_end, sport) return self.pytrainer_main.ddbb.select(tables,"date,distance,time,beats,comments,average,calories,maxspeed,maxbeats, sports.name,upositive,unegative", condition) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-05-03 22:35:39
|
Revision: 784 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=784&view=rev Author: dgranda Date: 2011-05-03 22:35:33 +0000 (Tue, 03 May 2011) Log Message: ----------- #120 - Changed the way OS is checked to allow pytrainer run on other POSIX in addition to GNU/LINUX Modified Paths: -------------- pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/platform.py Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-05-02 08:42:10 UTC (rev 783) +++ pytrainer/trunk/pytrainer/main.py 2011-05-03 22:35:33 UTC (rev 784) @@ -54,7 +54,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.8.0-svn#781" + self.version ="1.8.0-svn#784" self.DB_version = 8 #Process command line options self.startup_options = self.get_options() Modified: pytrainer/trunk/pytrainer/platform.py =================================================================== --- pytrainer/trunk/pytrainer/platform.py 2011-05-02 08:42:10 UTC (rev 783) +++ pytrainer/trunk/pytrainer/platform.py 2011-05-03 22:35:33 UTC (rev 784) @@ -1,6 +1,7 @@ # -*- coding: iso-8859-1 -*- #Copyright (C) Nathan Jones nc...@us... +#modified by dgranda on behalf of Debian bug #587997 (trac ticket #120) #This program is free software; you can redistribute it and/or #modify it under the terms of the GNU General Public License @@ -20,12 +21,12 @@ import sys def get_platform(): - if sys.platform == "linux2": - return _Linux() - elif sys.platform == "win32": + if os.name == "posix": + return _Linux() #although not true, not changing original return name to avoid side effects + elif os.name == "nt": return _Windows() else: - print "Unsupported sys.platform: %s." % sys.platform + print "Unsupported os.name: %s." % os.name sys.exit(1) class _Platform(object): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-05-02 08:42:20
|
Revision: 783 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=783&view=rev Author: dgranda Date: 2011-05-02 08:42:10 +0000 (Mon, 02 May 2011) Log Message: ----------- #119 - Renaming danish suffix in po file to avoid confusion Modified Paths: -------------- pytrainer/trunk/locale/da/LC_MESSAGES/Makefile Added Paths: ----------- pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_da.po Removed Paths: ------------- pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.po Modified: pytrainer/trunk/locale/da/LC_MESSAGES/Makefile =================================================================== --- pytrainer/trunk/locale/da/LC_MESSAGES/Makefile 2011-05-01 01:43:48 UTC (rev 782) +++ pytrainer/trunk/locale/da/LC_MESSAGES/Makefile 2011-05-02 08:42:10 UTC (rev 783) @@ -1,7 +1,7 @@ default: - msgfmt pytrainer_dk.po -o ./pytrainer.mo + msgfmt pytrainer_da.po -o ./pytrainer.mo merge: - msgmerge pytrainer_dk.po pytrainer_dk.po_new > pytrainer_dk.po.tmp - mv pytrainer_de.pk.tmp pytrainer_dk.po - rm pytrainer_dk.po_new + msgmerge pytrainer_da.po pytrainer_da.po_new > pytrainer_da.po.tmp + mv pytrainer_da.po.tmp pytrainer_da.po + rm pytrainer_da.po_new Copied: pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_da.po (from rev 782, pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.po) =================================================================== --- pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_da.po (rev 0) +++ pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_da.po 2011-05-02 08:42:10 UTC (rev 783) @@ -0,0 +1,806 @@ +# translation of pytrainer_dk.po to Dansk +# Danish translations for pytrainer package. +# Copyright (C) 2007 THE pytrainer'S COPYRIGHT HOLDER +# This file is distributed under the same license as the pytrainer package. +# +# Lars Olesen <ole...@gm...>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: pytrainer_dk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-12-09 23:06+0100\n" +"PO-Revision-Date: 2007-12-20 21:02+0100\n" +"Last-Translator: Lars Olesen <ole...@gm...>\n" +"Language-Team: Dansk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.11.4\n" + +#: glade/pytrainer.glade:10 +msgid "window1" +msgstr "Vindue1" + +#: glade/pytrainer.glade:50 +msgid "_File" +msgstr "Fil" + +#: glade/pytrainer.glade:74 +msgid "_Export as text separated by commas" +msgstr "Eksporteret som tekst adskilt af kommaer" + +#: glade/pytrainer.glade:114 +msgid "_Edit" +msgstr "Rediger" + +#: glade/pytrainer.glade:136 +msgid "_View" +msgstr "Billede" + +#: glade/pytrainer.glade:145 +msgid " _Classic View" +msgstr "Klassisk billede" + +#: glade/pytrainer.glade:156 +msgid " _List View" +msgstr "Liste billede" + +#: glade/pytrainer.glade:168 +msgid " _Waypoints Editor View" +msgstr "Waypoint redigerings billede" + +#: glade/pytrainer.glade:184 +msgid "Tools" +msgstr "Værktøjer" + +#: glade/pytrainer.glade:194 +msgid "Extensions" +msgstr "Udvidelser" + +#: glade/pytrainer.glade:204 +msgid "Gps Device Plugins" +msgstr "GPS udstyrs plugins" + +#: glade/pytrainer.glade:218 +msgid "_Help" +msgstr "Hjælp" + +#: glade/pytrainer.glade:338 glade/pytrainer.glade:4810 +#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 +#: pytrainer/gui/windowmain.py:378 +msgid "Sport" +msgstr "Sport" + +#: glade/pytrainer.glade:364 +msgid "All Sports" +msgstr "Alle sportsgrene" + +#: glade/pytrainer.glade:472 glade/pytrainer.glade:1658 +#: glade/pytrainer.glade:2414 glade/pytrainer.glade:3125 +msgid "<b>Beats avg:</b>" +msgstr "Hjerteslag" + +#: glade/pytrainer.glade:522 +msgid " bpm" +msgstr "puls" + +#: glade/pytrainer.glade:550 glade/pytrainer.glade:1630 +#: glade/pytrainer.glade:2386 glade/pytrainer.glade:3097 +msgid "<b>Time:</b>" +msgstr "Tid" + +#: glade/pytrainer.glade:578 glade/pytrainer.glade:1602 +#: glade/pytrainer.glade:2358 glade/pytrainer.glade:3069 +msgid "<b>Distance:</b>" +msgstr "Distance" + +#: glade/pytrainer.glade:632 glade/pytrainer.glade:677 +#: glade/pytrainer.glade:1903 glade/pytrainer.glade:1948 +#: glade/pytrainer.glade:2659 glade/pytrainer.glade:2704 +#: glade/pytrainer.glade:3370 glade/pytrainer.glade:3415 +#: glade/pytrainer.glade:5178 glade/pytrainer.glade:5223 +msgid ":" +msgstr ":" + +#: glade/pytrainer.glade:782 +msgid " Km" +msgstr "km" + +#: glade/pytrainer.glade:810 glade/pytrainer.glade:1714 +#: glade/pytrainer.glade:2470 glade/pytrainer.glade:3181 +msgid "<b>Calories: </b>" +msgstr "Kalorier" + +#: glade/pytrainer.glade:860 +msgid " Cal" +msgstr "Kal" + +#: glade/pytrainer.glade:888 glade/pytrainer.glade:1686 +#: glade/pytrainer.glade:2442 glade/pytrainer.glade:3153 +msgid "<b>Average:</b>" +msgstr "Gennemsnit" + +#: glade/pytrainer.glade:938 +msgid " km/h" +msgstr "km/t" + +#: glade/pytrainer.glade:1005 +msgid "<b>Comments:</b>" +msgstr "Kommentarer" + +#: glade/pytrainer.glade:1059 glade/pytrainer.glade:5484 +msgid "<b>Positive:</b>" +msgstr "Positive" + +#: glade/pytrainer.glade:1103 glade/pytrainer.glade:5528 +msgid "<b>Negative:</b>" +msgstr "Negative" + +#: glade/pytrainer.glade:1151 glade/pytrainer.glade:5576 +msgid " <b>Accumulated Unevenness:</b> " +msgstr "Akkumuleret højdeforskel" + +#: glade/pytrainer.glade:1297 +msgid " <b>Title:</b>" +msgstr "Titel" + +#: glade/pytrainer.glade:1386 glade/pytrainer.glade:2185 +#: glade/pytrainer.glade:2941 glade/pytrainer.glade:3652 +msgid "Value" +msgstr "Værdi" + +#: glade/pytrainer.glade:1411 glade/pytrainer.glade:2210 +msgid "" +"Stage Profile\n" +"Stage Velocity\n" +"Stage Profile/velocity" +msgstr "" +"Træningspas Højdekurve\n" +"Træningspas Hastighed\n" +"Træningpas Højdekurve / Hastighed" + +#: glade/pytrainer.glade:1543 +msgid "Record" +msgstr "Data sæt" + +#: glade/pytrainer.glade:1742 glade/pytrainer.glade:2498 +#: glade/pytrainer.glade:3209 +msgid "Km" +msgstr "Km" + +#: glade/pytrainer.glade:1770 glade/pytrainer.glade:2526 +#: glade/pytrainer.glade:3237 +msgid "bpm" +msgstr "puls" + +#: glade/pytrainer.glade:1798 glade/pytrainer.glade:2554 +#: glade/pytrainer.glade:3265 +msgid "km/h" +msgstr "km/t" + +#: glade/pytrainer.glade:1826 glade/pytrainer.glade:2582 +#: glade/pytrainer.glade:3293 +msgid "Cal" +msgstr "Kal" + +#: glade/pytrainer.glade:2110 +msgid " <b>Date:</b>" +msgstr "Dato" + +#: glade/pytrainer.glade:2299 +msgid "Day" +msgstr "Dag" + +#: glade/pytrainer.glade:2759 glade/pytrainer.glade:4751 +msgid " " +msgstr " " + +#: glade/pytrainer.glade:2866 +msgid " <b>Month:</b>" +msgstr "Måned" + +#: glade/pytrainer.glade:2966 glade/pytrainer.glade:3677 +msgid "" +"Kilometers\n" +"Time\n" +"Beats\n" +"Average\n" +"Calories" +msgstr "" +"Kilometern " +"Tid\n" +"Hjerteslag\n" +"Gennemsnit\n" +"Kalorier" + +#: glade/pytrainer.glade:3010 +msgid "Month" +msgstr "Måned" + +#: glade/pytrainer.glade:3354 +msgid "999" +msgstr "999" + +#: glade/pytrainer.glade:3577 +msgid " <b>Year:</b>" +msgstr "<b>År</b>" + +#: glade/pytrainer.glade:3721 +msgid "Year" +msgstr "År" + +#: glade/pytrainer.glade:3764 +msgid "label154" +msgstr "mærkat154" + +#: glade/pytrainer.glade:3801 +msgid "<b>Title:</b>" +msgstr "<b>Titel:</b>" + +#: glade/pytrainer.glade:3846 +msgid "Search" +msgstr "Søg" + +#: glade/pytrainer.glade:3893 +msgid "Columns" +msgstr "Kolonner" + +#: glade/pytrainer.glade:3968 +msgid "label155" +msgstr "mærkat155" + +#: glade/pytrainer.glade:4145 +msgid " <b>Name:</b>" +msgstr " <b>Navn:</b>" + +#: glade/pytrainer.glade:4173 +msgid " <b>Description:</b>" +msgstr " <b>Beskrivelse</b>" + +#: glade/pytrainer.glade:4201 +msgid " <b>Latitude: </b>" +msgstr " <b>Breddegrad:</b>" + +#: glade/pytrainer.glade:4229 +msgid " <b>Longitude:</b>" +msgstr " <b>Længdegrad:</b>" + +#: glade/pytrainer.glade:4257 +msgid " <b>Type:</b>" +msgstr " <b>Type:</b>" + +#: glade/pytrainer.glade:4329 +msgid "" +"Font\n" +"Restaurant\n" +"Scenic Area\n" +"Summit" +msgstr "" +"Font\n" +"Restaurant\n" +"Naturskønt område\n" +"Møde" + +#: glade/pytrainer.glade:4354 +msgid "<b> Waypoint: </b>" +msgstr "<b> Waypoint: </b>" + +#: glade/pytrainer.glade:4439 +msgid "label-2147483648" +msgstr "mærkat-2147483648" + +#: glade/pytrainer.glade:4487 +msgid "label162" +msgstr "mærkat162" + +#: glade/pytrainer.glade:4627 +msgid "label163" +msgstr "mærkat163" + +#: glade/pytrainer.glade:4652 glade/pytrainer.glade:5684 +msgid "New Entry" +msgstr "Nyt data sæt" + +#: glade/pytrainer.glade:4700 pytrainer/gui/windowmain.py:52 +#: pytrainer/gui/windowmain.py:376 pytrainer/gui/dialogselecttrack.py:36 +msgid "Date" +msgstr "Dato" + +#: glade/pytrainer.glade:4865 pytrainer/gui/windowmain.py:52 +#: pytrainer/gui/windowmain.py:375 +msgid "Title" +msgstr "Titel" + +#: glade/pytrainer.glade:4923 +msgid "GPX file" +msgstr "GPX fil" + +#: glade/pytrainer.glade:4985 +msgid "Calculate Values" +msgstr "Beregn værdier" + +#: glade/pytrainer.glade:5018 +msgid "Beats avg (bpm)" +msgstr "Gennemsnitlig puls " + +#: glade/pytrainer.glade:5074 +msgid "Distance (Km)" +msgstr "Afstand (km)" + +#: glade/pytrainer.glade:5124 pytrainer/gui/windowmain.py:52 +#: pytrainer/gui/windowmain.py:379 +msgid "Time" +msgstr "Tid" + +#: glade/pytrainer.glade:5278 +msgid "Average (km/h)" +msgstr "Gennemsnit (km/t)" + +#: glade/pytrainer.glade:5328 +msgid "Calculate Distance" +msgstr "Beregn distance" + +#: glade/pytrainer.glade:5348 +msgid "Calculate Time" +msgstr "Beregn tid" + +#: glade/pytrainer.glade:5368 +msgid "Calculate Average" +msgstr "Beregn gennemsnit" + +#: glade/pytrainer.glade:5409 pytrainer/gui/windowmain.py:382 +msgid "Calories" +msgstr "Kalorier" + +#: glade/pytrainer.glade:5615 +msgid "<b>Comments</b>" +msgstr "<b>Kommentarer</b>" + +#: glade/pytrainer.glade:5789 glade/pytrainer.glade:6083 +msgid "Profile" +msgstr "Profil" + +#: glade/pytrainer.glade:5835 +msgid "Name" +msgstr "Navn" + +#: glade/pytrainer.glade:5863 +msgid "Gender" +msgstr "Køn" + +#: glade/pytrainer.glade:5891 +msgid "Weight" +msgstr "Vægt" + +#: glade/pytrainer.glade:5919 +msgid "Height" +msgstr "Højde" + +#: glade/pytrainer.glade:6010 +msgid "Age" +msgstr "Alder" + +#: glade/pytrainer.glade:6113 +msgid "<b>Database</b>" +msgstr "<b>Database</b>" + +#: glade/pytrainer.glade:6147 +msgid "Database Type" +msgstr "Database Type" + +#: glade/pytrainer.glade:6175 +msgid "Database Host" +msgstr "Database Host" + +#: glade/pytrainer.glade:6224 +msgid "Database Pass" +msgstr "Database Password" + +#: glade/pytrainer.glade:6273 +msgid "Database User " +msgstr "Database Brugernavn " + +#: glade/pytrainer.glade:6322 +msgid "Database Name" +msgstr "Database Navn" + +#: glade/pytrainer.glade:6403 +msgid "Database" +msgstr "Database" + +#: glade/pytrainer.glade:6441 +msgid "<b>Sport list</b>" +msgstr "<b>Liste over sportsgrene</b>" + +#: glade/pytrainer.glade:6592 +msgid "llist" +msgstr "Liste" + +#: glade/pytrainer.glade:6621 +msgid "<b>Add new Sport</b>" +msgstr "<b>Tilføj ny Sportsgren</b>" + +#: glade/pytrainer.glade:6781 +msgid "new" +msgstr "ny" + +#: glade/pytrainer.glade:6816 +msgid "<b>Delete sport</b>" +msgstr "<b>Slet sportsgren</b>" + +#: glade/pytrainer.glade:6879 +msgid "" +"You are going to remove a sport. When you delete a \n" +"sport you delete the records asociated. Are you sure \n" +"that you want do it?" +msgstr "" +"Du er ved at fjerne en sportsgren. Når du sletter en\n" +"sportsgrenså sletter du de tilhørende data sæt. Er du sikker\\ " +"på at du ønsker dette ?" + +#: glade/pytrainer.glade:7016 +msgid "delete" +msgstr "Slet" + +#: glade/pytrainer.glade:7051 +msgid "<b>Edit sport</b>" +msgstr "<b>Rediger sportsgren</b>" + +#: glade/pytrainer.glade:7114 +msgid "New name" +msgstr "Nyt navn" + +#: glade/pytrainer.glade:7243 +msgid "edit" +msgstr "Rediger" + +#: glade/pytrainer.glade:7272 +msgid "Sports" +msgstr "Sportsgrene" + +#: glade/pytrainer.glade:7377 +msgid "Calendar" +msgstr "Kalender" + +#: glade/pytrainer.glade:7503 +msgid "pytrainer" +msgstr "pytrainer" + +#: glade/pytrainer.glade:7504 +msgid "(c) Fiz Vazquez <vu...@si...>" +msgstr "(c) Fiz Vazquez <vu...@si...>" + +#: glade/pytrainer.glade:7505 +msgid "The free sport trainning center" +msgstr "Det frie sports trænings center" + +#: glade/pytrainer.glade:7506 +msgid "" +"(C) Fiz Vazquez\n" +"\n" +" This program is free software; you can redistribute \n" +" it and/or modify it under the terms of the GNU \n" +" General Public License as published by the Free \n" +" Software Foundation; either version 2 of the License, \n" +" or (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be \n" +" useful, but WITHOUT ANY WARRANTY; without even the\n" +" implied warranty of MERCHANTABILITY or FITNESS FOR \n" +" A PARTICULAR PURPOSE. See the GNU General Public \n" +" License <http://www.opensource.org/gpl-license.html>\n" +" for more details.\n" +"\n" +" You can found the license on Debian systems in the file\n" +" /usr/share/common-licenses/GPL\n" +msgstr "" +"(C) Fiz Vazquez\n" +"\n" +" Dette program er fri software; Du må videredistribuere\n" +" det og/eller ændre det under betingelserne fra GNU \n" +" General Public License som den er publiceret af \"the Free \n" +" Software Foundation\"; enten version 2 af licensen, \n" +" eller (hvis du ønsker det) en hvilken som helst senere version.\n" +"\n" +" Dette program er distribueret med håbet om at det vil \n" +" være brugbart, men UDEN NOGEN GARANTI; uden selv den \n" +" implicitte garanti for SALGBARHED eller EGNETHED tIL\n " +"ET GIVET SPECIFIKT FORMÅL. Se GNU General Public \n" +" License <http://www.opensource.org/gpl-license.html>\n" +" for yderligere detaljer.\n" +"\n" +" Du kan finde licensen på Debian systemer i filen\n" +" /usr/share/common-licenses/GPL\n" + +#: glade/pytrainer.glade:7526 +msgid "pytrainer.e-oss.net" +msgstr "pytrainer.e-oss.net" + +#: glade/pytrainer.glade:7528 +msgid "" +"Catalan: Eloi Crespillo Itchart <el...@ik...>\n" +"Czech: Lobus Pokorny <sp...@se...>\n" +"French: Dj <dj...@dj...>\n" +"Norwegian: Havard Davidsen <hav...@gm...>\n" +"Polish: Seweryn Kokot <sk...@po...>\n" +"german: Aleks <al...@sc...>\n" +"Spanish: Fiz vazquez <vu...@si...>" +msgstr "" +"Katalansk: Eloi Crespillo Itchart <el...@ik...>\n" +"Tjekkisk: Lobus Pokorny <sp...@se...>\n" +"Fransk: Dj <dj...@dj...>\n" +"Norsk: Havard Davidsen <hav...@gm...>\n" +"Polsk: Seweryn Kokot <sk...@po...>\n" +"Tysk: Aleks <al...@sc...>\n" +"Spansk: Fiz vazquez <vu...@si...> " +"Dansk<ikke opgivet>" + +#: glade/pytrainer.glade:7619 +msgid "Edit Record" +msgstr "Rediger data sæt" + +#: glade/pytrainer.glade:7640 +msgid "Show graph in classic view" +msgstr "Vis graf i klassisk billede" + +#: glade/pytrainer.glade:7676 +msgid "warning" +msgstr "Advarsel" + +#: glade/pytrainer.glade:7802 +msgid "window2" +msgstr "Vindue2" + +#: glade/pytrainer.glade:7878 glade/pytrainer.glade:8228 +msgid "<b>Name:</b>" +msgstr "<b>Navn:</b>" + +#: glade/pytrainer.glade:7906 glade/pytrainer.glade:8256 +msgid "<b>Description:</b>" +msgstr "<b>Beskrivelse:</b>" + +#: glade/pytrainer.glade:7934 glade/pytrainer.glade:8284 +msgid "<b>Status:</b>" +msgstr "<b>Status:</b>" + +#: glade/pytrainer.glade:7962 +msgid "name-entry" +msgstr "Navne-indtastning" + +#: glade/pytrainer.glade:7990 glade/pytrainer.glade:8340 +msgid "description-entry" +msgstr "Beskrivelses indtastning" + +#: glade/pytrainer.glade:8018 glade/pytrainer.glade:8368 +msgid "status-entry" +msgstr "status-indtastning" + +#: glade/pytrainer.glade:8153 +msgid "Plugins" +msgstr "Plugins" + +#: glade/pytrainer.glade:8312 +msgid "nameEntry" +msgstr "navneIndtastning" + +#: glade/pytrainer.glade:8511 +msgid "Select track record" +msgstr "Vælg track data sæt" + +#: pytrainer/main.py:90 +msgid "No Active Plugins" +msgstr "Ingen aktive plugins" + +#: pytrainer/main.py:99 +msgid "No Active Extensions" +msgstr "Ingen aktive udvidelser" + +#: pytrainer/main.py:208 +msgid "You are going to remove one database entry. Are you sure yo want do it?" +msgstr "Du er ved at fjerne en database post. Er du sikker på at du vil gøre det ?" + +#: pytrainer/main.py:219 +msgid "You are going to remove one waypoint. Are you sure yo want do it?" +msgstr "Du er ved at fjerne et waypoint. Er du sikker på at du vil gøre det?" + +#: pytrainer/lib/date.py:72 +msgid "January" +msgstr "Januar" + +#: pytrainer/lib/date.py:73 +msgid "Febrary" +msgstr "Februar" + +#: pytrainer/lib/date.py:74 +msgid "March" +msgstr "Marts" + +#: pytrainer/lib/date.py:75 +msgid "April" +msgstr "April" + +#: pytrainer/lib/date.py:76 +msgid "May" +msgstr "Maj" + +#: pytrainer/lib/date.py:77 +msgid "June" +msgstr "Juni" + +#: pytrainer/lib/date.py:78 +msgid "July" +msgstr "Juli" + +#: pytrainer/lib/date.py:79 +msgid "August" +msgstr "August" + +#: pytrainer/lib/date.py:80 +msgid "September" +msgstr "September" + +#: pytrainer/lib/date.py:81 +msgid "October" +msgstr "Oktober" + +#: pytrainer/lib/date.py:82 +msgid "November" +msgstr "November" + +#: pytrainer/lib/date.py:83 +msgid "December" +msgstr "December" + +#: pytrainer/yeargraph.py:37 pytrainer/yeargraph.py:39 +#: pytrainer/yeargraph.py:41 pytrainer/yeargraph.py:43 +#: pytrainer/yeargraph.py:45 +msgid "month" +msgstr "måned" + +#: pytrainer/yeargraph.py:37 pytrainer/monthgraph.py:37 +msgid "kilometers" +msgstr "kilometer" + +#: pytrainer/yeargraph.py:37 +msgid "monthly kilometers" +msgstr "kilometer pr. måned" + +#: pytrainer/yeargraph.py:39 pytrainer/monthgraph.py:39 +msgid "time in hours" +msgstr "Tid i timer" + +#: pytrainer/yeargraph.py:39 +msgid "monthly time" +msgstr "Timer pr. måned" + +#: pytrainer/yeargraph.py:41 pytrainer/monthgraph.py:41 +msgid "beats per minute" +msgstr "Slag pr. minut" + +#: pytrainer/yeargraph.py:41 +msgid "monthly beats" +msgstr "Slag pr. måned" + +#: pytrainer/yeargraph.py:43 pytrainer/monthgraph.py:43 +msgid "average (hm/h)" +msgstr "gennemsnit (?/t)" + +#: pytrainer/yeargraph.py:43 +msgid "monthly averages" +msgstr "Månedlige gennemsnit" + +#: pytrainer/yeargraph.py:45 pytrainer/monthgraph.py:45 +msgid "calories" +msgstr "kalorier" + +#: pytrainer/yeargraph.py:45 +msgid "monthly calories" +msgstr "Kalorier pr. måned" + +#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 +#: pytrainer/gui/windowmain.py:56 +msgid "id" +msgstr "id" + +#: pytrainer/gui/windowmain.py:49 +msgid "Kilometer" +msgstr "Kilometer" + +#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:377 +msgid "Distance" +msgstr "Distance" + +#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:380 +msgid "Beats" +msgstr "Slag" + +#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:381 +msgid "Average" +msgstr "Gennemsnit" + +#: pytrainer/gui/windowmain.py:56 +msgid "Waypoint" +msgstr "Waypoint" + +#: pytrainer/gui/windowplugins.py:72 pytrainer/gui/windowextensions.py:70 +msgid "Active" +msgstr "Aktiv" + +#: pytrainer/gui/windowplugins.py:74 pytrainer/gui/windowextensions.py:72 +msgid "unActive" +msgstr "ikke-aktiv" + +#: pytrainer/gui/windowplugins.py:83 pytrainer/gui/windowextensions.py:81 +#, python-format +msgid "%s settings" +msgstr "%s settings" + +#: pytrainer/gui/windowplugins.py:106 pytrainer/gui/windowextensions.py:104 +#: pytrainer/gui/windowextensions.py:117 +msgid "Ok" +msgstr "Ok" + +#: pytrainer/gui/dialogselecttrack.py:36 +msgid "Track Name" +msgstr "Track Navn" + +#: pytrainer/daygraph.py:48 pytrainer/daygraph.py:50 +#: pytrainer/recordgraph.py:48 pytrainer/recordgraph.py:50 +msgid "Distance (km)" +msgstr "Distance (km)" + +#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 +msgid "Height (m)" +msgstr "Højde (m)" + +#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 +msgid "Stage Profile" +msgstr "Træningspas fart profil" + +#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 +msgid "Velocity (Km/h)" +msgstr "Hastighed (Km/t)" + +#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 +msgid "velocity" +msgstr "hastighed" + +#: pytrainer/monthgraph.py:37 pytrainer/monthgraph.py:39 +#: pytrainer/monthgraph.py:41 pytrainer/monthgraph.py:43 +#: pytrainer/monthgraph.py:45 +msgid "day" +msgstr "dag" + +#: pytrainer/monthgraph.py:37 +msgid "daily kilometers" +msgstr "kilometer pr. dag" + +#: pytrainer/monthgraph.py:39 +msgid "daily time" +msgstr "tid pr. dag" + +#: pytrainer/monthgraph.py:41 +msgid "daily beats" +msgstr "slag pr. dag" + +#: pytrainer/monthgraph.py:43 +msgid "daily averages" +msgstr "daglige gennemsnit" + +#: pytrainer/monthgraph.py:45 +msgid "daily calories" +msgstr "kalorier pr. dag" + +#: pytrainer/record.py:190 +msgid "" +"The gpx file seems to have several track records. Press cancel to select a " +"track record. Press Ok to load all of them as a single track record." +msgstr "gpx filen ser ud til at indeholde flere track data sæt. Tryk fortryd for at vælge et track datasæt; Tryk Ok for at hente dem alle som et enkelt track datasæt." + +#: pytrainer/waypoint.py:67 +msgid "" +"The gpx file seems to be a several days records. Perhaps you will need to " +"edit your gpx file" +msgstr "gpx filen ser ud til at indeholde data sæt for flere dage. Måske bliver du nødt til at redigere din gpx fil." + Deleted: pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.po =================================================================== --- pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.po 2011-05-01 01:43:48 UTC (rev 782) +++ pytrainer/trunk/locale/da/LC_MESSAGES/pytrainer_dk.po 2011-05-02 08:42:10 UTC (rev 783) @@ -1,806 +0,0 @@ -# translation of pytrainer_dk.po to Dansk -# Danish translations for pytrainer package. -# Copyright (C) 2007 THE pytrainer'S COPYRIGHT HOLDER -# This file is distributed under the same license as the pytrainer package. -# -# Lars Olesen <ole...@gm...>, 2007. -msgid "" -msgstr "" -"Project-Id-Version: pytrainer_dk\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-09 23:06+0100\n" -"PO-Revision-Date: 2007-12-20 21:02+0100\n" -"Last-Translator: Lars Olesen <ole...@gm...>\n" -"Language-Team: Dansk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: KBabel 1.11.4\n" - -#: glade/pytrainer.glade:10 -msgid "window1" -msgstr "Vindue1" - -#: glade/pytrainer.glade:50 -msgid "_File" -msgstr "Fil" - -#: glade/pytrainer.glade:74 -msgid "_Export as text separated by commas" -msgstr "Eksporteret som tekst adskilt af kommaer" - -#: glade/pytrainer.glade:114 -msgid "_Edit" -msgstr "Rediger" - -#: glade/pytrainer.glade:136 -msgid "_View" -msgstr "Billede" - -#: glade/pytrainer.glade:145 -msgid " _Classic View" -msgstr "Klassisk billede" - -#: glade/pytrainer.glade:156 -msgid " _List View" -msgstr "Liste billede" - -#: glade/pytrainer.glade:168 -msgid " _Waypoints Editor View" -msgstr "Waypoint redigerings billede" - -#: glade/pytrainer.glade:184 -msgid "Tools" -msgstr "Værktøjer" - -#: glade/pytrainer.glade:194 -msgid "Extensions" -msgstr "Udvidelser" - -#: glade/pytrainer.glade:204 -msgid "Gps Device Plugins" -msgstr "GPS udstyrs plugins" - -#: glade/pytrainer.glade:218 -msgid "_Help" -msgstr "Hjælp" - -#: glade/pytrainer.glade:338 glade/pytrainer.glade:4810 -#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:378 -msgid "Sport" -msgstr "Sport" - -#: glade/pytrainer.glade:364 -msgid "All Sports" -msgstr "Alle sportsgrene" - -#: glade/pytrainer.glade:472 glade/pytrainer.glade:1658 -#: glade/pytrainer.glade:2414 glade/pytrainer.glade:3125 -msgid "<b>Beats avg:</b>" -msgstr "Hjerteslag" - -#: glade/pytrainer.glade:522 -msgid " bpm" -msgstr "puls" - -#: glade/pytrainer.glade:550 glade/pytrainer.glade:1630 -#: glade/pytrainer.glade:2386 glade/pytrainer.glade:3097 -msgid "<b>Time:</b>" -msgstr "Tid" - -#: glade/pytrainer.glade:578 glade/pytrainer.glade:1602 -#: glade/pytrainer.glade:2358 glade/pytrainer.glade:3069 -msgid "<b>Distance:</b>" -msgstr "Distance" - -#: glade/pytrainer.glade:632 glade/pytrainer.glade:677 -#: glade/pytrainer.glade:1903 glade/pytrainer.glade:1948 -#: glade/pytrainer.glade:2659 glade/pytrainer.glade:2704 -#: glade/pytrainer.glade:3370 glade/pytrainer.glade:3415 -#: glade/pytrainer.glade:5178 glade/pytrainer.glade:5223 -msgid ":" -msgstr ":" - -#: glade/pytrainer.glade:782 -msgid " Km" -msgstr "km" - -#: glade/pytrainer.glade:810 glade/pytrainer.glade:1714 -#: glade/pytrainer.glade:2470 glade/pytrainer.glade:3181 -msgid "<b>Calories: </b>" -msgstr "Kalorier" - -#: glade/pytrainer.glade:860 -msgid " Cal" -msgstr "Kal" - -#: glade/pytrainer.glade:888 glade/pytrainer.glade:1686 -#: glade/pytrainer.glade:2442 glade/pytrainer.glade:3153 -msgid "<b>Average:</b>" -msgstr "Gennemsnit" - -#: glade/pytrainer.glade:938 -msgid " km/h" -msgstr "km/t" - -#: glade/pytrainer.glade:1005 -msgid "<b>Comments:</b>" -msgstr "Kommentarer" - -#: glade/pytrainer.glade:1059 glade/pytrainer.glade:5484 -msgid "<b>Positive:</b>" -msgstr "Positive" - -#: glade/pytrainer.glade:1103 glade/pytrainer.glade:5528 -msgid "<b>Negative:</b>" -msgstr "Negative" - -#: glade/pytrainer.glade:1151 glade/pytrainer.glade:5576 -msgid " <b>Accumulated Unevenness:</b> " -msgstr "Akkumuleret højdeforskel" - -#: glade/pytrainer.glade:1297 -msgid " <b>Title:</b>" -msgstr "Titel" - -#: glade/pytrainer.glade:1386 glade/pytrainer.glade:2185 -#: glade/pytrainer.glade:2941 glade/pytrainer.glade:3652 -msgid "Value" -msgstr "Værdi" - -#: glade/pytrainer.glade:1411 glade/pytrainer.glade:2210 -msgid "" -"Stage Profile\n" -"Stage Velocity\n" -"Stage Profile/velocity" -msgstr "" -"Træningspas Højdekurve\n" -"Træningspas Hastighed\n" -"Træningpas Højdekurve / Hastighed" - -#: glade/pytrainer.glade:1543 -msgid "Record" -msgstr "Data sæt" - -#: glade/pytrainer.glade:1742 glade/pytrainer.glade:2498 -#: glade/pytrainer.glade:3209 -msgid "Km" -msgstr "Km" - -#: glade/pytrainer.glade:1770 glade/pytrainer.glade:2526 -#: glade/pytrainer.glade:3237 -msgid "bpm" -msgstr "puls" - -#: glade/pytrainer.glade:1798 glade/pytrainer.glade:2554 -#: glade/pytrainer.glade:3265 -msgid "km/h" -msgstr "km/t" - -#: glade/pytrainer.glade:1826 glade/pytrainer.glade:2582 -#: glade/pytrainer.glade:3293 -msgid "Cal" -msgstr "Kal" - -#: glade/pytrainer.glade:2110 -msgid " <b>Date:</b>" -msgstr "Dato" - -#: glade/pytrainer.glade:2299 -msgid "Day" -msgstr "Dag" - -#: glade/pytrainer.glade:2759 glade/pytrainer.glade:4751 -msgid " " -msgstr " " - -#: glade/pytrainer.glade:2866 -msgid " <b>Month:</b>" -msgstr "Måned" - -#: glade/pytrainer.glade:2966 glade/pytrainer.glade:3677 -msgid "" -"Kilometers\n" -"Time\n" -"Beats\n" -"Average\n" -"Calories" -msgstr "" -"Kilometern " -"Tid\n" -"Hjerteslag\n" -"Gennemsnit\n" -"Kalorier" - -#: glade/pytrainer.glade:3010 -msgid "Month" -msgstr "Måned" - -#: glade/pytrainer.glade:3354 -msgid "999" -msgstr "999" - -#: glade/pytrainer.glade:3577 -msgid " <b>Year:</b>" -msgstr "<b>År</b>" - -#: glade/pytrainer.glade:3721 -msgid "Year" -msgstr "År" - -#: glade/pytrainer.glade:3764 -msgid "label154" -msgstr "mærkat154" - -#: glade/pytrainer.glade:3801 -msgid "<b>Title:</b>" -msgstr "<b>Titel:</b>" - -#: glade/pytrainer.glade:3846 -msgid "Search" -msgstr "Søg" - -#: glade/pytrainer.glade:3893 -msgid "Columns" -msgstr "Kolonner" - -#: glade/pytrainer.glade:3968 -msgid "label155" -msgstr "mærkat155" - -#: glade/pytrainer.glade:4145 -msgid " <b>Name:</b>" -msgstr " <b>Navn:</b>" - -#: glade/pytrainer.glade:4173 -msgid " <b>Description:</b>" -msgstr " <b>Beskrivelse</b>" - -#: glade/pytrainer.glade:4201 -msgid " <b>Latitude: </b>" -msgstr " <b>Breddegrad:</b>" - -#: glade/pytrainer.glade:4229 -msgid " <b>Longitude:</b>" -msgstr " <b>Længdegrad:</b>" - -#: glade/pytrainer.glade:4257 -msgid " <b>Type:</b>" -msgstr " <b>Type:</b>" - -#: glade/pytrainer.glade:4329 -msgid "" -"Font\n" -"Restaurant\n" -"Scenic Area\n" -"Summit" -msgstr "" -"Font\n" -"Restaurant\n" -"Naturskønt område\n" -"Møde" - -#: glade/pytrainer.glade:4354 -msgid "<b> Waypoint: </b>" -msgstr "<b> Waypoint: </b>" - -#: glade/pytrainer.glade:4439 -msgid "label-2147483648" -msgstr "mærkat-2147483648" - -#: glade/pytrainer.glade:4487 -msgid "label162" -msgstr "mærkat162" - -#: glade/pytrainer.glade:4627 -msgid "label163" -msgstr "mærkat163" - -#: glade/pytrainer.glade:4652 glade/pytrainer.glade:5684 -msgid "New Entry" -msgstr "Nyt data sæt" - -#: glade/pytrainer.glade:4700 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:376 pytrainer/gui/dialogselecttrack.py:36 -msgid "Date" -msgstr "Dato" - -#: glade/pytrainer.glade:4865 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:375 -msgid "Title" -msgstr "Titel" - -#: glade/pytrainer.glade:4923 -msgid "GPX file" -msgstr "GPX fil" - -#: glade/pytrainer.glade:4985 -msgid "Calculate Values" -msgstr "Beregn værdier" - -#: glade/pytrainer.glade:5018 -msgid "Beats avg (bpm)" -msgstr "Gennemsnitlig puls " - -#: glade/pytrainer.glade:5074 -msgid "Distance (Km)" -msgstr "Afstand (km)" - -#: glade/pytrainer.glade:5124 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:379 -msgid "Time" -msgstr "Tid" - -#: glade/pytrainer.glade:5278 -msgid "Average (km/h)" -msgstr "Gennemsnit (km/t)" - -#: glade/pytrainer.glade:5328 -msgid "Calculate Distance" -msgstr "Beregn distance" - -#: glade/pytrainer.glade:5348 -msgid "Calculate Time" -msgstr "Beregn tid" - -#: glade/pytrainer.glade:5368 -msgid "Calculate Average" -msgstr "Beregn gennemsnit" - -#: glade/pytrainer.glade:5409 pytrainer/gui/windowmain.py:382 -msgid "Calories" -msgstr "Kalorier" - -#: glade/pytrainer.glade:5615 -msgid "<b>Comments</b>" -msgstr "<b>Kommentarer</b>" - -#: glade/pytrainer.glade:5789 glade/pytrainer.glade:6083 -msgid "Profile" -msgstr "Profil" - -#: glade/pytrainer.glade:5835 -msgid "Name" -msgstr "Navn" - -#: glade/pytrainer.glade:5863 -msgid "Gender" -msgstr "Køn" - -#: glade/pytrainer.glade:5891 -msgid "Weight" -msgstr "Vægt" - -#: glade/pytrainer.glade:5919 -msgid "Height" -msgstr "Højde" - -#: glade/pytrainer.glade:6010 -msgid "Age" -msgstr "Alder" - -#: glade/pytrainer.glade:6113 -msgid "<b>Database</b>" -msgstr "<b>Database</b>" - -#: glade/pytrainer.glade:6147 -msgid "Database Type" -msgstr "Database Type" - -#: glade/pytrainer.glade:6175 -msgid "Database Host" -msgstr "Database Host" - -#: glade/pytrainer.glade:6224 -msgid "Database Pass" -msgstr "Database Password" - -#: glade/pytrainer.glade:6273 -msgid "Database User " -msgstr "Database Brugernavn " - -#: glade/pytrainer.glade:6322 -msgid "Database Name" -msgstr "Database Navn" - -#: glade/pytrainer.glade:6403 -msgid "Database" -msgstr "Database" - -#: glade/pytrainer.glade:6441 -msgid "<b>Sport list</b>" -msgstr "<b>Liste over sportsgrene</b>" - -#: glade/pytrainer.glade:6592 -msgid "llist" -msgstr "Liste" - -#: glade/pytrainer.glade:6621 -msgid "<b>Add new Sport</b>" -msgstr "<b>Tilføj ny Sportsgren</b>" - -#: glade/pytrainer.glade:6781 -msgid "new" -msgstr "ny" - -#: glade/pytrainer.glade:6816 -msgid "<b>Delete sport</b>" -msgstr "<b>Slet sportsgren</b>" - -#: glade/pytrainer.glade:6879 -msgid "" -"You are going to remove a sport. When you delete a \n" -"sport you delete the records asociated. Are you sure \n" -"that you want do it?" -msgstr "" -"Du er ved at fjerne en sportsgren. Når du sletter en\n" -"sportsgrenså sletter du de tilhørende data sæt. Er du sikker\\ " -"på at du ønsker dette ?" - -#: glade/pytrainer.glade:7016 -msgid "delete" -msgstr "Slet" - -#: glade/pytrainer.glade:7051 -msgid "<b>Edit sport</b>" -msgstr "<b>Rediger sportsgren</b>" - -#: glade/pytrainer.glade:7114 -msgid "New name" -msgstr "Nyt navn" - -#: glade/pytrainer.glade:7243 -msgid "edit" -msgstr "Rediger" - -#: glade/pytrainer.glade:7272 -msgid "Sports" -msgstr "Sportsgrene" - -#: glade/pytrainer.glade:7377 -msgid "Calendar" -msgstr "Kalender" - -#: glade/pytrainer.glade:7503 -msgid "pytrainer" -msgstr "pytrainer" - -#: glade/pytrainer.glade:7504 -msgid "(c) Fiz Vazquez <vu...@si...>" -msgstr "(c) Fiz Vazquez <vu...@si...>" - -#: glade/pytrainer.glade:7505 -msgid "The free sport trainning center" -msgstr "Det frie sports trænings center" - -#: glade/pytrainer.glade:7506 -msgid "" -"(C) Fiz Vazquez\n" -"\n" -" This program is free software; you can redistribute \n" -" it and/or modify it under the terms of the GNU \n" -" General Public License as published by the Free \n" -" Software Foundation; either version 2 of the License, \n" -" or (at your option) any later version.\n" -"\n" -" This program is distributed in the hope that it will be \n" -" useful, but WITHOUT ANY WARRANTY; without even the\n" -" implied warranty of MERCHANTABILITY or FITNESS FOR \n" -" A PARTICULAR PURPOSE. See the GNU General Public \n" -" License <http://www.opensource.org/gpl-license.html>\n" -" for more details.\n" -"\n" -" You can found the license on Debian systems in the file\n" -" /usr/share/common-licenses/GPL\n" -msgstr "" -"(C) Fiz Vazquez\n" -"\n" -" Dette program er fri software; Du må videredistribuere\n" -" det og/eller ændre det under betingelserne fra GNU \n" -" General Public License som den er publiceret af \"the Free \n" -" Software Foundation\"; enten version 2 af licensen, \n" -" eller (hvis du ønsker det) en hvilken som helst senere version.\n" -"\n" -" Dette program er distribueret med håbet om at det vil \n" -" være brugbart, men UDEN NOGEN GARANTI; uden selv den \n" -" implicitte garanti for SALGBARHED eller EGNETHED tIL\n " -"ET GIVET SPECIFIKT FORMÅL. Se GNU General Public \n" -" License <http://www.opensource.org/gpl-license.html>\n" -" for yderligere detaljer.\n" -"\n" -" Du kan finde licensen på Debian systemer i filen\n" -" /usr/share/common-licenses/GPL\n" - -#: glade/pytrainer.glade:7526 -msgid "pytrainer.e-oss.net" -msgstr "pytrainer.e-oss.net" - -#: glade/pytrainer.glade:7528 -msgid "" -"Catalan: Eloi Crespillo Itchart <el...@ik...>\n" -"Czech: Lobus Pokorny <sp...@se...>\n" -"French: Dj <dj...@dj...>\n" -"Norwegian: Havard Davidsen <hav...@gm...>\n" -"Polish: Seweryn Kokot <sk...@po...>\n" -"german: Aleks <al...@sc...>\n" -"Spanish: Fiz vazquez <vu...@si...>" -msgstr "" -"Katalansk: Eloi Crespillo Itchart <el...@ik...>\n" -"Tjekkisk: Lobus Pokorny <sp...@se...>\n" -"Fransk: Dj <dj...@dj...>\n" -"Norsk: Havard Davidsen <hav...@gm...>\n" -"Polsk: Seweryn Kokot <sk...@po...>\n" -"Tysk: Aleks <al...@sc...>\n" -"Spansk: Fiz vazquez <vu...@si...> " -"Dansk<ikke opgivet>" - -#: glade/pytrainer.glade:7619 -msgid "Edit Record" -msgstr "Rediger data sæt" - -#: glade/pytrainer.glade:7640 -msgid "Show graph in classic view" -msgstr "Vis graf i klassisk billede" - -#: glade/pytrainer.glade:7676 -msgid "warning" -msgstr "Advarsel" - -#: glade/pytrainer.glade:7802 -msgid "window2" -msgstr "Vindue2" - -#: glade/pytrainer.glade:7878 glade/pytrainer.glade:8228 -msgid "<b>Name:</b>" -msgstr "<b>Navn:</b>" - -#: glade/pytrainer.glade:7906 glade/pytrainer.glade:8256 -msgid "<b>Description:</b>" -msgstr "<b>Beskrivelse:</b>" - -#: glade/pytrainer.glade:7934 glade/pytrainer.glade:8284 -msgid "<b>Status:</b>" -msgstr "<b>Status:</b>" - -#: glade/pytrainer.glade:7962 -msgid "name-entry" -msgstr "Navne-indtastning" - -#: glade/pytrainer.glade:7990 glade/pytrainer.glade:8340 -msgid "description-entry" -msgstr "Beskrivelses indtastning" - -#: glade/pytrainer.glade:8018 glade/pytrainer.glade:8368 -msgid "status-entry" -msgstr "status-indtastning" - -#: glade/pytrainer.glade:8153 -msgid "Plugins" -msgstr "Plugins" - -#: glade/pytrainer.glade:8312 -msgid "nameEntry" -msgstr "navneIndtastning" - -#: glade/pytrainer.glade:8511 -msgid "Select track record" -msgstr "Vælg track data sæt" - -#: pytrainer/main.py:90 -msgid "No Active Plugins" -msgstr "Ingen aktive plugins" - -#: pytrainer/main.py:99 -msgid "No Active Extensions" -msgstr "Ingen aktive udvidelser" - -#: pytrainer/main.py:208 -msgid "You are going to remove one database entry. Are you sure yo want do it?" -msgstr "Du er ved at fjerne en database post. Er du sikker på at du vil gøre det ?" - -#: pytrainer/main.py:219 -msgid "You are going to remove one waypoint. Are you sure yo want do it?" -msgstr "Du er ved at fjerne et waypoint. Er du sikker på at du vil gøre det?" - -#: pytrainer/lib/date.py:72 -msgid "January" -msgstr "Januar" - -#: pytrainer/lib/date.py:73 -msgid "Febrary" -msgstr "Februar" - -#: pytrainer/lib/date.py:74 -msgid "March" -msgstr "Marts" - -#: pytrainer/lib/date.py:75 -msgid "April" -msgstr "April" - -#: pytrainer/lib/date.py:76 -msgid "May" -msgstr "Maj" - -#: pytrainer/lib/date.py:77 -msgid "June" -msgstr "Juni" - -#: pytrainer/lib/date.py:78 -msgid "July" -msgstr "Juli" - -#: pytrainer/lib/date.py:79 -msgid "August" -msgstr "August" - -#: pytrainer/lib/date.py:80 -msgid "September" -msgstr "September" - -#: pytrainer/lib/date.py:81 -msgid "October" -msgstr "Oktober" - -#: pytrainer/lib/date.py:82 -msgid "November" -msgstr "November" - -#: pytrainer/lib/date.py:83 -msgid "December" -msgstr "December" - -#: pytrainer/yeargraph.py:37 pytrainer/yeargraph.py:39 -#: pytrainer/yeargraph.py:41 pytrainer/yeargraph.py:43 -#: pytrainer/yeargraph.py:45 -msgid "month" -msgstr "måned" - -#: pytrainer/yeargraph.py:37 pytrainer/monthgraph.py:37 -msgid "kilometers" -msgstr "kilometer" - -#: pytrainer/yeargraph.py:37 -msgid "monthly kilometers" -msgstr "kilometer pr. måned" - -#: pytrainer/yeargraph.py:39 pytrainer/monthgraph.py:39 -msgid "time in hours" -msgstr "Tid i timer" - -#: pytrainer/yeargraph.py:39 -msgid "monthly time" -msgstr "Timer pr. måned" - -#: pytrainer/yeargraph.py:41 pytrainer/monthgraph.py:41 -msgid "beats per minute" -msgstr "Slag pr. minut" - -#: pytrainer/yeargraph.py:41 -msgid "monthly beats" -msgstr "Slag pr. måned" - -#: pytrainer/yeargraph.py:43 pytrainer/monthgraph.py:43 -msgid "average (hm/h)" -msgstr "gennemsnit (?/t)" - -#: pytrainer/yeargraph.py:43 -msgid "monthly averages" -msgstr "Månedlige gennemsnit" - -#: pytrainer/yeargraph.py:45 pytrainer/monthgraph.py:45 -msgid "calories" -msgstr "kalorier" - -#: pytrainer/yeargraph.py:45 -msgid "monthly calories" -msgstr "Kalorier pr. måned" - -#: pytrainer/gui/windowmain.py:49 pytrainer/gui/windowmain.py:52 -#: pytrainer/gui/windowmain.py:56 -msgid "id" -msgstr "id" - -#: pytrainer/gui/windowmain.py:49 -msgid "Kilometer" -msgstr "Kilometer" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:377 -msgid "Distance" -msgstr "Distance" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:380 -msgid "Beats" -msgstr "Slag" - -#: pytrainer/gui/windowmain.py:52 pytrainer/gui/windowmain.py:381 -msgid "Average" -msgstr "Gennemsnit" - -#: pytrainer/gui/windowmain.py:56 -msgid "Waypoint" -msgstr "Waypoint" - -#: pytrainer/gui/windowplugins.py:72 pytrainer/gui/windowextensions.py:70 -msgid "Active" -msgstr "Aktiv" - -#: pytrainer/gui/windowplugins.py:74 pytrainer/gui/windowextensions.py:72 -msgid "unActive" -msgstr "ikke-aktiv" - -#: pytrainer/gui/windowplugins.py:83 pytrainer/gui/windowextensions.py:81 -#, python-format -msgid "%s settings" -msgstr "%s settings" - -#: pytrainer/gui/windowplugins.py:106 pytrainer/gui/windowextensions.py:104 -#: pytrainer/gui/windowextensions.py:117 -msgid "Ok" -msgstr "Ok" - -#: pytrainer/gui/dialogselecttrack.py:36 -msgid "Track Name" -msgstr "Track Navn" - -#: pytrainer/daygraph.py:48 pytrainer/daygraph.py:50 -#: pytrainer/recordgraph.py:48 pytrainer/recordgraph.py:50 -msgid "Distance (km)" -msgstr "Distance (km)" - -#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 -msgid "Height (m)" -msgstr "Højde (m)" - -#: pytrainer/daygraph.py:48 pytrainer/recordgraph.py:48 -msgid "Stage Profile" -msgstr "Træningspas fart profil" - -#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 -msgid "Velocity (Km/h)" -msgstr "Hastighed (Km/t)" - -#: pytrainer/daygraph.py:50 pytrainer/recordgraph.py:50 -msgid "velocity" -msgstr "hastighed" - -#: pytrainer/monthgraph.py:37 pytrainer/monthgraph.py:39 -#: pytrainer/monthgraph.py:41 pytrainer/monthgraph.py:43 -#: pytrainer/monthgraph.py:45 -msgid "day" -msgstr "dag" - -#: pytrainer/monthgraph.py:37 -msgid "daily kilometers" -msgstr "kilometer pr. dag" - -#: pytrainer/monthgraph.py:39 -msgid "daily time" -msgstr "tid pr. dag" - -#: pytrainer/monthgraph.py:41 -msgid "daily beats" -msgstr "slag pr. dag" - -#: pytrainer/monthgraph.py:43 -msgid "daily averages" -msgstr "daglige gennemsnit" - -#: pytrainer/monthgraph.py:45 -msgid "daily calories" -msgstr "kalorier pr. dag" - -#: pytrainer/record.py:190 -msgid "" -"The gpx file seems to have several track records. Press cancel to select a " -"track record. Press Ok to load all of them as a single track record." -msgstr "gpx filen ser ud til at indeholde flere track data sæt. Tryk fortryd for at vælge et track datasæt; Tryk Ok for at hente dem alle som et enkelt track datasæt." - -#: pytrainer/waypoint.py:67 -msgid "" -"The gpx file seems to be a several days records. Perhaps you will need to " -"edit your gpx file" -msgstr "gpx filen ser ud til at indeholde data sæt for flere dage. Måske bliver du nødt til at redigere din gpx fil." - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-05-01 01:43:55
|
Revision: 782 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=782&view=rev Author: siggipals Date: 2011-05-01 01:43:48 +0000 (Sun, 01 May 2011) Log Message: ----------- #116 - Added new page to record view, containing projected times and ranking of activity compared to similar-distance same-sport activities, based on average speed/pace. Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Added Paths: ----------- pytrainer/trunk/glade/glasses.png Added: pytrainer/trunk/glade/glasses.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/glasses.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2011-04-28 10:33:43 UTC (rev 781) +++ pytrainer/trunk/glade/pytrainer.glade 2011-05-01 01:43:48 UTC (rev 782) @@ -2742,6 +2742,313 @@ <property name="type">tab</property> </packing> </child> + <child> + <widget class="GtkFrame" id="frame_analytics"> + <property name="visible">True</property> + <property name="border_width">6</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <widget class="GtkVBox" id="analytics_vbox_"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="analytics_hbox_"> + <property name="visible">True</property> + <child> + <widget class="GtkFrame" id="frame_projected"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <child> + <widget class="GtkAlignment" id="alignment_analytics"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <property name="can_focus">False</property> + <child> + <widget class="GtkTreeView" id="analyticsTreeView"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers-clickable">False</property> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="labelprojected"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Projected times</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + <property name="padding">10</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkFrame" id="frame_ranking"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <child> + <widget class="GtkAlignment" id="alignment_ranking"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <widget class="GtkVBox" id="vbox_ranking"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label11125"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><i>Rank relative to same-sport activities for distances ± x%:</i></property> + <property name="use_markup">True</property> + </widget> + </child> + <child> + <widget class="GtkHScale" id="slider_ranking"> + <property name="visible">True</property> + <property name="sensitive">True</property> + <property name="adjustment">5 0 20 1 0 0</property> + <signal name="value-changed" handler="on_change_rank_percentage"/> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkTable" id="table_ranking"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">5</property> + <property name="n_columns">2</property> + <property name="column_spacing">3</property> + <property name="row_spacing">5</property> + <child> + <widget class="GtkLabel" id="label11125"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Range:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">0</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11125"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Rank:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label11127"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Speed: </b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="wssdadadsada"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Avg speed:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label-2"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Standard deviation:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label-3"> + <property name="width_request">90</property> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Deviation:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="top_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_range"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_rank"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_speed"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_avg"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_stddev"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label_ranking_dev"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label"></property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label_ranking"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Ranking</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + <property name="position">3</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label14anal"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Analytics:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="position">4</property> + </packing> + </child> + <child> + <widget class="GtkImage" id="image28pre"> + <property name="visible">True</property> + <property name="pixbuf">glasses.png</property> + </widget> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + <property name="type">tab</property> + </packing> + </child> </widget> </child> <child> Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-04-28 10:33:43 UTC (rev 781) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-05-01 01:43:48 UTC (rev 782) @@ -161,6 +161,15 @@ ] self.create_treeview(self.lapsTreeView,columns) + #create the columns for the projected times treeview + columns=[ + {'name':_("id"), 'visible':False}, + {'name':_("Race"), 'xalign':1.0}, + {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, + {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, + ] + self.create_treeview(self.analyticsTreeView,columns,sortable=False) + self.fileconf = self.pytrainer_main.profile.confdir+"/listviewmenu.xml" if not os.path.isfile(self.fileconf): self._createXmlListView(self.fileconf) @@ -290,12 +299,14 @@ def render_float(self, column, cell, model, iter, data): _format, _quantity = data - _val = model.get_value(iter, column.get_sort_column_id()) + col = column.get_sort_column_id() + if col == -1: col = 0 + _val = model.get_value(iter, col) _val = self.uc.sys2usr(_quantity, _val) _val_str = _format % float(_val) cell.set_property('text', _val_str) - def create_treeview(self,treeview,columns): + def create_treeview(self,treeview,columns,sortable=True): for column_index, column_dict in enumerate(columns): if 'pixbuf' in column_dict: renderer = gtk.CellRendererPixbuf() @@ -317,7 +328,8 @@ column.set_cell_data_func(renderer, self.render_float, [column_dict['format_float'], column_dict['quantity']]) if 'format_duration' in column_dict and column_dict['format_duration']: column.set_cell_data_func(renderer, self.render_duration) - column.set_sort_column_id(column_index) + if sortable: + column.set_sort_column_id(column_index) treeview.append_column(column) def actualize_recordview(self,activity): @@ -441,7 +453,7 @@ self.frame_laps.show() else: self.frame_laps.hide() - runTime += float(activity.laps[0]['elapsed_time']) + runTime = activity.time else: self.recordview.set_current_page(0) @@ -719,7 +731,74 @@ #else: # self.recordview.set_sensitive(0) logging.debug("<<") + + def actualize_analytics(self,activity): + logging.debug(">>") + record_list = activity.tracks + + def project(d,a): + return int(a.time * (d / a.distance)**1.06) + + DISTANCES = { + .8 : _("800 m"), + 1.5 : _("1500 m"), + 5 : _("5K"), + 7 : _("7K"), + 10 : _("10K"), + 21.1 : _("Half marathon"), + 42.195 : _("Marathon"), + 100 : _("100K"), + } + + projected_store = gtk.ListStore( + gobject.TYPE_STRING, #id + gobject.TYPE_STRING, #name + gobject.TYPE_STRING, #distance + gobject.TYPE_STRING, #time + ) + ds = DISTANCES.keys() + ds = sorted(ds) + for d in ds: + v = DISTANCES[d] + iter = projected_store.append() + projected_store.set ( + iter, + 0, str(d), + 1, v, + 2, str(d), + 3, str(project(d, activity)), + ) + self.analyticsTreeView.set_model(projected_store) + + self.analytics_activity = activity + self.on_change_rank_percentage() + + logging.debug("<<") + + def on_change_rank_percentage(self, widget=None): + + activity = self.analytics_activity + if widget: + percentage = widget.get_value() / 100 + else: + percentage = .05 + records = self.pytrainer_main.ddbb.select_dict("records", ["distance","time"], "distance > %f AND distance < %f AND sport=%d" % (activity.distance * (1-percentage), activity.distance * (1+percentage), activity.sport_id)) + + count = 1 + for r in records: + if r['distance']/int(r['time']) > activity.distance/activity.time: + count += 1 + + import numpy + speeds = [r['distance']/int(r['time'])*3600 for r in records] + self.label_ranking_range.set_text("%.2f - %.2f" % (activity.distance * (1-percentage), activity.distance * (1+percentage))) + self.label_ranking_rank.set_text("%s/%s" % (count, len(records))) + self.label_ranking_avg.set_text("%.4f" % numpy.average(speeds)) + self.label_ranking_speed.set_text("%.4f" % (activity.distance/activity.time*3600)) + self.label_ranking_stddev.set_text("%.4f" % numpy.std(speeds)) + self.label_ranking_dev.set_text("%+f" % ((activity.distance/activity.time*3600 - numpy.average(speeds)) / numpy.std(speeds))) + def actualize_dayview(self,record_list=None, activity_list=None): logging.debug(">>") if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": @@ -1667,6 +1746,8 @@ selected_view="map" elif page == 3: selected_view="heartrate" + elif page == 4: + selected_view="analytics" self.parent.refreshRecordGraphView(selected_view) def on_showmap_clicked(self,widget): Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-04-28 10:33:43 UTC (rev 781) +++ pytrainer/trunk/pytrainer/main.py 2011-05-01 01:43:48 UTC (rev 782) @@ -238,6 +238,8 @@ self.refreshRecordGraphView("map") elif self.windowmain.recordview.get_current_page()==3: self.refreshRecordGraphView("heartrate") + elif self.windowmain.recordview.get_current_page()==4: + self.refreshRecordGraphView("analytics") elif view=="day": logging.debug('day view') sport = self.windowmain.activeSport @@ -313,6 +315,8 @@ if view=="heartrate": self.windowmain.actualize_heartrategraph(activity) self.windowmain.actualize_hrview(activity) + if view=="analytics": + self.windowmain.actualize_analytics(activity) logging.debug('<<') def refreshMapView(self, full_screen=False): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-04-28 10:33:59
|
Revision: 781 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=781&view=rev Author: dgranda Date: 2011-04-28 10:33:43 +0000 (Thu, 28 Apr 2011) Log Message: ----------- #114 Added patch from Friso for ascend and descent figures. Includes time spent moving and paused in record view Modified Paths: -------------- pytrainer/trunk/glade/pytrainer.glade pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Modified: pytrainer/trunk/glade/pytrainer.glade =================================================================== --- pytrainer/trunk/glade/pytrainer.glade 2011-04-26 23:33:11 UTC (rev 780) +++ pytrainer/trunk/glade/pytrainer.glade 2011-04-28 10:33:43 UTC (rev 781) @@ -1,4 +1,4 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <glade-interface> <!-- interface-requires gtk+ 2.6 --> <!-- interface-naming-policy toplevel-contextual --> @@ -928,13 +928,44 @@ <placeholder/> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label42"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Run / Rest:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="record_runrest"> + <property name="visible">True</property> + <property name="xalign">1</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label50"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">h:m:s</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> </child> </widget> <packing> @@ -952,49 +983,49 @@ <property name="position">1</property> </packing> </child> - <child> - <widget class="GtkFrame" id="frame_laps"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <child> - <widget class="GtkAlignment" id="alignment12l"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <property name="right_padding">12</property> - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2l"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="height_request">300</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <widget class="GtkTreeView" id="lapsTreeView"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label14"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Laps</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">5</property> - <property name="position">2</property> - </packing> - </child> <child> + <widget class="GtkFrame" id="frame_laps"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <child> + <widget class="GtkAlignment" id="alignment12l"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <property name="right_padding">12</property> + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow2l"> + <property name="height_request">300</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTreeView" id="lapsTreeView"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Laps</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">5</property> + <property name="position">2</property> + </packing> + </child> + <child> <widget class="GtkHBox" id="recordbuttons_hbox"> <property name="visible">True</property> <child> @@ -1038,7 +1069,6 @@ </child> </widget> <packing> - <property name="expand">True</property> <property name="fill">False</property> <property name="position">3</property> </packing> @@ -1358,7 +1388,7 @@ <widget class="GtkSpinButton" id="spinbuttonY1Min"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">0 -500 1000 1 10 0</property> <signal name="value_changed" handler="on_spinbuttonY1_value_changed"/> @@ -1376,7 +1406,7 @@ <widget class="GtkSpinButton" id="spinbuttonY1Max"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">0 -500 1000 1 10 0</property> <signal name="value_changed" handler="on_spinbuttonY1_value_changed"/> @@ -1439,7 +1469,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="max_length">2</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="adjustment">1 1 10 1 1 0</property> <signal name="value_changed" handler="on_spinbuttonY1LineWeight_value_changed"/> </widget> @@ -1481,7 +1511,7 @@ <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="max_length">2</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="adjustment">1 0 10 1 1 0</property> </widget> <packing> @@ -1573,7 +1603,7 @@ <widget class="GtkSpinButton" id="spinbuttonY2Min"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">0 -500 1000 1 10 0</property> </widget> @@ -1590,7 +1620,7 @@ <widget class="GtkSpinButton" id="spinbuttonY2Max"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">1 -500 1000 1 10 0</property> </widget> @@ -1660,7 +1690,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="max_length">2</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="adjustment">1 0 10 1 1 0</property> </widget> <packing> @@ -1692,7 +1722,7 @@ <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="max_length">2</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="adjustment">1 0 10 1 1 0</property> </widget> <packing> @@ -1769,7 +1799,7 @@ <widget class="GtkSpinButton" id="spinbuttonXMin"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">0 -500 1000 1 10 0</property> </widget> @@ -1786,7 +1816,7 @@ <widget class="GtkSpinButton" id="spinbuttonXMax"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> <property name="width_chars">4</property> <property name="adjustment">0 -500 1000 1 10 0</property> </widget> @@ -3199,13 +3229,44 @@ </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label31"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="day_ascdesc"> + <property name="visible">True</property> + <property name="xalign">1</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label32"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">m</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> </widget> </child> @@ -3811,13 +3872,44 @@ </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label33"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="weeka_ascdesc"> + <property name="visible">True</property> + <property name="xalign">1</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label34"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">m</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> </widget> </child> @@ -4434,13 +4526,44 @@ </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label36"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="montha_ascdesc"> + <property name="visible">True</property> + <property name="xalign">1</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label49"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">m</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> </widget> </child> @@ -5056,13 +5179,44 @@ </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label35"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Total Asc/Desc:</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="yeara_ascdesc"> + <property name="visible">True</property> + <property name="xalign">1</property> + </widget> + <packing> + <property name="left_attach">4</property> + <property name="right_attach">5</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> <child> - <placeholder/> + <widget class="GtkLabel" id="label41"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">m</property> + </widget> + <packing> + <property name="left_attach">5</property> + <property name="right_attach">6</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> </child> </widget> </child> @@ -5387,7 +5541,7 @@ </widget> </child> <child> - <widget class="GtkLabel" id="label14"> + <widget class="GtkLabel" id="label15"> <property name="visible">True</property> <property name="label" translatable="yes"><b>History</b></property> <property name="use_markup">True</property> @@ -5443,21 +5597,19 @@ <property name="can_focus">True</property> <signal name="button_press_event" handler="on_sportstatsTreeView_button_press"/> </widget> - <packing> - </packing> </child> </widget> </child> - <child> - <widget class="GtkLabel" id="label27"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Sports</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> + <child> + <widget class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Sports</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> </widget> <packing> <property name="expand">False</property> @@ -5473,219 +5625,238 @@ <widget class="GtkAlignment" id="alignment101"> <property name="visible">True</property> <property name="left_padding">12</property> - <child> - <widget class="GtkHBox" id="total_vbox"> - <property name="height_request">650</property> - <property name="visible">True</property> - <property name="border_width">5</property> - <property name="spacing">8</property> - <child> - <widget class="GtkVBox" id="vbox123"> - <property name="visible">True</property> - <child> - <widget class="GtkComboBoxEntry" id="total_combovalue"> - <property name="visible">True</property> - <property name="items" translatable="yes">Distance + <child> + <widget class="GtkHBox" id="total_vbox"> + <property name="height_request">650</property> + <property name="visible">True</property> + <property name="border_width">5</property> + <property name="spacing">8</property> + <child> + <widget class="GtkVBox" id="vbox123"> + <property name="visible">True</property> + <child> + <widget class="GtkComboBoxEntry" id="total_combovalue"> + <property name="visible">True</property> + <property name="items" translatable="yes">Distance Time Average Heart Rate Average Speed Calories</property> - <signal name="changed" handler="on_total_combovalue_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label-37"> - <property name="visible">True</property> - <property name="label" translatable="yes">Versus</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkComboBoxEntry" id="total_combovalue2"> - <property name="visible">True</property> - <property name="items" translatable="yes">None + <signal name="changed" handler="on_total_combovalue_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label-39"> + <property name="visible">True</property> + <property name="label" translatable="yes">Versus</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkComboBoxEntry" id="total_combovalue2"> + <property name="visible">True</property> + <property name="items" translatable="yes">None Distance Time Average Heart Rate Average Speed Calories</property> - <signal name="changed" handler="on_total_combovalue_changed"/> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <widget class="GtkTable" id="table3"> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">2</property> - <child> - <widget class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">Total distance:</property> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label19"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">Total duration:</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="labelTotalDistance"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - </widget> - <packing> - <property name="top_attach">0</property> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="labelTotalDuration"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label21a"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">Start date:</property> - </widget> - <packing> - <property name="top_attach">3</property> - <property name="left_attach">0</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label22a"> - <property name="visible">True</property> - <property name="xalign">1</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">End date:</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="labelStartDate"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - </widget> - <packing> - <property name="top_attach">3</property> - <property name="left_attach">1</property> - <property name="right_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="labelEndDate"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">5</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">4</property> - <property name="top_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="x_padding">10</property> - <property name="y_padding">10</property> - <property name="y_options">GTK_SHRINK</property> - </packing> - </child> - </widget> - </child> - - - </widget> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - </widget> - <packing> - </packing> - </child> + <signal name="changed" handler="on_total_combovalue_changed"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkTable" id="table3"> + <property name="visible">True</property> + <property name="n_rows">4</property> + <property name="n_columns">2</property> + <child> + <widget class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Total distance:</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_SHRINK</property> + <property name="x_padding">10</property> + <property name="y_padding">10</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="xalign">1</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Total duration:</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_SHRINK</property> + <property name="x_padding">10</property> + <property name="y_padding">10</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labelTotalDistance"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">5</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_SHRINK</property> + <property name="x_padding">10</property> + <property name="y_padding">10</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="labelTotalDuration"> + <property name="visible">True</property> + ... [truncated message content] |
From: <sig...@us...> - 2011-04-26 23:33:17
|
Revision: 780 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=780&view=rev Author: siggipals Date: 2011-04-26 23:33:11 +0000 (Tue, 26 Apr 2011) Log Message: ----------- #111 - Added capability for specifying graph display color for sports Modified Paths: -------------- pytrainer/trunk/glade/profile.glade pytrainer/trunk/pytrainer/gui/drawArea.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/gui/windowprofile.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/monthgraph.py pytrainer/trunk/pytrainer/profile.py pytrainer/trunk/pytrainer/timegraph.py pytrainer/trunk/pytrainer/totalgraph.py pytrainer/trunk/pytrainer/weekgraph.py pytrainer/trunk/pytrainer/yeargraph.py Modified: pytrainer/trunk/glade/profile.glade =================================================================== --- pytrainer/trunk/glade/profile.glade 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/glade/profile.glade 2011-04-26 23:33:11 UTC (rev 780) @@ -591,6 +591,7 @@ <widget class="GtkTreeView" id="sportTreeView"> <property name="visible">True</property> <property name="can_focus">True</property> + <signal name="row_activated" handler="on_sporttreeview_row_activated"/> </widget> </child> </widget> @@ -808,8 +809,8 @@ </widget> <packing> <property name="right_attach">3</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -841,6 +842,42 @@ <property name="y_options"></property> </packing> </child> + <child> + <widget class="GtkHBox" id="hboxcolor"> + <property name="visible">True</property> + <child> + <widget class="GtkImage" id="newcolor"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </widget> + <packing> + </packing> + </child> + <child> + <widget class="GtkButton" id="buttoncolor"> + <property name="label">gtk-edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_editcolor_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> <child> <placeholder/> </child> @@ -1188,8 +1225,8 @@ </widget> <packing> <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -1198,7 +1235,7 @@ <widget class="GtkLabel" id="label-9"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Maxiumum Pace</property> + <property name="label" translatable="yes">Maximum Pace</property> </widget> <packing> <property name="top_attach">3</property> @@ -1221,6 +1258,55 @@ <property name="y_options"></property> </packing> </child> + <child> + <widget class="GtkLabel" id="label-10"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Color</property> + </widget> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hboxcolor"> + <property name="visible">True</property> + <child> + <widget class="GtkImage" id="editcolor"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + </widget> + <packing> + </packing> + </child> + <child> + <widget class="GtkButton" id="buttoncolor"> + <property name="label">gtk-edit</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_editcolor_clicked"/> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> </widget> <packing> <property name="position">0</property> Modified: pytrainer/trunk/pytrainer/gui/drawArea.py =================================================================== --- pytrainer/trunk/pytrainer/gui/drawArea.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/gui/drawArea.py 2011-04-26 23:33:11 UTC (rev 780) @@ -171,7 +171,7 @@ else: return '%1.1f' % x - def drawStackedBars(self,xvalues,yvalues,ylabel,title, valuesAreTime=False): + def drawStackedBars(self,xvalues,yvalues,ylabel,title, valuesAreTime=False, colors={}): '''function to draw stacked bars xvalues needs to be a list of lists of strings, e.g. [0]["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] yvalues needs to be a list of dicts e.g. [0]{'Kayak': {'Tue': 10.08, 'Fri': 17.579999999999998, 'Thu': 15.66, 'Sat': 30.619999999999997}, {'Run': {'Mon': 9.65, 'Sun': 15.59}} @@ -218,7 +218,9 @@ for ind in inds: ybottoms[ind] += yheights[ind] yheights[ind] = 0 #Zero heights - color = self.getColor(keys.index(key)) + color = "#"+colors.get(key, '') + if len(color)<2: + color = self.getColor(keys.index(key)) for xvalue in xvalues[0]: index = xvalues[0].index(xvalue) if xvalue in yvalues[0][key]: @@ -255,7 +257,9 @@ for ind in inds: ybottoms[ind] += yheights[ind] yheights[ind] = 0.0 #Zero heights - color = self.getColor(keys.index(key)) + color = "#"+colors.get(key, '') + if len(color)<2: + color = self.getColor(keys.index(key)) for xvalue in xvalues[0]: index = xvalues[0].index(xvalue) if xvalue in yvalues[1][key]: Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-04-26 23:33:11 UTC (rev 780) @@ -246,10 +246,10 @@ self.drawareaheartrate = HeartRateGraph(self.heartrate_vbox, self.window1, self.heartrate_vbox2, pytrainer_main=self.pytrainer_main) #self.drawareaday = DayGraph(self.day_vbox, self.day_combovalue) self.day_vbox.hide() - self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2) - self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2) - self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2) - self.drawareatotal = TotalGraph(self.total_vbox, self.window1, self.total_combovalue,self.total_combovalue2) + self.drawareaweek = WeekGraph(self.weekview, self.window1, self.week_combovalue, self.week_combovalue2, self.pytrainer_main) + self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2, self.pytrainer_main) + self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2, self.pytrainer_main) + self.drawareatotal = TotalGraph(self.total_vbox, self.window1, self.total_combovalue,self.total_combovalue2, self.pytrainer_main) def createMap(self,MapViewer,waypoint): self.waypoint = waypoint @@ -298,9 +298,9 @@ def create_treeview(self,treeview,columns): for column_index, column_dict in enumerate(columns): if 'pixbuf' in column_dict: - renderer = gtk.CellRendererPixbuf() + renderer = gtk.CellRendererPixbuf() else: - renderer = gtk.CellRendererText() + renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(column_dict['name']) column.pack_start(renderer, expand=False) if 'pixbuf' in column_dict: @@ -433,10 +433,10 @@ # Use grey color for "rest" laps for c in self.lapsTreeView.get_columns()[:-1]: - for cr in c.get_cell_renderers(): - if type(cr)==gtk.CellRendererText: - c.add_attribute(cr, 'foreground', 11) - + for cr in c.get_cell_renderers(): + if type(cr)==gtk.CellRendererText: + c.add_attribute(cr, 'foreground', 11) + self.frame_laps.show() else: self.frame_laps.hide() Modified: pytrainer/trunk/pytrainer/gui/windowprofile.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-04-26 23:33:11 UTC (rev 780) @@ -35,6 +35,7 @@ self.data_path = data_path SimpleGladeApp.__init__(self, data_path+glade_path, root, domain) self.conf_options = parent.profile_options + self.stored_color = "000000" def new(self): self.gender_options = { @@ -56,9 +57,18 @@ self.prf_ddbb.insert_text(i,self.ddbb_type[i]) #preparamos la lista sports: - column_names=[_("Sport"),_("MET"),_("Extra Weight"), _("Maximum Pace")] + column_names=[_("Sport"),_("MET"),_("Extra Weight"), _("Maximum Pace"), _("Color")] for column_index, column_name in enumerate(column_names): - column = gtk.TreeViewColumn(column_name, gtk.CellRendererText(), text=column_index) + if column_index==4: + renderer = gtk.CellRendererPixbuf() + else: + renderer = gtk.CellRendererText() + column = gtk.TreeViewColumn(column_name, text=column_index) + column.pack_start(renderer, expand=False) + if column_index==4: + column.add_attribute(renderer, 'pixbuf', column_index) + else: + column.add_attribute(renderer, 'text', column_index) column.set_resizable(True) self.sportTreeView.append_column(column) @@ -153,6 +163,7 @@ gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, + gtk.gdk.Pixbuf, object) for i in sport_list: try: @@ -171,6 +182,8 @@ #print type(e), e max_pace = "" + colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 25, 15) + colorPixBuf.fill(0 if i[5] in (None,'') else long(i[5]+'00',16)) iter = store.append() store.set ( @@ -179,6 +192,7 @@ 1, met, 2, weight, 3, max_pace, + 4, colorPixBuf, ) self.sportTreeView.set_model(store) self.sportTreeView.set_cursor(0) @@ -328,7 +342,7 @@ md.run() md.destroy() return - self.parent.addNewSport(sport,met,weight,maxpace) + self.parent.addNewSport(sport,met,weight,maxpace,self.stored_color) self.parent.actualize_mainsportlist() self.on_switch_page(None,None,2) self.hidesportsteps() @@ -358,7 +372,7 @@ if iter: self.buttonbox.set_sensitive(0) sport = selected.get_value(iter,0) - name,met,weight,maxpace = self.parent.getSportInfo(sport) + name,met,weight,maxpace,color = self.parent.getSportInfo(sport) self.editsportentry.set_text(sport) self.sportnameedit.set_text(sport) if weight is not None: @@ -373,8 +387,39 @@ self.editmaxpace.set_text(str(maxpace)) else: self.editmaxpace.set_text("") + if color == None: + color = "0000" + + colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 250, 20) + colorPixBuf.fill(long("0x%s00" % color, 16)) + self.editcolor.set_from_pixbuf(colorPixBuf) + self.hidesportsteps() self.editsport.show() + + def on_editcolor_clicked(self, widget): + selected,iter = self.sportTreeView.get_selection().get_selected() + if iter: + sport = selected.get_value(iter,0) + name,met,weight,maxpace,color = self.parent.getSportInfo(sport) + if color==None: + color = "000000" + colorseldlg = gtk.ColorSelectionDialog("test") + colorseldlg.colorsel.set_has_palette(True) + colorseldlg.colorsel.set_current_color(gtk.gdk.color_parse("#"+color)) + colorseldlg.run() + col = colorseldlg.colorsel.get_current_color() + self.stored_color = ("%02x" % col.red)[:2] + ("%02x" % col.green)[:2] + ("%02x" % col.blue)[:2] + + colorPixBuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 250, 20) + colorPixBuf.fill(long("0x%s00" % self.stored_color, 16)) + self.newcolor.set_from_pixbuf(colorPixBuf) + self.editcolor.set_from_pixbuf(colorPixBuf) + + colorseldlg.hide() + + def on_sporttreeview_row_activated(self, widget, path, column): + self.on_editsport_clicked(None) def on_editsport_accept_clicked(self,widget): oldnamesport = self.sportnameedit.get_text() @@ -382,7 +427,7 @@ newmetsport = self.editmetentry.get_text() newweightsport = self.editweightentry.get_text() newmaxpace = self.editmaxpace.get_text() - self.parent.updateSport(oldnamesport,newnamesport,newmetsport,newweightsport, newmaxpace) + self.parent.updateSport(oldnamesport,newnamesport,newmetsport,newweightsport, newmaxpace, self.stored_color) self.parent.actualize_mainsportlist() self.on_switch_page(None,None,2) self.hidesportsteps() Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2011-04-26 23:33:11 UTC (rev 780) @@ -54,6 +54,7 @@ "weight":"float", "met":"float", "max_pace":"integer", + "color":"char(6)", }, "waypoints":{ "id_waypoint":"integer primary key autoincrement", "lat":"float", Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/main.py 2011-04-26 23:33:11 UTC (rev 780) @@ -55,7 +55,7 @@ def __init__(self,filename = None, data_path = None): #Version constants self.version ="1.8.0-svn#774" - self.DB_version = 7 + self.DB_version = 8 #Process command line options self.startup_options = self.get_options() self.environment = Environment(platform.get_platform(), self.startup_options.conf_dir) Modified: pytrainer/trunk/pytrainer/monthgraph.py =================================================================== --- pytrainer/trunk/pytrainer/monthgraph.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/monthgraph.py 2011-04-26 23:33:11 UTC (rev 780) @@ -30,8 +30,8 @@ (_("day"),_("Calories"), _("Daily Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - TimeGraph.__init__(self, vbox=vbox, window=window) + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%d" Modified: pytrainer/trunk/pytrainer/profile.py =================================================================== --- pytrainer/trunk/pytrainer/profile.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/profile.py 2011-04-26 23:33:11 UTC (rev 780) @@ -225,11 +225,11 @@ #connection = self.pytrainer_main.ddbb.connect() #if (connection == 1): logging.debug("retrieving sports info") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace",None) + return self.pytrainer_main.ddbb.select("sports","name,met,weight,id_sports,max_pace,color",None) #else: # return connection - def addNewSport(self,sport,met,weight,maxpace): + def addNewSport(self,sport,met,weight,maxpace,color): """31.08.2008 - dgranda It adds a new sport. arguments: @@ -238,9 +238,9 @@ weight: returns: id_sports from new sport""" logging.debug(">>") - logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met+"|"+maxpace) - sport = [sport,met,weight,maxpace] - self.pytrainer_main.ddbb.insert("sports","name,met,weight,max_pace",sport) + logging.debug("Adding new sport: "+sport+"|"+weight+"|"+met+"|"+maxpace+"|"+str(color)) + sport = [sport,met,weight,maxpace,color] + self.pytrainer_main.ddbb.insert("sports","name,met,weight,max_pace,color",sport) sport_id = self.pytrainer_main.ddbb.select("sports","id_sports","name=\"%s\"" %(sport)) logging.debug("<<") return sport_id @@ -254,13 +254,13 @@ self.pytrainer_main.ddbb.delete("sports","id_sports=\"%d\""%id_sport) logging.debug("<<") - def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport,newmaxpace=None): + def updateSport(self,oldnamesport,newnamesport,newmetsport,newweightsport,newmaxpace=None,newcolor=None): logging.debug("--") - self.pytrainer_main.ddbb.update("sports","name,met,weight,max_pace",[newnamesport,newmetsport,newweightsport, newmaxpace],"name=\"%s\""%oldnamesport) + self.pytrainer_main.ddbb.update("sports","name,met,weight,max_pace,color",[newnamesport,newmetsport,newweightsport, newmaxpace, newcolor],"name=\"%s\""%oldnamesport) def getSportInfo(self,namesport): logging.debug("--") - return self.pytrainer_main.ddbb.select("sports","name,met,weight,max_pace","name=\"%s\""%namesport)[0] + return self.pytrainer_main.ddbb.select("sports","name,met,weight,max_pace,color","name=\"%s\""%namesport)[0] def build_ddbb(self): logging.debug("--") Modified: pytrainer/trunk/pytrainer/timegraph.py =================================================================== --- pytrainer/trunk/pytrainer/timegraph.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/timegraph.py 2011-04-26 23:33:11 UTC (rev 780) @@ -20,9 +20,10 @@ from gui.drawArea import DrawArea class TimeGraph(object): - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): self.drawarea = DrawArea(vbox, window) self.SPORT_FIELD = 9 + self.sportlist = dict([(s[0],s[5]) for s in main.profile.getSportList()]) def getFloatValue(self, value): try: @@ -49,6 +50,7 @@ def get_values(self, values, value_selected, key_format, sportfield=9): valueDict = {} #Stores the totals valueCount = {} #Counts the totals to allow for averaging if needed + sportColors = {} for record in values: day = unicode(datetime.datetime.strptime(record[0], "%Y-%m-%d").strftime(key_format)) # Gives year for this record @@ -118,8 +120,7 @@ xlab.append(xvalues) valsAreTime.append(valuesAreTime) #Draw chart - - self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime) + self.drawarea.drawStackedBars(xlab,yval,ylab,tit,valsAreTime, colors = self.sportlist) def get_value_params(self,value): return self.value_params[value] Modified: pytrainer/trunk/pytrainer/totalgraph.py =================================================================== --- pytrainer/trunk/pytrainer/totalgraph.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/totalgraph.py 2011-04-26 23:33:11 UTC (rev 780) @@ -28,8 +28,8 @@ (_("year"),_("Calories"), _("Annual Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - TimeGraph.__init__(self, vbox=vbox, window=window) + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%Y" Modified: pytrainer/trunk/pytrainer/weekgraph.py =================================================================== --- pytrainer/trunk/pytrainer/weekgraph.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/weekgraph.py 2011-04-26 23:33:11 UTC (rev 780) @@ -32,8 +32,8 @@ (None, _("Calories"), _("Daily Calories"), None), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - TimeGraph.__init__(self, vbox=vbox, window=window) + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%a" Modified: pytrainer/trunk/pytrainer/yeargraph.py =================================================================== --- pytrainer/trunk/pytrainer/yeargraph.py 2011-04-26 23:16:34 UTC (rev 779) +++ pytrainer/trunk/pytrainer/yeargraph.py 2011-04-26 23:33:11 UTC (rev 780) @@ -30,8 +30,8 @@ (_("month"),_("Calories"), _("Monthly Calories"),"b"), ] - def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None): - TimeGraph.__init__(self, vbox=vbox, window=window) + def __init__(self, vbox = None, window = None, combovalue = None, combovalue2 = None, main = None): + TimeGraph.__init__(self, vbox=vbox, window=window, main=main) self.combovalue = combovalue self.combovalue2 = combovalue2 self.KEY_FORMAT = "%m" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-04-26 23:16:40
|
Revision: 779 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=779&view=rev Author: siggipals Date: 2011-04-26 23:16:34 +0000 (Tue, 26 Apr 2011) Log Message: ----------- #102 Try using Google Maps Elevation API if all else fails Modified Paths: -------------- pytrainer/trunk/extensions/fixelevation/fixelevation.py Modified: pytrainer/trunk/extensions/fixelevation/fixelevation.py =================================================================== --- pytrainer/trunk/extensions/fixelevation/fixelevation.py 2011-04-26 23:05:49 UTC (rev 778) +++ pytrainer/trunk/extensions/fixelevation/fixelevation.py 2011-04-26 23:16:34 UTC (rev 779) @@ -42,41 +42,76 @@ PYTRAINER = "{%s}" % pyt_ns self._trkpt_path = '{%s}trk/{%s}trkseg/{%s}trkpt' % (self._xmlns, self._xmlns, self._xmlns) + def addExt(trackpoint, ele_new): + #Add new elevation to extension tag + ''' + <extensions> + <pytrainer:ele method="srtm_bilinear">31.1</pytrainer:ele> + </extensions> + ''' + ext = etree.Element("extensions") + py_ele = etree.SubElement(ext, PYTRAINER + "ele", method="srtm_bilinear") + py_ele.text = str(ele_new) + trackpoint.append(ext) + """ Replace elevation from GPX by data from SRTM. TODO (Arnd) make a function within class fixelevation out of this for better reuse """ - for trkpt in self._data.findall(self._trkpt_path): + trackpoints = self._data.findall(self._trkpt_path) + for trkpt in trackpoints: lat = float(trkpt.attrib['lat']) lon = float(trkpt.attrib['lon']) ele = trkpt.find('{%s}ele' % self._xmlns) ele_new = self._srtm.get_elevation(lat, lon) - #Add new elevation to extension tag - ''' - <extensions> - <pytrainer:ele method="srtm_bilinear">31.1</pytrainer:ele> - </extensions> - ''' - ext = etree.Element("extensions") - py_ele = etree.SubElement(ext, PYTRAINER + "ele", method="srtm_bilinear") - py_ele.text = str(ele_new) - - #print etree.tostring(ext) - - + if not ele_new: ele_fixed = False break - - #if ele is not None: - # #ele.text = str(ele_new) - # ele.append(ext) - #else: - # ele = etree.Element('ele') - # ele.append(py_ele) - trkpt.append(ext) + + addExt(trkpt, ele_new) + if not ele_fixed: + # Try Google maps elevation API + import cjson, urllib2, math + steps = len(trackpoints) / 300 + + path = '' + lat_prev, long_prev = 0, 0 + t = 0 + for t in xrange(0,len(trackpoints),steps): + lat = float(trackpoints[t].attrib['lat']) + lon = float(trackpoints[t].attrib['lon']) + encoded_lat, lat_prev = encode_coord(lat, lat_prev) + encoded_long, long_prev = encode_coord(lon, long_prev) + path += encoded_lat + encoded_long + t += 1 + url = "http://maps.googleapis.com/maps/api/elevation/json?sensor=true&samples=%d&path=enc:" % int((len(trackpoints) / steps)) + url += path + + try: + google_ele = cjson.decode(urllib2.urlopen(url).read()) + if google_ele['status'] == "OK": + t_idx = 0 + ele_points = len(google_ele['results']) + for ele_new in xrange(0,ele_points): + addExt(trackpoints[t_idx], google_ele['results'][ele_new]['elevation']) + for intermediate in xrange(ele_new+1, ele_new+steps): + if intermediate<len(trackpoints): + if ele_new==ele_points-1: + calculated = google_ele['results'][ele_new]['elevation'] + else: + ele1 = google_ele['results'][ele_new]['elevation'] + ele2 = google_ele['results'][ele_new+1]['elevation'] + calculated = (ele1 * (intermediate-ele_new) + ele2 * (steps - (intermediate-ele_new))) / steps + t_idx += 1 + addExt(trackpoints[t_idx], calculated) + t_idx += 1 + ele_fixed = True + except urllib2.HTTPError: + pass + if ele_fixed: # Write out to original *.gpx. self._data.write( gpx_file, @@ -100,3 +135,24 @@ else: logging.error("ELE GPX file: %s NOT found!!!" % (gpx_file)) logging.debug("<<") + +def encode_coord(x, prev): + val = int(x * 1e5) + return encode_signed(val - prev), val + +def encode_signed(n): + tmp = n << 1 + if n < 0: + tmp = ~tmp + return encode_unsigned(tmp) + +def encode_unsigned(n): + b = [] + while n >= 32: + b.append(n & 31) + n = n >> 5 + b = [(c | 0x20) for c in b] + b.append(n) + b = [(i + 63) for i in b] + return ''.join([chr(i) for i in b]) + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-04-26 23:05:55
|
Revision: 778 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=778&view=rev Author: siggipals Date: 2011-04-26 23:05:49 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Remove debug print Modified Paths: -------------- pytrainer/trunk/pytrainer/lib/srtmdownload.py Modified: pytrainer/trunk/pytrainer/lib/srtmdownload.py =================================================================== --- pytrainer/trunk/pytrainer/lib/srtmdownload.py 2011-03-29 00:35:00 UTC (rev 777) +++ pytrainer/trunk/pytrainer/lib/srtmdownload.py 2011-04-26 23:05:49 UTC (rev 778) @@ -46,7 +46,6 @@ self.progressbar = progressbar self.label = label self.tile_name = tile_name - print tile_name def run(self): logging.debug(">>") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-03-29 00:35:06
|
Revision: 777 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=777&view=rev Author: siggipals Date: 2011-03-29 00:35:00 +0000 (Tue, 29 Mar 2011) Log Message: ----------- Stop lap data display from failing when no HR data present Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-20 20:04:27 UTC (rev 776) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-29 00:35:00 UTC (rev 777) @@ -427,7 +427,7 @@ pic = gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/trigger_%s.png" % lap['trigger']) iter = store.append() - store.set(iter, 0, lap['lap_number']+1, 1, pic, 2, m/1000, 3, str(int(float(t))), 4, s, 5, max_speed, 6, pace, 7, max_pace, 8, lap['avg_hr'], 9, lap['max_hr'], 10, lap['calories'], 11, color[lap['intensity']]) + store.set(iter, 0, lap['lap_number']+1, 1, pic, 2, m/1000, 3, str(int(float(t))), 4, s, 5, max_speed, 6, pace, 7, max_pace, 8, lap['avg_hr'] if lap['avg_hr'] else 0, 9, lap['max_hr'] if lap['max_hr'] else 0, 10, lap['calories'], 11, color[lap['intensity']]) self.lapsTreeView.set_model(store) self.lapsTreeView.set_rules_hint(True) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-03-20 20:04:34
|
Revision: 776 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=776&view=rev Author: dgranda Date: 2011-03-20 20:04:27 +0000 (Sun, 20 Mar 2011) Log Message: ----------- Updated ES localizations Modified Paths: -------------- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-03-20 20:03:50 UTC (rev 775) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-03-20 20:04:27 UTC (rev 776) @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: pytrainer 1.8.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-03-19 19:43+0100\n" -"PO-Revision-Date: 2011-03-19 19:44+0100\n" +"POT-Creation-Date: 2011-03-20 20:28+0100\n" +"PO-Revision-Date: 2011-03-20 20:30+0100\n" "Last-Translator: David Garcia Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "Language: es\n" @@ -47,7 +47,6 @@ #: glade/equipment.glade:277 #: glade/equipment.glade:533 -#: build/lib/pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowimportdata.py:352 msgid "Notes" msgstr "Notas" @@ -239,10 +238,6 @@ msgstr "<b>Delimitador en el archivo</b>" #: glade/importdata.glade:864 -#: build/lib/pytrainer/gui/windowmain.py:112 -#: build/lib/pytrainer/gui/windowmain.py:127 -#: build/lib/pytrainer/gui/windowmain.py:1282 -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/windowmain.py:112 #: pytrainer/gui/windowmain.py:127 #: pytrainer/gui/windowmain.py:1282 @@ -269,21 +264,6 @@ msgstr "Descartar" #: glade/importdata.glade:892 -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/recordgraph.py:136 -#: build/lib/pytrainer/recordgraph.py:138 -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/recordgraph.py:142 -#: build/lib/pytrainer/recordgraph.py:144 -#: build/lib/pytrainer/recordgraph.py:146 -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/totalgraph.py:24 -#: build/lib/pytrainer/yeargraph.py:26 -#: build/lib/pytrainer/daygraph.py:52 -#: build/lib/pytrainer/daygraph.py:54 -#: build/lib/pytrainer/daygraph.py:56 -#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/recordgraph.py:134 #: pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:138 @@ -315,8 +295,6 @@ msgstr "<b>Columna en el archivo</b>" #: glade/importdata.glade:972 -#: build/lib/pytrainer/gui/windowmain.py:111 -#: build/lib/pytrainer/gui/windowmain.py:1281 #: pytrainer/gui/windowmain.py:111 #: pytrainer/gui/windowmain.py:1281 msgid "Title" @@ -339,10 +317,6 @@ msgstr "Velocidad Máx. (km/h)" #: glade/importdata.glade:1037 -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/totalgraph.py:27 -#: build/lib/pytrainer/yeargraph.py:29 -#: build/lib/pytrainer/weekgraph.py:31 #: pytrainer/monthgraph.py:29 #: pytrainer/totalgraph.py:27 #: pytrainer/yeargraph.py:29 @@ -352,13 +326,6 @@ #: glade/importdata.glade:1050 #: glade/pytrainer.glade:277 -#: build/lib/pytrainer/gui/windowmain.py:106 -#: build/lib/pytrainer/gui/windowmain.py:114 -#: build/lib/pytrainer/gui/windowmain.py:136 -#: build/lib/pytrainer/gui/windowmain.py:1284 -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowmain.py:106 #: pytrainer/gui/windowmain.py:114 #: pytrainer/gui/windowmain.py:136 @@ -378,7 +345,6 @@ msgstr "Pulsaciones máximas (ppm)" #: glade/importdata.glade:1089 -#: build/lib/pytrainer/recordgraph.py:138 #: pytrainer/recordgraph.py:138 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" @@ -398,8 +364,6 @@ #: glade/importdata.glade:1323 #: glade/newrecord.glade:404 -#: build/lib/pytrainer/gui/windowmain.py:150 -#: pytrainer/gui/windowmain.py:150 msgid " " msgstr " " @@ -430,7 +394,6 @@ msgstr "<b>Importar desde fichero CSV</b>" #: glade/newrecord.glade:7 -#: build/lib/pytrainer/gui/windowmain.py:1945 #: pytrainer/gui/windowmain.py:1945 msgid "New Entry" msgstr "Nueva entrada" @@ -543,13 +506,6 @@ msgstr "Pulsaciones" #: glade/newrecord.glade:902 -#: build/lib/pytrainer/gui/windowmain.py:118 -#: build/lib/pytrainer/gui/windowmain.py:159 -#: build/lib/pytrainer/gui/windowmain.py:1288 -#: build/lib/pytrainer/monthgraph.py:30 -#: build/lib/pytrainer/totalgraph.py:28 -#: build/lib/pytrainer/yeargraph.py:30 -#: build/lib/pytrainer/weekgraph.py:32 #: pytrainer/gui/windowmain.py:118 #: pytrainer/gui/windowmain.py:159 #: pytrainer/gui/windowmain.py:1288 @@ -749,7 +705,6 @@ msgstr "M.E.T." #: glade/profile.glade:1156 -#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "Extra Weight" msgstr "Peso extra" @@ -795,7 +750,6 @@ msgstr "Basado en porcentajes" #: glade/profile.glade:1565 -#: build/lib/pytrainer/gui/windowmain.py:710 #: pytrainer/gui/windowmain.py:710 msgid "Karvonen method" msgstr "Karvonen" @@ -809,13 +763,6 @@ msgstr "<b>Zonas de frecuencia cardiaca</b>" #: glade/profile.glade:1647 -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/lib/activity.py:433 -#: build/lib/pytrainer/lib/activity.py:435 -#: build/lib/pytrainer/lib/activity.py:445 -#: build/lib/pytrainer/lib/activity.py:515 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/lib/activity.py:433 #: pytrainer/lib/activity.py:435 @@ -1008,7 +955,6 @@ #: glade/pytrainer.glade:3364 #: glade/pytrainer.glade:3987 #: glade/pytrainer.glade:4815 -#: build/lib/pytrainer/gui/windowmain.py:105 #: pytrainer/gui/windowmain.py:105 msgid "Km" msgstr "km" @@ -1022,13 +968,6 @@ #: glade/pytrainer.glade:4229 #: glade/pytrainer.glade:4858 #: glade/pytrainer.glade:4874 -#: build/lib/pytrainer/gui/windowmain.py:727 -#: build/lib/pytrainer/gui/windowmain.py:728 -#: build/lib/pytrainer/gui/windowmain.py:850 -#: build/lib/pytrainer/gui/windowmain.py:851 -#: build/lib/pytrainer/gui/windowmain.py:928 -#: build/lib/pytrainer/gui/windowmain.py:929 -#: build/lib/pytrainer/lib/activity.py:202 #: pytrainer/gui/windowmain.py:727 #: pytrainer/gui/windowmain.py:728 #: pytrainer/gui/windowmain.py:850 @@ -1052,7 +991,6 @@ msgstr "<b>Título:</b>" #: glade/pytrainer.glade:1106 -#: build/lib/pytrainer/gui/windowmain.py:1510 #: pytrainer/gui/windowmain.py:1510 msgid "Show graph display options" msgstr "Mostrar opciones del gráfico" @@ -1253,8 +1191,6 @@ #: glade/pytrainer.glade:4364 #: glade/pytrainer.glade:4683 #: glade/pytrainer.glade:4890 -#: build/lib/pytrainer/lib/activity.py:435 -#: build/lib/pytrainer/lib/activity.py:515 #: pytrainer/lib/activity.py:435 #: pytrainer/lib/activity.py:515 msgid "bpm" @@ -1290,13 +1226,6 @@ #: glade/pytrainer.glade:4348 #: glade/pytrainer.glade:4955 #: glade/pytrainer.glade:4971 -#: build/lib/pytrainer/gui/windowmain.py:729 -#: build/lib/pytrainer/gui/windowmain.py:730 -#: build/lib/pytrainer/gui/windowmain.py:852 -#: build/lib/pytrainer/gui/windowmain.py:853 -#: build/lib/pytrainer/gui/windowmain.py:930 -#: build/lib/pytrainer/gui/windowmain.py:931 -#: build/lib/pytrainer/lib/activity.py:203 #: pytrainer/gui/windowmain.py:729 #: pytrainer/gui/windowmain.py:730 #: pytrainer/gui/windowmain.py:852 @@ -1510,16 +1439,10 @@ msgid "Warning" msgstr "Advertencia" -#: build/lib/pytrainer/gui/windowmain.py:103 #: pytrainer/gui/windowmain.py:103 msgid "Miles" msgstr "Millas" -#: build/lib/pytrainer/gui/windowmain.py:106 -#: build/lib/pytrainer/gui/windowmain.py:110 -#: build/lib/pytrainer/gui/windowmain.py:123 -#: build/lib/pytrainer/gui/windowmain.py:126 -#: build/lib/pytrainer/gui/windowmain.py:135 #: pytrainer/gui/windowmain.py:106 #: pytrainer/gui/windowmain.py:110 #: pytrainer/gui/windowmain.py:123 @@ -1528,29 +1451,10 @@ msgid "id" msgstr "id" -#: build/lib/pytrainer/gui/windowmain.py:106 #: pytrainer/gui/windowmain.py:106 msgid "Start" msgstr "Comienzo" -#: build/lib/pytrainer/gui/windowmain.py:113 -#: build/lib/pytrainer/gui/windowmain.py:151 -#: build/lib/pytrainer/gui/windowmain.py:489 -#: build/lib/pytrainer/gui/windowmain.py:1283 -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 -#: build/lib/pytrainer/lib/activity.py:313 -#: build/lib/pytrainer/lib/activity.py:324 -#: build/lib/pytrainer/lib/activity.py:396 -#: build/lib/pytrainer/lib/activity.py:407 -#: build/lib/pytrainer/lib/activity.py:416 -#: build/lib/pytrainer/lib/activity.py:425 -#: build/lib/pytrainer/lib/activity.py:434 -#: build/lib/pytrainer/lib/activity.py:444 -#: build/lib/pytrainer/lib/activity.py:453 -#: build/lib/pytrainer/lib/activity.py:514 -#: build/lib/pytrainer/extensions/googlemaps.py:131 -#: build/lib/pytrainer/extensions/osm.py:52 #: pytrainer/gui/windowmain.py:113 #: pytrainer/gui/windowmain.py:151 #: pytrainer/gui/windowmain.py:489 @@ -1572,12 +1476,6 @@ msgid "Distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:115 -#: build/lib/pytrainer/gui/windowmain.py:152 -#: build/lib/pytrainer/gui/windowmain.py:490 -#: build/lib/pytrainer/gui/windowmain.py:1285 -#: build/lib/pytrainer/extensions/googlemaps.py:131 -#: build/lib/pytrainer/extensions/osm.py:52 #: pytrainer/gui/windowmain.py:115 #: pytrainer/gui/windowmain.py:152 #: pytrainer/gui/windowmain.py:490 @@ -1587,143 +1485,114 @@ msgid "Time" msgstr "Tiempo" -#: build/lib/pytrainer/gui/windowmain.py:116 #: pytrainer/gui/windowmain.py:116 msgid "⌀ HR" msgstr "⌀ FC" -#: build/lib/pytrainer/gui/windowmain.py:117 #: pytrainer/gui/windowmain.py:117 msgid "⌀ Speed" msgstr "⌀ Velocidad" -#: build/lib/pytrainer/gui/windowmain.py:123 #: pytrainer/gui/windowmain.py:123 msgid "Waypoint" msgstr "Waypoint" -#: build/lib/pytrainer/gui/windowmain.py:128 #: pytrainer/gui/windowmain.py:128 msgid "Weight" msgstr "Peso" -#: build/lib/pytrainer/gui/windowmain.py:129 #: pytrainer/gui/windowmain.py:129 msgid "Body Fat %" msgstr "Grasa corporal %" -#: build/lib/pytrainer/gui/windowmain.py:130 #: pytrainer/gui/windowmain.py:130 msgid "Resting HR" msgstr "FC en reposo" -#: build/lib/pytrainer/gui/windowmain.py:131 -#: build/lib/pytrainer/gui/windowmain.py:141 -#: build/lib/pytrainer/gui/windowmain.py:158 #: pytrainer/gui/windowmain.py:131 #: pytrainer/gui/windowmain.py:141 #: pytrainer/gui/windowmain.py:158 msgid "Max HR" msgstr "FC max" -#: build/lib/pytrainer/gui/windowmain.py:137 #: pytrainer/gui/windowmain.py:137 msgid "Total duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowmain.py:138 #: pytrainer/gui/windowmain.py:138 msgid "Total distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:139 -#: build/lib/pytrainer/gui/windowmain.py:153 #: pytrainer/gui/windowmain.py:139 #: pytrainer/gui/windowmain.py:153 msgid "Avg speed" msgstr "Velocidad" -#: build/lib/pytrainer/gui/windowmain.py:140 -#: build/lib/pytrainer/gui/windowmain.py:154 #: pytrainer/gui/windowmain.py:140 #: pytrainer/gui/windowmain.py:154 msgid "Max speed" msgstr "Velocidad Máx." -#: build/lib/pytrainer/gui/windowmain.py:142 #: pytrainer/gui/windowmain.py:142 msgid "Max duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowmain.py:143 #: pytrainer/gui/windowmain.py:143 msgid "Max distance" msgstr "Distancia" -#: build/lib/pytrainer/gui/windowmain.py:149 #: pytrainer/gui/windowmain.py:149 msgid "Lap" msgstr "Vuelta" -#: build/lib/pytrainer/gui/windowmain.py:155 +#: pytrainer/gui/windowmain.py:150 +msgid "Trigger" +msgstr "Activador" + #: pytrainer/gui/windowmain.py:155 msgid "Avg pace" msgstr "Ritmo" -#: build/lib/pytrainer/gui/windowmain.py:156 #: pytrainer/gui/windowmain.py:156 msgid "Max pace" -msgstr "Pico de ritmo" +msgstr "Pico ritmo" -#: build/lib/pytrainer/gui/windowmain.py:157 #: pytrainer/gui/windowmain.py:157 msgid "Avg HR" msgstr "FC med" -#: build/lib/pytrainer/gui/windowmain.py:160 #: pytrainer/gui/windowmain.py:160 msgid "Intensity" msgstr "Intensidad" -#: build/lib/pytrainer/gui/windowmain.py:491 #: pytrainer/gui/windowmain.py:491 msgid "Laps" msgstr "Vueltas" -#: build/lib/pytrainer/gui/windowmain.py:492 #: pytrainer/gui/windowmain.py:492 msgid "Left Axis Grid" msgstr "Cuadrícula eje izquierdo" -#: build/lib/pytrainer/gui/windowmain.py:493 #: pytrainer/gui/windowmain.py:493 msgid "Right Axis Grid" msgstr "Cuadrícula eje derecho" -#: build/lib/pytrainer/gui/windowmain.py:494 #: pytrainer/gui/windowmain.py:494 msgid "X Axis Grid" msgstr "Cuadrícula eje X" -#: build/lib/pytrainer/gui/windowmain.py:555 #: pytrainer/gui/windowmain.py:555 msgid "Reset Limits" msgstr "Borrar límites" -#: build/lib/pytrainer/gui/windowmain.py:557 #: pytrainer/gui/windowmain.py:557 msgid "Set Limits" msgstr "Establecer límites" -#: build/lib/pytrainer/gui/windowmain.py:712 #: pytrainer/gui/windowmain.py:712 msgid "Percentages method" msgstr "basado en porcentajes" -#: build/lib/pytrainer/gui/windowmain.py:720 -#: build/lib/pytrainer/gui/windowmain.py:843 -#: build/lib/pytrainer/gui/windowmain.py:921 -#: build/lib/pytrainer/lib/activity.py:196 #: pytrainer/gui/windowmain.py:720 #: pytrainer/gui/windowmain.py:843 #: pytrainer/gui/windowmain.py:921 @@ -1731,13 +1600,6 @@ msgid "miles" msgstr "millas" -#: build/lib/pytrainer/gui/windowmain.py:721 -#: build/lib/pytrainer/gui/windowmain.py:722 -#: build/lib/pytrainer/gui/windowmain.py:844 -#: build/lib/pytrainer/gui/windowmain.py:845 -#: build/lib/pytrainer/gui/windowmain.py:922 -#: build/lib/pytrainer/gui/windowmain.py:923 -#: build/lib/pytrainer/lib/activity.py:197 #: pytrainer/gui/windowmain.py:721 #: pytrainer/gui/windowmain.py:722 #: pytrainer/gui/windowmain.py:844 @@ -1748,13 +1610,6 @@ msgid "miles/h" msgstr "millas/h" -#: build/lib/pytrainer/gui/windowmain.py:723 -#: build/lib/pytrainer/gui/windowmain.py:724 -#: build/lib/pytrainer/gui/windowmain.py:846 -#: build/lib/pytrainer/gui/windowmain.py:847 -#: build/lib/pytrainer/gui/windowmain.py:924 -#: build/lib/pytrainer/gui/windowmain.py:925 -#: build/lib/pytrainer/lib/activity.py:198 #: pytrainer/gui/windowmain.py:723 #: pytrainer/gui/windowmain.py:724 #: pytrainer/gui/windowmain.py:846 @@ -1765,10 +1620,6 @@ msgid "min/mile" msgstr "min/milla" -#: build/lib/pytrainer/gui/windowmain.py:726 -#: build/lib/pytrainer/gui/windowmain.py:849 -#: build/lib/pytrainer/gui/windowmain.py:927 -#: build/lib/pytrainer/lib/activity.py:201 #: pytrainer/gui/windowmain.py:726 #: pytrainer/gui/windowmain.py:849 #: pytrainer/gui/windowmain.py:927 @@ -1776,32 +1627,23 @@ msgid "km" msgstr "km" -#: build/lib/pytrainer/gui/windowmain.py:1286 -#: build/lib/pytrainer/recordgraph.py:144 #: pytrainer/gui/windowmain.py:1286 #: pytrainer/recordgraph.py:144 msgid "Beats" msgstr "Pulsaciones" -#: build/lib/pytrainer/gui/windowmain.py:1287 #: pytrainer/gui/windowmain.py:1287 msgid "Average" msgstr "Media" -#: build/lib/pytrainer/gui/windowmain.py:1506 #: pytrainer/gui/windowmain.py:1506 msgid "Hide graph display options" msgstr "Ocultar configuración de visualización gráfica" -#: build/lib/pytrainer/gui/windowmain.py:1842 #: pytrainer/gui/windowmain.py:1842 msgid "lap" msgstr "vuelta" -#: build/lib/pytrainer/gui/windowmain.py:1852 -#: build/lib/pytrainer/gui/drawArea.py:165 -#: build/lib/pytrainer/extensions/googlemaps.py:129 -#: build/lib/pytrainer/extensions/osm.py:50 #: pytrainer/gui/windowmain.py:1852 #: pytrainer/gui/drawArea.py:165 #: pytrainer/extensions/googlemaps.py:129 @@ -1809,138 +1651,105 @@ msgid "h" msgstr "h" -#: build/lib/pytrainer/gui/windowmain.py:1852 -#: build/lib/pytrainer/gui/windowmain.py:1854 -#: build/lib/pytrainer/lib/activity.py:204 #: pytrainer/gui/windowmain.py:1852 #: pytrainer/gui/windowmain.py:1854 #: pytrainer/lib/activity.py:204 msgid "m" msgstr "m" -#: build/lib/pytrainer/gui/windowmain.py:1852 -#: build/lib/pytrainer/gui/windowmain.py:1854 #: pytrainer/gui/windowmain.py:1852 #: pytrainer/gui/windowmain.py:1854 msgid "s" msgstr "s" -#: build/lib/pytrainer/gui/windowmain.py:1941 -#: build/lib/pytrainer/record.py:63 #: pytrainer/gui/windowmain.py:1941 #: pytrainer/record.py:63 msgid "Edit Entry" msgstr "Editar entrada" -#: build/lib/pytrainer/gui/windowmain.py:1952 #: pytrainer/gui/windowmain.py:1952 msgid "Delete Entry" msgstr "Borrar entrada" -#: build/lib/pytrainer/gui/windowmain.py:1976 #: pytrainer/gui/windowmain.py:1976 msgid "Create Athlete Entry" msgstr "Crear entrada de atleta" -#: build/lib/pytrainer/gui/windowmain.py:1980 #: pytrainer/gui/windowmain.py:1980 msgid "Edit Athlete Entry" msgstr "Editar atleta" -#: build/lib/pytrainer/gui/windowmain.py:2061 -#: build/lib/pytrainer/main.py:459 #: pytrainer/gui/windowmain.py:2061 #: pytrainer/main.py:459 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: build/lib/pytrainer/gui/windowmain.py:2063 #: pytrainer/gui/windowmain.py:2063 msgid "Are you sure?" msgstr "¿Está seguro?" -#: build/lib/pytrainer/gui/windowimportdata.py:116 #: pytrainer/gui/windowimportdata.py:116 msgid "No file selected" msgstr "Ningún fichero seleccionado" -#: build/lib/pytrainer/gui/windowimportdata.py:161 #: pytrainer/gui/windowimportdata.py:161 msgid "Configure" msgstr "Configurar" -#: build/lib/pytrainer/gui/windowimportdata.py:162 #: pytrainer/gui/windowimportdata.py:162 msgid "Run" msgstr "Ejecutar" -#: build/lib/pytrainer/gui/windowimportdata.py:170 #: pytrainer/gui/windowimportdata.py:170 msgid "Disabled" msgstr "Desactivo" -#: build/lib/pytrainer/gui/windowimportdata.py:172 #: pytrainer/gui/windowimportdata.py:172 msgid "Enabled" msgstr "Activo" -#: build/lib/pytrainer/gui/windowimportdata.py:252 #: pytrainer/gui/windowimportdata.py:252 msgid "GPS device found" msgstr "Dispositivos GPS encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "GPS device <b>not</b> found" msgstr "Dispositivo GPS <b>no</b> encontrado" -#: build/lib/pytrainer/gui/windowimportdata.py:262 #: pytrainer/gui/windowimportdata.py:262 msgid "This tool was not found on the system" msgstr "No se ha encontrado esta herramienta en el sistema" -#: build/lib/pytrainer/gui/windowimportdata.py:264 #: pytrainer/gui/windowimportdata.py:264 msgid " Homepage" msgstr "Página de inicio" -#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "File" msgstr "Archivo" -#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Type" msgstr "Tipo" -#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Activities" msgstr "Actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Start Time" msgstr "Hora de comienzo" -#: build/lib/pytrainer/gui/windowimportdata.py:352 -#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Duration" msgstr "Duración" -#: build/lib/pytrainer/gui/windowimportdata.py:501 #: pytrainer/gui/windowimportdata.py:501 msgid "Imported into database" msgstr "Importado a base de datos" -#: build/lib/pytrainer/gui/windowimportdata.py:545 -#: build/lib/pytrainer/gui/windowextensions.py:81 -#: build/lib/pytrainer/gui/windowplugins.py:80 #: pytrainer/gui/windowimportdata.py:545 #: pytrainer/gui/windowextensions.py:81 #: pytrainer/gui/windowplugins.py:80 @@ -1948,10 +1757,6 @@ msgid "%s settings" msgstr "%s opciones" -#: build/lib/pytrainer/gui/windowimportdata.py:560 -#: build/lib/pytrainer/gui/windowextensions.py:70 -#: build/lib/pytrainer/gui/windowplugins.py:71 -#: build/lib/pytrainer/gui/windowplugins.py:95 #: pytrainer/gui/windowimportdata.py:560 #: pytrainer/gui/windowextensions.py:70 #: pytrainer/gui/windowplugins.py:71 @@ -1959,10 +1764,6 @@ msgid "Disable" msgstr "Desactivo" -#: build/lib/pytrainer/gui/windowimportdata.py:561 -#: build/lib/pytrainer/gui/windowextensions.py:72 -#: build/lib/pytrainer/gui/windowplugins.py:69 -#: build/lib/pytrainer/gui/windowplugins.py:96 #: pytrainer/gui/windowimportdata.py:561 #: pytrainer/gui/windowextensions.py:72 #: pytrainer/gui/windowplugins.py:69 @@ -1970,161 +1771,123 @@ msgid "Enable" msgstr "Activo" -#: build/lib/pytrainer/gui/windowimportdata.py:568 -#: build/lib/pytrainer/gui/windowplugins.py:103 #: pytrainer/gui/windowimportdata.py:568 #: pytrainer/gui/windowplugins.py:103 msgid "Ok" msgstr "Ok" -#: build/lib/pytrainer/gui/windowimportdata.py:628 #: pytrainer/gui/windowimportdata.py:628 msgid "Saving options" msgstr "Guardar configuración" -#: build/lib/pytrainer/gui/windowimportdata.py:630 #: pytrainer/gui/windowimportdata.py:630 msgid "Options saved" msgstr "Configuración guardada" -#: build/lib/pytrainer/gui/windowimportdata.py:655 #: pytrainer/gui/windowimportdata.py:655 msgid "Importing one activity" msgstr "Importando una actividad" -#: build/lib/pytrainer/gui/windowimportdata.py:656 #: pytrainer/gui/windowimportdata.py:656 msgid "Imported one activity" msgstr "Una actividad importada" -#: build/lib/pytrainer/gui/windowimportdata.py:658 #: pytrainer/gui/windowimportdata.py:658 #, python-format msgid "Importing %d activities" msgstr "Importando %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:659 #: pytrainer/gui/windowimportdata.py:659 #, python-format msgid "Imported %d activities" msgstr "Importadas %d actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:678 #: pytrainer/gui/windowimportdata.py:678 msgid "Choose a file (or files) to import activities from" msgstr "Seleccione fichero/s desde el/los que importar actividades" -#: build/lib/pytrainer/gui/windowimportdata.py:693 -#: build/lib/pytrainer/gui/windowimportdata.py:694 #: pytrainer/gui/windowimportdata.py:693 #: pytrainer/gui/windowimportdata.py:694 #, python-format msgid "Found file of type: %s" msgstr "Tipo de fichero encontrado: %s" -#: build/lib/pytrainer/gui/windowimportdata.py:718 #: pytrainer/gui/windowimportdata.py:718 msgid "Found in database" msgstr "Encontrado en base de datos" -#: build/lib/pytrainer/gui/windowimportdata.py:733 -#: build/lib/pytrainer/gui/windowimportdata.py:734 #: pytrainer/gui/windowimportdata.py:733 #: pytrainer/gui/windowimportdata.py:734 #, python-format msgid "File %s is of unknown or unsupported file type" msgstr "Fichero %s seleccionado desconocido o no soportado" -#: build/lib/pytrainer/gui/windowimportdata.py:807 #: pytrainer/gui/windowimportdata.py:807 #, python-format msgid "Column %d" msgstr "Columna %d" -#: build/lib/pytrainer/gui/drawArea.py:166 -#: build/lib/pytrainer/extensions/googlemaps.py:129 -#: build/lib/pytrainer/extensions/osm.py:50 #: pytrainer/gui/drawArea.py:166 #: pytrainer/extensions/googlemaps.py:129 #: pytrainer/extensions/osm.py:50 msgid "min" msgstr "min" -#: build/lib/pytrainer/gui/drawArea.py:403 #: pytrainer/gui/drawArea.py:403 msgid "rest" msgstr "descanso" -#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowrecord.py:210 msgid "GPX File" msgstr "Archivo GPX" -#: build/lib/pytrainer/gui/windowprofile.py:41 #: pytrainer/gui/windowprofile.py:41 msgid "Male" msgstr "Varón" -#: build/lib/pytrainer/gui/windowprofile.py:42 #: pytrainer/gui/windowprofile.py:42 msgid "Female" msgstr "Mujer" -#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "MET" msgstr "M.E.T." -#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "Maximum Pace" msgstr "Ritmo más rápido" -#: build/lib/pytrainer/gui/windowprofile.py:327 #: pytrainer/gui/windowprofile.py:327 msgid "Sport Creation Error" msgstr "Fallo en la creación de deporte" -#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Track Name" msgstr "Nombre de la ruta" -#: build/lib/pytrainer/gui/drawGraph.py:170 #: pytrainer/gui/drawGraph.py:170 msgid "Athlete Data" msgstr "Datos del atleta" -#: build/lib/pytrainer/gui/windowextensions.py:112 -#: build/lib/pytrainer/gui/windowextensions.py:125 #: pytrainer/gui/windowextensions.py:112 #: pytrainer/gui/windowextensions.py:125 msgid "OK" msgstr "Ok" -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" -#: build/lib/pytrainer/recordgraph.py:134 -#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" -#: build/lib/pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:136 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/recordgraph.py:136 -#: build/lib/pytrainer/lib/activity.py:325 -#: build/lib/pytrainer/lib/activity.py:415 -#: build/lib/pytrainer/lib/activity.py:417 #: pytrainer/recordgraph.py:136 #: pytrainer/lib/activity.py:325 #: pytrainer/lib/activity.py:415 @@ -2132,10 +1895,6 @@ msgid "Speed" msgstr "Velocidad" -#: build/lib/pytrainer/recordgraph.py:138 -#: build/lib/pytrainer/lib/activity.py:314 -#: build/lib/pytrainer/lib/activity.py:424 -#: build/lib/pytrainer/lib/activity.py:426 #: pytrainer/recordgraph.py:138 #: pytrainer/lib/activity.py:314 #: pytrainer/lib/activity.py:424 @@ -2143,94 +1902,66 @@ msgid "Pace" msgstr "Ritmo" -#: build/lib/pytrainer/recordgraph.py:140 -#: build/lib/pytrainer/heartrategraph.py:36 -#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" -#: build/lib/pytrainer/recordgraph.py:142 #: pytrainer/recordgraph.py:142 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" -#: build/lib/pytrainer/recordgraph.py:142 -#: build/lib/pytrainer/lib/activity.py:452 -#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/recordgraph.py:142 #: pytrainer/lib/activity.py:452 #: pytrainer/lib/activity.py:454 msgid "Cadence" msgstr "Cadence" -#: build/lib/pytrainer/recordgraph.py:144 #: pytrainer/recordgraph.py:144 msgid "Beats (%)" msgstr "Pulsaciones (%)" -#: build/lib/pytrainer/recordgraph.py:146 #: pytrainer/recordgraph.py:146 msgid "Zone" msgstr "Zona" -#: build/lib/pytrainer/profile.py:110 #: pytrainer/profile.py:110 msgid "Moderate activity" msgstr "Actividad moderada" -#: build/lib/pytrainer/profile.py:111 #: pytrainer/profile.py:111 msgid "Weight Control" msgstr "Control de peso" -#: build/lib/pytrainer/profile.py:112 #: pytrainer/profile.py:112 msgid "Aerobic" msgstr "Aeróbico" -#: build/lib/pytrainer/profile.py:113 #: pytrainer/profile.py:113 msgid "Anaerobic" msgstr "Anaeróbico" -#: build/lib/pytrainer/profile.py:114 #: pytrainer/profile.py:114 msgid "VO2 MAX" msgstr "VO2 máximo" -#: build/lib/pytrainer/lib/gpx.py:126 #: pytrainer/lib/gpx.py:126 msgid "No Name" msgstr "Sin nombre" -#: build/lib/pytrainer/lib/gpx.py:133 #: pytrainer/lib/gpx.py:133 msgid "No Data" msgstr "Sin datos" -#: build/lib/pytrainer/lib/activity.py:199 #: pytrainer/lib/activity.py:199 msgid "feet" msgstr "pies" -#: build/lib/pytrainer/lib/activity.py:312 #: pytrainer/lib/activity.py:312 msgid "Pace by Lap" msgstr "Ritmo por vuelta" -#: build/lib/pytrainer/lib/activity.py:318 -#: build/lib/pytrainer/lib/activity.py:329 -#: build/lib/pytrainer/lib/activity.py:401 -#: build/lib/pytrainer/lib/activity.py:411 -#: build/lib/pytrainer/lib/activity.py:420 -#: build/lib/pytrainer/lib/activity.py:429 -#: build/lib/pytrainer/lib/activity.py:438 -#: build/lib/pytrainer/lib/activity.py:448 -#: build/lib/pytrainer/lib/activity.py:457 -#: build/lib/pytrainer/lib/activity.py:519 #: pytrainer/lib/activity.py:318 #: pytrainer/lib/activity.py:329 #: pytrainer/lib/activity.py:401 @@ -2244,51 +1975,37 @@ msgid "Time (seconds)" msgstr "Tiempo (segundos)" -#: build/lib/pytrainer/lib/activity.py:323 #: pytrainer/lib/activity.py:323 msgid "Speed by Lap" msgstr "Velocidad por vuelta" -#: build/lib/pytrainer/lib/activity.py:395 -#: build/lib/pytrainer/lib/activity.py:397 #: pytrainer/lib/activity.py:395 #: pytrainer/lib/activity.py:397 msgid "Elevation" msgstr "Altura" -#: build/lib/pytrainer/lib/activity.py:406 -#: build/lib/pytrainer/lib/activity.py:408 #: pytrainer/lib/activity.py:406 #: pytrainer/lib/activity.py:408 msgid "Corrected Elevation" msgstr "Altura corregida" -#: build/lib/pytrainer/lib/activity.py:443 #: pytrainer/lib/activity.py:443 #, python-format msgid "Heart Rate (% of max)" msgstr "Frecuencia cardíaca (% del máx.)" -#: build/lib/pytrainer/lib/activity.py:445 #: pytrainer/lib/activity.py:445 msgid "%" msgstr "%" -#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/lib/activity.py:454 msgid "rpm" msgstr "rpm" -#: build/lib/pytrainer/lib/activity.py:513 #: pytrainer/lib/activity.py:513 msgid "Heart Rate zone" msgstr "Zona frecuencia cardiaca" -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/monthgraph.py:30 #: pytrainer/monthgraph.py:26 #: pytrainer/monthgraph.py:27 #: pytrainer/monthgraph.py:28 @@ -2297,17 +2014,11 @@ msgid "day" msgstr "día" -#: build/lib/pytrainer/monthgraph.py:26 -#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/monthgraph.py:26 #: pytrainer/weekgraph.py:28 msgid "Daily Distance" msgstr "Distancia" -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/totalgraph.py:25 -#: build/lib/pytrainer/yeargraph.py:27 -#: build/lib/pytrainer/weekgraph.py:29 #: pytrainer/monthgraph.py:27 #: pytrainer/totalgraph.py:25 #: pytrainer/yeargraph.py:27 @@ -2315,17 +2026,11 @@ msgid "Time (hours)" msgstr "Tiempo en horas" -#: build/lib/pytrainer/monthgraph.py:27 -#: build/lib/pytrainer/weekgraph.py:29 #: pytrainer/monthgraph.py:27 #: pytrainer/weekgraph.py:29 msgid "Daily Time" msgstr "Tiempo diario" -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/totalgraph.py:26 -#: build/lib/pytrainer/yeargraph.py:28 -#: build/lib/pytrainer/weekgraph.py:30 #: pytrainer/monthgraph.py:28 #: pytrainer/totalgraph.py:26 #: pytrainer/yeargraph.py:28 @@ -2333,32 +2038,21 @@ msgid "Average Heart Rate (bpm)" msgstr "Pulsaciones medias (ppm)" -#: build/lib/pytrainer/monthgraph.py:28 -#: build/lib/pytrainer/weekgraph.py:30 #: pytrainer/monthgraph.py:28 #: pytrainer/weekgraph.py:30 msgid "Daily Average Heart Rate" msgstr "Pulsaciones diarias" -#: build/lib/pytrainer/monthgraph.py:29 -#: build/lib/pytrainer/weekgraph.py:31 #: pytrainer/monthgraph.py:29 #: pytrainer/weekgraph.py:31 msgid "Daily Average Speed" msgstr "medias diarias" -#: build/lib/pytrainer/monthgraph.py:30 -#: build/lib/pytrainer/weekgraph.py:32 #: pytrainer/monthgraph.py:30 #: pytrainer/weekgraph.py:32 msgid "Daily Calories" msgstr "Calorías diarias" -#: build/lib/pytrainer/totalgraph.py:24 -#: build/lib/pytrainer/totalgraph.py:25 -#: build/lib/pytrainer/totalgraph.py:26 -#: build/lib/pytrainer/totalgraph.py:27 -#: build/lib/pytrainer/totalgraph.py:28 #: pytrainer/totalgraph.py:24 #: pytrainer/totalgraph.py:25 #: pytrainer/totalgraph.py:26 @@ -2367,51 +2061,38 @@ msgid "year" msgstr "año" -#: build/lib/pytrainer/totalgraph.py:24 #: pytrainer/totalgraph.py:24 msgid "Annual Distance" msgstr "Distancia anual" -#: build/lib/pytrainer/totalgraph.py:25 #: pytrainer/totalgraph.py:25 msgid "Annual Time" msgstr "Tiempo anual" -#: build/lib/pytrainer/totalgraph.py:26 #: pytrainer/totalgraph.py:26 msgid "Annual Average Heart Rate" msgstr "Pulsaciones medias en el año" -#: build/lib/pytrainer/totalgraph.py:27 #: pytrainer/totalgraph.py:27 msgid "Annual Average Speed" msgstr "Velocidad media anual" -#: build/lib/pytrainer/totalgraph.py:28 #: pytrainer/totalgraph.py:28 msgid "Annual Calories" msgstr "Calorías (kcal) en el año" -#: build/lib/pytrainer/athlete.py:52 #: pytrainer/athlete.py:52 msgid "lb" msgstr "lb" -#: build/lib/pytrainer/athlete.py:54 #: pytrainer/athlete.py:54 msgid "kg" msgstr "kg" -#: build/lib/pytrainer/record.py:518 #: pytrainer/record.py:518 msgid "pyTrainer can't import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" -#: build/lib/pytrainer/yeargraph.py:26 -#: build/lib/pytrainer/yeargraph.py:27 -#: build/lib/pytrainer/yeargraph.py:28 -#: build/lib/pytrainer/yeargraph.py:29 -#: build/lib/pytrainer/yeargraph.py:30 #: pytrainer/yeargraph.py:26 #: pytrainer/yeargraph.py:27 #: pytrainer/yeargraph.py:28 @@ -2420,47 +2101,38 @@ msgid "month" msgstr "mes" -#: build/lib/pytrainer/yeargraph.py:26 #: pytrainer/yeargraph.py:26 msgid "Monthly Distance" msgstr "Distancia" -#: build/lib/pytrainer/yeargraph.py:27 #: pytrainer/yeargraph.py:27 msgid "Monthly Time" msgstr "Tiempo mensual" -#: build/lib/pytrainer/yeargraph.py:28 #: pytrainer/yeargraph.py:28 msgid "Monthly Average Heart Rate" msgstr "Pulsaciones medias mensuales" -#: build/lib/pytrainer/yeargraph.py:29 #: pytrainer/yeargraph.py:29 msgid "Monthly Average Speed" msgstr "Medias mensuales" -#: build/lib/pytrainer/yeargraph.py:30 #: pytrainer/yeargraph.py:30 msgid "Monthly Calories" msgstr "Calorías mensuales" -#: build/lib/pytrainer/waypoint.py:87 #: pytrainer/waypoint.py:87 msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" msgstr "Parece que el archivo gpx contiene actividades de varios días. Probablemente necesites editarlo" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity (Km/h)" msgstr "Velocidad (km/h)" -#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity" msgstr "Velocidad" -#: build/lib/pytrainer/main.py:475 #: pytrainer/main.py:475 msgid "Delete this waypoint?" msgstr "¿Borrar este waypoint?" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-03-20 20:03:56
|
Revision: 775 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=775&view=rev Author: dgranda Date: 2011-03-20 20:03:50 +0000 (Sun, 20 Mar 2011) Log Message: ----------- Added column name to identify how laps were triggered Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-19 18:52:20 UTC (rev 774) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-20 20:03:50 UTC (rev 775) @@ -147,7 +147,7 @@ #create the columns for the laps treeview columns=[ {'name':_("Lap")}, - {'name':_(" "), 'xalign':0, 'pixbuf':True}, + {'name':_("Trigger"), 'xalign':0, 'pixbuf':True}, {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-03-19 18:52:26
|
Revision: 774 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=774&view=rev Author: dgranda Date: 2011-03-19 18:52:20 +0000 (Sat, 19 Mar 2011) Log Message: ----------- Replacing empty description with whitespace to avoid problems with localizations. Updating version number according to svn revision Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-19 18:49:00 UTC (rev 773) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-19 18:52:20 UTC (rev 774) @@ -147,7 +147,7 @@ #create the columns for the laps treeview columns=[ {'name':_("Lap")}, - {'name':_(""), 'xalign':0, 'pixbuf':True}, + {'name':_(" "), 'xalign':0, 'pixbuf':True}, {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'}, Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-03-19 18:49:00 UTC (rev 773) +++ pytrainer/trunk/pytrainer/main.py 2011-03-19 18:52:20 UTC (rev 774) @@ -54,7 +54,7 @@ class pyTrainer: def __init__(self,filename = None, data_path = None): #Version constants - self.version ="1.8.0-svn#753" + self.version ="1.8.0-svn#774" self.DB_version = 7 #Process command line options self.startup_options = self.get_options() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-03-19 18:49:08
|
Revision: 773 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=773&view=rev Author: dgranda Date: 2011-03-19 18:49:00 +0000 (Sat, 19 Mar 2011) Log Message: ----------- Updated ES localization Modified Paths: -------------- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer.mo =================================================================== (Binary files differ) Modified: pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po =================================================================== --- pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-03-19 00:16:14 UTC (rev 772) +++ pytrainer/trunk/locale/es/LC_MESSAGES/pytrainer_es.po 2011-03-19 18:49:00 UTC (rev 773) @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pytrainer 1.7.2\n" +"Project-Id-Version: pytrainer 1.8.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-24 13:39+0100\n" -"PO-Revision-Date: 2010-11-24 13:43+0100\n" +"POT-Creation-Date: 2011-03-19 19:43+0100\n" +"PO-Revision-Date: 2011-03-19 19:44+0100\n" "Last-Translator: David Garcia Granda <dg...@gm...>\n" "Language-Team: Spanish <es...@li...>\n" "Language: es\n" @@ -47,6 +47,7 @@ #: glade/equipment.glade:277 #: glade/equipment.glade:533 +#: build/lib/pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowimportdata.py:352 msgid "Notes" msgstr "Notas" @@ -83,7 +84,7 @@ #: glade/extensions.glade:82 #: glade/plugins.glade:144 #: glade/profile.glade:727 -#: glade/pytrainer.glade:5161 +#: glade/pytrainer.glade:5228 msgid "Name:" msgstr "Nombre:" @@ -94,7 +95,7 @@ #: glade/extensions.glade:110 #: glade/plugins.glade:86 -#: glade/pytrainer.glade:5690 +#: glade/pytrainer.glade:6048 msgid "Description:" msgstr "<b>Descripción:</b>" @@ -238,9 +239,13 @@ msgstr "<b>Delimitador en el archivo</b>" #: glade/importdata.glade:864 -#: pytrainer/gui/windowmain.py:109 -#: pytrainer/gui/windowmain.py:124 -#: pytrainer/gui/windowmain.py:1147 +#: build/lib/pytrainer/gui/windowmain.py:112 +#: build/lib/pytrainer/gui/windowmain.py:127 +#: build/lib/pytrainer/gui/windowmain.py:1282 +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 +#: pytrainer/gui/windowmain.py:112 +#: pytrainer/gui/windowmain.py:127 +#: pytrainer/gui/windowmain.py:1282 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Date" msgstr "Fecha" @@ -264,6 +269,21 @@ msgstr "Descartar" #: glade/importdata.glade:892 +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/recordgraph.py:136 +#: build/lib/pytrainer/recordgraph.py:138 +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/recordgraph.py:142 +#: build/lib/pytrainer/recordgraph.py:144 +#: build/lib/pytrainer/recordgraph.py:146 +#: build/lib/pytrainer/monthgraph.py:26 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/totalgraph.py:24 +#: build/lib/pytrainer/yeargraph.py:26 +#: build/lib/pytrainer/daygraph.py:52 +#: build/lib/pytrainer/daygraph.py:54 +#: build/lib/pytrainer/daygraph.py:56 +#: build/lib/pytrainer/weekgraph.py:28 #: pytrainer/recordgraph.py:134 #: pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:138 @@ -271,13 +291,14 @@ #: pytrainer/recordgraph.py:142 #: pytrainer/recordgraph.py:144 #: pytrainer/recordgraph.py:146 -#: pytrainer/monthgraph.py:70 +#: pytrainer/monthgraph.py:26 #: pytrainer/heartrategraph.py:36 -#: pytrainer/yeargraph.py:70 +#: pytrainer/totalgraph.py:24 +#: pytrainer/yeargraph.py:26 #: pytrainer/daygraph.py:52 #: pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:56 -#: pytrainer/weekgraph.py:115 +#: pytrainer/weekgraph.py:28 msgid "Distance (km)" msgstr "Distancia (km)" @@ -294,8 +315,10 @@ msgstr "<b>Columna en el archivo</b>" #: glade/importdata.glade:972 -#: pytrainer/gui/windowmain.py:108 -#: pytrainer/gui/windowmain.py:1146 +#: build/lib/pytrainer/gui/windowmain.py:111 +#: build/lib/pytrainer/gui/windowmain.py:1281 +#: pytrainer/gui/windowmain.py:111 +#: pytrainer/gui/windowmain.py:1281 msgid "Title" msgstr "Título" @@ -316,17 +339,30 @@ msgstr "Velocidad Máx. (km/h)" #: glade/importdata.glade:1037 -#: pytrainer/monthgraph.py:76 -#: pytrainer/yeargraph.py:76 -#: pytrainer/weekgraph.py:121 +#: build/lib/pytrainer/monthgraph.py:29 +#: build/lib/pytrainer/totalgraph.py:27 +#: build/lib/pytrainer/yeargraph.py:29 +#: build/lib/pytrainer/weekgraph.py:31 +#: pytrainer/monthgraph.py:29 +#: pytrainer/totalgraph.py:27 +#: pytrainer/yeargraph.py:29 +#: pytrainer/weekgraph.py:31 msgid "Average Speed (km/h)" msgstr "Velocidad media (km/h)" #: glade/importdata.glade:1050 #: glade/pytrainer.glade:277 -#: pytrainer/gui/windowmain.py:103 -#: pytrainer/gui/windowmain.py:111 -#: pytrainer/gui/windowmain.py:1149 +#: build/lib/pytrainer/gui/windowmain.py:106 +#: build/lib/pytrainer/gui/windowmain.py:114 +#: build/lib/pytrainer/gui/windowmain.py:136 +#: build/lib/pytrainer/gui/windowmain.py:1284 +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 +#: build/lib/pytrainer/gui/windowprofile.py:59 +#: pytrainer/gui/windowmain.py:106 +#: pytrainer/gui/windowmain.py:114 +#: pytrainer/gui/windowmain.py:136 +#: pytrainer/gui/windowmain.py:1284 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowprofile.py:59 @@ -342,6 +378,7 @@ msgstr "Pulsaciones máximas (ppm)" #: glade/importdata.glade:1089 +#: build/lib/pytrainer/recordgraph.py:138 #: pytrainer/recordgraph.py:138 msgid "Pace (min/km)" msgstr "Ritmo (min/km)" @@ -361,6 +398,8 @@ #: glade/importdata.glade:1323 #: glade/newrecord.glade:404 +#: build/lib/pytrainer/gui/windowmain.py:150 +#: pytrainer/gui/windowmain.py:150 msgid " " msgstr " " @@ -391,7 +430,8 @@ msgstr "<b>Importar desde fichero CSV</b>" #: glade/newrecord.glade:7 -#: pytrainer/gui/windowmain.py:1769 +#: build/lib/pytrainer/gui/windowmain.py:1945 +#: pytrainer/gui/windowmain.py:1945 msgid "New Entry" msgstr "Nueva entrada" @@ -503,11 +543,20 @@ msgstr "Pulsaciones" #: glade/newrecord.glade:902 -#: pytrainer/gui/windowmain.py:115 -#: pytrainer/gui/windowmain.py:1153 -#: pytrainer/monthgraph.py:78 -#: pytrainer/yeargraph.py:78 -#: pytrainer/weekgraph.py:123 +#: build/lib/pytrainer/gui/windowmain.py:118 +#: build/lib/pytrainer/gui/windowmain.py:159 +#: build/lib/pytrainer/gui/windowmain.py:1288 +#: build/lib/pytrainer/monthgraph.py:30 +#: build/lib/pytrainer/totalgraph.py:28 +#: build/lib/pytrainer/yeargraph.py:30 +#: build/lib/pytrainer/weekgraph.py:32 +#: pytrainer/gui/windowmain.py:118 +#: pytrainer/gui/windowmain.py:159 +#: pytrainer/gui/windowmain.py:1288 +#: pytrainer/monthgraph.py:30 +#: pytrainer/totalgraph.py:28 +#: pytrainer/yeargraph.py:30 +#: pytrainer/weekgraph.py:32 msgid "Calories" msgstr "Calorías" @@ -569,12 +618,12 @@ msgstr "<b>Sistema de medida</b>" #: glade/profile.glade:103 -#: glade/pytrainer.glade:2023 +#: glade/pytrainer.glade:2090 msgid "Google" msgstr "Google" #: glade/profile.glade:118 -#: glade/pytrainer.glade:2006 +#: glade/pytrainer.glade:2073 msgid "Open Street Map" msgstr "Open Street Map" @@ -619,12 +668,12 @@ msgstr "Género:" #: glade/profile.glade:407 -#: glade/pytrainer.glade:5186 +#: glade/pytrainer.glade:5253 msgid "Height:" msgstr "Altura:" #: glade/profile.glade:447 -#: glade/pytrainer.glade:5173 +#: glade/pytrainer.glade:5240 msgid "Date of birth:" msgstr "Fecha de nacimiento:" @@ -633,12 +682,12 @@ msgstr "Peso:" #: glade/profile.glade:542 -#: glade/pytrainer.glade:5248 +#: glade/pytrainer.glade:5315 msgid "<b>Athlete Details</b>" msgstr "<b>Datos personales</b>" #: glade/profile.glade:557 -#: glade/pytrainer.glade:5351 +#: glade/pytrainer.glade:5418 msgid "Athlete" msgstr "Atleta" @@ -700,6 +749,7 @@ msgstr "M.E.T." #: glade/profile.glade:1156 +#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "Extra Weight" msgstr "Peso extra" @@ -745,7 +795,8 @@ msgstr "Basado en porcentajes" #: glade/profile.glade:1565 -#: pytrainer/gui/windowmain.py:614 +#: build/lib/pytrainer/gui/windowmain.py:710 +#: pytrainer/gui/windowmain.py:710 msgid "Karvonen method" msgstr "Karvonen" @@ -758,6 +809,13 @@ msgstr "<b>Zonas de frecuencia cardiaca</b>" #: glade/profile.glade:1647 +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/lib/activity.py:433 +#: build/lib/pytrainer/lib/activity.py:435 +#: build/lib/pytrainer/lib/activity.py:445 +#: build/lib/pytrainer/lib/activity.py:515 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/lib/activity.py:433 #: pytrainer/lib/activity.py:435 @@ -865,7 +923,7 @@ msgstr "_Ayuda" #: glade/pytrainer.glade:290 -#: glade/pytrainer.glade:5467 +#: glade/pytrainer.glade:5825 msgid "All Sports" msgstr "Deportes" @@ -874,26 +932,26 @@ msgstr "<b>Deporte:</b>" #: glade/pytrainer.glade:408 -#: glade/pytrainer.glade:2726 -#: glade/pytrainer.glade:3337 -#: glade/pytrainer.glade:3960 -#: glade/pytrainer.glade:4659 +#: glade/pytrainer.glade:2793 +#: glade/pytrainer.glade:3404 +#: glade/pytrainer.glade:4027 +#: glade/pytrainer.glade:4726 msgid "<b>Duration:</b>" msgstr "<b>Duración:</b>" #: glade/pytrainer.glade:423 -#: glade/pytrainer.glade:2816 -#: glade/pytrainer.glade:3416 -#: glade/pytrainer.glade:4039 -#: glade/pytrainer.glade:4761 +#: glade/pytrainer.glade:2883 +#: glade/pytrainer.glade:3483 +#: glade/pytrainer.glade:4106 +#: glade/pytrainer.glade:4828 msgid "<b>Speed:</b>" msgstr "<b>Velocidad:</b>" #: glade/pytrainer.glade:437 -#: glade/pytrainer.glade:2984 -#: glade/pytrainer.glade:3611 -#: glade/pytrainer.glade:4234 -#: glade/pytrainer.glade:4856 +#: glade/pytrainer.glade:3051 +#: glade/pytrainer.glade:3678 +#: glade/pytrainer.glade:4301 +#: glade/pytrainer.glade:4923 msgid "<b>Pace:</b>" msgstr "<b>Ritmo:</b>" @@ -914,10 +972,10 @@ msgstr "<b>Fecha:</b>" #: glade/pytrainer.glade:628 -#: glade/pytrainer.glade:2712 -#: glade/pytrainer.glade:3323 -#: glade/pytrainer.glade:3946 -#: glade/pytrainer.glade:4645 +#: glade/pytrainer.glade:2779 +#: glade/pytrainer.glade:3390 +#: glade/pytrainer.glade:4013 +#: glade/pytrainer.glade:4712 msgid "<b>Distance:</b>" msgstr "<b>Distancia:</b>" @@ -926,10 +984,10 @@ msgstr "<b>Pico velocidad:</b>" #: glade/pytrainer.glade:661 -#: glade/pytrainer.glade:3014 -#: glade/pytrainer.glade:3625 -#: glade/pytrainer.glade:4248 -#: glade/pytrainer.glade:4871 +#: glade/pytrainer.glade:3081 +#: glade/pytrainer.glade:3692 +#: glade/pytrainer.glade:4315 +#: glade/pytrainer.glade:4938 msgid "<b>Max Pace:</b>" msgstr "<b>Pico ritmo:</b>" @@ -938,37 +996,45 @@ msgstr "<b>Descenso:</b>" #: glade/pytrainer.glade:769 -#: glade/pytrainer.glade:2924 -#: glade/pytrainer.glade:3491 -#: glade/pytrainer.glade:4114 -#: glade/pytrainer.glade:4571 +#: glade/pytrainer.glade:2991 +#: glade/pytrainer.glade:3558 +#: glade/pytrainer.glade:4181 +#: glade/pytrainer.glade:4638 msgid "Cal" msgstr "Cal" #: glade/pytrainer.glade:808 -#: glade/pytrainer.glade:2686 -#: glade/pytrainer.glade:3297 -#: glade/pytrainer.glade:3920 -#: glade/pytrainer.glade:4748 -#: pytrainer/gui/windowmain.py:102 +#: glade/pytrainer.glade:2753 +#: glade/pytrainer.glade:3364 +#: glade/pytrainer.glade:3987 +#: glade/pytrainer.glade:4815 +#: build/lib/pytrainer/gui/windowmain.py:105 +#: pytrainer/gui/windowmain.py:105 msgid "Km" msgstr "km" #: glade/pytrainer.glade:823 -#: glade/pytrainer.glade:2846 -#: glade/pytrainer.glade:2879 -#: glade/pytrainer.glade:3446 -#: glade/pytrainer.glade:3539 -#: glade/pytrainer.glade:4069 -#: glade/pytrainer.glade:4162 -#: glade/pytrainer.glade:4791 -#: glade/pytrainer.glade:4807 -#: pytrainer/gui/windowmain.py:631 -#: pytrainer/gui/windowmain.py:632 -#: pytrainer/gui/windowmain.py:754 -#: pytrainer/gui/windowmain.py:755 -#: pytrainer/gui/windowmain.py:832 -#: pytrainer/gui/windowmain.py:833 +#: glade/pytrainer.glade:2913 +#: glade/pytrainer.glade:2946 +#: glade/pytrainer.glade:3513 +#: glade/pytrainer.glade:3606 +#: glade/pytrainer.glade:4136 +#: glade/pytrainer.glade:4229 +#: glade/pytrainer.glade:4858 +#: glade/pytrainer.glade:4874 +#: build/lib/pytrainer/gui/windowmain.py:727 +#: build/lib/pytrainer/gui/windowmain.py:728 +#: build/lib/pytrainer/gui/windowmain.py:850 +#: build/lib/pytrainer/gui/windowmain.py:851 +#: build/lib/pytrainer/gui/windowmain.py:928 +#: build/lib/pytrainer/gui/windowmain.py:929 +#: build/lib/pytrainer/lib/activity.py:202 +#: pytrainer/gui/windowmain.py:727 +#: pytrainer/gui/windowmain.py:728 +#: pytrainer/gui/windowmain.py:850 +#: pytrainer/gui/windowmain.py:851 +#: pytrainer/gui/windowmain.py:928 +#: pytrainer/gui/windowmain.py:929 #: pytrainer/lib/activity.py:202 msgid "km/h" msgstr "km/h" @@ -977,16 +1043,21 @@ msgid "<b>Equipment:</b>" msgstr "<b>Material:</b>" -#: glade/pytrainer.glade:1014 +#: glade/pytrainer.glade:984 +msgid "<b>Laps</b>" +msgstr "<b>Vueltas</b>" + +#: glade/pytrainer.glade:1056 msgid " <b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:1064 -#: pytrainer/gui/windowmain.py:1375 +#: glade/pytrainer.glade:1106 +#: build/lib/pytrainer/gui/windowmain.py:1510 +#: pytrainer/gui/windowmain.py:1510 msgid "Show graph display options" msgstr "Mostrar opciones del gráfico" -#: glade/pytrainer.glade:1082 +#: glade/pytrainer.glade:1124 msgid "" "Profile\n" "Speed\n" @@ -1004,14 +1075,15 @@ "Porcentaje\n" "Zona" -#: glade/pytrainer.glade:1099 -#: glade/pytrainer.glade:3831 -#: glade/pytrainer.glade:4454 -#: glade/pytrainer.glade:5076 +#: glade/pytrainer.glade:1141 +#: glade/pytrainer.glade:3898 +#: glade/pytrainer.glade:4521 +#: glade/pytrainer.glade:5143 +#: glade/pytrainer.glade:5503 msgid "Versus" msgstr "contra" -#: glade/pytrainer.glade:1110 +#: glade/pytrainer.glade:1152 msgid "" "None\n" "Profile\n" @@ -1026,199 +1098,224 @@ "Ritmo\n" "Pulsaciones\n" -#: glade/pytrainer.glade:1257 +#: glade/pytrainer.glade:1299 msgid "<small>Graph Display Options</small>" msgstr "<small>Opciones de visualización gráfica</small>" -#: glade/pytrainer.glade:1282 -#: glade/pytrainer.glade:1497 -#: glade/pytrainer.glade:1717 +#: glade/pytrainer.glade:1324 +#: glade/pytrainer.glade:1539 +#: glade/pytrainer.glade:1759 msgid "<small>Limits</small>" msgstr "<small>Límites</small>" -#: glade/pytrainer.glade:1294 -#: glade/pytrainer.glade:1509 -#: glade/pytrainer.glade:1763 +#: glade/pytrainer.glade:1336 +#: glade/pytrainer.glade:1551 +#: glade/pytrainer.glade:1805 msgid "<small>Min</small>" msgstr "<small>Mín</small>" -#: glade/pytrainer.glade:1306 -#: glade/pytrainer.glade:1521 -#: glade/pytrainer.glade:1775 +#: glade/pytrainer.glade:1348 +#: glade/pytrainer.glade:1563 +#: glade/pytrainer.glade:1817 msgid "<small>Max</small>" msgstr "<small>Máx</small>" -#: glade/pytrainer.glade:1355 -#: glade/pytrainer.glade:1577 +#: glade/pytrainer.glade:1397 +#: glade/pytrainer.glade:1619 msgid "<small>Color</small>" msgstr "<small>Color</small>" -#: glade/pytrainer.glade:1386 -#: glade/pytrainer.glade:1590 +#: glade/pytrainer.glade:1428 +#: glade/pytrainer.glade:1632 msgid "<small>Weight</small>" msgstr "<small>Peso</small>" -#: glade/pytrainer.glade:1416 +#: glade/pytrainer.glade:1458 msgid "Y1" msgstr "Y1" -#: glade/pytrainer.glade:1427 -#: glade/pytrainer.glade:1638 +#: glade/pytrainer.glade:1469 +#: glade/pytrainer.glade:1680 msgid "<small>Smoothing</small>" msgstr "<small>Suavizado</small>" -#: glade/pytrainer.glade:1567 +#: glade/pytrainer.glade:1609 msgid "Y2" msgstr "Y2" -#: glade/pytrainer.glade:1707 +#: glade/pytrainer.glade:1749 msgid "X" msgstr "X" -#: glade/pytrainer.glade:1788 +#: glade/pytrainer.glade:1830 msgid "<small>Distance</small>" msgstr "<small>Distancia</small>" -#: glade/pytrainer.glade:1817 +#: glade/pytrainer.glade:1859 msgid "<small>Time</small>" msgstr "<small>Tiempo</small>" -#: glade/pytrainer.glade:1878 +#: glade/pytrainer.glade:1920 msgid "Show Laps" msgstr "Mostras vueltas" -#: glade/pytrainer.glade:1917 +#: glade/pytrainer.glade:1959 msgid "Reset Graph" msgstr "Resetear" -#: glade/pytrainer.glade:1979 +#: glade/pytrainer.glade:2021 msgid "Redraw Map" msgstr "Restaurar" -#: glade/pytrainer.glade:1995 +#: glade/pytrainer.glade:2037 +msgid "<small>Show:</small>" +msgstr "<small>Mostrar:</small>" + +#: glade/pytrainer.glade:2048 +msgid "" +"None\n" +"Speed\n" +"Heart rate\n" +"Cadence" +msgstr "" +"Nada\n" +"Velocidad\n" +"Pulsaciones\n" +"Cadencia" + +#: glade/pytrainer.glade:2063 msgid "<small>Display map using:</small>" msgstr "<small>Opciones de visualización de mapas:</small>" -#: glade/pytrainer.glade:2097 +#: glade/pytrainer.glade:2164 msgid "<b>Beats:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2109 -#: glade/pytrainer.glade:2894 -#: glade/pytrainer.glade:3461 -#: glade/pytrainer.glade:4084 -#: glade/pytrainer.glade:4541 +#: glade/pytrainer.glade:2176 +#: glade/pytrainer.glade:2961 +#: glade/pytrainer.glade:3528 +#: glade/pytrainer.glade:4151 +#: glade/pytrainer.glade:4608 msgid "<b>Calories: </b>" msgstr "<b>Calorías: </b>" -#: glade/pytrainer.glade:2123 -#: glade/pytrainer.glade:3046 -#: glade/pytrainer.glade:3689 -#: glade/pytrainer.glade:4312 -#: glade/pytrainer.glade:4919 +#: glade/pytrainer.glade:2190 +#: glade/pytrainer.glade:3113 +#: glade/pytrainer.glade:3756 +#: glade/pytrainer.glade:4379 +#: glade/pytrainer.glade:4986 msgid "<b>Max Beats:</b>" msgstr "<b>Pico pulsaciones:</b>" -#: glade/pytrainer.glade:2137 +#: glade/pytrainer.glade:2204 msgid "<b>HR Zones Method:</b>" msgstr "<b>Método de cálculo:</b>" -#: glade/pytrainer.glade:2152 +#: glade/pytrainer.glade:2219 msgid "<b>HR Zone5:</b>" msgstr "<b>Máximo esfuerzo:</b>" -#: glade/pytrainer.glade:2167 -#: glade/pytrainer.glade:2366 +#: glade/pytrainer.glade:2234 +#: glade/pytrainer.glade:2433 msgid " bpm" msgstr "ppm" -#: glade/pytrainer.glade:2183 +#: glade/pytrainer.glade:2250 msgid " Cal" msgstr "Cal" -#: glade/pytrainer.glade:2241 +#: glade/pytrainer.glade:2308 msgid "<b>HR Zone4:</b>" msgstr "<b>Anaeróbica:</b>" -#: glade/pytrainer.glade:2257 +#: glade/pytrainer.glade:2324 msgid "<b>HR Zone3:</b>" msgstr "<b>Aeróbica:</b>" -#: glade/pytrainer.glade:2273 +#: glade/pytrainer.glade:2340 msgid "<b>HR Zone2:</b>" msgstr "<b>Quemagrasas:</b>" -#: glade/pytrainer.glade:2289 +#: glade/pytrainer.glade:2356 msgid "<b>HR Zone1:</b>" msgstr "<b>Recuperación:</b>" -#: glade/pytrainer.glade:2391 -#: glade/pytrainer.glade:2403 -#: glade/pytrainer.glade:2418 -#: glade/pytrainer.glade:2433 -#: glade/pytrainer.glade:2448 -#: glade/pytrainer.glade:2969 -#: glade/pytrainer.glade:3063 -#: glade/pytrainer.glade:3596 -#: glade/pytrainer.glade:3674 -#: glade/pytrainer.glade:4219 -#: glade/pytrainer.glade:4297 -#: glade/pytrainer.glade:4616 -#: glade/pytrainer.glade:4823 +#: glade/pytrainer.glade:2458 +#: glade/pytrainer.glade:2470 +#: glade/pytrainer.glade:2485 +#: glade/pytrainer.glade:2500 +#: glade/pytrainer.glade:2515 +#: glade/pytrainer.glade:3036 +#: glade/pytrainer.glade:3130 +#: glade/pytrainer.glade:3663 +#: glade/pytrainer.glade:3741 +#: glade/pytrainer.glade:4286 +#: glade/pytrainer.glade:4364 +#: glade/pytrainer.glade:4683 +#: glade/pytrainer.glade:4890 +#: build/lib/pytrainer/lib/activity.py:435 +#: build/lib/pytrainer/lib/activity.py:515 #: pytrainer/lib/activity.py:435 #: pytrainer/lib/activity.py:515 msgid "bpm" msgstr "ppm" -#: glade/pytrainer.glade:2493 +#: glade/pytrainer.glade:2560 msgid " <b>Heart Rate:</b>" msgstr "<b>Pulsaciones:</b>" -#: glade/pytrainer.glade:2653 +#: glade/pytrainer.glade:2720 msgid "Record" msgstr "Registro" -#: glade/pytrainer.glade:2862 -#: glade/pytrainer.glade:3507 -#: glade/pytrainer.glade:4130 -#: glade/pytrainer.glade:4839 +#: glade/pytrainer.glade:2929 +#: glade/pytrainer.glade:3574 +#: glade/pytrainer.glade:4197 +#: glade/pytrainer.glade:4906 msgid "<b>Max Speed:</b>" msgstr "<b>Velocidad máxima:</b>" -#: glade/pytrainer.glade:2939 -#: glade/pytrainer.glade:3566 -#: glade/pytrainer.glade:4189 -#: glade/pytrainer.glade:4586 +#: glade/pytrainer.glade:3006 +#: glade/pytrainer.glade:3633 +#: glade/pytrainer.glade:4256 +#: glade/pytrainer.glade:4653 msgid "<b>Beats avg:</b>" msgstr "<b>Media pulsaciones:</b>" -#: glade/pytrainer.glade:2999 -#: glade/pytrainer.glade:3031 -#: glade/pytrainer.glade:3642 -#: glade/pytrainer.glade:3658 -#: glade/pytrainer.glade:4265 -#: glade/pytrainer.glade:4281 -#: glade/pytrainer.glade:4888 -#: glade/pytrainer.glade:4904 -#: pytrainer/gui/windowmain.py:633 -#: pytrainer/gui/windowmain.py:634 -#: pytrainer/gui/windowmain.py:756 -#: pytrainer/gui/windowmain.py:757 -#: pytrainer/gui/windowmain.py:834 -#: pytrainer/gui/windowmain.py:835 +#: glade/pytrainer.glade:3066 +#: glade/pytrainer.glade:3098 +#: glade/pytrainer.glade:3709 +#: glade/pytrainer.glade:3725 +#: glade/pytrainer.glade:4332 +#: glade/pytrainer.glade:4348 +#: glade/pytrainer.glade:4955 +#: glade/pytrainer.glade:4971 +#: build/lib/pytrainer/gui/windowmain.py:729 +#: build/lib/pytrainer/gui/windowmain.py:730 +#: build/lib/pytrainer/gui/windowmain.py:852 +#: build/lib/pytrainer/gui/windowmain.py:853 +#: build/lib/pytrainer/gui/windowmain.py:930 +#: build/lib/pytrainer/gui/windowmain.py:931 +#: build/lib/pytrainer/lib/activity.py:203 +#: pytrainer/gui/windowmain.py:729 +#: pytrainer/gui/windowmain.py:730 +#: pytrainer/gui/windowmain.py:852 +#: pytrainer/gui/windowmain.py:853 +#: pytrainer/gui/windowmain.py:930 +#: pytrainer/gui/windowmain.py:931 #: pytrainer/lib/activity.py:203 msgid "min/km" msgstr "min/km" -#: glade/pytrainer.glade:3153 +#: glade/pytrainer.glade:3220 msgid " <b>Date:</b>" msgstr "<b>Fecha:</b>" -#: glade/pytrainer.glade:3196 +#: glade/pytrainer.glade:3263 msgid "Value" msgstr "Valor" -#: glade/pytrainer.glade:3207 +#: glade/pytrainer.glade:3274 msgid "" "Stage Profile\n" "Stage Velocity\n" @@ -1228,17 +1325,18 @@ "Velocidad de Etapa\n" "Perfil/Velocidad de Etapa" -#: glade/pytrainer.glade:3263 +#: glade/pytrainer.glade:3330 msgid "Day" msgstr "Día" -#: glade/pytrainer.glade:3765 +#: glade/pytrainer.glade:3832 msgid " <b>Week:</b>" msgstr "<b>Semana:</b>" -#: glade/pytrainer.glade:3816 -#: glade/pytrainer.glade:4439 -#: glade/pytrainer.glade:5061 +#: glade/pytrainer.glade:3883 +#: glade/pytrainer.glade:4506 +#: glade/pytrainer.glade:5128 +#: glade/pytrainer.glade:5488 msgid "" "Distance\n" "Time\n" @@ -1252,9 +1350,10 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:3842 -#: glade/pytrainer.glade:4465 -#: glade/pytrainer.glade:5087 +#: glade/pytrainer.glade:3909 +#: glade/pytrainer.glade:4532 +#: glade/pytrainer.glade:5154 +#: glade/pytrainer.glade:5514 msgid "" "None\n" "Distance\n" @@ -1270,51 +1369,79 @@ "Velocidad media\n" "Calorías" -#: glade/pytrainer.glade:3886 +#: glade/pytrainer.glade:3953 msgid "Week" msgstr "Semana" -#: glade/pytrainer.glade:4388 +#: glade/pytrainer.glade:4455 msgid " <b>Month:</b>" msgstr "<b>Mes:</b>" -#: glade/pytrainer.glade:4508 +#: glade/pytrainer.glade:4575 msgid "Month" msgstr "Mes" -#: glade/pytrainer.glade:5010 +#: glade/pytrainer.glade:5077 msgid " <b>Year:</b>" msgstr "<b>Año:</b>" -#: glade/pytrainer.glade:5130 +#: glade/pytrainer.glade:5197 msgid "Year" msgstr "Año" -#: glade/pytrainer.glade:5284 +#: glade/pytrainer.glade:5351 msgid "<b>Graph</b>" msgstr "<b>Gráfico</b>" -#: glade/pytrainer.glade:5325 +#: glade/pytrainer.glade:5392 msgid "<b>History</b>" msgstr "<b>Histórico</b>" -#: glade/pytrainer.glade:5389 +#: glade/pytrainer.glade:5454 +msgid "<b>Sports</b>" +msgstr "<b>Deportes</b>" + +#: glade/pytrainer.glade:5537 +msgid "Total distance:" +msgstr "Distancia:" + +#: glade/pytrainer.glade:5551 +msgid "Total duration:" +msgstr "Duración:" + +#: glade/pytrainer.glade:5602 +msgid "Start date:" +msgstr "Fecha de comienzo:" + +#: glade/pytrainer.glade:5618 +msgid "End date:" +msgstr "Fecha fin:" + +#: glade/pytrainer.glade:5682 +msgid "<b>All</b>" +msgstr "<b>Todos</b>" + +#: glade/pytrainer.glade:5709 +msgid "Totals" +msgstr "Totales" + +#: glade/pytrainer.glade:5747 msgid "<b>Title:</b>" msgstr "<b>Título:</b>" -#: glade/pytrainer.glade:5412 +#: glade/pytrainer.glade:5770 msgid "Search" msgstr "Buscar" -#: glade/pytrainer.glade:5436 +#: glade/pytrainer.glade:5794 msgid "All Distances" msgstr "Distancia" -#: glade/pytrainer.glade:5445 +#: glade/pytrainer.glade:5803 msgid "All Durations" msgstr "Duración" -#: glade/pytrainer.glade:5455 +#: glade/pytrainer.glade:5813 msgid "" "All time\n" "Last 4 weeks\n" @@ -1326,15 +1453,15 @@ "Últimos 6 meses\n" "Últimos 12 meses" -#: glade/pytrainer.glade:5492 +#: glade/pytrainer.glade:5850 msgid "Columns" msgstr "Columnas" -#: glade/pytrainer.glade:5619 +#: glade/pytrainer.glade:5977 msgid "Type:" msgstr "Tipo:" -#: glade/pytrainer.glade:5632 +#: glade/pytrainer.glade:5990 msgid "" "Font\n" "Restaurant\n" @@ -1346,31 +1473,31 @@ "Mirador\n" "Cumbre" -#: glade/pytrainer.glade:5648 +#: glade/pytrainer.glade:6006 msgid "Latitude: " msgstr "<b>Latitud:</b>" -#: glade/pytrainer.glade:5662 +#: glade/pytrainer.glade:6020 msgid " Name:" msgstr "Nombre:" -#: glade/pytrainer.glade:5674 +#: glade/pytrainer.glade:6032 msgid "Longitude:" msgstr "<b>Longitud:</b>" -#: glade/pytrainer.glade:5766 +#: glade/pytrainer.glade:6124 msgid "<b> Waypoint: </b>" msgstr "<b> Waypoint: </b>" -#: glade/pytrainer.glade:5950 +#: glade/pytrainer.glade:6308 msgid "Edit Record" msgstr "Editar entrada" -#: glade/pytrainer.glade:5964 +#: glade/pytrainer.glade:6322 msgid "Show graph in classic view" msgstr "Mostrar gráfico en vista clásica" -#: glade/pytrainer.glade:5978 +#: glade/pytrainer.glade:6336 msgid "Merge tracks" msgstr "Combinar entrenamientos" @@ -1383,24 +1510,51 @@ msgid "Warning" msgstr "Advertencia" -#: pytrainer/gui/windowmain.py:100 +#: build/lib/pytrainer/gui/windowmain.py:103 +#: pytrainer/gui/windowmain.py:103 msgid "Miles" msgstr "Millas" -#: pytrainer/gui/windowmain.py:103 -#: pytrainer/gui/windowmain.py:107 -#: pytrainer/gui/windowmain.py:120 +#: build/lib/pytrainer/gui/windowmain.py:106 +#: build/lib/pytrainer/gui/windowmain.py:110 +#: build/lib/pytrainer/gui/windowmain.py:123 +#: build/lib/pytrainer/gui/windowmain.py:126 +#: build/lib/pytrainer/gui/windowmain.py:135 +#: pytrainer/gui/windowmain.py:106 +#: pytrainer/gui/windowmain.py:110 #: pytrainer/gui/windowmain.py:123 +#: pytrainer/gui/windowmain.py:126 +#: pytrainer/gui/windowmain.py:135 msgid "id" msgstr "id" -#: pytrainer/gui/windowmain.py:103 +#: build/lib/pytrainer/gui/windowmain.py:106 +#: pytrainer/gui/windowmain.py:106 msgid "Start" msgstr "Comienzo" -#: pytrainer/gui/windowmain.py:110 -#: pytrainer/gui/windowmain.py:393 -#: pytrainer/gui/windowmain.py:1148 +#: build/lib/pytrainer/gui/windowmain.py:113 +#: build/lib/pytrainer/gui/windowmain.py:151 +#: build/lib/pytrainer/gui/windowmain.py:489 +#: build/lib/pytrainer/gui/windowmain.py:1283 +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 +#: build/lib/pytrainer/lib/activity.py:313 +#: build/lib/pytrainer/lib/activity.py:324 +#: build/lib/pytrainer/lib/activity.py:396 +#: build/lib/pytrainer/lib/activity.py:407 +#: build/lib/pytrainer/lib/activity.py:416 +#: build/lib/pytrainer/lib/activity.py:425 +#: build/lib/pytrainer/lib/activity.py:434 +#: build/lib/pytrainer/lib/activity.py:444 +#: build/lib/pytrainer/lib/activity.py:453 +#: build/lib/pytrainer/lib/activity.py:514 +#: build/lib/pytrainer/extensions/googlemaps.py:131 +#: build/lib/pytrainer/extensions/osm.py:52 +#: pytrainer/gui/windowmain.py:113 +#: pytrainer/gui/windowmain.py:151 +#: pytrainer/gui/windowmain.py:489 +#: pytrainer/gui/windowmain.py:1283 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 #: pytrainer/lib/activity.py:313 @@ -1413,232 +1567,380 @@ #: pytrainer/lib/activity.py:444 #: pytrainer/lib/activity.py:453 #: pytrainer/lib/activity.py:514 -#: pytrainer/extensions/googlemaps.py:71 -#: pytrainer/extensions/osm.py:50 +#: pytrainer/extensions/googlemaps.py:131 +#: pytrainer/extensions/osm.py:52 msgid "Distance" msgstr "Distancia" -#: pytrainer/gui/windowmain.py:112 -#: pytrainer/gui/windowmain.py:394 -#: pytrainer/gui/windowmain.py:1150 -#: pytrainer/extensions/googlemaps.py:71 -#: pytrainer/extensions/osm.py:50 +#: build/lib/pytrainer/gui/windowmain.py:115 +#: build/lib/pytrainer/gui/windowmain.py:152 +#: build/lib/pytrainer/gui/windowmain.py:490 +#: build/lib/pytrainer/gui/windowmain.py:1285 +#: build/lib/pytrainer/extensions/googlemaps.py:131 +#: build/lib/pytrainer/extensions/osm.py:52 +#: pytrainer/gui/windowmain.py:115 +#: pytrainer/gui/windowmain.py:152 +#: pytrainer/gui/windowmain.py:490 +#: pytrainer/gui/windowmain.py:1285 +#: pytrainer/extensions/googlemaps.py:131 +#: pytrainer/extensions/osm.py:52 msgid "Time" msgstr "Tiempo" -#: pytrainer/gui/windowmain.py:113 +#: build/lib/pytrainer/gui/windowmain.py:116 +#: pytrainer/gui/windowmain.py:116 msgid "⌀ HR" msgstr "⌀ FC" -#: pytrainer/gui/windowmain.py:114 +#: build/lib/pytrainer/gui/windowmain.py:117 +#: pytrainer/gui/windowmain.py:117 msgid "⌀ Speed" msgstr "⌀ Velocidad" -#: pytrainer/gui/windowmain.py:120 +#: build/lib/pytrainer/gui/windowmain.py:123 +#: pytrainer/gui/windowmain.py:123 msgid "Waypoint" msgstr "Waypoint" -#: pytrainer/gui/windowmain.py:125 +#: build/lib/pytrainer/gui/windowmain.py:128 +#: pytrainer/gui/windowmain.py:128 msgid "Weight" msgstr "Peso" -#: pytrainer/gui/windowmain.py:126 +#: build/lib/pytrainer/gui/windowmain.py:129 +#: pytrainer/gui/windowmain.py:129 msgid "Body Fat %" msgstr "Grasa corporal %" -#: pytrainer/gui/windowmain.py:127 +#: build/lib/pytrainer/gui/windowmain.py:130 +#: pytrainer/gui/windowmain.py:130 msgid "Resting HR" msgstr "FC en reposo" -#: pytrainer/gui/windowmain.py:128 +#: build/lib/pytrainer/gui/windowmain.py:131 +#: build/lib/pytrainer/gui/windowmain.py:141 +#: build/lib/pytrainer/gui/windowmain.py:158 +#: pytrainer/gui/windowmain.py:131 +#: pytrainer/gui/windowmain.py:141 +#: pytrainer/gui/windowmain.py:158 msgid "Max HR" msgstr "FC max" -#: pytrainer/gui/windowmain.py:395 +#: build/lib/pytrainer/gui/windowmain.py:137 +#: pytrainer/gui/windowmain.py:137 +msgid "Total duration" +msgstr "Duración" + +#: build/lib/pytrainer/gui/windowmain.py:138 +#: pytrainer/gui/windowmain.py:138 +msgid "Total distance" +msgstr "Distancia" + +#: build/lib/pytrainer/gui/windowmain.py:139 +#: build/lib/pytrainer/gui/windowmain.py:153 +#: pytrainer/gui/windowmain.py:139 +#: pytrainer/gui/windowmain.py:153 +msgid "Avg speed" +msgstr "Velocidad" + +#: build/lib/pytrainer/gui/windowmain.py:140 +#: build/lib/pytrainer/gui/windowmain.py:154 +#: pytrainer/gui/windowmain.py:140 +#: pytrainer/gui/windowmain.py:154 +msgid "Max speed" +msgstr "Velocidad Máx." + +#: build/lib/pytrainer/gui/windowmain.py:142 +#: pytrainer/gui/windowmain.py:142 +msgid "Max duration" +msgstr "Duración" + +#: build/lib/pytrainer/gui/windowmain.py:143 +#: pytrainer/gui/windowmain.py:143 +msgid "Max distance" +msgstr "Distancia" + +#: build/lib/pytrainer/gui/windowmain.py:149 +#: pytrainer/gui/windowmain.py:149 +msgid "Lap" +msgstr "Vuelta" + +#: build/lib/pytrainer/gui/windowmain.py:155 +#: pytrainer/gui/windowmain.py:155 +msgid "Avg pace" +msgstr "Ritmo" + +#: build/lib/pytrainer/gui/windowmain.py:156 +#: pytrainer/gui/windowmain.py:156 +msgid "Max pace" +msgstr "Pico de ritmo" + +#: build/lib/pytrainer/gui/windowmain.py:157 +#: pytrainer/gui/windowmain.py:157 +msgid "Avg HR" +msgstr "FC med" + +#: build/lib/pytrainer/gui/windowmain.py:160 +#: pytrainer/gui/windowmain.py:160 +msgid "Intensity" +msgstr "Intensidad" + +#: build/lib/pytrainer/gui/windowmain.py:491 +#: pytrainer/gui/windowmain.py:491 msgid "Laps" msgstr "Vueltas" -#: pytrainer/gui/windowmain.py:396 +#: build/lib/pytrainer/gui/windowmain.py:492 +#: pytrainer/gui/windowmain.py:492 msgid "Left Axis Grid" msgstr "Cuadrícula eje izquierdo" -#: pytrainer/gui/windowmain.py:397 +#: build/lib/pytrainer/gui/windowmain.py:493 +#: pytrainer/gui/windowmain.py:493 msgid "Right Axis Grid" msgstr "Cuadrícula eje derecho" -#: pytrainer/gui/windowmain.py:398 +#: build/lib/pytrainer/gui/windowmain.py:494 +#: pytrainer/gui/windowmain.py:494 msgid "X Axis Grid" msgstr "Cuadrícula eje X" -#: pytrainer/gui/windowmain.py:459 +#: build/lib/pytrainer/gui/windowmain.py:555 +#: pytrainer/gui/windowmain.py:555 msgid "Reset Limits" msgstr "Borrar límites" -#: pytrainer/gui/windowmain.py:461 +#: build/lib/pytrainer/gui/windowmain.py:557 +#: pytrainer/gui/windowmain.py:557 msgid "Set Limits" msgstr "Establecer límites" -#: pytrainer/gui/windowmain.py:616 +#: build/lib/pytrainer/gui/windowmain.py:712 +#: pytrainer/gui/windowmain.py:712 msgid "Percentages method" msgstr "basado en porcentajes" -#: pytrainer/gui/windowmain.py:624 -#: pytrainer/gui/windowmain.py:747 -#: pytrainer/gui/windowmain.py:825 +#: build/lib/pytrainer/gui/windowmain.py:720 +#: build/lib/pytrainer/gui/windowmain.py:843 +#: build/lib/pytrainer/gui/windowmain.py:921 +#: build/lib/pytrainer/lib/activity.py:196 +#: pytrainer/gui/windowmain.py:720 +#: pytrainer/gui/windowmain.py:843 +#: pytrainer/gui/windowmain.py:921 #: pytrainer/lib/activity.py:196 msgid "miles" msgstr "millas" -#: pytrainer/gui/windowmain.py:625 -#: pytrainer/gui/windowmain.py:626 -#: pytrainer/gui/windowmain.py:748 -#: pytrainer/gui/windowmain.py:749 -#: pytrainer/gui/windowmain.py:826 -#: pytrainer/gui/windowmain.py:827 +#: build/lib/pytrainer/gui/windowmain.py:721 +#: build/lib/pytrainer/gui/windowmain.py:722 +#: build/lib/pytrainer/gui/windowmain.py:844 +#: build/lib/pytrainer/gui/windowmain.py:845 +#: build/lib/pytrainer/gui/windowmain.py:922 +#: build/lib/pytrainer/gui/windowmain.py:923 +#: build/lib/pytrainer/lib/activity.py:197 +#: pytrainer/gui/windowmain.py:721 +#: pytrainer/gui/windowmain.py:722 +#: pytrainer/gui/windowmain.py:844 +#: pytrainer/gui/windowmain.py:845 +#: pytrainer/gui/windowmain.py:922 +#: pytrainer/gui/windowmain.py:923 #: pytrainer/lib/activity.py:197 msgid "miles/h" msgstr "millas/h" -#: pytrainer/gui/windowmain.py:627 -#: pytrainer/gui/windowmain.py:628 -#: pytrainer/gui/windowmain.py:750 -#: pytrainer/gui/windowmain.py:751 -#: pytrainer/gui/windowmain.py:828 -#: pytrainer/gui/windowmain.py:829 +#: build/lib/pytrainer/gui/windowmain.py:723 +#: build/lib/pytrainer/gui/windowmain.py:724 +#: build/lib/pytrainer/gui/windowmain.py:846 +#: build/lib/pytrainer/gui/windowmain.py:847 +#: build/lib/pytrainer/gui/windowmain.py:924 +#: build/lib/pytrainer/gui/windowmain.py:925 +#: build/lib/pytrainer/lib/activity.py:198 +#: pytrainer/gui/windowmain.py:723 +#: pytrainer/gui/windowmain.py:724 +#: pytrainer/gui/windowmain.py:846 +#: pytrainer/gui/windowmain.py:847 +#: pytrainer/gui/windowmain.py:924 +#: pytrainer/gui/windowmain.py:925 #: pytrainer/lib/activity.py:198 msgid "min/mile" msgstr "min/milla" -#: pytrainer/gui/windowmain.py:630 -#: pytrainer/gui/windowmain.py:753 -#: pytrainer/gui/windowmain.py:831 +#: build/lib/pytrainer/gui/windowmain.py:726 +#: build/lib/pytrainer/gui/windowmain.py:849 +#: build/lib/pytrainer/gui/windowmain.py:927 +#: build/lib/pytrainer/lib/activity.py:201 +#: pytrainer/gui/windowmain.py:726 +#: pytrainer/gui/windowmain.py:849 +#: pytrainer/gui/windowmain.py:927 #: pytrainer/lib/activity.py:201 msgid "km" msgstr "km" -#: pytrainer/gui/windowmain.py:1151 +#: build/lib/pytrainer/gui/windowmain.py:1286 +#: build/lib/pytrainer/recordgraph.py:144 +#: pytrainer/gui/windowmain.py:1286 #: pytrainer/recordgraph.py:144 msgid "Beats" msgstr "Pulsaciones" -#: pytrainer/gui/windowmain.py:1152 +#: build/lib/pytrainer/gui/windowmain.py:1287 +#: pytrainer/gui/windowmain.py:1287 msgid "Average" msgstr "Media" -#: pytrainer/gui/windowmain.py:1371 +#: build/lib/pytrainer/gui/windowmain.py:1506 +#: pytrainer/gui/windowmain.py:1506 msgid "Hide graph display options" msgstr "Ocultar configuración de visualización gráfica" -#: pytrainer/gui/windowmain.py:1669 +#: build/lib/pytrainer/gui/windowmain.py:1842 +#: pytrainer/gui/windowmain.py:1842 msgid "lap" msgstr "vuelta" -#: pytrainer/gui/windowmain.py:1679 +#: build/lib/pytrainer/gui/windowmain.py:1852 +#: build/lib/pytrainer/gui/drawArea.py:165 +#: build/lib/pytrainer/extensions/googlemaps.py:129 +#: build/lib/pytrainer/extensions/osm.py:50 +#: pytrainer/gui/windowmain.py:1852 #: pytrainer/gui/drawArea.py:165 -#: pytrainer/extensions/googlemaps.py:69 -#: pytrainer/extensions/osm.py:48 +#: pytrainer/extensions/googlemaps.py:129 +#: pytrainer/extensions/osm.py:50 msgid "h" msgstr "h" -#: pytrainer/gui/windowmain.py:1679 -#: pytrainer/gui/windowmain.py:1681 +#: build/lib/pytrainer/gui/windowmain.py:1852 +#: build/lib/pytrainer/gui/windowmain.py:1854 +#: build/lib/pytrainer/lib/activity.py:204 +#: pytrainer/gui/windowmain.py:1852 +#: pytrainer/gui/windowmain.py:1854 #: pytrainer/lib/activity.py:204 msgid "m" msgstr "m" -#: pytrainer/gui/windowmain.py:1679 -#: pytrainer/gui/windowmain.py:1681 +#: build/lib/pytrainer/gui/windowmain.py:1852 +#: build/lib/pytrainer/gui/windowmain.py:1854 +#: pytrainer/gui/windowmain.py:1852 +#: pytrainer/gui/windowmain.py:1854 msgid "s" msgstr "s" -#: pytrainer/gui/windowmain.py:1765 +#: build/lib/pytrainer/gui/windowmain.py:1941 +#: build/lib/pytrainer/record.py:63 +#: pytrainer/gui/windowmain.py:1941 #: pytrainer/record.py:63 msgid "Edit Entry" msgstr "Editar entrada" -#: pytrainer/gui/windowmain.py:1776 +#: build/lib/pytrainer/gui/windowmain.py:1952 +#: pytrainer/gui/windowmain.py:1952 msgid "Delete Entry" msgstr "Borrar entrada" -#: pytrainer/gui/windowmain.py:1800 +#: build/lib/pytrainer/gui/windowmain.py:1976 +#: pytrainer/gui/windowmain.py:1976 msgid "Create Athlete Entry" msgstr "Crear entrada de atleta" -#: pytrainer/gui/windowmain.py:1804 +#: build/lib/pytrainer/gui/windowmain.py:1980 +#: pytrainer/gui/windowmain.py:1980 msgid "Edit Athlete Entry" msgstr "Editar atleta" -#: pytrainer/gui/windowmain.py:1885 -#: pytrainer/main.py:433 +#: build/lib/pytrainer/gui/windowmain.py:2061 +#: build/lib/pytrainer/main.py:459 +#: pytrainer/gui/windowmain.py:2061 +#: pytrainer/main.py:459 msgid "Delete this database entry?" msgstr "¿Borrar esta entrada de la base de datos?" -#: pytrainer/gui/windowmain.py:1887 +#: build/lib/pytrainer/gui/windowmain.py:2063 +#: pytrainer/gui/windowmain.py:2063 msgid "Are you sure?" msgstr "¿Está seguro?" +#: build/lib/pytrainer/gui/windowimportdata.py:116 #: pytrainer/gui/windowimportdata.py:116 msgid "No file selected" msgstr "Ningún fichero seleccionado" +#: build/lib/pytrainer/gui/windowimportdata.py:161 #: pytrainer/gui/windowimportdata.py:161 msgid "Configure" msgstr "Configurar" +#: build/lib/pytrainer/gui/windowimportdata.py:162 #: pytrainer/gui/windowimportdata.py:162 msgid "Run" msgstr "Ejecutar" +#: build/lib/pytrainer/gui/windowimportdata.py:170 #: pytrainer/gui/windowimportdata.py:170 msgid "Disabled" msgstr "Desactivo" +#: build/lib/pytrainer/gui/windowimportdata.py:172 #: pytrainer/gui/windowimportdata.py:172 msgid "Enabled" msgstr "Activo" +#: build/lib/pytrainer/gui/windowimportdata.py:252 #: pytrainer/gui/windowimportdata.py:252 msgid "GPS device found" msgstr "Dispositivos GPS encontrado" +#: build/lib/pytrainer/gui/windowimportdata.py:255 #: pytrainer/gui/windowimportdata.py:255 msgid "GPS device <b>not</b> found" msgstr "Dispositivo GPS <b>no</b> encontrado" +#: build/lib/pytrainer/gui/windowimportdata.py:262 #: pytrainer/gui/windowimportdata.py:262 msgid "This tool was not found on the system" msgstr "No se ha encontrado esta herramienta en el sistema" +#: build/lib/pytrainer/gui/windowimportdata.py:264 #: pytrainer/gui/windowimportdata.py:264 msgid " Homepage" msgstr "Página de inicio" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "File" msgstr "Archivo" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Type" msgstr "Tipo" +#: build/lib/pytrainer/gui/windowimportdata.py:317 #: pytrainer/gui/windowimportdata.py:317 msgid "Activities" msgstr "Actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Start Time" msgstr "Hora de comienzo" +#: build/lib/pytrainer/gui/windowimportdata.py:352 +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowimportdata.py:352 #: pytrainer/gui/windowrecord.py:210 msgid "Duration" msgstr "Duración" +#: build/lib/pytrainer/gui/windowimportdata.py:501 #: pytrainer/gui/windowimportdata.py:501 msgid "Imported into database" msgstr "Importado a base de datos" +#: build/lib/pytrainer/gui/windowimportdata.py:545 +#: build/lib/pytrainer/gui/windowextensions.py:81 +#: build/lib/pytrainer/gui/windowplugins.py:80 #: pytrainer/gui/windowimportdata.py:545 #: pytrainer/gui/windowextensions.py:81 #: pytrainer/gui/windowplugins.py:80 @@ -1646,6 +1948,10 @@ msgid "%s settings" msgstr "%s opciones" +#: build/lib/pytrainer/gui/windowimportdata.py:560 +#: build/lib/pytrainer/gui/windowextensions.py:70 +#: build/lib/pytrainer/gui/windowplugins.py:71 +#: build/lib/pytrainer/gui/windowplugins.py:95 #: pytrainer/gui/windowimportdata.py:560 #: pytrainer/gui/windowextensions.py:70 #: pytrainer/gui/windowplugins.py:71 @@ -1653,6 +1959,10 @@ msgid "Disable" msgstr "Desactivo" +#: build/lib/pytrainer/gui/windowimportdata.py:561 +#: build/lib/pytrainer/gui/windowextensions.py:72 +#: build/lib/pytrainer/gui/windowplugins.py:69 +#: build/lib/pytrainer/gui/windowplugins.py:96 #: pytrainer/gui/windowimportdata.py:561 #: pytrainer/gui/windowextensions.py:72 #: pytrainer/gui/windowplugins.py:69 @@ -1660,119 +1970,161 @@ msgid "Enable" msgstr "Activo" +#: build/lib/pytrainer/gui/windowimportdata.py:568 +#: build/lib/pytrainer/gui/windowplugins.py:103 #: pytrainer/gui/windowimportdata.py:568 #: pytrainer/gui/windowplugins.py:103 msgid "Ok" msgstr "Ok" +#: build/lib/pytrainer/gui/windowimportdata.py:628 #: pytrainer/gui/windowimportdata.py:628 msgid "Saving options" msgstr "Guardar configuración" +#: build/lib/pytrainer/gui/windowimportdata.py:630 #: pytrainer/gui/windowimportdata.py:630 msgid "Options saved" msgstr "Configuración guardada" +#: build/lib/pytrainer/gui/windowimportdata.py:655 #: pytrainer/gui/windowimportdata.py:655 msgid "Importing one activity" msgstr "Importando una actividad" +#: build/lib/pytrainer/gui/windowimportdata.py:656 #: pytrainer/gui/windowimportdata.py:656 msgid "Imported one activity" msgstr "Una actividad importada" +#: build/lib/pytrainer/gui/windowimportdata.py:658 #: pytrainer/gui/windowimportdata.py:658 #, python-format msgid "Importing %d activities" msgstr "Importando %d actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:659 #: pytrainer/gui/windowimportdata.py:659 #, python-format msgid "Imported %d activities" msgstr "Importadas %d actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:678 #: pytrainer/gui/windowimportdata.py:678 msgid "Choose a file (or files) to import activities from" msgstr "Seleccione fichero/s desde el/los que importar actividades" +#: build/lib/pytrainer/gui/windowimportdata.py:693 +#: build/lib/pytrainer/gui/windowimportdata.py:694 #: pytrainer/gui/windowimportdata.py:693 #: pytrainer/gui/windowimportdata.py:694 #, python-format msgid "Found file of type: %s" msgstr "Tipo de fichero encontrado: %s" +#: build/lib/pytrainer/gui/windowimportdata.py:718 #: pytrainer/gui/windowimportdata.py:718 msgid "Found in database" msgstr "Encontrado en base de datos" +#: build/lib/pytrainer/gui/windowimportdata.py:733 +#: build/lib/pytrainer/gui/windowimportdata.py:734 #: pytrainer/gui/windowimportdata.py:733 #: pytrainer/gui/windowimportdata.py:734 #, python-format msgid "File %s is of unknown or unsupported file type" msgstr "Fichero %s seleccionado desconocido o no soportado" +#: build/lib/pytrainer/gui/windowimportdata.py:807 #: pytrainer/gui/windowimportdata.py:807 #, python-format msgid "Column %d" msgstr "Columna %d" +#: build/lib/pytrainer/gui/drawArea.py:166 +#: build/lib/pytrainer/extensions/googlemaps.py:129 +#: build/lib/pytrainer/extensions/osm.py:50 #: pytrainer/gui/drawArea.py:166 -#: pytrainer/extensions/googlemaps.py:69 -#: pytrainer/extensions/osm.py:48 +#: pytrainer/extensions/googlemaps.py:129 +#: pytrainer/extensions/osm.py:50 msgid "min" msgstr "min" -#: pytrainer/gui/drawArea.py:399 +#: build/lib/pytrainer/gui/drawArea.py:403 +#: pytrainer/gui/drawArea.py:403 msgid "rest" msgstr "descanso" +#: build/lib/pytrainer/gui/windowrecord.py:210 #: pytrainer/gui/windowrecord.py:210 msgid "GPX File" msgstr "Archivo GPX" +#: build/lib/pytrainer/gui/windowprofile.py:41 #: pytrainer/gui/windowprofile.py:41 msgid "Male" msgstr "Varón" +#: build/lib/pytrainer/gui/windowprofile.py:42 #: pytrainer/gui/windowprofile.py:42 msgid "Female" msgstr "Mujer" +#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "MET" msgstr "M.E.T." +#: build/lib/pytrainer/gui/windowprofile.py:59 #: pytrainer/gui/windowprofile.py:59 msgid "Maximum Pace" msgstr "Ritmo más rápido" +#: build/lib/pytrainer/gui/windowprofile.py:327 +#: pytrainer/gui/windowprofile.py:327 +msgid "Sport Creation Error" +msgstr "Fallo en la creación de deporte" + +#: build/lib/pytrainer/gui/dialogselecttrack.py:40 #: pytrainer/gui/dialogselecttrack.py:40 msgid "Track Name" msgstr "Nombre de la ruta" +#: build/lib/pytrainer/gui/drawGraph.py:170 #: pytrainer/gui/drawGraph.py:170 msgid "Athlete Data" msgstr "Datos del atleta" +#: build/lib/pytrainer/gui/windowextensions.py:112 +#: build/lib/pytrainer/gui/windowextensions.py:125 #: pytrainer/gui/windowextensions.py:112 #: pytrainer/gui/windowextensions.py:125 msgid "OK" msgstr "Ok" +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Height (m)" msgstr "Altura (m)" +#: build/lib/pytrainer/recordgraph.py:134 +#: build/lib/pytrainer/daygraph.py:52 #: pytrainer/recordgraph.py:134 #: pytrainer/daygraph.py:52 msgid "Stage Profile" msgstr "Perfil de Etapa" +#: build/lib/pytrainer/recordgraph.py:136 #: pytrainer/recordgraph.py:136 msgid "Speed (Km/h)" msgstr "Velocidad (km/h)" +#: build/lib/pytrainer/recordgraph.py:136 +#: build/lib/pytrainer/lib/activity.py:325 +#: build/lib/pytrainer/lib/activity.py:415 +#: build/lib/pytrainer/lib/activity.py:417 #: pytrainer/recordgraph.py:136 #: pytrainer/lib/activity.py:325 #: pytrainer/lib/activity.py:415 @@ -1780,6 +2132,10 @@ msgid "Speed" msgstr "Velocidad" +#: build/lib/pytrainer/recordgraph.py:138 +#: build/lib/pytrainer/lib/activity.py:314 +#: build/lib/pytrainer/lib/activity.py:424 +#: build/lib/pytrainer/lib/activity.py:426 #: pytrainer/recordgraph.py:138 #: pytrainer/lib/activity.py:314 #: pytrainer/lib/activity.py:424 @@ -1787,66 +2143,94 @@ msgid "Pace" msgstr "Ritmo" +#: build/lib/pytrainer/recordgraph.py:140 +#: build/lib/pytrainer/heartrategraph.py:36 +#: build/lib/pytrainer/daygraph.py:56 #: pytrainer/recordgraph.py:140 #: pytrainer/heartrategraph.py:36 #: pytrainer/daygraph.py:56 msgid "Beats (bpm)" msgstr "Media pulsaciones (ppm)" +#: build/lib/pytrainer/recordgraph.py:142 #: pytrainer/recordgraph.py:142 msgid "Cadence (rpm)" msgstr "Cadencia (rpm)" +#: build/lib/pytrainer/recordgraph.py:142 +#: build/lib/pytrainer/lib/activity.py:452 +#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/recordgraph.py:142 #: pytrainer/lib/activity.py:452 #: pytrainer/lib/activity.py:454 msgid "Cadence" msgstr "Cadence" +#: build/lib/pytrainer/recordgraph.py:144 #: pytrainer/recordgraph.py:144 msgid "Beats (%)" msgstr "Pulsaciones (%)" +#: build/lib/pytrainer/recordgraph.py:146 #: pytrainer/recordgraph.py:146 msgid "Zone" msgstr "Zona" -#: pytrainer/profile.py:109 +#: build/lib/pytrainer/profile.py:110 +#: pytrainer/profile.py:110 msgid "Moderate activity" msgstr "Actividad moderada" -#: pytrainer/profile.py:110 +#: build/lib/pytrainer/profile.py:111 +#: pytrainer/profile.py:111 msgid "Weight Control" msgstr "Control de peso" -#: pytrainer/profile.py:111 +#: build/lib/pytrainer/profile.py:112 +#: pytrainer/profile.py:112 msgid "Aerobic" msgstr "Aeróbico" -#: pytrainer/profile.py:112 +#: build/lib/pytrainer/profile.py:113 +#: pytrainer/profile.py:113 msgid "Anaerobic" msgstr "Anaeróbico" -#: pytrainer/profile.py:113 +#: build/lib/pytrainer/profile.py:114 +#: pytrainer/profile.py:114 msgid "VO2 MAX" msgstr "VO2 máximo" -#: pytrainer/lib/gpx.py:122 +#: build/lib/pytrainer/lib/gpx.py:126 +#: pytrainer/lib/gpx.py:126 msgid "No Name" msgstr "Sin nombre" -#: pytrainer/lib/gpx.py:129 +#: build/lib/pytrainer/lib/gpx.py:133 +#: pytrainer/lib/gpx.py:133 msgid "No Data" msgstr "Sin datos" +#: build/lib/pytrainer/lib/activity.py:199 #: pytrainer/lib/activity.py:199 msgid "feet" msgstr "pies" +#: build/lib/pytrainer/lib/activity.py:312 #: pytrainer/lib/activity.py:312 msgid "Pace by Lap" msgstr "Ritmo por vuelta" +#: build/lib/pytrainer/lib/activity.py:318 +#: build/lib/pytrainer/lib/activity.py:329 +#: build/lib/pytrainer/lib/activity.py:401 +#: build/lib/pytrainer/lib/activity.py:411 +#: build/lib/pytrainer/lib/activity.py:420 +#: build/lib/pytrainer/lib/activity.py:429 +#: build/lib/pytrainer/lib/activity.py:438 +#: build/lib/pytrainer/lib/activity.py:448 +#: build/lib/pytrainer/lib/activity.py:457 +#: build/lib/pytrainer/lib/activity.py:519 #: pytrainer/lib/activity.py:318 #: pytrainer/lib/activity.py:329 #: pytrainer/lib/activity.py:401 @@ -1860,135 +2244,224 @@ msgid "Time (seconds)" msgstr "Tiempo (segundos)" +#: build/lib/pytrainer/lib/activity.py:323 #: pytrainer/lib/activity.py:323 msgid "Speed by Lap" msgstr "Velocidad por vuelta" +#: build/lib/pytrainer/lib/activity.py:395 +#: build/lib/pytrainer/lib/activity.py:397 #: pytrainer/lib/activity.py:395 #: pytrainer/lib/activity.py:397 msgid "Elevation" msgstr "Altura" +#: build/lib/pytrainer/lib/activity.py:406 +#: build/lib/pytrainer/lib/activity.py:408 #: pytrainer/lib/activity.py:406 #: pytrainer/lib/activity.py:408 msgid "Corrected Elevation" msgstr "Altura corregida" +#: build/lib/pytrainer/lib/activity.py:443 #: pytrainer/lib/activity.py:443 #, python-format msgid "Heart Rate (% of max)" msgstr "Frecuencia cardíaca (% del máx.)" +#: build/lib/pytrainer/lib/activity.py:445 #: pytrainer/lib/activity.py:445 msgid "%" msgstr "%" +#: build/lib/pytrainer/lib/activity.py:454 #: pytrainer/lib/activity.py:454 msgid "rpm" msgstr "rpm" +#: build/lib/pytrainer/lib/activity.py:513 #: pytrainer/lib/activity.py:513 msgid "Heart Rate zone" msgstr "Zona frecuencia cardiaca" -#: pytrainer/monthgraph.py:70 -#: pytrainer/monthgraph.py:72 -#: pytrainer/monthgraph.py:74 -#: pytrainer/monthgraph.py:76 -#: pytrainer/monthgraph.py:78 +#: build/lib/pytrainer/monthgraph.py:26 +#: build/lib/pytrainer/monthgraph.py:27 +#: build/lib/pytrainer/monthgraph.py:28 +#: build/lib/pytrainer/monthgraph.py:29 +#: build/lib/pytrainer/monthgraph.py:30 +#: pytrainer/monthgraph.py:26 +#: pytrainer/monthgraph.py:27 +#: pytrainer/monthgraph.py:28 +#: pytrainer/monthgraph.py:29 +#: pytrainer/monthgraph.py:30 msgid "day" msgstr "día" -#: pytrainer/monthgraph.py:70 -#: pytrainer/weekgraph.py:115 +#: build/lib/pytrainer/monthgraph.py:26 +#: build/lib/pytrainer/weekgraph.py:28 +#: pytrainer/monthgraph.py:26 +#: pytrainer/weekgraph.py:28 msgid "Daily Distance" msgstr "Distancia" -#: pytrainer/monthgraph.py:72 -#: pytrainer/yeargraph.py:72 -#: pytrainer/weekgraph.py:117 +#: build/lib/pytrainer/monthgraph.py:27 +#: build/lib/pytrainer/totalgraph.py:25 +#: build/lib/pytrainer/yeargraph.py:27 +#: build/lib/pytrainer/weekgraph.py:29 +#: pytrainer/monthgraph.py:27 +#: pytrainer/totalgraph.py:25 +#: pytrainer/yeargraph.py:27 +#: pytrainer/weekgraph.py:29 msgid "Time (hours)" msgstr "Tiempo en horas" -#: pytrainer/monthgraph.py:72 -#: pytrainer/weekgraph.py:117 +#: build/lib/pytrainer/monthgraph.py:27 +#: build/lib/pytrainer/weekgraph.py:29 +#: pytrainer/monthgraph.py:27 +#: pytrainer/weekgraph.py:29 msgid "Daily Time" msgstr "Tiempo diario" -#: pytrainer/monthgraph.py:74 -#: pytrainer/yeargraph.py:74 -#: pytrainer/weekgraph.py:119 +#: build/lib/pytrainer/monthgraph.py:28 +#: build/lib/pytrainer/totalgraph.py:26 +#: build/lib/pytrainer/yeargraph.py:28 +#: build/lib/pytrainer/weekgraph.py:30 +#: pytrainer/monthgraph.py:28 +#: pytrainer/totalgraph.py:26 +#: pytrainer/yeargraph.py:28 +#: pytrainer/weekgraph.py:30 msgid "Average Heart Rate (bpm)" msgstr "Pulsaciones medias (ppm)" -#: pytrainer/monthgraph.py:74 -#: pytrainer/weekgraph.py:119 +#: build/lib/pytrainer/monthgraph.py:28 +#: build/lib/pytrainer/weekgraph.py:30 +#: pytrainer/monthgraph.py:28 +#: pytrainer/weekgraph.py:30 msgid "Daily Average Heart Rate" msgstr "Pulsaciones diarias" -#: pytrainer/monthgraph.py:76 -#: pytrainer/weekgraph.py:121 +#: build/lib/pytrainer/monthgraph.py:29 +#: build/lib/pytrainer/weekgraph.py:31 +#: pytrainer/monthgraph.py:29 +#: pytrainer/weekgraph.py:31 msgid "Daily Average Speed" msgstr "medias diarias" -#: pytrainer/monthgraph.py:78 -#: pytrainer/weekgraph.py:123 +#: build/lib/pytrainer/monthgraph.py:30 +#: build/lib/pytrainer/weekgraph.py:32 +#: pytrainer/monthgraph.py:30 +#: pytrainer/weekgraph.py:32 msgid "Daily Calories" msgstr "Calorías diarias" +#: build/lib/pytrainer/totalgraph.py:24 +#: build/lib/pytrainer/totalgraph.py:25 +#: build/lib/pytrainer/totalgraph.py:26 +#: build/lib/pytrainer/totalgraph.py:27 +#: build/lib/pytrainer/totalgraph.py:28 +#: pytrainer/totalgraph.py:24 +#: pytrainer/totalgraph.py:25 +#: pytrainer/totalgraph.py:26 +#: pytrainer/totalgraph.py:27 +#: pytrainer/totalgraph.py:28 +msgid "year" +msgstr "año" + +#: build/lib/pytrainer/totalgraph.py:24 +#: pytrainer/totalgraph.py:24 +msgid "Annual Distance" +msgstr "Distancia anual" + +#: build/lib/pytrainer/totalgraph.py:25 +#: pytrainer/totalgraph.py:25 +msgid "Annual Time" +msgstr "Tiempo anual" + +#: build/lib/pytrainer/totalgraph.py:26 +#: pytrainer/totalgraph.py:26 +msgid "Annual Average Heart Rate" +msgstr "Pulsaciones medias en el año" + +#: build/lib/pytrainer/totalgraph.py:27 +#: pytrainer/totalgraph.py:27 +msgid "Annual Average Speed" +msgstr "Velocidad media anual" + +#: build/lib/pytrainer/totalgraph.py:28 +#: pytrainer/totalgraph.py:28 +msgid "Annual Calories" +msgstr "Calorías (kcal) en el año" + +#: build/lib/pytrainer/athlete.py:52 #: pytrainer/athlete.py:52 msgid "lb" msgstr "lb" +#: build/lib/pytrainer/athlete.py:54 #: pytrainer/athlete.py:54 msgid "kg" msgstr "kg" -#: pytrainer/record.py:513 +#: build/lib/pytrainer/record.py:518 +#: pytrainer/record.py:518 msgid "pyTrainer can't import data from your gpx file" msgstr "pyTrainer no puede importar datos de tu fichero gpx" -#: pytrainer/yeargraph.py:70 -#: pytrainer/yeargraph.py:72 -#: pytrainer/yeargraph.py:74 -#: pytrainer/yeargraph.py:76 -#: pytrainer/yeargraph.py:78 +#: build/lib/pytrainer/yeargraph.py:26 +#: build/lib/pytrainer/yeargraph.py:27 +#: build/lib/pytrainer/yeargraph.py:28 +#: build/lib/pytrainer/yeargraph.py:29 +#: build/lib/pytrainer/yeargraph.py:30 +#: pytrainer/yeargraph.py:26 +#: pytrainer/yeargraph.py:27 +#: pytrainer/yeargraph.py:28 +#: pytrainer/yeargraph.py:29 +#: pytrainer/yeargraph.py:30 msgid "month" msgstr "mes" -#: pytrainer/yeargraph.py:70 +#: build/lib/pytrainer/yeargraph.py:26 +#: pytrainer/yeargraph.py:26 msgid "Monthly Distance" msgstr "Distancia" -#: pytrainer/yeargraph.py:72 +#: build/lib/pytrainer/yeargraph.py:27 +#: pytrainer/yeargraph.py:27 msgid "Monthly Time" msgstr "Tiempo mensual" -#: pytrainer/yeargraph.py:74 +#: build/lib/pytrainer/yeargraph.py:28 +#: pytrainer/yeargraph.py:28 msgid "Monthly Average Heart Rate" msgstr "Pulsaciones medias mensuales" -#: pytrainer/yeargraph.py:76 +#: build/lib/pytrainer/yeargraph.py:29 +#: pytrainer/yeargraph.py:29 msgid "Monthly Average Speed" msgstr "Medias mensuales" -#: pytrainer/yeargraph.py:78 +#: build/lib/pytrainer/yeargraph.py:30 +#: pytrainer/yeargraph.py:30 msgid "Monthly Calories" msgstr "Calorías mensuales" +#: build/lib/pytrainer/waypoint.py:87 #: pytrainer/waypoint.py:87 msgid "The gpx file seems to be a several days records. Perhaps you will need to edit your gpx file" msgstr "Parece que el archivo gpx contiene actividades de varios días. Probablemente necesites editarlo" +#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity (Km/h)" msgstr "Velocidad (km/h)" +#: build/lib/pytrainer/daygraph.py:54 #: pytrainer/daygraph.py:54 msgid "Velocity" msgstr "Velocidad" -#: pytrainer/main.py:449 +#: build/lib/pytrainer/main.py:475 +#: pytrainer/main.py:475 msgid "Delete this waypoint?" msgstr "¿Borrar este waypoint?" @@ -2074,79 +2547,3 @@ msgid "Wordpress Extension Upload Complete" msgstr "Envío completo a Wordpress" -#~ msgid "Use this port for internal connections: " -#~ msgstr "Use este puerto para conexiones internas" - -#~ msgid "" -#~ "<small><b>Note:</b> Change this only if you know what you are doing</" -#~ "small>" -#~ msgstr "" -#~ "<small><b>Nota:</b> cambie esto solamente si sabe lo que hace</small>" - -#~ msgid "<b>Port Connnection</b>" -#~ msgstr "<b>Puerto de conexión:</b>" - -#~ msgid "Googlemaps v3" -#~ msgstr "Googlemaps v3" - -#~ msgid "<small>Is the Googlemaps API version 3 in use?</small>" -#~ msgstr "<small>¿Se usa la versión 3 de la API de Googlemaps?</small>" - -#~ msgid "Unified Import" -#~ msgstr "Importar" - -#~ msgid "<small>Is the Unified Importer active?</small>" -#~ msgstr "<small>¿Está habilitado el importador unificado?</small>" - -#~ msgid "Equipment handling" -#~ msgstr "Gestión de equipamiento" - -#~ msgid "<small>Want to track equipment?</small>" -#~ msgstr "<small>¿Control de equipamiento?</small>" - -#~ msgid "" -#~ "<small>* Note Googlemaps API version 3 is on by default, use --gmaps2 to " -#~ "switch it off</small>" -#~ msgstr "" -#~ "<small>* Se usa por defecto la versión 3 de la API de Googlemaps, utilice " -#~ "--gmaps2 para desactivarla</small>" - -#~ msgid "Category:" -#~ msgstr "Categoría:" - -#~ msgid "" -#~ "Running shoes\n" -#~ "GPS watch\n" -#~ "T-shirts\n" -#~ "Tyres\n" -#~ "Socks" -#~ msgstr "" -#~ "Zapatillas de correr\n" -#~ "Reloj GPS\n" -#~ "Camiseta\n" -#~ "Rueda\n" -#~ "Calcetines" - -#~ msgid "New equipment" -#~ msgstr "Nuevo equipamiento" - -#~ msgid "Kilometer" -#~ msgstr "Kilómetros" - -#~ msgid "Elevation v Distance" -#~ msgstr "Altura vs Distancia" - -#~ msgid "Elevation v Time" -#~ msgstr "Altura vs Tiempo" - -#~ msgid "Speed v Distance" -#~ msgstr "Velocidad vs Distancia" - -#~ msgid "Pace v Distance" -#~ msgstr "Ritmo vs Distancia" - -#~ msgid "Heart Rate v Distance" -#~ msgstr "Pulsaciones vs Distancia" - -#~ msgid "Cadence v Distance" -#~ msgstr "Cadencia vs Distancia" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-03-19 00:16:21
|
Revision: 772 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=772&view=rev Author: siggipals Date: 2011-03-19 00:16:14 +0000 (Sat, 19 Mar 2011) Log Message: ----------- Store more lap info in DB, and show in record view Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/lib/activity.py pytrainer/trunk/pytrainer/lib/ddbb.py pytrainer/trunk/pytrainer/lib/gpx.py pytrainer/trunk/pytrainer/lib/sqliteUtils.py pytrainer/trunk/pytrainer/main.py pytrainer/trunk/pytrainer/record.py Added Paths: ----------- pytrainer/trunk/glade/trigger_distance.png pytrainer/trunk/glade/trigger_hr.png pytrainer/trunk/glade/trigger_location.png pytrainer/trunk/glade/trigger_manual.png pytrainer/trunk/glade/trigger_time.png Added: pytrainer/trunk/glade/trigger_distance.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/trigger_distance.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pytrainer/trunk/glade/trigger_hr.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/trigger_hr.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pytrainer/trunk/glade/trigger_location.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/trigger_location.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pytrainer/trunk/glade/trigger_manual.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/trigger_manual.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pytrainer/trunk/glade/trigger_time.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/trigger_time.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-19 00:16:14 UTC (rev 772) @@ -147,11 +147,17 @@ #create the columns for the laps treeview columns=[ {'name':_("Lap")}, + {'name':_(""), 'xalign':0, 'pixbuf':True}, {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'}, + {'name':_("Max speed"), 'format_float':'%.2f', 'quantity':'speed'}, {'name':_("Avg pace"), 'xalign':1.0, 'quantity':'pace'}, + {'name':_("Max pace"), 'xalign':1.0, 'quantity':'pace'}, + {'name':_("Avg HR"), 'xalign':1.0}, + {'name':_("Max HR"), 'xalign':1.0}, {'name':_("Calories"), 'xalign':1.0}, + {'name':_("Intensity"), 'visible':False}, ] self.create_treeview(self.lapsTreeView,columns) @@ -291,10 +297,16 @@ def create_treeview(self,treeview,columns): for column_index, column_dict in enumerate(columns): + if 'pixbuf' in column_dict: + renderer = gtk.CellRendererPixbuf() + else: + renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(column_dict['name']) - renderer = gtk.CellRendererText() column.pack_start(renderer, expand=False) - column.add_attribute(renderer, 'text', column_index) + if 'pixbuf' in column_dict: + column.add_attribute(renderer, 'pixbuf', column_index) + else: + column.add_attribute(renderer, 'text', column_index) column.set_resizable(True) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) if 'xalign' in column_dict: @@ -382,11 +394,17 @@ if len(activity.laps)>1: store = gtk.ListStore( gobject.TYPE_INT, + gtk.gdk.Pixbuf, gobject.TYPE_FLOAT, gobject.TYPE_STRING, gobject.TYPE_FLOAT, + gobject.TYPE_FLOAT, gobject.TYPE_STRING, + gobject.TYPE_STRING, gobject.TYPE_INT, + gobject.TYPE_INT, + gobject.TYPE_INT, + gobject.TYPE_STRING, ) for lap in activity.laps: t = lap['elapsed_time'] @@ -396,12 +414,29 @@ m = km2miles(m) s = m / float(t) * 3.6 + max_speed = lap['max_speed'] * 3.6 if s > 0: pace = "%d:%02d" %((3600/s)/60,(3600/s)%60) + max_pace = "%d:%02d" %((3600/max_speed)/60,(3600/max_speed)%60) + + color = { + 'active' : '#000000', + 'rest' : '#808080', + } + + pic = gtk.gdk.pixbuf_new_from_file(self.data_path+"glade/trigger_%s.png" % lap['trigger']) + iter = store.append() - store.set(iter, 0, lap['lap_number']+1, 1, m/1000, 2, str(int(float(t))), 3, s, 4, pace, 5, lap['calories']) + store.set(iter, 0, lap['lap_number']+1, 1, pic, 2, m/1000, 3, str(int(float(t))), 4, s, 5, max_speed, 6, pace, 7, max_pace, 8, lap['avg_hr'], 9, lap['max_hr'], 10, lap['calories'], 11, color[lap['intensity']]) self.lapsTreeView.set_model(store) self.lapsTreeView.set_rules_hint(True) + + # Use grey color for "rest" laps + for c in self.lapsTreeView.get_columns()[:-1]: + for cr in c.get_cell_renderers(): + if type(cr)==gtk.CellRendererText: + c.add_attribute(cr, 'foreground', 11) + self.frame_laps.show() else: self.frame_laps.hide() Modified: pytrainer/trunk/pytrainer/lib/activity.py =================================================================== --- pytrainer/trunk/pytrainer/lib/activity.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/lib/activity.py 2011-03-19 00:16:14 UTC (rev 772) @@ -285,7 +285,7 @@ raise Exception( "Error - multiple results from DB for id: %s" % self.id ) #Get lap information laps = self.pytrainer_main.ddbb.select_dict("laps", - ("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number"), + ("id_lap", "record", "elapsed_time", "distance", "start_lat", "start_lon", "end_lat", "end_lon", "calories", "lap_number", "intensity", "avg_hr", "max_hr", "max_speed", "trigger"), "record=\"%s\"" % self.id) if laps is None or laps == [] or len(laps) < 1: #No laps found logging.debug("No laps in DB for record %d" % self.id) Modified: pytrainer/trunk/pytrainer/lib/ddbb.py =================================================================== --- pytrainer/trunk/pytrainer/lib/ddbb.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/lib/ddbb.py 2011-03-19 00:16:14 UTC (rev 772) @@ -23,6 +23,7 @@ import traceback import commands, os import dateutil +import gpx from pytrainer.lib.date import Date #Define the tables and their columns that should be in the database @@ -73,6 +74,11 @@ "end_lat": "float", "end_lon": "float", "calories": "int", + "intensity": "varchar(7)", + "trigger": "varchar(9)", + "max_speed": "float", + "avg_hr": "int", + "max_hr": "int", }, "athletestats": { "id_athletestat": "integer primary key autoincrement", @@ -348,6 +354,7 @@ #These functions _must_ be safe to run at any time (i.e. not be version specfic or only safe to run once) self.populate_date_time_local() self.populate_duration_from_time() + self.add_lap_metadata() logging.debug('<<') def checkDBDataValues(self): @@ -442,3 +449,21 @@ print e logging.debug("Error updating record: " + str(record)) logging.debug(str(e)) + + def add_lap_metadata(self): + logging.debug('--') + record_ids = set([r[0] for r in self.select("laps","record")]) + for record in record_ids: + try: + laps = self.select("laps","id_lap, intensity, avg_hr, max_hr, max_speed, trigger", "record = %s" % record) + gpxfile = self.configuration.gpxdir+"/%s.gpx"%(record) + if not laps[0][1] and os.path.isfile(gpxfile) : #GPX file exists for this record - probably not a manual record + gpxrecord = gpx.Gpx(filename=gpxfile) + for lap, gpxlap in zip(laps, gpxrecord.getLaps()): + self.ddbbObject.update("laps", "intensity, avg_hr, max_hr, max_speed, trigger", (gpxlap[7], gpxlap[8], gpxlap[9], gpxlap[10], "%s" % gpxlap[11]), "id_lap = %d" % lap[0]) + except Exception as e: + print "Error updating record: " + str(record) + print e + logging.debug("Error updating record: " + str(record)) + logging.debug(str(e)) + Modified: pytrainer/trunk/pytrainer/lib/gpx.py =================================================================== --- pytrainer/trunk/pytrainer/lib/gpx.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/lib/gpx.py 2011-03-19 00:16:14 UTC (rev 772) @@ -47,6 +47,9 @@ startPointTag = gpxdataNS.substitute(tag="startPoint") elapsedTimeTag = gpxdataNS.substitute(tag="elapsedTime") distanceTag = gpxdataNS.substitute(tag="distance") +intensityTag = gpxdataNS.substitute(tag="intensity") +triggerTag = gpxdataNS.substitute(tag="trigger") +summaryTag = gpxdataNS.substitute(tag="summary") pytrainerNS = string.Template(".//{http://sourceforge.net.project/pytrainer/GPX/0/1}$tag") pyt_eleTag = pytrainerNS.substitute(tag="ele") @@ -99,6 +102,7 @@ trackSegTag = mainNS.substitute(tag="trkseg") elevationTag = mainNS.substitute(tag="ele") nameTag = mainNS.substitute(tag="name") + intensityTag = mainNS.substitute(tag="intensity") logging.debug("getting values...") self.Values = self._getValues() @@ -161,7 +165,7 @@ lat = self.trkpoints[-1]['lat'] lon = self.trkpoints[-1]['lon'] #print ((self.total_time, lat, lon, self.calories, self.total_dist, stLat, stLon)) - lapInfo.append((self.total_time, lat, lon, self.calories, self.total_dist*1000, stLat, stLon)) + lapInfo.append((self.total_time, lat, lon, self.calories, self.total_dist*1000, stLat, stLon, "active", self.hr_average, self.maxhr, self.maxvel, "manual")) else: for lap in laps: endPoint = lap.find(endPointTag) @@ -180,8 +184,14 @@ #print elapsedTime calories = lap.findtext(calorieTag) distance = lap.findtext(distanceTag) + intensity = lap.findtext(intensityTag) + trigger = lap.findtext(triggerTag) + summary = lap.find(summaryTag) + max_speed = summary.findtext(mainNS.substitute(tag="MaximumSpeed")) + avg_hr = summary.findtext(mainNS.substitute(tag="AverageHeartRateBpm")) + max_hr = summary.findtext(mainNS.substitute(tag="MaximumHeartRateBpm")) logging.debug("Found time: %s, lat: %s lon: %s cal: %s dist: %s " % (elapsedTime, lat, lon, calories, distance)) - lapInfo.append((elapsedTime, lat, lon, calories, distance, stLat, stLon)) + lapInfo.append((elapsedTime, lat, lon, calories, distance, stLat, stLon, intensity, avg_hr, max_hr, max_speed, trigger)) logging.debug("<<") return lapInfo Modified: pytrainer/trunk/pytrainer/lib/sqliteUtils.py =================================================================== --- pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/lib/sqliteUtils.py 2011-03-19 00:16:14 UTC (rev 772) @@ -116,7 +116,7 @@ for val in values: if count>0: string+="," - string += """%s="%s" """ %(cells[count],values[count]) + string += """%s=%s """ %(cells[count],values[count] if type(values[count]) not in [str, unicode] else "'%s'" % values[count]) count = count+1 string +=" where %s" %condition Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/main.py 2011-03-19 00:16:14 UTC (rev 772) @@ -55,7 +55,7 @@ def __init__(self,filename = None, data_path = None): #Version constants self.version ="1.8.0-svn#753" - self.DB_version = 6 + self.DB_version = 7 #Process command line options self.startup_options = self.get_options() self.environment = Environment(platform.get_platform(), self.startup_options.conf_dir) Modified: pytrainer/trunk/pytrainer/record.py =================================================================== --- pytrainer/trunk/pytrainer/record.py 2011-03-16 23:43:51 UTC (rev 771) +++ pytrainer/trunk/pytrainer/record.py 2011-03-19 00:16:14 UTC (rev 772) @@ -237,6 +237,11 @@ tmp_lap['end_lat'] = lap[1] tmp_lap['end_lon'] = lap[2] tmp_lap['calories'] = lap[3] + tmp_lap['intensity'] = lap[7] + tmp_lap['avg_hr'] = lap[8] + tmp_lap['max_hr'] = lap[9] + tmp_lap['max_speed'] = lap[10] + tmp_lap['trigger'] = lap[11] laps.append(tmp_lap) logging.debug('<<') return laps @@ -346,7 +351,7 @@ def getLaps(self, id_record): logging.debug('--') laps = self.pytrainer_main.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger", "record=\"%s\"" % id_record) if laps is None or laps == []: #No laps stored - update DB logging.debug("No laps in DB for record %d" % id_record) @@ -363,7 +368,7 @@ self.insertLaps(lap_keys,lap.values()) #Try to get lap info again #TODO? refactor laps = self.pytrainer_main.ddbb.select("laps", - "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number", + "id_lap, record, elapsed_time, distance, start_lat, start_lon, end_lat, end_lon, calories, lap_number, intensity, max_speed, avg_hr, max_hr, trigger", "record=\"%s\"" % id_record) return laps This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-03-16 23:43:57
|
Revision: 771 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=771&view=rev Author: siggipals Date: 2011-03-16 23:43:51 +0000 (Wed, 16 Mar 2011) Log Message: ----------- Respect unit prefs in record lap info Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-15 17:58:48 UTC (rev 770) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-16 23:43:51 UTC (rev 771) @@ -147,7 +147,7 @@ #create the columns for the laps treeview columns=[ {'name':_("Lap")}, - {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.1f', 'quantity':'distance'}, + {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.2f', 'quantity':'distance'}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'}, {'name':_("Avg pace"), 'xalign':1.0, 'quantity':'pace'}, @@ -391,6 +391,10 @@ for lap in activity.laps: t = lap['elapsed_time'] m = lap['distance'] + + if self.pytrainer_main.profile.getValue("pytraining","prf_us_system") == "True": + m = km2miles(m) + s = m / float(t) * 3.6 if s > 0: pace = "%d:%02d" %((3600/s)/60,(3600/s)%60) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dg...@us...> - 2011-03-15 17:58:54
|
Revision: 770 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=770&view=rev Author: dgranda Date: 2011-03-15 17:58:48 +0000 (Tue, 15 Mar 2011) Log Message: ----------- Fixed issue when calculating pace showing lap info - #109 Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowmain.py Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-12 01:12:42 UTC (rev 769) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2011-03-15 17:58:48 UTC (rev 770) @@ -150,7 +150,7 @@ {'name':_("Distance"), 'xalign':1.0, 'format_float':'%.1f', 'quantity':'distance'}, {'name':_("Time"), 'xalign':1.0, 'format_duration':True}, {'name':_("Avg speed"), 'format_float':'%.2f', 'quantity':'speed'}, - {'name':_("Avg pace"), 'format_float':'%.2f', 'quantity':'pace'}, + {'name':_("Avg pace"), 'xalign':1.0, 'quantity':'pace'}, {'name':_("Calories"), 'xalign':1.0}, ] self.create_treeview(self.lapsTreeView,columns) @@ -385,15 +385,17 @@ gobject.TYPE_FLOAT, gobject.TYPE_STRING, gobject.TYPE_FLOAT, - gobject.TYPE_FLOAT, + gobject.TYPE_STRING, gobject.TYPE_INT, ) for lap in activity.laps: t = lap['elapsed_time'] m = lap['distance'] s = m / float(t) * 3.6 + if s > 0: + pace = "%d:%02d" %((3600/s)/60,(3600/s)%60) iter = store.append() - store.set(iter, 0, lap['lap_number']+1, 1, m/1000, 2, str(int(float(t))), 3, s, 4, 60/s, 5, lap['calories']) + store.set(iter, 0, lap['lap_number']+1, 1, m/1000, 2, str(int(float(t))), 3, s, 4, pace, 5, lap['calories']) self.lapsTreeView.set_model(store) self.lapsTreeView.set_rules_hint(True) self.frame_laps.show() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sig...@us...> - 2011-03-12 01:12:48
|
Revision: 769 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=769&view=rev Author: siggipals Date: 2011-03-12 01:12:42 +0000 (Sat, 12 Mar 2011) Log Message: ----------- #76 - Don't accept duplicate sport names Modified Paths: -------------- pytrainer/trunk/pytrainer/gui/windowprofile.py Modified: pytrainer/trunk/pytrainer/gui/windowprofile.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-03-12 00:11:01 UTC (rev 768) +++ pytrainer/trunk/pytrainer/gui/windowprofile.py 2011-03-12 01:12:42 UTC (rev 769) @@ -320,6 +320,14 @@ met = self.newmetentry.get_text() weight = self.newweightentry.get_text() maxpace = self.newmaxpace.get_text() + if sport.lower() in [s[0].lower() for s in self.parent.getSportList()]: + msg = "Sport '%s' already exists" % sport + logging.error(msg) + md = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, _(msg)) + md.set_title(_("Sport Creation Error")) + md.run() + md.destroy() + return self.parent.addNewSport(sport,met,weight,maxpace) self.parent.actualize_mainsportlist() self.on_switch_page(None,None,2) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |