1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-03 22:39:15 +02:00

Compare commits

...

357 Commits
7.9 ... 7.20

Author SHA1 Message Date
cb03c8a903 Always run the redistributables installer and let it decide what to do
(instead of an own and broken registry check with magic numbers)
2020-01-26 15:58:20 +01:00
eef6360643 Fixed MSVC redist checks 2020-01-26 14:07:49 +01:00
ac73c04445 MSVC redistributables names have changed 2020-01-26 13:23:45 +01:00
3299b41ec7 There is no Qt 5.14/VS2017 on appveyor... 2020-01-26 13:13:34 +01:00
58fd5022ca paths? 2020-01-26 13:07:55 +01:00
ebe1851abb ... 2020-01-26 13:02:29 +01:00
b3ddbd7b63 Removed duplicit configuration 2020-01-26 12:57:27 +01:00
e5042b11d7 Maybe there is a completely different error... 2020-01-26 12:55:46 +01:00
2e0eadd0e7 Try another path 2020-01-26 12:51:19 +01:00
42e917efab Reduced test 2020-01-26 12:49:47 +01:00
07761ea335 Try it using conditions... 2020-01-26 12:39:38 +01:00
f17e5c2ea1 try it without call 2020-01-26 12:33:15 +01:00
21bcaf9562 Some more try... 2020-01-26 12:17:15 +01:00
a160cb4eb3 Maybe this way... 2020-01-26 12:08:02 +01:00
f5ec18a13a Surrender 2020-01-26 12:02:30 +01:00
f6b15e1acc Yet another try... 2020-01-26 11:59:12 +01:00
652471ac90 ?! 2020-01-26 11:52:16 +01:00
2da1f8bc70 @#$%^! windows shell 2020-01-26 11:49:42 +01:00
2d4d2721bf Added missing quotes 2020-01-26 11:43:17 +01:00
d74816883a AppVeyor build fix 2020-01-26 11:40:38 +01:00
81b5631de4 Updated Windows build environment
(Qt 5.14, MSVC 2017, OpenSSL 1.1.1)
2020-01-26 11:27:48 +01:00
2e84901e43 Merge branch 'origin/master' into Weblate. 2020-01-24 19:45:01 +01:00
f61fb5657c Translated using Weblate (Spanish)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/es/
2020-01-24 19:45:01 +01:00
24e216cdfc Translated using Weblate (French)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2020-01-24 19:45:00 +01:00
09d6de00a6 Some more style/layout fiddeling
+ code cleanup
2020-01-24 19:44:19 +01:00
f7990ee2e6 Merge branch 'origin/master' into Weblate. 2020-01-23 23:22:56 +01:00
cb01c0b590 Cleanup the remaining parser that stores temporary data 2020-01-23 23:22:04 +01:00
21cf5ddaec Merge branch 'origin/master' into Weblate. 2020-01-23 23:21:01 +01:00
48d4686dd4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2020-01-23 23:21:01 +01:00
d035a307d8 Variables with underscores followed by a capital letter are prohibited by the C++ standard
Fixes #266
2020-01-23 23:19:32 +01:00
89e04f3678 Translated using Weblate (Swedish)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2020-01-23 08:04:58 +01:00
e664fc188c Translated using Weblate (German)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2020-01-23 08:04:58 +01:00
3597a07ed7 Translated using Weblate (Czech)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2020-01-23 08:04:58 +01:00
0472cc03f3 Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.0% (323 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2020-01-23 08:04:57 +01:00
d169a9f710 Translated using Weblate (Turkish)
Currently translated at 100.0% (351 of 351 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2020-01-23 08:04:57 +01:00
2ff2195116 Localization update 2020-01-22 22:42:26 +01:00
cdbf2db5fe Version++ 2020-01-22 22:39:14 +01:00
2bb635a120 Log coordinates in a better usable way 2020-01-22 22:36:58 +01:00
465b146001 Do not duplicate the area descriptions where (most) maps have POIs 2020-01-22 22:18:29 +01:00
ce6d6298bb Use the polygons labels for displaying rather than discarding them 2020-01-22 21:01:05 +01:00
ae2ff99be8 Do not fetch polygon labels as they are unused anyway 2020-01-22 07:46:58 +01:00
5b6cd24839 Merge branch 'master' of https://github.com/tumic0/GPXSee 2020-01-21 21:53:07 +01:00
cd22e6207a Added support for Huffman compressed RGN data 2020-01-21 21:50:13 +01:00
b826e497f3 Some more cosmetics 2020-01-19 21:00:11 +01:00
7cc39f25e1 Code cleanup 2020-01-19 18:08:03 +01:00
f61d9fcd55 Fixed crash on error introduced with the latest error handling changes
(+ ignore broken tiles rather than terminate parsing)
2020-01-19 17:40:14 +01:00
67a1f7e108 Includes cleanup 2020-01-19 17:05:26 +01:00
040de56a54 Fixed error handling + code cleanup 2020-01-19 13:23:20 +01:00
a486abb159 Added workaround for broken GPS IFD entries produced by NOKIA phones
Closes #260
2020-01-16 22:54:12 +01:00
37215959b8 Merge branch 'origin/master' into Weblate. 2020-01-16 19:32:17 +01:00
1ccce095a9 Updated appdata info 2020-01-16 19:31:40 +01:00
057180e431 Added OS X SML integration 2020-01-16 19:31:14 +01:00
60e62da6a2 Merge branch 'origin/master' into Weblate. 2020-01-15 23:24:58 +01:00
a3eafea60a Added missing icon file 2020-01-15 23:24:20 +01:00
962f8de160 Merge branch 'origin/master' into Weblate. 2020-01-15 23:11:01 +01:00
6525d34e08 Added SML desktop integration (Windows + Linux) 2020-01-15 23:10:14 +01:00
3c661ddf65 Merge branch 'origin/master' into Weblate. 2020-01-15 21:56:45 +01:00
42b4216d9c Added support for sensors data 2020-01-15 21:56:04 +01:00
4e7418111d Merge branch 'origin/master' into Weblate. 2020-01-14 23:21:58 +01:00
a89ef11d73 Added basic support for Suunto SML files 2020-01-14 23:21:05 +01:00
d8b54ac342 Version++ 2020-01-12 16:09:06 +01:00
293046590e Merge branch 'origin/master' into Weblate. 2020-01-12 16:08:19 +01:00
ea2f67fc09 Merge branch 'origin/master' into Weblate. 2020-01-12 16:01:50 +01:00
60b33064a7 Delete the popup immediately to prevent it "blocking" an error message 2020-01-12 16:01:38 +01:00
2efc6fb6d3 Optimization 2020-01-11 23:41:04 +01:00
eb744df9cc Merge branch 'origin/master' into Weblate. 2020-01-11 23:40:49 +01:00
8c9180190a Fixed buffer overflow 2020-01-05 00:50:02 +01:00
6c6d297a3c Merge branch 'origin/master' into Weblate. 2020-01-05 00:49:34 +01:00
6839119794 Updated 4Umaps URL 2019-12-23 17:05:38 +01:00
669715aa32 Merge branch 'origin/master' into Weblate. 2019-12-23 17:05:27 +01:00
fdc172ab38 Merge branch 'origin/master' into Weblate. 2019-12-23 16:16:26 +01:00
05f23de1ed Clear the popup on scene clear
Fixes #257
2019-12-23 16:16:15 +01:00
9a0344adac Switched OpenStreetMap to HTTPS 2019-12-23 15:48:58 +01:00
b9d5fa8772 Merge branch 'origin/master' into Weblate. 2019-12-23 15:48:57 +01:00
d4de0edca6 Merge branch 'origin/master' into Weblate. 2019-12-20 23:39:29 +01:00
fdeb24a196 Properly load non-ASCII map names 2019-12-20 23:39:20 +01:00
7f650f9d6a Merge branch 'origin/master' into Weblate. 2019-12-11 16:02:28 +01:00
a986293f20 Properly handle points with extended style IDs 2019-12-09 22:50:19 +01:00
ec0b0adba0 Merge branch 'master' of https://github.com/tumic0/GPXSee 2019-12-04 22:20:01 +01:00
52c6bb569e Merge branch 'origin/master' into Weblate. 2019-12-04 22:19:59 +01:00
0f670f9ddd A much nicer (and faster) 24b conversion 2019-12-04 22:19:00 +01:00
dba46b09a8 Merge branch 'origin/master' into Weblate. 2019-12-03 08:19:20 +01:00
ce59f13de7 Ukrainian localized comment for gpxsee.desktop entry (#259) 2019-12-03 08:19:14 +01:00
b8cf3872ce Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.0% (322 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2019-12-02 10:32:40 +01:00
b59112f74e Added missing error handling 2019-12-01 13:33:00 +01:00
17b3602fda Fixed/improved pause detection
Fixes #250
2019-11-26 23:15:06 +01:00
c0928097cc Merge branch 'origin/master' into Weblate. 2019-11-26 20:17:22 +01:00
e709fad764 French description in desktop (#253) 2019-11-26 20:17:18 +01:00
fb566ae163 Merge branch 'origin/master' into Weblate. 2019-11-26 20:16:51 +01:00
3d8a4cc6b7 append Comment[tr] (#254) 2019-11-26 20:16:47 +01:00
4eb44a53f7 Merge branch 'origin/master' into Weblate. 2019-11-26 08:15:11 +01:00
b61c39ea46 Code cleanup 2019-11-26 08:15:01 +01:00
4767be1972 Translated using Weblate (French)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2019-11-23 10:04:57 +01:00
ee9e17e31c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2019-11-20 13:24:45 +01:00
3721084d21 Made the code compile on QT5 < 5.9
+ propper error handling
2019-11-15 23:41:30 +01:00
6076c9d82e Added missing includes 2019-11-15 23:05:22 +01:00
2ef499001d Merge branch 'origin/master' into Weblate. 2019-11-15 22:11:18 +01:00
e4d8ab1feb Added support for multiple images 2019-11-15 22:10:55 +01:00
2fc82aceab Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2019-11-15 14:04:32 +01:00
475eb6185a Added missing red light camera entry points 2019-11-14 22:55:06 +01:00
cdf3a48516 Improved layout on OS X 2019-11-13 20:03:19 +01:00
dcc3c0086a Merge branch 'origin/master' into Weblate. 2019-11-13 19:21:48 +01:00
0d6aeecebb Added missing speed 2019-11-13 19:21:41 +01:00
704c68443a Translated using Weblate (Finnish)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-11-13 19:13:01 +01:00
183b02a5e7 Translated using Weblate (Russian)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-11-13 19:13:01 +01:00
e91815150d Translated using Weblate (Turkish)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2019-11-13 19:13:00 +01:00
73c33450ee Translated using Weblate (Swedish)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2019-11-13 10:40:31 +01:00
e06d07c176 Translated using Weblate (German)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2019-11-13 09:52:37 +01:00
c73f30e21f Translated using Weblate (Czech)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2019-11-13 09:48:52 +01:00
bbf2044729 Fixed typo 2019-11-13 09:43:54 +01:00
4a86ab9d1e Merge remote-tracking branch 'weblate/master' 2019-11-13 09:41:25 +01:00
16c3fea8a8 Fixed weblate merge conflict 2019-11-13 09:26:42 +01:00
f4ec9b6ac4 A better option name 2019-11-13 09:13:05 +01:00
44155f9ef0 Translated using Weblate (Russian)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-11-13 08:54:30 +01:00
a5e809a0f3 Translated using Weblate (Finnish)
Currently translated at 100.0% (350 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-11-13 08:54:29 +01:00
3e70f9262b Translated using Weblate (Russian)
Currently translated at 99.7% (349 of 350 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-11-13 08:42:08 +01:00
3573a2edbe Localization update 2019-11-13 08:33:51 +01:00
82d9623c6d Merge branch 'origin/master' into Weblate. 2019-11-13 08:28:07 +01:00
258a9b0201 Added automatic pause detection 2019-11-13 08:27:54 +01:00
36d84f6c98 Merge branch 'origin/master' into Weblate. 2019-11-11 20:21:58 +01:00
15c79a7a13 Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.0% (320 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2019-11-11 20:21:58 +01:00
34e0294815 Translated using Weblate (Finnish)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-11-11 20:21:58 +01:00
ad6a04b975 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2019-11-11 20:21:57 +01:00
e0f682fcd8 Translated using Weblate (Russian)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-11-11 20:21:57 +01:00
a801359eed Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2019-11-11 20:21:57 +01:00
bb238f4c7e Missing GPI integration stuff 2019-11-11 20:21:14 +01:00
c1ebc8e74b Merge branch 'origin/master' into Weblate. 2019-11-10 19:48:36 +01:00
110c8c6bed Fixed broken coordinates decoding 2019-11-10 19:48:17 +01:00
e8fffe65bf Merge branch 'origin/master' into Weblate. 2019-11-10 19:20:38 +01:00
1731aa1890 Added propper error handling 2019-11-10 19:20:25 +01:00
c389889662 Merge branch 'origin/master' into Weblate. 2019-11-10 18:39:49 +01:00
e38e12f89b Allow arbitrary zoom levels
Closes #244
2019-11-10 18:38:47 +01:00
26f71f5d00 Merge branch 'origin/master' into Weblate. 2019-11-10 18:00:16 +01:00
65e04ce08b Fixed areas tooltip handling 2019-11-10 17:59:58 +01:00
d84d8e03e0 Merge branch 'origin/master' into Weblate. 2019-11-10 16:47:01 +01:00
475ad358ae Translated using Weblate (Turkish)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2019-11-10 16:47:01 +01:00
db7e60bdfb Added support for GPI speed/red light cameras 2019-11-10 16:46:31 +01:00
444791fb4c Translated using Weblate (Swedish)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2019-11-10 07:00:23 +01:00
be3a882baa Merge branch 'origin/master' into Weblate. 2019-11-09 23:06:59 +01:00
6d6dc9f316 Code cleanup 2019-11-09 23:06:52 +01:00
d86e825c60 Merge branch 'origin/master' into Weblate. 2019-11-09 21:43:45 +01:00
6bb2af3da8 Translated using Weblate (Czech)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2019-11-09 21:43:45 +01:00
d195526afb Translated using Weblate (German)
Currently translated at 100.0% (348 of 348 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2019-11-09 21:43:45 +01:00
9ec3956672 Code cleanup 2019-11-09 21:43:07 +01:00
3098d2ab95 Merge branch 'origin/master' into Weblate. 2019-11-09 21:27:06 +01:00
dccf9f7e1a Localization update 2019-11-09 21:26:52 +01:00
e55c29c33c Merge branch 'origin/master' into Weblate. 2019-11-09 21:25:57 +01:00
bd5728ffa0 Version++ 2019-11-09 21:25:45 +01:00
af525d4e3d Merge branch 'origin/master' into Weblate. 2019-11-08 21:01:37 +01:00
96e0b584a0 Added support for waypoint addresses 2019-11-08 21:00:59 +01:00
0d6e3bac17 Merge branch 'origin/master' into Weblate. 2019-11-08 01:04:43 +01:00
d292b5f533 Fixed Qt4 build 2019-11-08 01:04:17 +01:00
ec2cb21a8a Merge branch 'origin/master' into Weblate. 2019-11-07 23:24:25 +01:00
3632ed8816 Do not duplicate temporary images + improved error handling 2019-11-07 23:23:25 +01:00
58acea1a2d Translated using Weblate (French)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2019-11-07 05:35:59 +01:00
9e63e3f47e Added support for GPI images
+ GPI parser fixes/improvements
2019-11-06 23:23:05 +01:00
7581c8a32a Trying to fix the OS X build 2019-11-06 08:50:46 +01:00
8715e0e37b Enabled Ukrainian localization 2019-11-05 21:59:01 +01:00
36b9813e1b Merge branch 'origin/master' into Weblate. 2019-11-05 19:41:53 +01:00
1a59e1cb24 Code cleanup 2019-11-05 19:31:52 +01:00
7f7d25a6fa Translated using Weblate (Finnish)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-11-05 00:39:45 +01:00
87755952b6 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2019-11-04 10:19:52 +01:00
3821eb4d84 Merge branch 'origin/master' into Weblate. 2019-11-03 17:27:43 +01:00
15af82ee49 Improved pause detection 2019-11-03 17:27:15 +01:00
1f8a66108b Merge branch 'origin/master' into Weblate. 2019-11-02 23:26:16 +01:00
9309dd945b Added Ukrainian translations file stub 2019-11-02 23:25:41 +01:00
858741c9a5 Translated using Weblate (Russian)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-11-02 19:23:59 +01:00
26c922d9a2 Merge branch 'origin/master' into Weblate. 2019-11-02 09:54:50 +01:00
2ba78545ef Fixed broken GPI files encoding handling 2019-11-02 09:54:11 +01:00
d2a47d1a51 Merge branch 'origin/master' into Weblate. 2019-11-01 19:11:10 +01:00
b2ca97b836 Version++ 2019-11-01 19:10:47 +01:00
979981ffb8 Merge branch 'origin/master' into Weblate. 2019-11-01 19:07:57 +01:00
9a57ca69a0 Added support for mangled POI files 2019-11-01 19:07:21 +01:00
7b9bdf1f08 Merge branch 'origin/master' into Weblate. 2019-10-31 19:16:04 +01:00
034647b461 Added Garmin GPI info 2019-10-31 19:16:00 +01:00
f1d8497851 Merge branch 'origin/master' into Weblate. 2019-10-31 17:49:39 +01:00
2f2f155707 Fixed broken DEM value reading on southern and western coordinates
Fixes #240
2019-10-31 17:47:58 +01:00
6d87587544 Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.9% (319 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2019-10-31 06:46:09 +01:00
dad2d79361 Translated using Weblate (Swedish)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2019-10-30 22:56:49 +01:00
9f2d7eb4bb Translated using Weblate (Turkish)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2019-10-30 22:56:48 +01:00
b57809b3b3 Translated using Weblate (German)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2019-10-30 22:56:48 +01:00
6cb6c1b4fd Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2019-10-30 22:56:47 +01:00
14a01b7126 Translated using Weblate (Czech)
Currently translated at 100.0% (347 of 347 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2019-10-30 22:56:47 +01:00
315c095af9 Localization files update 2019-10-30 19:48:06 +01:00
10d2fe4431 Fixed crash on empty segment
Fixes #239
2019-10-29 09:10:32 +01:00
29147e1b8b Merge branch 'origin/master' into Weblate. 2019-10-28 15:21:08 +01:00
0a1a1ac6be Fixed path marker Z-value issue 2019-10-28 15:20:38 +01:00
6c102c6d98 Merge branch 'origin/master' into Weblate. 2019-10-28 14:34:50 +01:00
df89952483 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (346 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2019-10-28 14:34:50 +01:00
01d8d917cb Merge branch 'master' of https://github.com/tumic0/GPXSee 2019-10-28 14:34:32 +01:00
d1522210e5 Added Windows GPI integration 2019-10-28 14:34:01 +01:00
d3ac528d57 Merge branch 'origin/master' into Weblate. 2019-10-28 12:02:26 +01:00
82eed4759c Added OS X GPI integration 2019-10-28 12:01:58 +01:00
2a94e1ac59 Merge branch 'origin/master' into Weblate. 2019-10-28 11:06:31 +01:00
8feeeaa918 Added GPI icon 2019-10-28 11:06:06 +01:00
2946fa799e Merge branch 'origin/master' into Weblate. 2019-10-28 09:11:26 +01:00
41ebe8aec7 Be more strict when handling tracks with missing timestamps 2019-10-28 09:10:38 +01:00
e35a8246f9 Merge branch 'origin/master' into Weblate. 2019-10-27 22:52:06 +01:00
725bb8a381 Graphs with zero size height are valid 2019-10-27 22:51:36 +01:00
fc5eea33cf Merge branch 'origin/master' into Weblate. 2019-10-27 19:54:12 +01:00
a1de3c956c Fixed broken graphs with missing time data handling 2019-10-27 19:53:32 +01:00
d2d9b94e78 Merge branch 'origin/master' into Weblate. 2019-10-27 16:35:16 +01:00
e6b205e823 Fixed error handling 2019-10-27 16:34:53 +01:00
0b680928fd Merge branch 'origin/master' into Weblate. 2019-10-25 22:31:04 +02:00
c0c01eef8b Added support for GPI files 2019-10-25 22:30:12 +02:00
7cdee93e9e Translated using Weblate (Turkish)
Currently translated at 100.0% (346 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2019-10-24 05:01:25 +02:00
33071ac8df Translated using Weblate (Finnish)
Currently translated at 100.0% (346 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-10-24 05:01:25 +02:00
c7ff6f3aa1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.3% (316 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2019-10-24 05:01:24 +02:00
c61d4c8201 Translated using Weblate (Russian)
Currently translated at 100.0% (346 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-10-24 05:01:23 +02:00
05a871c8a0 Translated using Weblate (Swedish)
Currently translated at 100.0% (346 of 346 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2019-10-24 05:01:23 +02:00
ae9dd309e9 CZ and DE translations 2019-10-22 22:41:08 +02:00
cea0a51d0e Localization update 2019-10-22 22:35:36 +02:00
5dcc63600c Removed the pt_PT localization stub as noone is evidently going to really translate that language... 2019-10-22 22:28:43 +02:00
c29ed0a2ca Nicer multiple links display 2019-10-22 22:27:12 +02:00
9905de67bd Added support for GPX 1.0 links 2019-10-20 20:30:10 +02:00
25b42fd2f8 Version++ 2019-10-18 08:38:04 +02:00
0a6d575b21 Fixed symbol name collision 2019-10-17 22:37:21 +02:00
21de5e22e4 Fixed QT4 build 2019-10-17 22:14:58 +02:00
4670630e22 A much better windows popup close handling 2019-10-17 22:02:44 +02:00
5f79326601 Made the popup disappear logic work on Windows 2019-10-16 22:58:22 +02:00
0c1a123cd9 Handle the tooltips pixel accurate 2019-10-16 19:22:55 +02:00
9c96e7124a Added tooltip event triggers for info messages 2019-10-15 23:59:15 +02:00
694847a424 Extended links support + popup fixes 2019-10-14 20:07:05 +02:00
e7f5da5af7 Added missing text wrappping 2019-10-14 01:45:16 +02:00
d59a37466b Added support for waypoint links 2019-10-14 01:16:38 +02:00
f2bfd584d0 Fixed flickering & QT4 problems 2019-10-14 00:07:57 +02:00
a9ce6f54c7 Hyperlink + copy&paste enabled tool tips 2019-10-13 20:20:32 +02:00
de9bae9d66 Fixed broken path ticks tool tip units switching
Fixes #233
2019-10-07 22:03:26 +02:00
716662322d Wrong project... 2019-10-05 22:06:13 +02:00
2a893fe4ef Added change log link 2019-10-05 22:04:14 +02:00
a24d55025f Text layout tweaking & optimization 2019-10-05 12:41:42 +02:00
04ddcecb70 Increased tile cache size 2019-10-03 22:47:31 +02:00
dc9a600a6e Version++ 2019-10-03 01:06:53 +02:00
c365de130b Properly align the zoom 0 level with tiles of a different size than 256 2019-10-02 23:58:58 +02:00
d3558198ca Translated using Weblate (German)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/de/
2019-09-29 11:58:18 +02:00
acc69f5c3d Merge branch 'origin/master' into Weblate. 2019-09-29 11:47:55 +02:00
7a900f2252 Version++ 2019-09-29 11:48:08 +02:00
dad76a4e89 Merge branch 'origin/master' into Weblate. 2019-09-29 11:24:33 +02:00
e28e69b248 Added support for enchanced altitude and speed entries 2019-09-29 11:24:20 +02:00
7fffd6a161 Merge branch 'origin/master' into Weblate. 2019-09-29 00:03:21 +02:00
c4fd82e5a0 Properly handle routes without elevation data as well 2019-09-29 00:03:14 +02:00
fa08c0dbea Properly handle files without elevation data 2019-09-28 23:56:59 +02:00
070eff2115 Print a warning message on unsupported IMG compression 2019-09-28 23:55:26 +02:00
20a4870904 Merge branch 'origin/master' into Weblate. 2019-09-21 00:37:02 +02:00
1bb9908936 Some more code cleanup 2019-09-21 00:36:49 +02:00
36555b3140 Code cleanup 2019-09-20 00:23:47 +02:00
6564fb36ab Merge branch 'origin/master' into Weblate. 2019-09-20 00:23:46 +02:00
1a3356b8fe Cosmetics 2019-09-18 09:18:09 +02:00
7ad64922c9 Merge branch 'origin/master' into Weblate. 2019-09-18 09:18:09 +02:00
64a8ec1b84 Merge branch 'origin/master' into Weblate. 2019-09-18 09:12:36 +02:00
0a75298b2b Made the variable record info parsing universal 2019-09-18 09:11:46 +02:00
99be5699af Merge branch 'origin/master' into Weblate. 2019-09-18 08:38:05 +02:00
cdb641b204 Properly read variable length values
Code cleanup
2019-09-18 08:37:33 +02:00
f57bd48840 Merge branch 'origin/master' into Weblate. 2019-09-10 19:45:52 +02:00
c2abf2c146 Prefer loading speed over "NT maps not supported" reporting 2019-09-10 19:45:06 +02:00
a5a2070ccc Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2019-09-09 12:35:04 +02:00
ed7cb1beb1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.3% (313 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2019-09-09 12:35:04 +02:00
37d832bc7f Translated using Weblate (French)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2019-09-09 12:35:04 +02:00
c322bf9f68 Translated using Weblate (Turkish)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2019-09-07 21:35:43 +02:00
2705ffbbfe Translated using Weblate (Russian)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2019-09-07 00:22:41 +02:00
e8962dd50f Translated using Weblate (Czech)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2019-09-07 00:22:40 +02:00
b37e32d622 Translated using Weblate (Finnish)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2019-09-07 00:22:40 +02:00
2b1d0d2189 Translated using Weblate (Swedish)
Currently translated at 100.0% (343 of 343 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2019-09-07 00:22:39 +02:00
33e3471ca3 Added pt_PT translation file stub 2019-09-06 20:10:40 +02:00
bf55f1e07d ts files update 2019-09-06 20:10:09 +02:00
37a0eec48f Added support for pseudo-NT IMG maps (e.g. TopoHispania) 2019-09-05 22:31:13 +02:00
fcaacb4b6a Version++ 2019-08-29 20:18:35 +02:00
f9c593e6d1 Fixed the "DEM values not used in route points" issue 2019-08-29 20:15:03 +02:00
37e07accd4 Fixed percent slider updates 2019-08-27 20:19:06 +02:00
a7117361be Cosmetics 2019-08-27 20:18:39 +02:00
548c03d543 Added support for graph zooming 2019-08-26 21:03:40 +02:00
1addb1118d Fixed broken maximal ticks count limitation 2019-08-26 20:40:14 +02:00
ae64ef9d83 Only use B records with a valid fix in IGC files 2019-08-25 13:05:27 +02:00
3d16cf2500 Removed forgotten debug stuff 2019-08-25 11:38:41 +02:00
609ac0c57a Graph loading performance improvement
+ code/API cleanup
2019-08-25 10:54:25 +02:00
a70c6f0f24 Fixed broken gear ratio statistics 2019-08-22 19:56:55 +02:00
3ad0c89511 Added missing area-under-mouse highlighting 2019-08-19 19:22:16 +02:00
1497d42bd5 Added CUP files support info 2019-08-18 00:13:04 +02:00
a4906e7d01 Translated using Weblate (Spanish)
Currently translated at 98.5% (337 of 342 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/es/
2019-08-17 20:15:59 +02:00
f56dfd95e3 Merge branch 'origin/master' into Weblate. 2019-08-17 11:07:57 +02:00
2bda7ba714 Ignore "???" turnpoints in CUP tasks 2019-08-17 11:07:28 +02:00
940bd0511e Merge branch 'origin/master' into Weblate. 2019-08-17 10:45:16 +02:00
30518cebc0 Fixed CUP task parsing 2019-08-17 10:44:53 +02:00
696bc50ba1 Merge branch 'origin/master' into Weblate. 2019-08-16 21:33:03 +02:00
b91358a6bd Added CUP files OS X desktop integration 2019-08-16 21:32:31 +02:00
94eab9fba0 Merge branch 'origin/master' into Weblate. 2019-08-16 20:51:20 +02:00
44b98754d7 Version++ 2019-08-16 20:50:59 +02:00
8451178808 Merge branch 'origin/master' into Weblate. 2019-08-16 20:47:25 +02:00
7eedcc083e CUP files Windows & Linux desktop integration 2019-08-16 20:46:42 +02:00
cd32b21aca Merge branch 'origin/master' into Weblate. 2019-08-16 18:33:27 +02:00
e1bda86b35 Use the whole waypoint info in the route points
+ Optimize for waypoint reading
2019-08-16 18:32:55 +02:00
967e307be9 Fixed QT4 build 2019-08-15 22:10:25 +02:00
7cf1e3e1a5 Merge branch 'origin/master' into Weblate. 2019-08-15 22:10:11 +02:00
0f44feebb1 Merge branch 'origin/master' into Weblate. 2019-08-15 21:28:40 +02:00
ecb82952f6 Added support for SeeYou CUP files 2019-08-15 21:27:55 +02:00
ab6ea84255 Some more cleanup 2019-08-13 20:50:43 +02:00
0b2d610a34 Merge branch 'origin/master' into Weblate. 2019-08-13 20:50:30 +02:00
f67eaa8dec Various code cleanup 2019-08-12 22:20:12 +02:00
2a619aa0ef Merge branch 'origin/master' into Weblate. 2019-08-12 22:20:03 +02:00
dd292bc995 Merge branch 'origin/master' into Weblate. 2019-08-11 09:28:08 +02:00
680104fec3 Fixed lat/lon reference parsing in big endian EXIF entries
Closes #218
2019-08-11 09:26:54 +02:00
b72a9e67fe Cosmetics 2019-08-01 18:58:19 +02:00
24b7b9d996 Merge branch 'origin/master' into Weblate. 2019-08-01 18:58:18 +02:00
7965f2ff34 Merge branch 'origin/master' into Weblate. 2019-08-01 08:38:29 +02:00
5f5b391cd9 Added support for Geographic 2D projections (coordinate systems) in vector maps 2019-08-01 08:36:58 +02:00
faed6fc203 Merge branch 'origin/master' into Weblate. 2019-07-28 11:59:40 +02:00
38b62c0121 Added missing libqt4-opengl-dev package install 2019-07-28 11:58:56 +02:00
f26f8a95ac Merge branch 'origin/master' into Weblate. 2019-07-28 10:34:32 +02:00
1297db26f6 Properly de-capitalize strings with "scharfes S" 2019-07-28 10:31:03 +02:00
2ee955172d Translated using Weblate (French)
Currently translated at 100.0% (342 of 342 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2019-07-26 14:31:49 +02:00
a11b926a98 Version++ 2019-07-18 08:14:47 +02:00
70b5371a6e Improved error handling 2019-07-18 00:26:27 +02:00
d07b6c6a9d Load TRE subdivs on demand, not all on tile load 2019-07-16 22:08:23 +02:00
c9a62e8b61 Removed obsolete stuff 2019-07-16 00:23:08 +02:00
aa3579c0be Fixed QT4 build 2019-07-13 15:14:29 +02:00
297177ad41 Cosmetics 2019-07-13 14:42:44 +02:00
0e9720f68b Optimization 2019-07-13 14:18:16 +02:00
c1f36e5fbb Improved shields layout algorithm 2019-07-13 08:36:04 +02:00
a20fd3e474 Fixed cut&paste error 2019-07-11 18:55:12 +02:00
aba78f3baa Properly handle self-asignments 2019-07-10 23:08:58 +02:00
2f24bb5462 Some more code cleanup 2019-07-10 21:49:46 +02:00
c1fdb21fad Cosmetics 2019-07-10 21:37:03 +02:00
6bea3b7ebf Suppress QT's deprecated functions warnings 2019-07-10 21:17:52 +02:00
a7efa80e8f Merge branch 'master' of https://github.com/tumic0/GPXSee 2019-07-08 21:19:54 +02:00
4e9faf3a23 Code cleanup 2019-07-08 21:19:25 +02:00
d4e153d10f Updated PL translation (#217) 2019-07-08 08:31:43 +02:00
86cc30433c Merge branch 'origin/master' into Weblate. 2019-07-07 19:16:56 +02:00
a41e89053d Version++ 2019-07-07 19:17:06 +02:00
63335aa004 IMG maps font sizes adjustement 2019-07-04 21:38:57 +02:00
3243179b32 Merge branch 'origin/master' into Weblate. 2019-07-04 21:38:54 +02:00
b04388f776 Merge branch 'origin/master' into Weblate. 2019-07-04 18:18:22 +02:00
53e960fabe Improved IMG map memory management 2019-07-04 18:18:03 +02:00
c56e6c14d1 Merge branch 'origin/master' into Weblate. 2019-07-04 09:06:18 +02:00
b4cc88446a Improved IMG maps loading (lazy loading) 2019-07-04 09:05:30 +02:00
2860530d3c Merge branch 'origin/master' into Weblate. 2019-07-02 08:52:42 +02:00
863aa3f542 Allow lower zooms, properly sort cities 2019-07-02 08:52:26 +02:00
fa0a380839 Merge branch 'origin/master' into Weblate. 2019-07-01 22:54:23 +02:00
03d5745da9 Added missing label validity checks 2019-07-01 22:53:34 +02:00
52cf7c4278 Merge branch 'origin/master' into Weblate. 2019-06-30 23:39:46 +02:00
5c86fc4103 Added missing kilometer markers color change 2019-06-30 23:39:31 +02:00
3ad8c58911 Merge branch 'origin/master' into Weblate. 2019-06-30 23:18:38 +02:00
ce5a3be7ca Properly split the shield label 2019-06-30 23:18:30 +02:00
83e6772de2 Merge branch 'origin/master' into Weblate. 2019-06-30 23:09:14 +02:00
db0df92933 Use a smaller font for shield labels 2019-06-30 23:09:09 +02:00
a3bc48c5d3 Merge branch 'origin/master' into Weblate. 2019-06-30 20:39:33 +02:00
537b1c3716 Added support for label shields 2019-06-30 20:39:22 +02:00
561fadb4f2 Do not resize the font on every usage 2019-06-29 10:27:12 +02:00
a39f2bc2a9 Merge branch 'origin/master' into Weblate. 2019-06-29 10:27:09 +02:00
ebb690673c Code cleanup 2019-06-28 07:43:16 +02:00
7ee9ea0fa4 Merge branch 'origin/master' into Weblate. 2019-06-28 07:43:10 +02:00
e10808fc7c Merge branch 'origin/master' into Weblate. 2019-06-23 10:19:36 +02:00
255f4ca63c Improved handling of track data with time skews 2019-06-23 10:18:56 +02:00
d2a65b4cb1 Merge branch 'origin/master' into Weblate. 2019-06-22 20:33:43 +02:00
3a046af6b6 Fixed crash on TYP files with incomplete styles 2019-06-22 20:32:37 +02:00
d8be4f8951 Merge branch 'origin/master' into Weblate. 2019-06-21 23:02:21 +02:00
ee09b2e667 Code cleanup 2019-06-21 23:02:13 +02:00
2811d7b2a3 Translated using Weblate (French)
Currently translated at 100.0% (342 of 342 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2019-06-18 20:33:15 +02:00
183 changed files with 10074 additions and 4292 deletions

View File

@ -1,22 +1,33 @@
version: 7.9.{build}
configuration: Release
platform: Any CPU
version: 7.20.{build}
configuration:
- Release
image:
- Visual Studio 2017
environment:
NSISDIR: C:\Program Files (x86)\NSIS
matrix:
- QTDIR: C:\Qt\5.11\msvc2015
PLATFORM: x86
- QTDIR: C:\Qt\5.13\msvc2017
NSI: gpxsee.nsi
OPENSSLDIR: C:\OpenSSL-Win32\bin
- QTDIR: C:\Qt\5.11\msvc2015_64
PLATFORM: x86_amd64
VCVARS: vcvars32.bat
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
LIBCRYPTO: libssl-1_1.dll
LIBSSL: libcrypto-1_1.dll
- QTDIR: C:\Qt\5.13\msvc2017_64
NSI: gpxsee64.nsi
OPENSSLDIR: C:\OpenSSL-Win64\bin
VCVARS: vcvars64.bat"
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
LIBCRYPTO: libssl-1_1-x64.dll
LIBSSL: libcrypto-1_1-x64.dll
install:
- cmd: >-
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %PLATFORM%
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\"%VCVARS%
build_script:
- cmd: >-
lrelease gpxsee.pro
@ -44,9 +55,9 @@ build_script:
copy licence.txt installer
copy %OPENSSLDIR%\libeay32.dll installer
copy %OPENSSLDIR%\%LIBCRYPTO% installer
copy %OPENSSLDIR%\ssleay32.dll installer
copy %OPENSSLDIR%\%LIBSSL% installer
makensis.exe installer\%NSI%

View File

@ -6,10 +6,11 @@ os:
before_install:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev libqt4-opengl-dev; fi
script:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/qt/bin/:${PATH}; fi

View File

@ -2,7 +2,7 @@
GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common GPS log file formats.
## Features
* Opens GPX, TCX, FIT, KML, IGC, NMEA, SLF, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin CSV and geotagged JPEG files.
* Opens GPX, TCX, FIT, KML, NMEA, IGC, CUP, SLF, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin GPI&CSV and geotagged JPEG files.
* User-definable online maps (OpenStreetMap/Google tiles, WMTS, WMS, TMS, QuadTiles).
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG & JNX maps, TwoNav RMaps, GeoTIFF images).
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.

View File

@ -3,7 +3,7 @@ unix:!macx {
} else {
TARGET = GPXSee
}
VERSION = 7.9
VERSION = 7.20
QT += core \
gui \
@ -19,6 +19,9 @@ equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 4) {QT += opengl}
INCLUDEPATH += ./src
HEADERS += src/common/config.h \
src/GUI/graphicsscene.h \
src/GUI/popup.h \
src/common/garmin.h \
src/common/staticassert.h \
src/common/coordinates.h \
src/common/range.h \
@ -84,7 +87,12 @@ HEADERS += src/common/config.h \
src/GUI/mapview.h \
src/GUI/font.h \
src/GUI/areaitem.h \
src/data/link.h \
src/map/IMG/bitmapline.h \
src/map/IMG/bitstream.h \
src/map/IMG/deltastream.h \
src/map/IMG/huffmanstream.h \
src/map/IMG/huffmantable.h \
src/map/IMG/textpathitem.h \
src/map/IMG/textpointitem.h \
src/map/projection.h \
@ -175,13 +183,19 @@ HEADERS += src/common/config.h \
src/map/IMG/lblfile.h \
src/map/IMG/vectortile.h \
src/map/IMG/subdiv.h \
src/map/IMG/units.h \
src/map/IMG/style.h \
src/map/IMG/netfile.h \
src/GUI/limitedcombobox.h \
src/GUI/pathtickitem.h \
src/map/IMG/textitem.h
src/map/IMG/textitem.h \
src/map/IMG/label.h \
src/data/csv.h \
src/data/cupparser.h \
src/data/gpiparser.h \
src/data/address.h \
src/data/smlparser.h
SOURCES += src/main.cpp \
src/GUI/popup.cpp \
src/common/coordinates.cpp \
src/common/rectc.cpp \
src/common/range.cpp \
@ -233,6 +247,10 @@ SOURCES += src/main.cpp \
src/GUI/mapview.cpp \
src/GUI/areaitem.cpp \
src/map/IMG/bitmapline.cpp \
src/map/IMG/bitstream.cpp \
src/map/IMG/deltastream.cpp \
src/map/IMG/huffmanstream.cpp \
src/map/IMG/huffmantable.cpp \
src/map/IMG/textpathitem.cpp \
src/map/IMG/textpointitem.cpp \
src/map/maplist.cpp \
@ -311,14 +329,20 @@ SOURCES += src/main.cpp \
src/map/IMG/style.cpp \
src/map/IMG/netfile.cpp \
src/GUI/pathtickitem.cpp \
src/map/IMG/textitem.cpp
src/map/IMG/textitem.cpp \
src/data/csv.cpp \
src/data/cupparser.cpp \
src/GUI/graphicsscene.cpp \
src/data/gpiparser.cpp \
src/data/smlparser.cpp
greaterThan(QT_MAJOR_VERSION, 4) {
HEADERS += src/data/geojsonparser.h
SOURCES += src/data/geojsonparser.cpp
}
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
QT_NO_DEPRECATED_WARNINGS
DEFINES *= QT_USE_QSTRINGBUILDER
RESOURCES += gpxsee.qrc
@ -334,7 +358,8 @@ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_da.ts \
lang/gpxsee_tr.ts \
lang/gpxsee_es.ts \
lang/gpxsee_pt_BR.ts
lang/gpxsee_pt_BR.ts \
lang/gpxsee_uk.ts
macx {
ICON = icons/gpxsee.icns
@ -352,7 +377,8 @@ macx {
lang/gpxsee_da.qm \
lang/gpxsee_tr.qm \
lang/gpxsee_es.qm \
lang/gpxsee_pt_BR.qm
lang/gpxsee_pt_BR.qm \
lang/gpxsee_uk.qm
csv.path = Contents/Resources
csv.files = pkg/csv
maps.path = Contents/Resources
@ -369,7 +395,10 @@ macx {
icons/formats/wpt.icns \
icons/formats/loc.icns \
icons/formats/slf.icns \
icons/formats/json.icns
icons/formats/json.icns \
icons/formats/cup.icns \
icons/formats/gpi.icns \
icons/formats/sml.icns
QMAKE_BUNDLE_DATA += locale maps icons csv
}
@ -386,7 +415,10 @@ win32 {
icons/formats/wpt.ico \
icons/formats/loc.ico \
icons/formats/slf.ico \
icons/formats/json.ico
icons/formats/json.ico \
icons/formats/cup.ico \
icons/formats/gpi.ico \
icons/formats/sml.ico
DEFINES += _USE_MATH_DEFINES \
NOGDI
}

BIN
icons/formats/cup.icns Normal file

Binary file not shown.

BIN
icons/formats/cup.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

BIN
icons/formats/gpi.icns Normal file

Binary file not shown.

BIN
icons/formats/gpi.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
icons/formats/sml.icns Normal file

Binary file not shown.

BIN
icons/formats/sml.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

View File

@ -10,3 +10,6 @@ tcx:#ffcc00
wpt:#66ff00
loc:#556677
slf:#881199
cup:#20a810
gpi:#fca314
sml:#6434eb

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1901
lang/gpxsee_uk.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -211,6 +211,54 @@
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>cup</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.naviter.seeyou.cup</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/cup.icns</string>
<key>CFBundleTypeName</key>
<string>SeeYou CUP File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>gpi</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.garmin.gpi</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/gpi.icns</string>
<key>CFBundleTypeName</key>
<string>Garmin POI File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>sml</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/sml+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/sml.icns</string>
<key>CFBundleTypeName</key>
<string>Suunto Markup Language</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
@ -467,6 +515,69 @@
<string>application/geo+json</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.naviter.seeyou.cup</string>
<key>UTTypeReferenceURL</key>
<string>http://www.naviter.com</string>
<key>UTTypeDescription</key>
<string>SeeYou CUP File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>cup</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.naviter.seeyou.cup</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.garmin.gpi</string>
<key>UTTypeReferenceURL</key>
<string>http://www.garmin.com</string>
<key>UTTypeDescription</key>
<string>Garmin POI File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>gpi</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.garmin.gpi</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.suunto.sml</string>
<key>UTTypeReferenceURL</key>
<string>https://www.suunto.com</string>
<key>UTTypeDescription</key>
<string>Suunto Markup Language</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>sml</string>
</array>
<key>public.mime-type</key>
<string>application/sml+xml</string>
</dict>
</dict>
</array>
</dict>
</plist>

View File

@ -12,16 +12,18 @@
<p>Features:</p>
<ul>
<li>Opens GPX, TCX, FIT, KML, IGC, NMEA, SLF, LOC, OziExplorer (PLT,
WPT, RTE), GeoJSON, Garmin CSV and geotagged JPEG files.</li>
<li>Opens GPX, TCX, FIT, KML, IGC, NMEA, SIGMA SLF, Suunto SML, LOC,
OziExplorer (PLT, WPT, RTE), GeoJSON, SeeYou CUP,
Garmin GPI &amp; CSV and geotagged JPEG files.</li>
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
WMS, TMS).</li>
WMS, TMS, QuadTiles).</li>
<li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
TwoNav RMaps, Garmin IMG &amp; JNX, GeoTIFF images).</li>
<li>Elevation, speed, heart rate, cadence, power and temperature
graphs.</li>
<li>Elevation, speed, heart rate, cadence, power, temperature and
gear ratio graphs.</li>
<li>Support for multiple tracks in one view.</li>
<li>Support for POI files.</li>
<li>Support for DEM files (SRTM HGT).</li>
<li>Print/export to PDF.</li>
<li>Full-screen mode.</li>
<li>HiDPI/Retina displays &amp; maps support.</li>
@ -67,5 +69,8 @@
<mimetype>application/loc+xml</mimetype>
<mimetype>application/slf+xml</mimetype>
<mimetype>application/geo+json</mimetype>
<mimetype>application/vnd.naviter.seeyou.cup</mimetype>
<mimetype>application/vnd.garmin.gpi</mimetype>
<mimetype>application/sml+xml</mimetype>
</mimetypes>
</component>

View File

@ -3,12 +3,15 @@ Name=GPXSee
Comment=GPS log file viewer and analyzer
Comment[cz]=Prohlížeč a analyzátor GPS logů
Comment[fi]=Ohjelma GPS-lokien katseluun ja analysointiin
Comment[fr]=Visualisation et analyse de fichier GPS
Comment[pl]=Przeglądarka i analizator plików dziennika GPS
Comment[ru]=Программа для просмотра и анализа GPS логов
Comment[sv]=GPS-loggfilsläsare och analysator
Comment[tr]=GPS günlük dosyası görüntüleyici ve analizcisi
Comment[uk]=Переглядач та аналізатор GPS логів
Exec=gpxsee %F
Icon=gpxsee
Terminal=false
Type=Application
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt;
MimeType=application/gpx+xml;application/tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/loc+xml;application/slf+xml;application/geo+json;
MimeType=application/gpx+xml;application/tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/loc+xml;application/slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;

View File

@ -7,7 +7,7 @@
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "7.9"
!define VERSION "7.20"
; The file to write
OutFile "GPXSee-${VERSION}.exe"
@ -106,18 +106,21 @@ Section "GPXSee" SEC_APP
; Associate file formats
DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 5
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 6
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 7
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 8
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 9
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 10
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 11
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 12
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -145,30 +148,17 @@ Section "MSVC runtime" SEC_MSVC
SectionIn RO
DetailPrint "Checking whether Visual C++ 2015 Redistributable is already installed..."
${If} ${RunningX64}
ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
${Else}
ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
${EndIf}
StrCmp $R0 "1" 0 +3
DetailPrint "Visual C++ 2015 Redistributable is already installed, skipping install."
Goto done
DetailPrint "Installing Visual C++ 2015 Redistributable..."
SetOutPath $TEMP
File "vcredist_x86.exe"
ExecWait '"$TEMP\vcredist_x86.exe" /install /quiet /norestart'
SetOutPath $INSTDIR
File "vc_redist.x86.exe"
ExecWait '"$TEMP\vc_redist.x86.exe" /install /quiet /norestart'
SetOutPath $INSTDIR
done:
SectionEnd
Section "OpenSSL" SEC_OPENSSL
File "libeay32.dll"
File "ssleay32.dll"
File "libcrypto-1_1.dll"
File "libssl-1_1.dll"
SectionEnd
@ -193,6 +183,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Spanish" "es"
!insertmacro LOCALIZATION "Swedish" "sv"
!insertmacro LOCALIZATION "Turkish" "tr"
!insertmacro LOCALIZATION "Ukrainian" "uk"
SectionGroupEnd
;--------------------------------
@ -227,6 +218,9 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -239,7 +233,7 @@ SectionEnd
LangString DESC_QT ${LANG_ENGLISH} \
"QT cross-platform application framework."
LangString DESC_MSVC ${LANG_ENGLISH} \
"Visual C++ 2015 runtime components. If already installed, will be skipped."
"Microsoft Visual C++ 2017 runtime. If already installed, will be skipped."
LangString DESC_OPENSSL ${LANG_ENGLISH} \
"OpenSSL library. Required for HTTPS to work."
LangString DESC_ANGLE ${LANG_ENGLISH} \
@ -257,4 +251,4 @@ LangString DESC_LOCALIZATION ${LANG_ENGLISH} \
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_MSVC} $(DESC_MSVC)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_APP} $(DESC_APP)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_LOCALIZATION} $(DESC_LOCALIZATION)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
!insertmacro MUI_FUNCTION_DESCRIPTION_END

View File

@ -84,4 +84,25 @@
<generic-icon name="text-plain"/>
<glob pattern="*.geojson"/>
</mime-type>
<mime-type type="application/vnd.naviter.seeyou.cup">
<comment>SeeYou CUP File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<glob pattern="*.cup"/>
</mime-type>
<mime-type type="application/vnd.garmin.gpi">
<comment>Garmin POI File</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application/octet-stream"/>
<glob pattern="*.gpi"/>
</mime-type>
<mime-type type="application/sml+xml">
<comment>Suunto Markup Language</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<glob pattern="*.sml"/>
</mime-type>
</mime-info>

View File

@ -7,7 +7,7 @@
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "7.9"
!define VERSION "7.20"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"
@ -113,18 +113,21 @@ Section "GPXSee" SEC_APP
; Associate file formats
DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 5
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 6
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 7
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 8
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 9
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 data" 10
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 11
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 12
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
!insertmacro FILE_ASSOCIATION_ADD "geojson" "GeoJSON" 4
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -152,25 +155,17 @@ Section "MSVC runtime" SEC_MSVC
SectionIn RO
DetailPrint "Checking whether Visual C++ 2015 Redistributable is already installed..."
ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" "Installed"
StrCmp $R0 "1" 0 +3
DetailPrint "Visual C++ 2015 Redistributable is already installed, skipping install."
Goto done
DetailPrint "Installing Visual C++ 2015 Redistributable..."
SetOutPath $TEMP
File "vcredist_x64.exe"
ExecWait '"$TEMP\vcredist_x64.exe" /install /quiet /norestart'
File "vc_redist.x64.exe"
ExecWait '"$TEMP\vc_redist.x64.exe" /install /quiet /norestart'
SetOutPath $INSTDIR
done:
SectionEnd
Section "OpenSSL" SEC_OPENSSL
File "libeay32.dll"
File "ssleay32.dll"
File "libcrypto-1_1-x64.dll"
File "libssl-1_1-x64.dll"
SectionEnd
@ -195,6 +190,7 @@ SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Spanish" "es"
!insertmacro LOCALIZATION "Swedish" "sv"
!insertmacro LOCALIZATION "Turkish" "tr"
!insertmacro LOCALIZATION "Ukrainian" "uk"
SectionGroupEnd
;--------------------------------
@ -230,6 +226,9 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "loc"
!insertmacro FILE_ASSOCIATION_REMOVE "slf"
!insertmacro FILE_ASSOCIATION_REMOVE "geojson"
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -242,7 +241,7 @@ SectionEnd
LangString DESC_QT ${LANG_ENGLISH} \
"QT cross-platform application framework."
LangString DESC_MSVC ${LANG_ENGLISH} \
"Visual C++ 2015 runtime components. If already installed, will be skipped."
"Microsoft Visual C++ 2017 runtime. If already installed, will be skipped."
LangString DESC_OPENSSL ${LANG_ENGLISH} \
"OpenSSL library. Required for HTTPS to work."
LangString DESC_ANGLE ${LANG_ENGLISH} \
@ -260,4 +259,4 @@ LangString DESC_LOCALIZATION ${LANG_ENGLISH} \
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_MSVC} $(DESC_MSVC)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_APP} $(DESC_APP)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_LOCALIZATION} $(DESC_LOCALIZATION)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
!insertmacro MUI_FUNCTION_DESCRIPTION_END

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.gpxsee.org/map/1.3">
<name>4UMaps</name>
<url>https://4umaps.com/$z/$x/$y.png</url>
<url>https://tileserver.4umaps.com/$z/$x/$y.png</url>
<zoom min="2" max="15"/>
<bounds bottom="-65"/>
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © 4UMaps.eu</copyright>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.gpxsee.org/map/1.3">
<name>Open Street Map</name>
<url>http://tile.openstreetmap.org/$z/$x/$y.png</url>
<url>https://tile.openstreetmap.org/$z/$x/$y.png</url>
<copyright>Map data: © OpenStreetMap contributors (ODbL) | Rendering: © OpenStreetMap (CC-BY-SA)</copyright>
</map>

View File

@ -2,12 +2,13 @@
#include <QApplication>
#include <QCursor>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include "map/map.h"
#include "tooltip.h"
#include "popup.h"
#include "areaitem.h"
QString AreaItem::toolTip() const
QString AreaItem::info() const
{
ToolTip tt;
@ -20,8 +21,8 @@ QString AreaItem::toolTip() const
return tt.toString();
}
AreaItem::AreaItem(const Area &area, Map *map, QGraphicsItem *parent)
: QGraphicsItem(parent), _area(area)
AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
: GraphicsItem(parent), _area(area)
{
_map = map;
_digitalZoom = 0;
@ -35,8 +36,6 @@ AreaItem::AreaItem(const Area &area, Map *map, QGraphicsItem *parent)
setCursor(Qt::ArrowCursor);
setAcceptHoverEvents(true);
setToolTip(toolTip());
}
@ -153,3 +152,27 @@ void AreaItem::setDigitalZoom(int zoom)
_digitalZoom = zoom;
_pen.setWidthF(_width * pow(2, -_digitalZoom));
}
void AreaItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
setZValue(zValue() + 1.0);
update();
}
void AreaItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF(_width * pow(2, -_digitalZoom));
setZValue(zValue() - 1.0);
update();
}
void AreaItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
QGraphicsItem::mousePressEvent(event);
}

View File

@ -1,15 +1,16 @@
#ifndef AREAITEM_H
#define AREAITEM_H
#include <QGraphicsItem>
#include "data/area.h"
#include "graphicsscene.h"
#include "tooltip.h"
class Map;
class AreaItem : public QGraphicsItem
class AreaItem : public GraphicsItem
{
public:
AreaItem(const Area &area, Map *map, QGraphicsItem *parent = 0);
AreaItem(const Area &area, Map *map, GraphicsItem *parent = 0);
QPainterPath shape() const {return _painterPath;}
QRectF boundingRect() const {return _painterPath.boundingRect();}
@ -26,10 +27,17 @@ public:
void setStyle(Qt::PenStyle style);
void setDigitalZoom(int zoom);
virtual QString info() const;
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
QPainterPath painterPath(const Polygon &polygon);
void updatePainterPath();
QString toolTip() const;
ToolTip toolTip() const;
Area _area;
Map *_map;

View File

@ -30,7 +30,7 @@ private:
Ticks::Ticks(double minValue, double maxValue, int maxCount)
{
double range = niceNum(maxValue - minValue, false);
_d = niceNum(range / maxCount, true);
_d = niceNum(range / maxCount, false);
_min = ceil(minValue / _d) * _d;
_max = floor(maxValue / _d) * _d;
}

View File

@ -14,6 +14,11 @@ CadenceGraph::CadenceGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(1);
}
CadenceGraph::~CadenceGraph()
{
qDeleteAll(_tracks);
}
void CadenceGraph::setInfo()
{
if (_showTracks) {
@ -36,23 +41,28 @@ QList<GraphItem*> CadenceGraph::loadData(const Data &data)
const Graph &graph = track.cadence();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType);
GraphView::addGraph(gi);
CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType,
_width, _palette.nextColor());
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_avg.append(QPointF(track.distance(), gi->avg()));
graphs.append(gi);
}
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -75,6 +85,9 @@ qreal CadenceGraph::avg() const
void CadenceGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_avg.clear();
GraphTab::clear();
@ -84,7 +97,13 @@ void CadenceGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -3,18 +3,20 @@
#include "graphtab.h"
class CadenceGraphItem;
class CadenceGraph : public GraphTab
{
Q_OBJECT
public:
CadenceGraph(QWidget *parent = 0);
~CadenceGraph();
QString label() const {return tr("Cadence");}
QList<GraphItem*> loadData(const Data &data);
void clear();
void showTracks(bool show);
void showRoutes(bool show) {Q_UNUSED(show);}
private:
qreal avg() const;
@ -24,6 +26,7 @@ private:
QVector<QPointF> _avg;
bool _showTracks;
QList<CadenceGraphItem *> _tracks;
};
#endif // CADENCEGRAPH_H

View File

@ -4,12 +4,12 @@
CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent)
int width, const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
setToolTip(toolTip());
}
QString CadenceGraphItem::toolTip() const
QString CadenceGraphItem::info() const
{
ToolTip tt;
QLocale l(QLocale::system());

View File

@ -8,11 +8,10 @@ class CadenceGraphItem : public GraphItem
Q_OBJECT
public:
CadenceGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
CadenceGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
private:
QString toolTip() const;
QString info() const;
};
#endif // CADENCEGRAPHITEM_H

View File

@ -8,26 +8,18 @@
static qreal nMin(qreal a, qreal b)
{
if (!std::isnan(a) && !std::isnan(b))
return qMin(a, b);
else if (!std::isnan(a))
return a;
else if (!std::isnan(b))
return b;
if (std::isnan(a))
return std::isnan(b) ? NAN : b;
else
return NAN;
return std::isnan(b) ? a : qMin(a, b);
}
static qreal nMax(qreal a, qreal b)
{
if (!std::isnan(a) && !std::isnan(b))
return qMax(a, b);
else if (!std::isnan(a))
return a;
else if (!std::isnan(b))
return b;
if (std::isnan(a))
return std::isnan(b) ? NAN : b;
else
return NAN;
return std::isnan(b) ? a : qMax(a, b);
}
ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent)
@ -49,6 +41,12 @@ ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent)
setMinYRange(50.0);
}
ElevationGraph::~ElevationGraph()
{
qDeleteAll(_tracks);
qDeleteAll(_routes);
}
void ElevationGraph::setInfo()
{
if (std::isnan(max()) || std::isnan(min()))
@ -70,19 +68,28 @@ void ElevationGraph::setInfo()
GraphItem *ElevationGraph::loadGraph(const Graph &graph, Type type)
{
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
return 0;
}
ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType);
GraphView::addGraph(gi, type);
ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType, _width,
_palette.nextColor());
gi->setUnits(_units);
if (type == Track) {
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_trackAscent += gi->ascent();
_trackDescent += gi->descent();
_trackMax = nMax(_trackMax, gi->max());
_trackMin = nMin(_trackMin, gi->min());
} else {
_routes.append(gi);
if (_showRoutes)
addGraph(gi);
_routeAscent += gi->ascent();
_routeDescent += gi->descent();
_routeMax = nMax(_routeMax, gi->max());
@ -101,7 +108,7 @@ QList<GraphItem*> ElevationGraph::loadData(const Data &data)
for (int i = 0; i < data.routes().count(); i++)
graphs.append(loadGraph(data.routes().at(i).elevation(), Route));
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -111,6 +118,11 @@ QList<GraphItem*> ElevationGraph::loadData(const Data &data)
void ElevationGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
qDeleteAll(_routes);
_routes.clear();
_trackAscent = 0;
_routeAscent = 0;
_trackDescent = 0;
@ -142,12 +154,23 @@ void ElevationGraph::setUnits(Units units)
GraphView::setUnits(units);
}
void ElevationGraph::showItems(const QList<ElevationGraphItem *> &list,
bool show)
{
for (int i = 0; i < list.size(); i++) {
if (show)
addGraph(list.at(i));
else
removeGraph(list.at(i));
}
}
void ElevationGraph::showTracks(bool show)
{
_showTracks = show;
showItems(_tracks, show);
setInfo();
showGraph(show, Track);
redraw();
}
@ -156,7 +179,7 @@ void ElevationGraph::showRoutes(bool show)
{
_showRoutes = show;
showGraph(show, Route);
showItems(_routes, show);
setInfo();
redraw();

View File

@ -3,12 +3,15 @@
#include "graphtab.h"
class ElevationGraphItem;
class ElevationGraph : public GraphTab
{
Q_OBJECT
public:
ElevationGraph(QWidget *parent = 0);
~ElevationGraph();
QString label() const {return tr("Elevation");}
QList<GraphItem*> loadData(const Data &data);
@ -29,6 +32,7 @@ private:
void setInfo();
GraphItem *loadGraph(const Graph &graph, Type type);
void showItems(const QList<ElevationGraphItem *> &list, bool show);
qreal _trackAscent, _trackDescent;
qreal _routeAscent, _routeDescent;
@ -36,6 +40,7 @@ private:
qreal _trackMin, _routeMin;
bool _showTracks, _showRoutes;
QList<ElevationGraphItem *> _tracks, _routes;
};
#endif // ELEVATIONGRAPH_H

View File

@ -4,7 +4,8 @@
ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent)
int width, const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
_min = GraphItem::min();
_max = GraphItem::max();
@ -23,15 +24,13 @@ ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type,
_descent += prev - cur;
}
}
setToolTip(toolTip(Metric));
}
QString ElevationGraphItem::toolTip(Units units) const
QString ElevationGraphItem::info() const
{
ToolTip tt;
qreal scale = (units == Metric) ? 1.0 : M2FT;
QString su = (units == Metric) ? tr("m") : tr("ft");
qreal scale = (_units == Metric) ? 1.0 : M2FT;
QString su = (_units == Metric) ? tr("m") : tr("ft");
QLocale l(QLocale::system());
tt.insert(tr("Ascent"), l.toString(ascent() * scale, 'f', 0)
@ -45,8 +44,3 @@ QString ElevationGraphItem::toolTip(Units units) const
return tt.toString();
}
void ElevationGraphItem::setUnits(Units units)
{
setToolTip(toolTip(units));
}

View File

@ -8,19 +8,17 @@ class ElevationGraphItem : public GraphItem
Q_OBJECT
public:
ElevationGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
ElevationGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
qreal ascent() const {return _ascent;}
qreal descent() const {return _descent;}
qreal max() const {return _max;}
qreal min() const {return _min;}
void setUnits(Units units);
QString info() const;
private:
QString toolTip(Units units) const;
qreal _ascent, _descent, _min, _max;
};

View File

@ -14,6 +14,11 @@ GearRatioGraph::GearRatioGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(2);
}
GearRatioGraph::~GearRatioGraph()
{
qDeleteAll(_tracks);
}
void GearRatioGraph::setInfo()
{
if (_showTracks) {
@ -37,11 +42,15 @@ QList<GraphItem*> GearRatioGraph::loadData(const Data &data)
const Graph &graph = data.tracks().at(i).ratio();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType);
GraphView::addGraph(gi);
GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType,
_width, _palette.nextColor());
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
for (QMap<qreal, qreal>::const_iterator it = gi->map().constBegin();
it != gi->map().constEnd(); ++it)
@ -51,12 +60,12 @@ QList<GraphItem*> GearRatioGraph::loadData(const Data &data)
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -70,10 +79,7 @@ qreal GearRatioGraph::top() const
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
it != _map.constEnd(); ++it) {
if (it == _map.constBegin()) {
val = it.value();
key = it.key();
} else if (it.value() > val) {
if (std::isnan(val) || it.value() > val) {
val = it.value();
key = it.key();
}
@ -84,6 +90,9 @@ qreal GearRatioGraph::top() const
void GearRatioGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_map.clear();
GraphTab::clear();
@ -93,7 +102,13 @@ void GearRatioGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -4,12 +4,15 @@
#include <QMap>
#include "graphtab.h"
class GearRatioGraphItem;
class GearRatioGraph : public GraphTab
{
Q_OBJECT
public:
GearRatioGraph(QWidget *parent = 0);
~GearRatioGraph();
QString label() const {return tr("Gear ratio");}
QList<GraphItem*> loadData(const Data &data);
@ -25,6 +28,7 @@ private:
QMap<qreal, qreal> _map;
bool _showTracks;
QList<GearRatioGraphItem*> _tracks;
};
#endif // GEARRATIOGRAPH_H

View File

@ -5,25 +5,29 @@
GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent), _top(NAN)
int width, const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
qreal val = NAN;
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
it != _map.constEnd(); ++it) {
if (it == _map.constBegin()) {
val = it.value();
_top = it.key();
} else if (it.value() > val) {
val = it.value();
_top = it.key();
for (int i = 0; i < graph.size(); i++) {
const GraphSegment &segment = graph.at(i);
for (int j = 1; j < segment.size(); j++) {
qreal dx = segment.at(j).s() - segment.at(j-1).s();
_map.insert(segment.at(j).y(), _map.value(segment.at(j).y()) + dx);
}
}
setToolTip(toolTip());
qreal key = NAN, val = NAN;
for (QMap<qreal, qreal>::const_iterator it = _map.constBegin();
it != _map.constEnd(); ++it) {
if (std::isnan(val) || it.value() > val) {
val = it.value();
key = it.key();
}
}
_top = key;
}
QString GearRatioGraphItem::toolTip() const
QString GearRatioGraphItem::info() const
{
ToolTip tt;
QLocale l(QLocale::system());

View File

@ -9,16 +9,15 @@ class GearRatioGraphItem : public GraphItem
Q_OBJECT
public:
GearRatioGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
GearRatioGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
qreal top() const {return _top;}
const QMap<qreal, qreal> &map() const {return _map;}
private:
QString toolTip() const;
QString info() const;
private:
QMap<qreal, qreal> _map;
qreal _top;
};

54
src/GUI/graphicsscene.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <QGraphicsSceneHelpEvent>
#include <QGraphicsView>
#include "popup.h"
#include "graphicsscene.h"
/* Standard GraphicsScene::items() is not pixel accurate, so we use the
following function which has the same logic as used in the original
QGraphicsScene::helpEvent() function. */
QList<QGraphicsItem *> GraphicsScene::itemsAtPosition(const QPoint &screenPos,
const QPointF &scenePos, QWidget *widget) const
{
QGraphicsView *view = widget
? qobject_cast<QGraphicsView *>(widget->parentWidget()) : 0;
if (!view)
return items(scenePos, Qt::IntersectsItemShape, Qt::DescendingOrder,
QTransform());
const QRectF pointRect(QPointF(widget->mapFromGlobal(screenPos)),
QSizeF(1, 1));
if (!view->isTransformed())
return items(pointRect, Qt::IntersectsItemShape, Qt::DescendingOrder);
const QTransform viewTransform = view->viewportTransform();
if (viewTransform.type() <= QTransform::TxScale)
return items(viewTransform.inverted().mapRect(pointRect),
Qt::IntersectsItemShape, Qt::DescendingOrder, viewTransform);
return items(viewTransform.inverted().map(pointRect),
Qt::IntersectsItemShape, Qt::DescendingOrder, viewTransform);
}
void GraphicsScene::helpEvent(QGraphicsSceneHelpEvent *event)
{
QList<QGraphicsItem *> list = itemsAtPosition(event->screenPos(),
event->scenePos(), event->widget());
for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == QGraphicsItem::UserType + 1) {
GraphicsItem *mi = static_cast<GraphicsItem*>(list.at(i));
Popup::show(event->screenPos(), mi->info(), event->widget());
return;
}
}
/* No need to process QGraphicsScene::helpEvent() */
}
void GraphicsScene::clear()
{
Popup::clear();
QGraphicsScene::clear();
}

32
src/GUI/graphicsscene.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef GRAPHICSSCENE_H
#define GRAPHICSSCENE_H
#include <QGraphicsScene>
#include <QGraphicsItem>
class GraphicsItem : public QGraphicsItem
{
public:
GraphicsItem(QGraphicsItem *parent = 0) : QGraphicsItem(parent) {}
virtual QString info() const = 0;
int type() const {return QGraphicsItem::UserType + 1;}
};
class GraphicsScene : public QGraphicsScene
{
public:
GraphicsScene(QObject *parent = 0) : QGraphicsScene(parent) {}
public slots:
void clear();
protected:
void helpEvent(QGraphicsSceneHelpEvent *event);
private:
QList<QGraphicsItem *> itemsAtPosition(const QPoint &screenPos,
const QPointF &scenePos, QWidget *widget) const;
};
#endif // GRAPHICSSCENE_H

View File

@ -1,31 +1,29 @@
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include "popup.h"
#include "graphitem.h"
GraphItem::GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent)
: QGraphicsObject(parent), _graph(graph), _type(type)
GraphItem::GraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent)
: GraphicsItem(parent), _graph(graph), _type(type)
{
Q_ASSERT(_graph.isValid());
_id = 0;
_width = 1;
_pen = QPen(Qt::black, _width);
_sx = 1.0; _sy = 1.0;
_units = Metric;
_pen = QPen(color, width);
_sx = 0; _sy = 0;
_time = _graph.hasTime();
setZValue(2.0);
updatePath();
updateShape();
updateBounds();
setAcceptHoverEvents(true);
updateBounds();
}
void GraphItem::updateShape()
{
QPainterPathStroker s;
s.setWidth(_width + 1);
s.setWidth(_pen.width() + 1);
_shape = s.createStroke(_path);
}
@ -54,7 +52,6 @@ void GraphItem::setGraphType(GraphType type)
_type = type;
updatePath();
updateShape();
updateBounds();
}
@ -69,12 +66,11 @@ void GraphItem::setColor(const QColor &color)
void GraphItem::setWidth(int width)
{
if (width == _width)
if (width == _pen.width())
return;
prepareGeometryChange();
_width = width;
_pen.setWidth(width);
updateShape();
@ -170,10 +166,10 @@ void GraphItem::emitSliderPositionChanged(qreal pos)
void GraphItem::hover(bool hover)
{
if (hover) {
_pen.setWidth(_width + 1);
_pen.setWidth(_pen.width() + 1);
setZValue(zValue() + 1.0);
} else {
_pen.setWidth(_width);
_pen.setWidth(_pen.width() - 1);
setZValue(zValue() - 1.0);
}
@ -189,23 +185,30 @@ void GraphItem::setScale(qreal sx, qreal sy)
_sx = sx; _sy = sy;
updatePath();
updateShape();
}
void GraphItem::updatePath()
{
_path = QPainterPath();
if (_type == Time && !_time)
if (_sx == 0 && _sy == 0)
return;
for (int i = 0; i < _graph.size(); i++) {
const GraphSegment &segment = _graph.at(i);
prepareGeometryChange();
_path.moveTo(segment.first().x(_type) * _sx, -segment.first().y() * _sy);
for (int i = 1; i < segment.size(); i++)
_path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y() * _sy);
_path = QPainterPath();
if (!(_type == Time && !_time)) {
for (int i = 0; i < _graph.size(); i++) {
const GraphSegment &segment = _graph.at(i);
_path.moveTo(segment.first().x(_type) * _sx, -segment.first().y()
* _sy);
for (int i = 1; i < segment.size(); i++)
_path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y()
* _sy);
}
}
updateShape();
}
void GraphItem::updateBounds()
@ -231,7 +234,10 @@ void GraphItem::updateBounds()
}
}
_bounds = QRectF(QPointF(left, top), QPointF(right, bottom));
if (left == right)
_bounds = QRectF();
else
_bounds = QRectF(QPointF(left, top), QPointF(right, bottom));
}
qreal GraphItem::max() const
@ -286,7 +292,7 @@ void GraphItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF(_width + 1);
_pen.setWidth(_pen.width() + 1);
setZValue(zValue() + 1.0);
update();
@ -297,9 +303,15 @@ void GraphItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF(_width);
_pen.setWidth(_pen.width() - 1);
setZValue(zValue() - 1.0);
update();
emit selected(false);
}
void GraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
GraphicsItem::mousePressEvent(event);
}

View File

@ -5,15 +5,19 @@
#include <QPen>
#include "data/graph.h"
#include "units.h"
#include "graphicsscene.h"
class GraphItem : public QGraphicsObject
class GraphItem : public QObject, public GraphicsItem
{
Q_OBJECT
public:
GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent = 0);
GraphItem(const Graph &graph, GraphType type, int width, const QColor &color,
QGraphicsItem *parent = 0);
virtual ~GraphItem() {}
virtual QString info() const = 0;
QPainterPath shape() const {return _shape;}
QRectF boundingRect() const {return _shape.boundingRect();}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
@ -27,11 +31,9 @@ public:
void setScale(qreal sx, qreal sy);
void setGraphType(GraphType type);
int id() const {return _id;}
void setId(int id) {_id = id;}
void setColor(const QColor &color);
void setWidth(int width);
virtual void setUnits(Units units) {Q_UNUSED(units);}
void setUnits(Units units) {_units = units;}
qreal yAtX(qreal x);
qreal distanceAtTime(qreal time);
@ -46,27 +48,26 @@ public slots:
void emitSliderPositionChanged(qreal);
void hover(bool hover);
private:
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
Units _units;
private:
const GraphSegment *segment(qreal x, GraphType type) const;
void updatePath();
void updateShape();
void updateBounds();
int _id;
QPen _pen;
int _width;
Graph _graph;
GraphType _type;
QPainterPath _path;
QPainterPath _shape;
QRectF _bounds;
qreal _sx, _sy;
QPen _pen;
bool _time;
};

View File

@ -1,8 +1,7 @@
#include <QGraphicsScene>
#include <QEvent>
#include <QMouseEvent>
#include <QPaintEngine>
#include <QPaintDevice>
#include <QScrollBar>
#include <QGraphicsSimpleTextItem>
#include <QPalette>
#include <QLocale>
@ -16,6 +15,7 @@
#include "graphitem.h"
#include "pathitem.h"
#include "format.h"
#include "graphicsscene.h"
#include "graphview.h"
@ -24,7 +24,7 @@
GraphView::GraphView(QWidget *parent)
: QGraphicsView(parent)
{
_scene = new QGraphicsScene(this);
_scene = new GraphicsScene(this);
setScene(_scene);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
@ -38,9 +38,9 @@ GraphView::GraphView(QWidget *parent)
_yAxis = new AxisItem(AxisItem::Y);
_yAxis->setZValue(1.0);
_slider = new SliderItem();
_slider->setZValue(3.0);
_slider->setZValue(4.0);
_sliderInfo = new SliderInfoItem(_slider);
_sliderInfo->setZValue(3.0);
_sliderInfo->setZValue(4.0);
_info = new InfoItem();
_grid = new GridItem();
_message = new QGraphicsSimpleTextItem(tr("Data not available"));
@ -64,6 +64,8 @@ GraphView::GraphView(QWidget *parent)
_units = Metric;
_graphType = Distance;
_xLabel = tr("Distance");
_zoom = 1.0;
}
GraphView::~GraphView()
@ -74,9 +76,6 @@ GraphView::~GraphView()
delete _info;
delete _grid;
delete _message;
for (int i = 0; i < _graphs.count(); i++)
delete _graphs[i];
}
void GraphView::createXLabel()
@ -167,14 +166,11 @@ void GraphView::setGraphType(GraphType type)
for (int i = 0; i < _graphs.count(); i++) {
GraphItem *gi = _graphs.at(i);
gi->setGraphType(type);
if (!_hide.contains(gi->id())) {
if (gi->bounds().width() > 0)
addItem(gi);
else
removeItem(gi);
}
if (gi->scene() == _scene)
_bounds |= gi->bounds();
if (gi->bounds().isNull())
removeItem(gi);
else
addItem(gi);
_bounds |= gi->bounds();
}
if (type == Distance)
@ -196,29 +192,32 @@ void GraphView::showSliderInfo(bool show)
_sliderInfo->setVisible(show);
}
void GraphView::addGraph(GraphItem *graph, int id)
void GraphView::addGraph(GraphItem *graph)
{
QColor color(_palette.nextColor());
color.setAlpha(255);
graph->setUnits(_units);
graph->setId(id);
graph->setColor(color);
graph->setWidth(_width);
connect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
SLOT(emitSliderPositionChanged(qreal)));
_graphs.append(graph);
if (!graph->bounds().isNull())
_scene->addItem(graph);
_bounds |= graph->bounds();
if (!_hide.contains(id)) {
_visible.append(graph);
if (graph->bounds().width() > 0) {
_scene->addItem(graph);
_bounds |= graph->bounds();
}
setXUnits();
}
setXUnits();
}
void GraphView::removeGraph(GraphItem *graph)
{
disconnect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
SLOT(emitSliderPositionChanged(qreal)));
_graphs.removeOne(graph);
_scene->removeItem(graph);
_bounds = QRectF();
for (int i = 0; i < _graphs.count(); i++)
_bounds |= _graphs.at(i)->bounds();
setXUnits();
}
void GraphView::removeItem(QGraphicsItem *item)
@ -233,29 +232,6 @@ void GraphView::addItem(QGraphicsItem *item)
_scene->addItem(item);
}
void GraphView::showGraph(bool show, int id)
{
if (show)
_hide.remove(id);
else
_hide.insert(id);
_visible.clear();
_bounds = QRectF();
for (int i = 0; i < _graphs.count(); i++) {
GraphItem *gi = _graphs.at(i);
if (_hide.contains(gi->id()))
removeItem(gi);
else {
_visible.append(gi);
if (gi->bounds().width() > 0) {
addItem(gi);
_bounds |= gi->bounds();
}
}
}
}
QRectF GraphView::bounds() const
{
QRectF br(_bounds);
@ -314,9 +290,10 @@ void GraphView::redraw(const QSizeF &size)
sx = (size.width() - (my.width() + mx.width())) / r.width();
sy = (size.height() - (mx.height() + my.height())
- _info->boundingRect().height()) / r.height();
sx *= _zoom;
for (int i = 0; i < _visible.size(); i++)
_visible.at(i)->setScale(sx, sy);
for (int i = 0; i < _graphs.size(); i++)
_graphs.at(i)->setScale(sx, sy);
QPointF p(r.left() * sx, r.top() * sy);
QSizeF s(r.width() * sx, r.height() * sy);
@ -361,6 +338,40 @@ void GraphView::mousePressEvent(QMouseEvent *e)
QGraphicsView::mousePressEvent(e);
}
void GraphView::wheelEvent(QWheelEvent *e)
{
static int deg = 0;
deg += e->delta() / 8;
if (qAbs(deg) < 15)
return;
deg = 0;
QPointF pos = mapToScene(e->pos());
QRectF gr(_grid->boundingRect());
QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
_zoom = (e->delta() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0);
redraw();
QRectF ngr(_grid->boundingRect());
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
r.y() * ngr.height())));
QScrollBar *sb = horizontalScrollBar();
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x());
QGraphicsView::wheelEvent(e);
}
void GraphView::paintEvent(QPaintEvent *e)
{
QRectF viewRect(mapToScene(rect()).boundingRect());
_info->setPos(QPointF(viewRect.left() + (viewRect.width()
- _info->boundingRect().width())/2.0, _info->pos().y()));
QGraphicsView::paintEvent(e);
}
void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale)
{
QSizeF canvas = QSizeF(target.width() / scale, target.height() / scale);
@ -377,56 +388,45 @@ void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale)
void GraphView::clear()
{
_graphs.clear();
_slider->clear();
_info->clear();
for (int i = 0; i < _graphs.count(); i++)
delete _graphs[i];
_graphs.clear();
_visible.clear();
_palette.reset();
_bounds = QRectF();
_sliderPos = 0;
_zoom = 1.0;
_scene->setSceneRect(0, 0, 0, 0);
}
void GraphView::updateSliderPosition()
{
if (bounds().width() <= 0)
return;
if (_sliderPos <= bounds().right() && _sliderPos >= bounds().left()) {
_slider->setPos((_sliderPos / bounds().width())
* _slider->area().width(), _slider->area().bottom());
_slider->setVisible(!_visible.isEmpty());
_slider->setVisible(true);
updateSliderInfo();
} else {
_slider->setPos(_slider->area().left(), _slider->area().bottom());
_slider->setVisible(false);
}
if (_slider->isVisible())
updateSliderInfo();
}
void GraphView::updateSliderInfo()
{
QLocale l(QLocale::system());
qreal r, y;
qreal r = 0, y = 0;
if (_visible.count() > 1) {
r = 0;
y = 0;
} else {
QRectF br(_visible.first()->bounds());
if (_graphs.count() == 1) {
QRectF br(_graphs.first()->bounds());
if (br.height() < _minYRange)
br.adjust(0, -(_minYRange/2 - br.height()/2), 0,
_minYRange/2 - br.height()/2);
y = _visible.first()->yAtX(_sliderPos);
y = _graphs.first()->yAtX(_sliderPos);
r = (y - br.bottom()) / br.height();
}
@ -438,7 +438,7 @@ void GraphView::updateSliderInfo()
_sliderInfo->setPos(QPointF(0, _slider->boundingRect().height() * r));
_sliderInfo->setText(_graphType == Time ? Format::timeSpan(_sliderPos,
bounds().width() > 3600) : l.toString(_sliderPos * _xScale, 'f', 1)
+ UNIT_SPACE + _xUnits, (_visible.count() > 1) ? QString()
+ UNIT_SPACE + _xUnits, (_graphs.count() > 1) ? QString()
: l.toString(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE
+ _yUnits);
}
@ -458,7 +458,7 @@ void GraphView::emitSliderPositionChanged(const QPointF &pos)
void GraphView::setSliderPosition(qreal pos)
{
if (_visible.isEmpty())
if (_graphs.isEmpty())
return;
_sliderPos = pos;
@ -486,11 +486,8 @@ void GraphView::setPalette(const Palette &palette)
_palette = palette;
_palette.reset();
for (int i = 0; i < _graphs.count(); i++) {
QColor color(_palette.nextColor());
color.setAlpha(255);
_graphs.at(i)->setColor(color);
}
for (int i = 0; i < _graphs.count(); i++)
_graphs.at(i)->setColor(_palette.nextColor());
}
void GraphView::setGraphWidth(int width)

View File

@ -17,6 +17,7 @@ class GraphItem;
class PathItem;
class GridItem;
class QGraphicsSimpleTextItem;
class GraphicsScene;
class GraphView : public QGraphicsView
{
@ -27,7 +28,7 @@ public:
~GraphView();
bool isEmpty() const {return _graphs.isEmpty();}
const QList<KV> &info() const {return _info->info();}
const QList<KV<QString, QString> > &info() const {return _info->info();}
void clear();
void plot(QPainter *painter, const QRectF &target, qreal scale);
@ -46,12 +47,17 @@ signals:
void sliderPositionChanged(qreal);
protected:
void addGraph(GraphItem *graph, int id = 0);
void showGraph(bool show, int id = 0);
void addGraph(GraphItem *graph);
void removeGraph(GraphItem *graph);
void setGraphType(GraphType type);
void setUnits(Units units);
void resizeEvent(QResizeEvent *e);
void mousePressEvent(QMouseEvent *e);
void wheelEvent(QWheelEvent *e);
void changeEvent(QEvent *e);
void paintEvent(QPaintEvent *e);
const QString &yLabel() const {return _yLabel;}
const QString &yUnits() const {return _yUnits;}
qreal yScale() const {return _yScale;}
@ -68,12 +74,11 @@ protected:
void redraw();
void addInfo(const QString &key, const QString &value);
void clearInfo();
void skipColor() {_palette.nextColor();}
void changeEvent(QEvent *e);
QList<GraphItem*> _graphs;
GraphType _graphType;
Units _units;
Palette _palette;
int _width;
private slots:
void emitSliderPositionChanged(const QPointF &pos);
@ -89,19 +94,7 @@ private:
void removeItem(QGraphicsItem *item);
void addItem(QGraphicsItem *item);
void resizeEvent(QResizeEvent *e);
void mousePressEvent(QMouseEvent *e);
Units _units;
qreal _xScale, _yScale;
qreal _yOffset;
QString _xUnits, _yUnits;
QString _xLabel, _yLabel;
int _precision;
qreal _minYRange;
qreal _sliderPos;
QGraphicsScene *_scene;
GraphicsScene *_scene;
AxisItem *_xAxis, *_yAxis;
SliderItem *_slider;
@ -109,12 +102,19 @@ private:
InfoItem *_info;
GridItem *_grid;
QGraphicsSimpleTextItem *_message;
QList<GraphItem*> _graphs;
QList<GraphItem*> _visible;
QSet<int> _hide;
QRectF _bounds;
Palette _palette;
int _width;
qreal _sliderPos;
qreal _xScale, _yScale;
qreal _yOffset;
QString _xUnits, _yUnits;
QString _xLabel, _yLabel;
int _precision;
qreal _minYRange;
qreal _zoom;
};
#endif // GRAPHVIEW_H

View File

@ -451,11 +451,11 @@ void GUI::createActions()
_degreesMinutesAction->setActionGroup(ag);
connect(_degreesMinutesAction, SIGNAL(triggered()), this,
SLOT(setDegreesMinutes()));
_DMSAction = new QAction(tr("Degrees, minutes, seconds (DMS)"), this);
_DMSAction->setMenuRole(QAction::NoRole);
_DMSAction->setCheckable(true);
_DMSAction->setActionGroup(ag);
connect(_DMSAction, SIGNAL(triggered()), this, SLOT(setDMS()));
_dmsAction = new QAction(tr("Degrees, minutes, seconds (DMS)"), this);
_dmsAction->setMenuRole(QAction::NoRole);
_dmsAction->setCheckable(true);
_dmsAction->setActionGroup(ag);
connect(_dmsAction, SIGNAL(triggered()), this, SLOT(setDMS()));
_fullscreenAction = new QAction(QIcon(FULLSCREEN_ICON),
tr("Fullscreen mode"), this);
_fullscreenAction->setMenuRole(QAction::NoRole);
@ -559,7 +559,7 @@ void GUI::createMenus()
QMenu *coordinatesMenu = settingsMenu->addMenu(tr("Coordinates format"));
coordinatesMenu->addAction(_decimalDegreesAction);
coordinatesMenu->addAction(_degreesMinutesAction);
coordinatesMenu->addAction(_DMSAction);
coordinatesMenu->addAction(_dmsAction);
settingsMenu->addSeparator();
settingsMenu->addAction(_showToolbarsAction);
settingsMenu->addAction(_fullscreenAction);
@ -885,8 +885,7 @@ void GUI::closePOIFiles()
{
_poiFilesMenu->clear();
for (int i = 0; i < _poiFilesActions.count(); i++)
delete _poiFilesActions[i];
qDeleteAll(_poiFilesActions);
_poiFilesActions.clear();
_poi->clear();
@ -950,6 +949,7 @@ void GUI::openOptions()
SET_TRACK_OPTION(cadenceFilter, setCadenceFilter);
SET_TRACK_OPTION(powerFilter, setPowerFilter);
SET_TRACK_OPTION(outlierEliminate, setOutlierElimination);
SET_TRACK_OPTION(automaticPause, setAutomaticPause);
SET_TRACK_OPTION(pauseSpeed, setPauseSpeed);
SET_TRACK_OPTION(pauseInterval, setPauseInterval);
SET_TRACK_OPTION(useReportedSpeed, useReportedSpeed);
@ -1067,7 +1067,7 @@ void GUI::statistics()
text.append("<tr><th colspan=\"2\">" + tab->label() + "</th></tr>");
for (int j = 0; j < tab->info().size(); j++) {
const KV &kv = tab->info().at(j);
const KV<QString, QString> &kv = tab->info().at(j);
text.append("<tr><td>" + kv.key() + ":</td><td>" + kv.value()
+ "</td></tr>");
}
@ -1581,7 +1581,6 @@ void GUI::keyPressEvent(QKeyEvent *event)
else
_movingTimeAction->trigger();
break;
case Qt::Key_Escape:
if (_fullscreenAction->isChecked()) {
_fullscreenAction->setChecked(false);
@ -1656,7 +1655,7 @@ void GUI::writeSettings()
: _nauticalUnitsAction->isChecked() ? Nautical : Metric;
if (units != UNITS_DEFAULT)
settings.setValue(UNITS_SETTING, units);
CoordinatesFormat format = _DMSAction->isChecked() ? DMS
CoordinatesFormat format = _dmsAction->isChecked() ? DMS
: _degreesMinutesAction->isChecked() ? DegreesMinutes : DecimalDegrees;
if (format != COORDINATES_DEFAULT)
settings.setValue(COORDINATES_SETTING, format);
@ -1800,6 +1799,8 @@ void GUI::writeSettings()
settings.setValue(POWER_FILTER_SETTING, _options.powerFilter);
if (_options.outlierEliminate != OUTLIER_ELIMINATE_DEFAULT)
settings.setValue(OUTLIER_ELIMINATE_SETTING, _options.outlierEliminate);
if (_options.automaticPause != AUTOMATIC_PAUSE_DEFAULT)
settings.setValue(AUTOMATIC_PAUSE_SETTING, _options.automaticPause);
if (_options.pauseSpeed != PAUSE_SPEED_DEFAULT)
settings.setValue(PAUSE_SPEED_SETTING, _options.pauseSpeed);
if (_options.pauseInterval != PAUSE_INTERVAL_DEFAULT)
@ -1878,7 +1879,7 @@ void GUI::readSettings()
value = settings.value(COORDINATES_SETTING, COORDINATES_DEFAULT).toInt();
if (value == DMS)
_DMSAction->trigger();
_dmsAction->trigger();
else if (value == DegreesMinutes)
_degreesMinutesAction->trigger();
else
@ -2074,6 +2075,8 @@ void GUI::readSettings()
USE_REPORTED_SPEED_DEFAULT).toBool();
_options.dataUseDEM = settings.value(DATA_USE_DEM_SETTING,
DATA_USE_DEM_DEFAULT).toBool();
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
AUTOMATIC_PAUSE_DEFAULT).toBool();
_options.pauseInterval = settings.value(PAUSE_INTERVAL_SETTING,
PAUSE_INTERVAL_DEFAULT).toInt();
_options.poiRadius = settings.value(POI_RADIUS_SETTING, POI_RADIUS_DEFAULT)
@ -2155,6 +2158,7 @@ void GUI::readSettings()
Track::setCadenceFilter(_options.cadenceFilter);
Track::setPowerFilter(_options.powerFilter);
Track::setOutlierElimination(_options.outlierEliminate);
Track::setAutomaticPause(_options.automaticPause);
Track::setPauseSpeed(_options.pauseSpeed);
Track::setPauseInterval(_options.pauseInterval);
Track::useReportedSpeed(_options.useReportedSpeed);

View File

@ -180,7 +180,7 @@ private:
QAction *_nauticalUnitsAction;
QAction *_decimalDegreesAction;
QAction *_degreesMinutesAction;
QAction *_DMSAction;
QAction *_dmsAction;
QAction *_totalTimeAction;
QAction *_movingTimeAction;
QAction *_nextMapAction;

View File

@ -14,6 +14,11 @@ HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(0);
}
HeartRateGraph::~HeartRateGraph()
{
qDeleteAll(_tracks);
}
void HeartRateGraph::setInfo()
{
if (_showTracks) {
@ -36,23 +41,28 @@ QList<GraphItem*> HeartRateGraph::loadData(const Data &data)
const Graph &graph = track.heartRate();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType);
GraphView::addGraph(gi);
HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType,
_width, _palette.nextColor());
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_avg.append(QPointF(track.distance(), gi->avg()));
graphs.append(gi);
}
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -75,6 +85,9 @@ qreal HeartRateGraph::avg() const
void HeartRateGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_avg.clear();
GraphTab::clear();
@ -84,7 +97,13 @@ void HeartRateGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -3,12 +3,15 @@
#include "graphtab.h"
class HeartRateGraphItem;
class HeartRateGraph : public GraphTab
{
Q_OBJECT
public:
HeartRateGraph(QWidget *parent = 0);
~HeartRateGraph();
QString label() const {return tr("Heart rate");}
QList<GraphItem*> loadData(const Data &data);
@ -23,6 +26,7 @@ private:
QVector<QPointF> _avg;
bool _showTracks;
QList<HeartRateGraphItem*> _tracks;
};
#endif // HEARTRATEGRAPH_H

View File

@ -4,12 +4,12 @@
HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent)
int width, const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
setToolTip(toolTip());
}
QString HeartRateGraphItem::toolTip() const
QString HeartRateGraphItem::info() const
{
ToolTip tt;
QLocale l(QLocale::system());

View File

@ -8,11 +8,10 @@ class HeartRateGraphItem : public GraphItem
Q_OBJECT
public:
HeartRateGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
HeartRateGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
private:
QString toolTip() const;
QString info() const;
};
#endif // HEARTRATEGRAPHITEM_H

View File

@ -16,7 +16,7 @@ void InfoItem::updateBoundingRect()
QFontMetrics fm(_font);
qreal width = 0;
for (QList<KV>::const_iterator i = _list.constBegin();
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
i != _list.constEnd(); i++) {
width += fm.width(i->key() + ": ");
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
@ -37,7 +37,7 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
painter->setFont(_font);
painter->setRenderHint(QPainter::Antialiasing, false);
for (QList<KV>::const_iterator i = _list.constBegin();
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
i != _list.constEnd(); i++) {
painter->drawText(width, fm.height() - fm.descent(), i->key() + ": ");
width += fm.width(i->key() + ": ");
@ -61,7 +61,7 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
void InfoItem::insert(const QString &key, const QString &value)
{
KV kv(key, value);
KV<QString, QString> kv(key, value);
int i;
prepareGeometryChange();

View File

@ -14,7 +14,7 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
const QList<KV> &info() const {return _list;}
const QList<KV<QString, QString> > &info() const {return _list;}
void insert(const QString &key, const QString &value);
void clear();
@ -23,7 +23,7 @@ public:
private:
void updateBoundingRect();
QList<KV> _list;
QList<KV<QString, QString> > _list;
QRectF _boundingRect;
QFont _font;
};

View File

@ -16,6 +16,7 @@
#include "scaleitem.h"
#include "coordinatesitem.h"
#include "keys.h"
#include "graphicsscene.h"
#include "mapview.h"
@ -32,7 +33,7 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
Q_ASSERT(map != 0);
Q_ASSERT(poi != 0);
_scene = new QGraphicsScene(this);
_scene = new GraphicsScene(this);
setScene(_scene);
setDragMode(QGraphicsView::ScrollHandDrag);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
@ -215,12 +216,12 @@ QList<PathItem *> MapView::loadData(const Data &data)
QList<PathItem *> paths;
int zoom = _map->zoom();
for (int i = 0; i < data.areas().count(); i++)
addArea(data.areas().at(i));
for (int i = 0; i < data.tracks().count(); i++)
paths.append(addTrack(data.tracks().at(i)));
for (int i = 0; i < data.routes().count(); i++)
paths.append(addRoute(data.routes().at(i)));
for (int i = 0; i < data.areas().count(); i++)
addArea(data.areas().at(i));
addWaypoints(data.waypoints());
if (_tracks.empty() && _routes.empty() && _waypoints.empty()
@ -255,17 +256,18 @@ QPointF MapView::contentCenter() const
void MapView::updatePOIVisibility()
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it, jt;
if (!_showPOI)
return;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->show();
if (!_overlapPOIs) {
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
for (jt = _pois.constBegin(); jt != _pois.constEnd(); jt++) {
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++) {
for (POIHash::const_iterator jt = _pois.constBegin();
jt != _pois.constEnd(); jt++) {
if (it.value()->isVisible() && jt.value()->isVisible()
&& it != jt && it.value()->collidesWithItem(jt.value()))
jt.value()->hide();
@ -288,8 +290,8 @@ void MapView::rescale()
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setMap(_map);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setMap(_map);
updatePOIVisibility();
@ -339,8 +341,8 @@ void MapView::setMap(Map *map)
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setMap(map);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setMap(_map);
updatePOIVisibility();
@ -364,12 +366,10 @@ void MapView::setPOI(POI *poi)
void MapView::updatePOI()
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++) {
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
_scene->removeItem(it.value());
delete it.value();
}
qDeleteAll(_pois);
_pois.clear();
if (_showTracks)
@ -426,8 +426,8 @@ void MapView::setUnits(Units units)
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setToolTipFormat(_units, _coordinatesFormat);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setToolTipFormat(_units, _coordinatesFormat);
}
@ -445,8 +445,8 @@ void MapView::setCoordinatesFormat(CoordinatesFormat format)
for (int i = 0; i < _routes.count(); i++)
_routes[i]->setCoordinatesFormat(_coordinatesFormat);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setToolTipFormat(_units, _coordinatesFormat);
}
@ -461,8 +461,6 @@ void MapView::clearMapCache()
void MapView::digitalZoom(int zoom)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
if (zoom) {
_digitalZoom += zoom;
scale(pow(2, zoom), pow(2, zoom));
@ -479,7 +477,8 @@ void MapView::digitalZoom(int zoom)
_areas.at(i)->setDigitalZoom(_digitalZoom);
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setDigitalZoom(_digitalZoom);
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setDigitalZoom(_digitalZoom);
_mapScale->setDigitalZoom(_digitalZoom);
@ -747,8 +746,8 @@ void MapView::showPOI(bool show)
{
_showPOI = show;
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setVisible(show);
updatePOIVisibility();
@ -758,8 +757,8 @@ void MapView::showPOILabels(bool show)
{
_showPOILabels = show;
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->showLabel(show);
updatePOIVisibility();
@ -852,21 +851,19 @@ void MapView::setWaypointColor(const QColor &color)
void MapView::setPOISize(int size)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
_poiSize = size;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setSize(size);
}
void MapView::setPOIColor(const QColor &color)
{
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
_poiColor = color;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setColor(color);
}
@ -1003,8 +1000,8 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
for (int i = 0; i < _waypoints.size(); i++)
_waypoints.at(i)->setMap(_map);
QHash<SearchPointer<Waypoint>, WaypointItem*>::const_iterator it;
for (it = _pois.constBegin(); it != _pois.constEnd(); it++)
for (POIHash::const_iterator it = _pois.constBegin();
it != _pois.constEnd(); it++)
it.value()->setMap(_map);
updatePOIVisibility();
@ -1021,13 +1018,17 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
void MapView::setProjection(int id)
{
Projection projection(PCS::pcs(id));
if (!projection.isValid())
return;
_projection = projection;
const PCS *pcs;
const GCS *gcs;
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
if ((pcs = PCS::pcs(id)))
_projection = Projection(pcs);
else if ((gcs = GCS::gcs(id)))
_projection = Projection(gcs);
else
qWarning("%d: Unknown PCS/GCS id", id);
_map->setProjection(_projection);
rescale();
centerOn(_map->ll2xy(center));

View File

@ -30,6 +30,7 @@ class PathItem;
class GraphItem;
class AreaItem;
class Area;
class GraphicsScene;
class MapView : public QGraphicsView
{
@ -92,6 +93,8 @@ private slots:
void reloadMap();
private:
typedef QHash<SearchPointer<Waypoint>, WaypointItem*> POIHash;
PathItem *addTrack(const Track &track);
PathItem *addRoute(const Route &route);
void addArea(const Area &area);
@ -118,14 +121,14 @@ private:
void mouseMoveEvent(QMouseEvent *event);
void leaveEvent(QEvent *event);
QGraphicsScene *_scene;
GraphicsScene *_scene;
ScaleItem *_mapScale;
CoordinatesItem *_coordinates;
QList<TrackItem*> _tracks;
QList<RouteItem*> _routes;
QList<WaypointItem*> _waypoints;
QList<AreaItem*> _areas;
QHash<SearchPointer<Waypoint>, WaypointItem*> _pois;
POIHash _pois;
RectC _tr, _rr, _wr, _ar;
qreal _res;

View File

@ -36,15 +36,24 @@ static QFrame *line()
}
#endif // Q_OS_MAC
void OptionsDialog::automaticPauseDetectionSet(bool set)
{
_pauseInterval->setEnabled(!set);
_pauseSpeed->setEnabled(!set);
}
QWidget *OptionsDialog::createMapPage()
{
_projection = new LimitedComboBox(200);
QList<PCS::Info> projections(PCS::pcsList());
QList<KV<int, QString> > projections(GCS::list() + PCS::list());
qSort(projections);
for (int i = 0; i < projections.size(); i++) {
QString text = QString::number(projections.at(i).id()) + " - "
+ projections.at(i).name();
_projection->addItem(text, QVariant(projections.at(i).id()));
QString text = QString::number(projections.at(i).key()) + " - "
+ projections.at(i).value();
_projection->addItem(text, QVariant(projections.at(i).key()));
}
_projection->setCurrentIndex(_projection->findData(_options->projection));
@ -340,10 +349,18 @@ QWidget *OptionsDialog::createDataPage()
filterTab->setLayout(filterTabLayout);
_automaticPause = new QRadioButton(tr("Automatic"));
_manualPause = new QRadioButton(tr("Custom"));
if (_options->automaticPause)
_automaticPause->setChecked(true);
else
_manualPause->setChecked(true);
_pauseSpeed = new QDoubleSpinBox();
_pauseSpeed->setDecimals(1);
_pauseSpeed->setSingleStep(0.1);
_pauseSpeed->setMinimum(0.1);
_pauseSpeed->setEnabled(_manualPause->isChecked());
if (_options->units == Imperial) {
_pauseSpeed->setValue(_options->pauseSpeed * MS2MIH);
_pauseSpeed->setSuffix(UNIT_SPACE + tr("mi/h"));
@ -358,10 +375,26 @@ QWidget *OptionsDialog::createDataPage()
_pauseInterval->setMinimum(1);
_pauseInterval->setSuffix(UNIT_SPACE + tr("s"));
_pauseInterval->setValue(_options->pauseInterval);
_pauseInterval->setEnabled(_manualPause->isChecked());
QFormLayout *pauseLayout = new QFormLayout();
pauseLayout->addRow(tr("Minimal speed:"), _pauseSpeed);
pauseLayout->addRow(tr("Minimal duration:"), _pauseInterval);
connect(_automaticPause, SIGNAL(toggled(bool)), this,
SLOT(automaticPauseDetectionSet(bool)));
QHBoxLayout *pauseTypeLayout = new QHBoxLayout();
#ifdef Q_OS_MAC
pauseTypeLayout->addStretch();
#endif
pauseTypeLayout->addWidget(_automaticPause);
pauseTypeLayout->addWidget(_manualPause);
pauseTypeLayout->addStretch();
QFormLayout *pauseValuesLayout = new QFormLayout();
pauseValuesLayout->addRow(tr("Minimal speed:"), _pauseSpeed);
pauseValuesLayout->addRow(tr("Minimal duration:"), _pauseInterval);
QVBoxLayout *pauseLayout = new QVBoxLayout();
pauseLayout->addLayout(pauseTypeLayout);
pauseLayout->addLayout(pauseValuesLayout);
QWidget *pauseTab = new QWidget();
pauseTab->setLayout(pauseLayout);
@ -676,6 +709,7 @@ void OptionsDialog::accept()
_options->cadenceFilter = _cadenceFilter->value();
_options->powerFilter = _powerFilter->value();
_options->outlierEliminate = _outlierEliminate->isChecked();
_options->automaticPause = _automaticPause->isChecked();
qreal pauseSpeed = (_options->units == Imperial)
? _pauseSpeed->value() / MS2MIH : (_options->units == Nautical)
? _pauseSpeed->value() / MS2KN : _pauseSpeed->value() / MS2KMH;

View File

@ -49,6 +49,7 @@ struct Options {
int cadenceFilter;
int powerFilter;
bool outlierEliminate;
bool automaticPause;
qreal pauseSpeed;
int pauseInterval;
bool useReportedSpeed;
@ -86,6 +87,9 @@ public slots:
public:
OptionsDialog(Options *options, QWidget *parent = 0);
private slots:
void automaticPauseDetectionSet(bool set);
private:
QWidget *createMapPage();
QWidget *createAppearancePage();
@ -129,6 +133,9 @@ private:
OddSpinBox *_cadenceFilter;
OddSpinBox *_powerFilter;
QCheckBox *_outlierEliminate;
QRadioButton *_automaticPause;
QRadioButton *_manualPause;
QDoubleSpinBox *_pauseSpeed;
QSpinBox *_pauseInterval;
QRadioButton *_computedSpeed;

View File

@ -1,9 +1,11 @@
#include <cmath>
#include <QCursor>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include "common/greatcircle.h"
#include "map/map.h"
#include "pathtickitem.h"
#include "popup.h"
#include "pathitem.h"
@ -20,7 +22,7 @@ static inline unsigned segments(qreal distance)
}
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
: QGraphicsObject(parent), _path(path), _map(map)
: GraphicsItem(parent), _path(path), _map(map)
{
Q_ASSERT(_path.isValid());
@ -38,6 +40,7 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
_markerDistance = _path.first().first().distance();
_marker = new MarkerItem(this);
_marker->setZValue(1);
_marker->setPos(position(_markerDistance));
setCursor(Qt::ArrowCursor);
@ -141,6 +144,10 @@ void PathItem::setColor(const QColor &color)
return;
_pen.setColor(color);
for (int i = 0; i < _ticks.size(); i++)
_ticks[i]->setColor(color);
update();
}
@ -317,8 +324,7 @@ unsigned PathItem::tickSize() const
void PathItem::updateTicks()
{
for (int i = 0; i < _ticks.size(); i++)
delete _ticks[i];
qDeleteAll(_ticks);
_ticks.clear();
if (!_showTicks)
@ -333,7 +339,6 @@ void PathItem::updateTicks()
_ticks[i] = new PathTickItem(tr, (i + 1) * ts, this);
_ticks[i]->setPos(position((i + 1) * ts * xInM()));
_ticks[i]->setColor(_pen.color());
_ticks[i]->setToolTip(toolTip());
}
}
@ -378,3 +383,9 @@ void PathItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
emit selected(false);
}
void PathItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
GraphicsItem::mousePressEvent(event);
}

View File

@ -6,16 +6,18 @@
#include "data/path.h"
#include "markeritem.h"
#include "units.h"
#include "graphicsscene.h"
class Map;
class PathTickItem;
class PathItem : public QGraphicsObject
class PathItem : public QObject, public GraphicsItem
{
Q_OBJECT
public:
PathItem(const Path &path, Map *map, QGraphicsItem *parent = 0);
virtual ~PathItem() {}
QPainterPath shape() const {return _shape;}
QRectF boundingRect() const {return _shape.boundingRect();}
@ -35,8 +37,6 @@ public:
void showMarker(bool show);
void showTicks(bool show);
Units units() const {return _units;}
public slots:
void moveMarker(qreal distance);
void hover(bool hover);
@ -44,6 +44,13 @@ public slots:
signals:
void selected(bool);
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
Units _units;
private:
const PathSegment *segment(qreal x) const;
QPointF position(qreal distance) const;
@ -55,15 +62,11 @@ private:
unsigned tickSize() const;
void updateTicks();
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
Path _path;
Map *_map;
qreal _markerDistance;
int _digitalZoom;
Units _units;
qreal _width;
QPen _pen;
QPainterPath _shape;

View File

@ -1,6 +1,9 @@
#include <QPainter>
#include <QCursor>
#include <QGraphicsSceneMouseEvent>
#include "font.h"
#include "popup.h"
#include "pathitem.h"
#include "pathtickitem.h"
@ -17,7 +20,7 @@ static QFont defaultFont()
QFont PathTickItem::_font = defaultFont();
PathTickItem::PathTickItem(const QRectF &tickRect, int value,
QGraphicsItem *parent) : QGraphicsItem(parent), _tickRect(tickRect),
QGraphicsItem *parent) : GraphicsItem(parent), _tickRect(tickRect),
_text(QString::number(value))
{
_tickRect.moveCenter(QPointF(0, -_tickRect.height()/2.0 - 3));
@ -69,3 +72,10 @@ QRect PathTickItem::tickRect(int value)
return fm.boundingRect(QRect(), Qt::AlignCenter,
QString::number(qMax(value, 10))).adjusted(-2, 0, 2, 0);
}
void PathTickItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
const PathItem *pi = static_cast<PathItem*>(parentItem());
Popup::show(event->screenPos(), pi->info(), event->widget());
QGraphicsItem::mousePressEvent(event);
}

View File

@ -3,8 +3,9 @@
#include <QFont>
#include <QGraphicsItem>
#include "graphicsscene.h"
class PathTickItem : public QGraphicsItem
class PathTickItem : public GraphicsItem
{
public:
PathTickItem(const QRectF &tickRect, int value, QGraphicsItem *parent = 0);
@ -16,8 +17,14 @@ public:
void setPos(const QPointF &pos);
void setColor(const QColor &color) {_brush = QBrush(color);}
int type() const {return parentItem()->type();}
QString info() const {return static_cast<GraphicsItem*>(parentItem())->info();}
static QRect tickRect(int value);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
QRectF _tickRect;
QString _text;

View File

@ -24,7 +24,7 @@ PercentSlider::PercentSlider(QWidget *parent) : QWidget(parent)
_label->setAlignment(Qt::AlignRight);
_label->setText(format(_slider->value()));
connect(_slider, SIGNAL(sliderMoved(int)), this, SLOT(updateLabel(int)));
connect(_slider, SIGNAL(valueChanged(int)), this, SLOT(updateLabel(int)));
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(_slider);

171
src/GUI/popup.cpp Normal file
View File

@ -0,0 +1,171 @@
#include <QToolTip>
#include <QStyle>
#include <QStylePainter>
#include <QStyleOptionFrame>
#include <QLabel>
#include <QMouseEvent>
#include <QApplication>
#include <QDesktopWidget>
#include <QBasicTimer>
#include "popup.h"
class PopupLabel : public QLabel
{
public:
PopupLabel(const QString &text, QWidget *parent = 0);
~PopupLabel();
bool eventFilter(QObject *o, QEvent *ev);
void place(const QPoint &pos, QWidget *w);
void deleteAfterTimer();
void stopTimer() {_timer.stop();}
static PopupLabel *_instance;
protected:
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
void contextMenuEvent(QContextMenuEvent *) {}
private:
QBasicTimer _timer;
};
PopupLabel *PopupLabel::_instance = 0;
PopupLabel::PopupLabel(const QString &text, QWidget *parent)
: QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
| Qt::WindowDoesNotAcceptFocus
#endif // QT5
)
{
delete _instance;
_instance = this;
setForegroundRole(QPalette::ToolTipText);
setBackgroundRole(QPalette::ToolTipBase);
setPalette(QToolTip::palette());
ensurePolished();
setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0,
this));
setFrameStyle(QFrame::NoFrame);
setAlignment(Qt::AlignLeft);
setIndent(1);
setWindowOpacity(style()->styleHint(QStyle::SH_ToolTipLabel_Opacity, 0,
this) / 255.0);
setTextInteractionFlags(Qt::TextBrowserInteraction);
setOpenExternalLinks(true);
setWordWrap(true);
setMouseTracking(true);
qApp->installEventFilter(this);
}
PopupLabel::~PopupLabel()
{
_instance = 0;
}
void PopupLabel::paintEvent(QPaintEvent *event)
{
QStylePainter p(this);
QStyleOptionFrame opt;
opt.init(this);
p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
p.end();
QLabel::paintEvent(event);
}
void PopupLabel::timerEvent(QTimerEvent *event)
{
if (event->timerId() == _timer.timerId()) {
_timer.stop();
deleteLater();
}
}
bool PopupLabel::eventFilter(QObject *o, QEvent *ev)
{
Q_UNUSED(o);
switch (ev->type()) {
case QEvent::KeyPress:
case QEvent::KeyRelease: {
const int key = static_cast<QKeyEvent *>(ev)->key();
if (key == Qt::Key_Escape) {
deleteLater();
return true;
}
break;
}
case QEvent::FocusIn:
case QEvent::FocusOut:
case QEvent::WindowActivate:
case QEvent::WindowDeactivate:
case QEvent::Close:
deleteLater();
break;
case QEvent::MouseMove: {
QRectF r(geometry().adjusted(-5, -20, 5, 20));
QPointF p(static_cast<QMouseEvent*>(ev)->globalPos());
if (!r.contains(p))
deleteAfterTimer();
break;
}
default:
break;
}
return false;
}
void PopupLabel::place(const QPoint &pos, QWidget *w)
{
QRect screen = QApplication::desktop()->screenGeometry(w);
QPoint p(pos.x() + 2, pos.y() + 16);
if (p.x() + width() > screen.x() + screen.width())
p.rx() -= 4 + width();
if (p.y() + height() > screen.y() + screen.height())
p.ry() -= 24 + height();
if (p.y() < screen.y())
p.setY(screen.y());
if (p.x() + width() > screen.x() + screen.width())
p.setX(screen.x() + screen.width() - width());
if (p.x() < screen.x())
p.setX(screen.x());
if (p.y() + height() > screen.y() + screen.height())
p.setY(screen.y() + screen.height() - height());
this->move(p);
}
void PopupLabel::deleteAfterTimer()
{
if (!_timer.isActive())
_timer.start(300, this);
}
void Popup::show(const QPoint &pos, const QString &text, QWidget *w)
{
if (PopupLabel::_instance) {
PopupLabel::_instance->stopTimer();
PopupLabel::_instance->setText(text);
} else
PopupLabel::_instance = new PopupLabel(text);
PopupLabel::_instance->resize(PopupLabel::_instance->sizeHint());
PopupLabel::_instance->place(pos, w);
PopupLabel::_instance->showNormal();
}
void Popup::clear()
{
if (PopupLabel::_instance)
delete PopupLabel::_instance;
}

15
src/GUI/popup.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef POPUP_H
#define POPUP_H
class QPoint;
class QString;
class QWidget;
class Popup
{
public:
static void show(const QPoint &pos, const QString &text, QWidget *w);
static void clear();
};
#endif // POPUP_H

View File

@ -14,6 +14,11 @@ PowerGraph::PowerGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(1);
}
PowerGraph::~PowerGraph()
{
qDeleteAll(_tracks);
}
void PowerGraph::setInfo()
{
if (_showTracks) {
@ -36,23 +41,27 @@ QList<GraphItem*> PowerGraph::loadData(const Data &data)
const Graph &graph = track.power();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
PowerGraphItem *gi = new PowerGraphItem(graph, _graphType);
GraphView::addGraph(gi);
PowerGraphItem *gi = new PowerGraphItem(graph, _graphType, _width,
_palette.nextColor());
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_avg.append(QPointF(track.distance(), gi->avg()));
graphs.append(gi);
}
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -75,6 +84,9 @@ qreal PowerGraph::avg() const
void PowerGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_avg.clear();
GraphTab::clear();
@ -84,7 +96,13 @@ void PowerGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -3,12 +3,15 @@
#include "graphtab.h"
class PowerGraphItem;
class PowerGraph : public GraphTab
{
Q_OBJECT
public:
PowerGraph(QWidget *parent = 0);
~PowerGraph();
QString label() const {return tr("Power");}
QList<GraphItem*> loadData(const Data &data);
@ -23,6 +26,7 @@ private:
QVector<QPointF> _avg;
bool _showTracks;
QList<PowerGraphItem*> _tracks;
};
#endif // POWERGRAPH_H

View File

@ -3,13 +3,13 @@
#include "powergraphitem.h"
PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent)
PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
setToolTip(toolTip());
}
QString PowerGraphItem::toolTip() const
QString PowerGraphItem::info() const
{
ToolTip tt;
QLocale l(QLocale::system());

View File

@ -8,11 +8,10 @@ class PowerGraphItem : public GraphItem
Q_OBJECT
public:
PowerGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
PowerGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
private:
QString toolTip() const;
QString info() const;
};
#endif // POWERGRAPHITEM_H

View File

@ -7,7 +7,7 @@
#include "routeitem.h"
QString RouteItem::toolTip(Units units) const
QString RouteItem::info() const
{
ToolTip tt;
@ -16,7 +16,18 @@ QString RouteItem::toolTip(Units units) const
if (!_desc.isEmpty())
tt.insert(tr("Description"), _desc);
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
units));
_units));
if (!_links.isEmpty()) {
QString links;
for (int i = 0; i < _links.size(); i++) {
const Link &link = _links.at(i);
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
link.text().isEmpty() ? link.URL() : link.text()));
if (i != _links.size() - 1)
links.append("<br/>");
}
tt.insert(tr("Links"), links);
}
return tt.toString();
}
@ -24,7 +35,7 @@ QString RouteItem::toolTip(Units units) const
RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
: PathItem(route.path(), map, parent)
{
const QVector<Waypoint> &waypoints = route.waypoints();
const RouteData &waypoints = route.data();
_waypoints.resize(waypoints.size());
for (int i = 0; i < waypoints.size(); i++)
@ -32,9 +43,8 @@ RouteItem::RouteItem(const Route &route, Map *map, QGraphicsItem *parent)
_name = route.name();
_desc = route.description();
_links = route.links();
_coordinatesFormat = DecimalDegrees;
setToolTip(toolTip(Metric));
}
void RouteItem::setMap(Map *map)
@ -47,15 +57,13 @@ void RouteItem::setMap(Map *map)
void RouteItem::setUnits(Units u)
{
if (units() == u)
if (_units == u)
return;
PathItem::setUnits(u);
setToolTip(toolTip(units()));
for (int i = 0; i < _waypoints.count(); i++)
_waypoints[i]->setToolTipFormat(units(), _coordinatesFormat);
_waypoints[i]->setToolTipFormat(u, _coordinatesFormat);
PathItem::setUnits(u);
}
void RouteItem::setCoordinatesFormat(CoordinatesFormat format)
@ -66,7 +74,7 @@ void RouteItem::setCoordinatesFormat(CoordinatesFormat format)
_coordinatesFormat = format;
for (int i = 0; i < _waypoints.count(); i++)
_waypoints[i]->setToolTipFormat(units(), _coordinatesFormat);
_waypoints[i]->setToolTipFormat(_units, _coordinatesFormat);
}
void RouteItem::showWaypoints(bool show)

View File

@ -5,6 +5,7 @@
#include "pathitem.h"
#include "units.h"
#include "format.h"
#include "graphicsscene.h"
class Map;
class WaypointItem;
@ -23,11 +24,12 @@ public:
void showWaypoints(bool show);
void showWaypointLabels(bool show);
private:
QString toolTip(Units units) const;
QString info() const;
private:
QString _name;
QString _desc;
QVector<Link> _links;
CoordinatesFormat _coordinatesFormat;
QVector<WaypointItem*> _waypoints;

View File

@ -135,6 +135,8 @@
#define POWER_FILTER_DEFAULT 3
#define OUTLIER_ELIMINATE_SETTING "outlierEliminate"
#define OUTLIER_ELIMINATE_DEFAULT true
#define AUTOMATIC_PAUSE_SETTING "automaticPause"
#define AUTOMATIC_PAUSE_DEFAULT true
#define PAUSE_SPEED_SETTING "pauseSpeed"
#define PAUSE_SPEED_DEFAULT 0.5 /* m/s */
#define PAUSE_INTERVAL_SETTING "pauseInterval"
@ -152,7 +154,7 @@
#define ENABLE_HTTP2_SETTING "enableHTTP2"
#define ENABLE_HTTP2_DEFAULT true
#define PIXMAP_CACHE_SETTING "pixmapCache"
#define PIXMAP_CACHE_DEFAULT 64 /* MB */
#define PIXMAP_CACHE_DEFAULT 256 /* MB */
#define CONNECTION_TIMEOUT_SETTING "connectionTimeout"
#define CONNECTION_TIMEOUT_DEFAULT 30 /* s */
#define HIRES_PRINT_SETTING "hiresPrint"

View File

@ -18,6 +18,11 @@ SpeedGraph::SpeedGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(1);
}
SpeedGraph::~SpeedGraph()
{
qDeleteAll(_tracks);
}
void SpeedGraph::setInfo()
{
if (_showTracks) {
@ -44,13 +49,18 @@ QList<GraphItem*> SpeedGraph::loadData(const Data &data)
const Graph &graph = track.speed();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType,
track.movingTime());
SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType, _width,
_palette.nextColor(), track.movingTime());
gi->setTimeType(_timeType);
GraphView::addGraph(gi);
gi->setUnits(_units);
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_avg.append(QPointF(track.distance(), gi->avg()));
_mavg.append(QPointF(track.distance(), gi->mavg()));
graphs.append(gi);
@ -58,12 +68,12 @@ QList<GraphItem*> SpeedGraph::loadData(const Data &data)
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -87,6 +97,9 @@ qreal SpeedGraph::avg() const
void SpeedGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_avg.clear();
_mavg.clear();
@ -121,8 +134,8 @@ void SpeedGraph::setTimeType(enum TimeType type)
{
_timeType = type;
for (int i = 0; i < _graphs.size(); i++)
static_cast<SpeedGraphItem*>(_graphs.at(i))->setTimeType(type);
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setTimeType(type);
setInfo();
redraw();
@ -132,7 +145,13 @@ void SpeedGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -4,12 +4,15 @@
#include <QList>
#include "graphtab.h"
class SpeedGraphItem;
class SpeedGraph : public GraphTab
{
Q_OBJECT
public:
SpeedGraph(QWidget *parent = 0);
~SpeedGraph();
QString label() const {return tr("Speed");}
QList<GraphItem*> loadData(const Data &data);
@ -29,7 +32,9 @@ private:
Units _units;
TimeType _timeType;
bool _showTracks;
QList<SpeedGraphItem *> _tracks;
};
#endif // SPEEDGRAPH_H

View File

@ -4,20 +4,18 @@
#include "speedgraphitem.h"
SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type,
qreal movingTime, QGraphicsItem *parent) : GraphItem(graph, type, parent)
SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, qreal movingTime, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
_units = Metric;
_timeType = Total;
_max = GraphItem::max();
_avg = graph.last().last().s() / graph.last().last().t();
_mavg = graph.last().last().s() / movingTime;
setToolTip(toolTip());
}
QString SpeedGraphItem::toolTip() const
QString SpeedGraphItem::info() const
{
ToolTip tt;
qreal scale = (_units == Imperial) ? MS2MIH : (_units == Nautical)
@ -39,14 +37,7 @@ QString SpeedGraphItem::toolTip() const
return tt.toString();
}
void SpeedGraphItem::setUnits(Units units)
{
_units = units;
setToolTip(toolTip());
}
void SpeedGraphItem::setTimeType(TimeType type)
{
_timeType = type;
setToolTip(toolTip());
}

View File

@ -9,22 +9,19 @@ class SpeedGraphItem : public GraphItem
Q_OBJECT
public:
SpeedGraphItem(const Graph &graph, GraphType type, qreal movingTime,
QGraphicsItem *parent = 0);
SpeedGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, qreal movingTime, QGraphicsItem *parent = 0);
qreal avg() const {return _avg;}
qreal mavg() const {return _mavg;}
qreal max() const {return _max;}
void setUnits(Units units);
QString info() const;
void setTimeType(TimeType type);
private:
QString toolTip() const;
qreal _avg, _mavg, _max;
Units _units;
TimeType _timeType;
};

View File

@ -14,6 +14,11 @@ TemperatureGraph::TemperatureGraph(QWidget *parent) : GraphTab(parent)
setSliderPrecision(1);
}
TemperatureGraph::~TemperatureGraph()
{
qDeleteAll(_tracks);
}
void TemperatureGraph::setInfo()
{
if (_showTracks) {
@ -38,24 +43,29 @@ QList<GraphItem*> TemperatureGraph::loadData(const Data &data)
const Graph &graph = track.temperature();
if (!graph.isValid()) {
skipColor();
_palette.nextColor();
graphs.append(0);
} else {
TemperatureGraphItem *gi = new TemperatureGraphItem(graph,
_graphType);
GraphView::addGraph(gi);
_graphType, _width, _palette.nextColor());
gi->setUnits(_units);
_tracks.append(gi);
if (_showTracks)
addGraph(gi);
_avg.append(QPointF(track.distance(), gi->avg()));
graphs.append(gi);
}
}
for (int i = 0; i < data.routes().count(); i++) {
skipColor();
_palette.nextColor();
graphs.append(0);
}
for (int i = 0; i < data.areas().count(); i++)
skipColor();
_palette.nextColor();
setInfo();
redraw();
@ -78,6 +88,9 @@ qreal TemperatureGraph::avg() const
void TemperatureGraph::clear()
{
qDeleteAll(_tracks);
_tracks.clear();
_avg.clear();
GraphTab::clear();
@ -108,7 +121,13 @@ void TemperatureGraph::showTracks(bool show)
{
_showTracks = show;
showGraph(show);
for (int i = 0; i < _tracks.size(); i++) {
if (show)
addGraph(_tracks.at(i));
else
removeGraph(_tracks.at(i));
}
setInfo();
redraw();

View File

@ -3,12 +3,15 @@
#include "graphtab.h"
class TemperatureGraphItem;
class TemperatureGraph : public GraphTab
{
Q_OBJECT
public:
TemperatureGraph(QWidget *parent = 0);
~TemperatureGraph();
QString label() const {return tr("Temperature");}
QList<GraphItem*> loadData(const Data &data);
@ -26,6 +29,7 @@ private:
QVector<QPointF> _avg;
bool _showTracks;
QList<TemperatureGraphItem *> _tracks;
};
#endif // TEMPERATUREGRAPH_H

View File

@ -4,21 +4,20 @@
TemperatureGraphItem::TemperatureGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent) : GraphItem(graph, type, parent)
int width, const QColor &color, QGraphicsItem *parent)
: GraphItem(graph, type, width, color, parent)
{
_min = GraphItem::min();
_max = GraphItem::max();
_avg = GraphItem::avg();
setToolTip(toolTip(Metric));
}
QString TemperatureGraphItem::toolTip(Units units) const
QString TemperatureGraphItem::info() const
{
ToolTip tt;
qreal scale = (units == Metric) ? 1.0 : C2FS;
qreal offset = (units == Metric) ? 0 : C2FO;
QString su = (units == Metric) ?
qreal scale = (_units == Metric) ? 1.0 : C2FS;
qreal offset = (_units == Metric) ? 0 : C2FO;
QString su = (_units == Metric) ?
QChar(0x00B0) + tr("C") : QChar(0x00B0) + tr("F");
QLocale l(QLocale::system());
@ -31,8 +30,3 @@ QString TemperatureGraphItem::toolTip(Units units) const
return tt.toString();
}
void TemperatureGraphItem::setUnits(Units units)
{
setToolTip(toolTip(units));
}

View File

@ -8,18 +8,16 @@ class TemperatureGraphItem : public GraphItem
Q_OBJECT
public:
TemperatureGraphItem(const Graph &graph, GraphType type,
QGraphicsItem *parent = 0);
TemperatureGraphItem(const Graph &graph, GraphType type, int width,
const QColor &color, QGraphicsItem *parent = 0);
qreal max() const {return _max;}
qreal min() const {return _min;}
qreal avg() const {return _avg;}
void setUnits(Units units);
QString info() const;
private:
QString toolTip(Units units) const;
qreal _min, _max, _avg;
};

View File

@ -1,33 +1,42 @@
#include <QImageReader>
#include "popup.h"
#include "tooltip.h"
static QSize thumbnailSize(const ImageInfo &img, int limit)
{
int width, height;
if (img.size().width() > img.size().height()) {
width = qMin(img.size().width(), limit);
qreal ratio = img.size().width() / (qreal)img.size().height();
height = (int)(width / ratio);
} else {
height = qMin(img.size().height(), limit);
qreal ratio = img.size().height() / (qreal)img.size().width();
width = (int)(height / ratio);
}
#define THUMBNAIL_MAX_SIZE 240
return QSize(width, height);
}
void ToolTip::insert(const QString &key, const QString &value)
{
_list.append(KV(key, value));
_list.append(KV<QString, QString>(key, value));
}
QString ToolTip::toString() const
{
QString html;
if (_img.isValid()) {
int width, height;
if (_img.size().width() > _img.size().height()) {
width = qMin(_img.size().width(), THUMBNAIL_MAX_SIZE);
qreal ratio = _img.size().width() / (qreal)_img.size().height();
height = (int)(width / ratio);
} else {
height = qMin(_img.size().height(), THUMBNAIL_MAX_SIZE);
qreal ratio = _img.size().height() / (qreal)_img.size().width();
width = (int)(height / ratio);
}
if (_images.size()) {
html = "<div align=\"center\">";
for (int i = 0; i < _images.size(); i++) {
const ImageInfo &img = _images.at(i);
QSize size(thumbnailSize(img, qMin(960/_images.size(), 240)));
html += "<div align=\"center\">";
html += QString("<img src=\"file:%0\" width=\"%1\" height=\"%2\"/>")
.arg(_img.path(), QString::number(width), QString::number(height));
html += QString("<a href=\"file:%0\">"
"<img src=\"%0\" width=\"%1\" height=\"%2\"/></a>")
.arg(img.path(), QString::number(size.width()),
QString::number(size.height()));
}
html += "</div>";
}

View File

@ -3,6 +3,7 @@
#include <QString>
#include <QList>
#include <QVector>
#include "common/kv.h"
#include "data/imageinfo.h"
@ -10,12 +11,12 @@ class ToolTip
{
public:
void insert(const QString &key, const QString &value);
void setImage(const ImageInfo &image) {_img = image;}
void setImages(const QVector<ImageInfo> &images) {_images = images;}
QString toString() const;
private:
QList<KV> _list;
ImageInfo _img;
QList<KV<QString, QString> > _list;
QVector<ImageInfo> _images;
};
#endif // TOOLTIP_H

View File

@ -5,7 +5,7 @@
#include "trackitem.h"
QString TrackItem::toolTip(Units units) const
QString TrackItem::info() const
{
ToolTip tt;
@ -14,13 +14,24 @@ QString TrackItem::toolTip(Units units) const
if (!_desc.isEmpty())
tt.insert(tr("Description"), _desc);
tt.insert(tr("Distance"), Format::distance(path().last().last().distance(),
units));
_units));
if (_time > 0)
tt.insert(tr("Total time"), Format::timeSpan(_time));
if (_movingTime > 0)
tt.insert(tr("Moving time"), Format::timeSpan(_movingTime));
if (!_date.isNull())
tt.insert(tr("Date"), _date.toString(Qt::SystemLocaleShortDate));
if (!_links.isEmpty()) {
QString links;
for (int i = 0; i < _links.size(); i++) {
const Link &link = _links.at(i);
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
link.text().isEmpty() ? link.URL() : link.text()));
if (i != _links.size() - 1)
links.append("<br/>");
}
tt.insert(tr("Links"), links);
}
return tt.toString();
}
@ -30,15 +41,8 @@ TrackItem::TrackItem(const Track &track, Map *map, QGraphicsItem *parent)
{
_name = track.name();
_desc = track.description();
_links = track.links();
_date = track.date();
_time = track.time();
_movingTime = track.movingTime();
setToolTip(toolTip(Metric));
}
void TrackItem::setUnits(Units units)
{
PathItem::setUnits(units);
setToolTip(toolTip(units));
}

View File

@ -6,6 +6,7 @@
#include "data/track.h"
#include "pathitem.h"
#include "units.h"
#include "graphicsscene.h"
class Map;
@ -16,13 +17,12 @@ class TrackItem : public PathItem
public:
TrackItem(const Track &track, Map *map, QGraphicsItem *parent = 0);
void setUnits(Units units);
QString info() const;
private:
QString toolTip(Units units) const;
QString _name;
QString _desc;
QVector<Link> _links;
QDateTime _date;
qreal _time;
qreal _movingTime;

View File

@ -1,7 +1,10 @@
#include <QApplication>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include <QLabel>
#include "font.h"
#include "tooltip.h"
#include "popup.h"
#include "waypointitem.h"
@ -10,30 +13,54 @@
#define FS(size) \
((int)((qreal)size * 1.41))
QString WaypointItem::toolTip(Units units, CoordinatesFormat format)
QString WaypointItem::info() const
{
ToolTip tt;
if (!_waypoint.name().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
tt.insert(qApp->translate("WaypointItem", "Coordinates"),
Format::coordinates(_waypoint.coordinates(), format));
Format::coordinates(_waypoint.coordinates(), _format));
if (_waypoint.hasElevation())
tt.insert(qApp->translate("WaypointItem", "Elevation"),
Format::elevation(_waypoint.elevation(), units));
Format::elevation(_waypoint.elevation(), _units));
if (_waypoint.timestamp().isValid())
tt.insert(qApp->translate("WaypointItem", "Date"),
_waypoint.timestamp().toString(Qt::SystemLocaleShortDate));
if (!_waypoint.description().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Description"),
_waypoint.description());
tt.setImage(_waypoint.image());
if (_waypoint.address().isValid()) {
QString addr("<address>");
addr += _waypoint.address().street();
addr += "<br/>" + _waypoint.address().city();
if (!_waypoint.address().postalCode().isEmpty())
addr += "<br/>" + _waypoint.address().postalCode();
if (!_waypoint.address().state().isEmpty())
addr += "<br/>" + _waypoint.address().state();
if (!_waypoint.address().country().isEmpty())
addr += "<br/>" + _waypoint.address().country();
addr += "</address>";
tt.insert(qApp->translate("WaypointItem", "Address"), addr);
}
if (!_waypoint.links().isEmpty()) {
QString links;
for (int i = 0; i < _waypoint.links().size(); i++) {
const Link &link = _waypoint.links().at(i);
links.append(QString("<a href=\"%0\">%1</a>").arg(link.URL(),
link.text().isEmpty() ? link.URL() : link.text()));
if (i != _waypoint.links().size() - 1)
links.append("<br/>");
}
tt.insert(qApp->translate("WaypointItem", "Links"), links);
}
tt.setImages(_waypoint.images());
return tt.toString();
}
WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
QGraphicsItem *parent) : QGraphicsItem(parent)
QGraphicsItem *parent) : GraphicsItem(parent)
{
_waypoint = waypoint;
_showLabel = true;
@ -43,10 +70,12 @@ WaypointItem::WaypointItem(const Waypoint &waypoint, Map *map,
_font.setPixelSize(FS(_size));
_font.setFamily(FONT_FAMILY);
_units = Metric;
_format = DecimalDegrees;
updateCache();
setPos(map->ll2xy(waypoint.coordinates()));
setToolTip(toolTip(Metric, DecimalDegrees));
setCursor(Qt::ArrowCursor);
setAcceptHoverEvents(true);
}
@ -116,7 +145,8 @@ void WaypointItem::setColor(const QColor &color)
void WaypointItem::setToolTipFormat(Units units, CoordinatesFormat format)
{
setToolTip(toolTip(units, format));
_units = units;
_format = format;
}
void WaypointItem::showLabel(bool show)
@ -148,3 +178,10 @@ void WaypointItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
updateCache();
setZValue(zValue() - 1.0);
}
void WaypointItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
/* Do not propagate the event any further as lower stacked items (path
items) would replace the popup with their own popup */
}

View File

@ -3,12 +3,15 @@
#include <cmath>
#include <QGraphicsItem>
#include <QFont>
#include "data/waypoint.h"
#include "map/map.h"
#include "units.h"
#include "graphicsscene.h"
#include "format.h"
class WaypointItem : public QGraphicsItem
class WaypointItem : public GraphicsItem
{
public:
WaypointItem(const Waypoint &waypoint, Map *map, QGraphicsItem *parent = 0);
@ -16,23 +19,26 @@ public:
const Waypoint &waypoint() const {return _waypoint;}
void setMap(Map *map) {setPos(map->ll2xy(_waypoint.coordinates()));}
void setToolTipFormat(Units units, CoordinatesFormat format);
void setSize(int size);
void setColor(const QColor &color);
void showLabel(bool show);
void setDigitalZoom(int zoom) {setScale(pow(2, -zoom));}
void setToolTipFormat(Units units, CoordinatesFormat format);
QPainterPath shape() const {return _shape;}
QRectF boundingRect() const {return _shape.boundingRect();}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
private:
QString info() const;
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
void updateCache();
QString toolTip(Units units, CoordinatesFormat format);
Waypoint _waypoint;
QPainterPath _shape;
@ -41,6 +47,9 @@ private:
bool _showLabel;
QFont _font;
QRect _labelBB;
Units _units;
CoordinatesFormat _format;
};
#endif // WAYPOINTITEM_H

View File

@ -14,7 +14,8 @@ double Coordinates::distanceTo(const Coordinates &c) const
#ifndef QT_NO_DEBUG
QDebug operator<<(QDebug dbg, const Coordinates &c)
{
dbg.nospace() << "Coordinates(" << c.lon() << ", " << c.lat() << ")";
dbg.nospace() << qSetRealNumberPrecision(10) << "Coordinates(" << c.lat()
<< ", " << c.lon() << ")";
return dbg.space();
}
#endif // QT_NO_DEBUG

16
src/common/garmin.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef GARMIN_H
#define GARMIN_H
#include <QtGlobal>
inline double toWGS32(qint32 v)
{
return (double)(((double)v / (double)(1U<<31)) * (double)180);
}
inline double toWGS24(qint32 v)
{
return toWGS32(v<<8);
}
#endif // GARMIN_H

View File

@ -1,21 +1,20 @@
#ifndef KV_H
#define KV_H
#include <QString>
template <class KEY, class VALUE>
class KV {
public:
KV(const QString &key, const QString &value) : _key(key), _value(value) {}
KV(const KEY &key, const VALUE &value) : _key(key), _value(value) {}
const QString &key() const {return _key;}
const QString &value() const {return _value;}
const KEY &key() const {return _key;}
const VALUE &value() const {return _value;}
bool operator==(const KV &other) const
{return this->key() == other.key();}
bool operator==(const KV &other) const {return _key == other._key;}
bool operator<(const KV &other) const {return _key < other._key;}
private:
QString _key;
QString _value;
KEY _key;
VALUE _value;
};
#endif // KV_H

View File

@ -9,6 +9,7 @@
#define TIFF_SHORT 3
#define TIFF_LONG 4
#define TIFF_RATIONAL 5
#define TIFF_SRATIONAL 10
#define TIFF_DOUBLE 12
class TIFFFile
@ -17,6 +18,7 @@ public:
TIFFFile(QIODevice *device);
bool isValid() const {return _ifd != 0;}
bool isBE() const {return _be;}
quint32 ifd() const {return _ifd;}
bool seek(qint64 pos) {return _device->seek(_offset + pos);}

35
src/data/address.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef ADDRESS_H
#define ADDRESS_H
#include <QString>
class Address
{
public:
Address() {}
Address(const QString &street, const QString &city)
: _street(street), _city(city) {}
const QString &street() const {return _street;}
const QString &city() const {return _city;}
const QString &state() const {return _state;}
const QString &country() const {return _country;}
const QString &postalCode() const {return _postalCode;}
void setStreet(const QString &street) {_street = street;}
void setCity(const QString &city) {_city = city;}
void setState(const QString &state) {_state = state;}
void setCountry(const QString &country) {_country = country;}
void setPostalCode(const QString &postalCode) {_postalCode = postalCode;}
bool isValid() const {return !(_street.isEmpty() || _city.isEmpty());}
private:
QString _street;
QString _city;
QString _state;
QString _country;
QString _postalCode;
};
#endif // ADDRESS_H

67
src/data/csv.cpp Normal file
View File

@ -0,0 +1,67 @@
#include <QStringList>
#include "csv.h"
/*
RFC 4180 parser with the following enchancements:
- allows an arbitrary delimiter
- allows LF line ends in addition to CRLF line ends
*/
bool CSV::readEntry(QStringList &list)
{
int state = 0;
char c;
QByteArray field;
while (_device->getChar(&c)) {
switch (state) {
case 0:
if (c == '\r')
state = 3;
else if (c == '\n') {
list.append(field);
_line++;
return true;
} else if (c == _delimiter) {
list.append(field);
field.clear();
} else if (c == '"') {
if (!field.isEmpty())
return false;
state = 1;
} else
field.append(c);
break;
case 1:
if (c == '"')
state = 2;
else {
field.append(c);
if (c == '\n')
_line++;
}
break;
case 2:
if (c == '"') {
field.append('"');
state = 1;
} else if (c == _delimiter || c == '\r' || c == '\n') {
_device->ungetChar(c);
state = 0;
} else
return false;
break;
case 3:
if (c == '\n') {
_device->ungetChar(c);
state = 0;
} else
return false;
break;
}
}
list.append(field);
return (state == 0);
}

22
src/data/csv.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef CSV_H
#define CSV_H
#include <QIODevice>
class CSV
{
public:
CSV(QIODevice *device, char delimiter = ',')
: _device(device), _delimiter(delimiter), _line(1) {}
bool readEntry(QStringList &list);
bool atEnd() const {return _device->atEnd();}
int line() const {return _line;}
private:
QIODevice *_device;
char _delimiter;
int _line;
};
#endif // CSV_H

Some files were not shown because too many files have changed in this diff Show More