1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-22 14:54:24 +02:00

Compare commits

..

184 Commits
7.38 ... 8.5

Author SHA1 Message Date
060c4df170 Merge branch 'origin/master' into Weblate. 2021-02-08 19:57:14 +01:00
d88f71ddba Version++ 2021-02-08 19:56:57 +01:00
24ade728d0 Merge branch 'origin/master' into Weblate. 2021-02-08 19:54:42 +01:00
de064c7ea1 Code cleanup after recent SubFile redesign 2021-02-08 19:54:14 +01:00
a8a613468e Do not show empty popups 2021-02-08 19:53:24 +01:00
ed6a81c9e7 Properly fix the areas crash 2021-02-08 19:52:48 +01:00
507fe0b9a8 Merge branch 'origin/master' into Weblate. 2021-02-08 00:57:54 +01:00
273f8a4c21 Translated using Weblate (Finnish)
Currently translated at 99.7% (389 of 390 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2021-02-08 00:57:54 +01:00
aceb840700 Added missing AQM icon association 2021-02-08 00:56:20 +01:00
0cd18c0927 Fixed crash when there is no graph in the data 2021-02-08 00:55:27 +01:00
1d81afb89d Translated using Weblate (Russian)
Currently translated at 100.0% (390 of 390 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2021-02-07 22:23:40 +01:00
1c9761be57 Translated using Weblate (Hungarian)
Currently translated at 100.0% (390 of 390 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2021-02-07 16:41:13 +01:00
9481e9b4e5 Added AlpineQuest maps support info 2021-02-07 16:11:52 +01:00
c6db2401ff NSIS requires the BOM for UTF8 strings to work properly 2021-02-07 16:09:17 +01:00
145a46686e Propper error checking 2021-02-07 11:53:10 +01:00
065d52d98b Propper error handling 2021-02-07 11:46:03 +01:00
d769ec4f06 Propper error handling 2021-02-07 11:43:30 +01:00
4d05b6d667 Removed obsolete localization strings 2021-02-07 09:23:41 +01:00
a96b047a9e Merge branch 'origin/master' into Weblate. 2021-02-07 09:17:11 +01:00
9041524076 Translated using Weblate (Turkish)
Currently translated at 100.0% (390 of 390 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2021-02-07 09:17:11 +01:00
5358c8ea38 Translated using Weblate (Swedish)
Currently translated at 100.0% (390 of 390 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2021-02-07 09:17:11 +01:00
0b58f3ec48 Missing CZ and DE translations 2021-02-07 09:16:43 +01:00
1830c038f3 Fixed assignment instead of compare 2021-02-07 09:08:28 +01:00
42bf36fdfa Merge branch 'origin/master' into Weblate. 2021-02-07 01:08:23 +01:00
f2e91f4a6b Fixed date background rendering issue 2021-02-06 15:43:20 +01:00
7604346799 Localization update 2021-02-06 15:26:46 +01:00
a369a1689d Added position date display option
Closes #330
2021-02-06 15:23:02 +01:00
787868185f Translated using Weblate (Hungarian)
Currently translated at 100.0% (389 of 389 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2021-02-06 11:23:34 +01:00
d294d86b0f Translated using Weblate (Turkish)
Currently translated at 100.0% (389 of 389 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2021-02-06 11:23:34 +01:00
317833dfc3 Translated using Weblate (Swedish)
Currently translated at 100.0% (389 of 389 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2021-02-06 11:23:33 +01:00
b80b50d5bb Translated using Weblate (Russian)
Currently translated at 100.0% (389 of 389 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2021-02-06 11:23:33 +01:00
c44d21017a Translated using Weblate (Czech)
Currently translated at 100.0% (389 of 389 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2021-02-06 11:23:11 +01:00
7bc1c53452 Added OS X AQM desktop integration 2021-02-06 10:44:31 +01:00
de8f49979c Localization update 2021-02-06 00:18:49 +01:00
399b6e9013 Fixed broken icon order 2021-02-05 23:11:10 +01:00
6590a2ca44 Added AQM MIME type 2021-02-05 22:20:30 +01:00
4ab611b04a Windows & Linux AQM desktop integration 2021-02-05 22:01:10 +01:00
c82e97b1ca Code cleanup 2021-02-05 21:58:34 +01:00
86c6fa7b03 Added support for AlpineQuest AQM maps 2021-02-04 23:22:16 +01:00
5cec192a1c Removed BOM 2021-02-03 23:34:03 +01:00
f73097af86 Cosmetics 2021-02-03 23:15:52 +01:00
2f740d5b8e Code cleanup 2021-02-03 22:56:30 +01:00
b9c1c6c6cf Fixed block read algorithm 2021-02-03 22:49:06 +01:00
731f2d7e6d Added an optimized subfile block read 2021-02-03 22:16:00 +01:00
d2a1271348 Optimization 2021-02-01 20:06:05 +01:00
47b6c9d116 Code cleanup 2021-01-31 14:54:21 +01:00
97dbfb163b Scale the painter, not the images for performance reasons 2021-01-31 10:30:06 +01:00
33f2002a52 Do not cache the raster data 2021-01-27 21:18:06 +01:00
02c3682758 Added propper error handling 2021-01-25 23:01:36 +01:00
a9c2b30bd6 Merge branch 'origin/master' into Weblate. 2021-01-25 21:39:22 +01:00
b880998dcc Version++ 2021-01-25 21:39:22 +01:00
01d7842c00 Merge branch 'origin/master' into Weblate. 2021-01-25 21:37:56 +01:00
bf613f1b6d Added support for raster polygon backgrounds 2021-01-25 21:37:07 +01:00
43c4dae4d1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (382 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2021-01-23 20:45:19 +01:00
6ba7493b59 Version++ 2021-01-23 18:30:46 +01:00
2e10c609f4 Fixed crash on empty paths
Fixes #339
2021-01-23 18:24:58 +01:00
cd571f4662 Removed surplus conversions 2021-01-23 15:15:29 +01:00
51e38bf4d8 Fixed typos 2021-01-18 23:00:23 +01:00
3b480fbd23 Merge branch 'origin/master' into Weblate. 2021-01-18 22:48:44 +01:00
c523ddbfac Translated using Weblate (Hungarian)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2021-01-18 22:48:44 +01:00
3be4227de9 Translated using Weblate (Turkish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2021-01-18 22:48:44 +01:00
17dbcf3e10 Translated using Weblate (Swedish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2021-01-18 22:48:43 +01:00
57b2f431c1 Translated using Weblate (Russian)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2021-01-18 22:48:43 +01:00
52b081ea59 Translated using Weblate (French)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2021-01-18 22:48:43 +01:00
dc97061c8e Translated using Weblate (Finnish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2021-01-18 22:48:43 +01:00
b59e6d5d79 German translation 2021-01-18 22:48:14 +01:00
9386fa587c Rather do not hover on the secondary graphs 2021-01-18 00:36:52 +01:00
9a459dc365 Properly handle the marker when there are multiple tracks 2021-01-18 00:18:52 +01:00
2bbf75cb0b Localization update 2021-01-17 19:51:29 +01:00
f697c6b693 Removed unused include 2021-01-17 19:36:38 +01:00
6d8ccd2216 Unified path -> name conversion 2021-01-17 19:33:06 +01:00
3033bc680d Includes cleanup 2021-01-17 18:39:57 +01:00
c95e9abd65 Merge branch 'origin/master' into Weblate. 2021-01-17 16:03:30 +01:00
591560c0eb Improved graph slider and path marker handling
+ related refactoring
2021-01-17 16:02:37 +01:00
e473b5dc2d Merge branch 'origin/master' into Weblate. 2021-01-15 06:44:46 +01:00
7217f9acfc Cosmetics 2021-01-15 06:44:31 +01:00
8f39ce3be5 Translated using Weblate (Esperanto)
Currently translated at 96.1% (371 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/eo/
2021-01-14 13:32:18 +01:00
fba7a0b40f Translated using Weblate (French)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fr/
2021-01-14 13:32:17 +01:00
fb261a1513 Merge branch 'origin/master' into Weblate. 2021-01-11 23:42:04 +01:00
925ddffba5 Remove accidently added BOM 2021-01-11 23:41:44 +01:00
6891999139 Merge branch 'origin/master' into Weblate. 2021-01-11 23:39:17 +01:00
14a9c0a8cb A little bit more sane binary search 2021-01-11 23:38:46 +01:00
6103788008 Merge branch 'origin/master' into Weblate. 2021-01-11 00:31:26 +01:00
cb8c19a2bc Yet another retype for MSVC/qt6 2021-01-11 00:30:52 +01:00
dadf095cc1 Merge branch 'origin/master' into Weblate. 2021-01-10 16:17:41 +01:00
f4ee36a173 Silence Qt6 MSVC warning 2021-01-10 16:17:19 +01:00
7555c89f0c Merge branch 'origin/master' into Weblate. 2021-01-10 15:43:13 +01:00
ae1e357fb7 See if this silences MSVC2019... 2021-01-10 15:42:29 +01:00
05e8cccb3a Merge branch 'origin/master' into Weblate. 2021-01-10 15:21:22 +01:00
1468528a62 Try to silence some more MSVC warnings 2021-01-10 15:21:00 +01:00
30e6f624b6 Merge branch 'origin/master' into Weblate. 2021-01-10 15:03:49 +01:00
a568efadd2 Silence MSVC warning 2021-01-10 15:03:32 +01:00
aca258da05 Merge branch 'origin/master' into Weblate. 2021-01-10 13:24:18 +01:00
815071fc55 Use propper qHash return values on Qt6 2021-01-10 13:23:43 +01:00
35ff0f8d55 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.4% (382 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2021-01-10 08:32:09 +01:00
7a664342b6 Yet another Qt6 NSIS fix 2021-01-09 13:30:54 +01:00
34b5323fb6 Added support for NSIS QT6 build 2021-01-09 13:06:31 +01:00
0a5480ba2c Added AppVeyor Qt6 build 2021-01-09 11:43:59 +01:00
ef6dff42b7 Version++ 2021-01-09 11:29:29 +01:00
cec8946d86 Fixed windows icons background 2021-01-06 19:27:28 +01:00
1b842ab2f0 Fixed crash on invalid KMZ maps 2021-01-05 20:56:40 +01:00
0ac6b697bb Removed obsolete stuff 2021-01-02 22:37:56 +01:00
4cb369d2f3 Merge branch 'origin/master' into Weblate. 2021-01-01 12:52:00 +01:00
f7b44b64b0 Fixed broken graph info layout 2021-01-01 12:51:39 +01:00
895b2219c5 Merge branch 'origin/master' into Weblate. 2020-12-31 15:45:18 +01:00
0ec265e4ea Version++ 2020-12-31 15:45:03 +01:00
d9e5fc6a74 Merge branch 'origin/master' into Weblate. 2020-12-31 14:03:55 +01:00
c3f345c7f9 Added support for ZIPed DEM files 2020-12-31 14:03:30 +01:00
1f9bff6a9b Merge branch 'origin/master' into Weblate. 2020-12-30 09:26:41 +01:00
7e39a34d0e Fixed typo 2020-12-30 09:26:26 +01:00
a941a7315e Merge branch 'origin/master' into Weblate. 2020-12-29 18:36:59 +01:00
cf4f9b6f98 Fixed digital zoom on OS X 2020-12-29 18:36:23 +01:00
3d89d0d7da Merge branch 'origin/master' into Weblate. 2020-12-29 15:17:54 +01:00
9b3ed7ef1d Fixed Qt6 Release build 2020-12-29 15:17:31 +01:00
796107b1ab Merge branch 'origin/master' into Weblate. 2020-12-29 01:05:40 +01:00
a7e9c95ba2 Updated minimal required Qt version
Luckily for wretches using Debian systems, the minimal Qt version is 5.11, not 5.12
2020-12-29 01:05:36 +01:00
cd54d2d952 Merge branch 'origin/master' into Weblate. 2020-12-28 16:09:15 +01:00
bafbb825fc Fixed TimeZoneInfo QVariant loading/saving in QT6 2020-12-28 16:08:36 +01:00
031ed4907c Merge branch 'origin/master' into Weblate. 2020-12-28 14:45:51 +01:00
7cdbad3e79 Translated using Weblate (Hungarian)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2020-12-28 14:45:51 +01:00
b62ec2429a Translated using Weblate (Turkish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2020-12-28 14:45:50 +01:00
10032000b1 Translated using Weblate (Russian)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2020-12-28 14:45:50 +01:00
fd19d9c5a4 Translated using Weblate (Finnish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2020-12-28 14:45:50 +01:00
60bb42d708 Translated missing strings 2020-12-28 14:45:25 +01:00
6201ba1c67 Cosmetics 2020-12-28 14:42:16 +01:00
85d6357cb9 Added missing HiDPI mode support 2020-12-28 14:05:51 +01:00
26cbbee135 Added KMZ mimetype 2020-12-28 11:19:44 +01:00
e200d1597d Consistently use HTTPS 2020-12-28 11:13:40 +01:00
cd46a9cb0a Fixed screenshots links 2020-12-28 11:11:00 +01:00
1ba1ae498c Added Esperanto localization 2020-12-27 19:39:41 +01:00
31429b6344 Translated using Weblate (Swedish)
Currently translated at 100.0% (388 of 388 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2020-12-27 06:32:19 +01:00
5719cb5a35 Merge branch 'origin/master' into Weblate. 2020-12-27 02:49:08 +01:00
73aab44848 Localization update 2020-12-27 02:48:47 +01:00
e2360f8fb2 Merge branch 'origin/master' into Weblate. 2020-12-27 00:16:20 +01:00
08fc8ff6c4 Fixed cut&paste error 2020-12-27 00:15:41 +01:00
78d6ae6838 Merge branch 'origin/master' into Weblate. 2020-12-27 00:14:49 +01:00
0ae55e1511 Improved projection settings layout 2020-12-27 00:14:28 +01:00
e0be482d65 Merge branch 'origin/master' into Weblate. 2020-12-27 00:01:23 +01:00
4f22c50510 Properly handle return values 2020-12-27 00:00:59 +01:00
3bc5adec73 Merge branch 'origin/master' into Weblate. 2020-12-26 19:57:42 +01:00
a17110782a Added KMZ maps info 2020-12-26 19:57:25 +01:00
1d5f5ccffd Merge branch 'origin/master' into Weblate. 2020-12-26 19:54:21 +01:00
e1e3800f72 Use the same icons for KML and KMZ
(soon we are out of colors anyway...)
2020-12-26 19:53:23 +01:00
a1a67fd03f Merge branch 'origin/master' into Weblate. 2020-12-26 14:46:20 +01:00
b12eef7366 Use a better data descriptions 2020-12-26 14:45:38 +01:00
a3071eb022 Merge branch 'origin/master' into Weblate. 2020-12-26 14:30:35 +01:00
821790fa91 Code cleanup 2020-12-26 14:30:18 +01:00
4d0cf66925 Merge branch 'origin/master' into Weblate. 2020-12-26 00:41:13 +01:00
598d21077e Translated using Weblate (Esperanto)
Currently translated at 95.0% (367 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/eo/
2020-12-26 00:41:13 +01:00
763d634934 Translated using Weblate (Swedish)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2020-12-26 00:41:11 +01:00
336f3741d8 Cosmetics 2020-12-26 00:40:57 +01:00
b6357cfab6 Merge branch 'origin/master' into Weblate. 2020-12-25 19:50:49 +01:00
248695ac04 Added KMZ maps info 2020-12-25 19:50:46 +01:00
ab4944b296 Merge branch 'origin/master' into Weblate. 2020-12-25 19:48:10 +01:00
d116508d73 Added Windows and Linux KMZ desktop integration 2020-12-25 19:47:37 +01:00
efec3ce4f4 Merge branch 'origin/master' into Weblate. 2020-12-25 18:42:28 +01:00
23c7d8e585 Translated using Weblate (Ukrainian)
Currently translated at 97.9% (378 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2020-12-25 18:42:28 +01:00
ec86692ea9 Translated using Weblate (Russian)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2020-12-25 18:42:28 +01:00
3237146b78 Translated using Weblate (Finnish)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2020-12-25 18:42:28 +01:00
fbf81e8861 Added Esperanto localization stub 2020-12-25 18:42:12 +01:00
5bf9ee7bec Translated using Weblate (Czech)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/cs/
2020-12-25 16:17:22 +01:00
652d6cf97c Removed obsolete/duplicit entries 2020-12-25 16:05:51 +01:00
a36068c207 Merge remote-tracking branch 'weblate/master' 2020-12-25 16:00:01 +01:00
8e5fcfa0b2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.9% (382 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2020-12-25 15:12:09 +01:00
f1375fb7f8 Translated using Weblate (Finnish)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2020-12-25 15:12:09 +01:00
c98315a7b7 Updated localizations with fixed typo 2020-12-25 15:11:51 +01:00
b90dfc963f Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.6% (377 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/nb_NO/
2020-12-25 11:08:06 +01:00
a7bbfb0995 Merge branch 'origin/master' into Weblate. 2020-12-25 09:13:20 +01:00
eca7ca44ee Translated using Weblate (Ukrainian)
Currently translated at 97.4% (376 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2020-12-25 09:13:20 +01:00
56a68689b4 Translated using Weblate (Russian)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2020-12-25 09:13:20 +01:00
16e7de8a0d Translated using Weblate (Finnish)
Currently translated at 98.9% (382 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2020-12-25 09:13:20 +01:00
977ba58570 Fixed typo 2020-12-25 09:13:11 +01:00
0d8e46cad0 Translated using Weblate (Turkish)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2020-12-24 21:28:56 +01:00
14cf94d393 Translated using Weblate (Hungarian)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2020-12-24 21:28:55 +01:00
88763ba1ca Translated using Weblate (Swedish)
Currently translated at 100.0% (386 of 386 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2020-12-24 21:20:47 +01:00
d74693327d Localization update 2020-12-24 16:34:32 +01:00
dde8e9a22c Make the source projection of JNX and KMZ maps selectable 2020-12-24 16:33:17 +01:00
50d4ca1690 Added missing devel package 2020-12-24 00:06:29 +01:00
07894f3a55 Various KMZ map fixes 2020-12-23 23:05:12 +01:00
86dd6ed772 Fixed typos 2020-12-22 22:50:46 +01:00
d01a5a7e42 Added support for KMZ maps 2020-12-22 22:32:07 +01:00
97bea8c56c Added support for Qt6
Removed support for Qt4 and Qt5 < 5.12
2020-12-22 22:09:09 +01:00
b5972c8328 Added BSB charts support info 2020-12-16 00:25:31 +01:00
4fd0ca0b11 Added polyconic projection license info 2020-12-16 00:15:57 +01:00
178 changed files with 10537 additions and 6166 deletions

View File

@ -1,32 +1,39 @@
version: 7.38.{build} version: 8.5.{build}
configuration: configuration:
- Release - Release
image: image:
- Visual Studio 2017 - Visual Studio 2019
environment: environment:
NSISDIR: C:\Program Files (x86)\NSIS NSISDIR: C:\Program Files (x86)\NSIS
matrix: matrix:
- QTDIR: C:\Qt\5.13\msvc2017 - QTDIR: C:\Qt\5.15\msvc2019
NSI: gpxsee.nsi NSI: gpxsee.nsi
VCVARS: vcvars32.bat VCVARS: vcvars32.bat
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
LIBCRYPTO: libssl-1_1.dll LIBCRYPTO: libssl-1_1.dll
LIBSSL: libcrypto-1_1.dll LIBSSL: libcrypto-1_1.dll
- QTDIR: C:\Qt\5.13\msvc2017_64 - QTDIR: C:\Qt\5.15\msvc2019_64
NSI: gpxsee64.nsi NSI: gpxsee64.nsi
VCVARS: vcvars64.bat VCVARS: vcvars64.bat
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
LIBCRYPTO: libssl-1_1-x64.dll LIBCRYPTO: libssl-1_1-x64.dll
LIBSSL: libcrypto-1_1-x64.dll LIBSSL: libcrypto-1_1-x64.dll
- QTDIR: C:\Qt\6.0\msvc2019_64
NSI: gpxsee64.nsi
VCVARS: vcvars64.bat
OPENSSLDIR: C:\OpenSSL-v111-Win64\bin
LIBCRYPTO: libssl-1_1-x64.dll
LIBSSL: libcrypto-1_1-x64.dll
NSISDEF: /DQT6
install: install:
- cmd: >- - cmd: >-
set PATH=%QTDIR%\bin;%NSISDIR%;%PATH% set PATH=%QTDIR%\bin;%NSISDIR%;%PATH%
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\"%VCVARS% call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\"%VCVARS%
build_script: build_script:
- cmd: >- - cmd: >-
@ -60,6 +67,6 @@ build_script:
copy %OPENSSLDIR%\%LIBSSL% installer copy %OPENSSLDIR%\%LIBSSL% installer
makensis.exe installer\%NSI% makensis.exe %NSISDEF% installer\%NSI%
artifacts: artifacts:
- path: installer\GPXSee-*.exe - path: installer\GPXSee-*.exe

View File

@ -4,13 +4,15 @@ os:
- linux - linux
- osx - osx
dist: focal
before_install: before_install:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
install: install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev libqt4-opengl-dev; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install qtbase5-dev qtbase5-private-dev libqt5opengl5-dev qttools5-dev-tools; fi
script: script:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/qt/bin/:${PATH}; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then PATH=/usr/local/opt/qt/bin/:${PATH}; fi

View File

@ -4,7 +4,7 @@ GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common G
## Features ## Features
* Opens GPX, TCX, FIT, KML, NMEA, IGC, CUP, SIGMA SLF, Suunto SML, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin GPI&CSV and geotagged JPEG files. * Opens GPX, TCX, FIT, KML, NMEA, IGC, CUP, SIGMA SLF, Suunto SML, LOC, GeoJSON, OziExplorer (PLT, RTE, WPT), Garmin GPI&CSV and geotagged JPEG files.
* User-definable online maps (OpenStreetMap/Google tiles, WMTS, WMS, TMS, QuadTiles). * User-definable online maps (OpenStreetMap/Google tiles, WMTS, WMS, TMS, QuadTiles).
* Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images). * Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, Garmin IMG/GMAP & JNX maps, TwoNav RMaps, GeoTIFF images, BSB charts, KMZ maps, AlpineQuest maps).
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs. * Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.
* Support for DEM files (SRTM HGT). * Support for DEM files (SRTM HGT).
* Support for multiple tracks in one view. * Support for multiple tracks in one view.
@ -18,8 +18,8 @@ GPXSee is a Qt-based GPS log file viewer and analyzer that supports all common G
## Build ## Build
Build requirements: Build requirements:
* Qt 4.8 or QT 5.x (Qt >= 5.10.1 recommended for all features) * Qt5 >= 5.11 or Qt 6.x
* C++03 or newer compiler (tested: msvc2015, gcc >= 4.8, clang/Apple LLVM version 8.1.0) * C++11 or newer compiler (tested: msvc2017, gcc 7.5.0, clang/Apple LLVM version 10.0.0)
Build steps: Build steps:
```shell ```shell
@ -51,6 +51,7 @@ licenses:
* [Mapbox Maki icons](icons/POI) - CC0 * [Mapbox Maki icons](icons/POI) - CC0
* [RTree implementation](src/common/rtree.h) - Public domain * [RTree implementation](src/common/rtree.h) - Public domain
* [Albers](src/map/albersequal.cpp), [Geocentric](src/map/geocentric.cpp), [LCC](src/map/lambertconic.cpp), * [Albers](src/map/albersequal.cpp), [Geocentric](src/map/geocentric.cpp), [LCC](src/map/lambertconic.cpp),
[Mercator](src/map/mercator.cpp), [Polar Stereographic](src/map/polarstereographic.cpp) [Mercator](src/map/mercator.cpp), [Polar Stereographic](src/map/polarstereographic.cpp),
and [Transverse Mercator](src/map/transversemercator.cpp) projections - NIMA Source Code Disclaimer [Polyconic](src/map/polyconic.cpp) and [Transverse Mercator](src/map/transversemercator.cpp)
projections - NIMA Source Code Disclaimer
* [Projection parameters CSV files](pkg/csv) - BSD/EPSG/Public domain * [Projection parameters CSV files](pkg/csv) - BSD/EPSG/Public domain

View File

@ -3,19 +3,17 @@ unix:!macx {
} else { } else {
TARGET = GPXSee TARGET = GPXSee
} }
VERSION = 7.38 VERSION = 8.5
QT += core \ QT += core \
gui \ gui \
gui-private \
network \ network \
sql \ sql \
concurrent concurrent \
greaterThan(QT_MAJOR_VERSION, 4) { widgets \
QT += widgets printsupport
QT += printsupport greaterThan(QT_MAJOR_VERSION, 5) {QT += openglwidgets}
}
lessThan(QT_MAJOR_VERSION, 5) {QT += opengl}
equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 4) {QT += opengl}
INCLUDEPATH += ./src INCLUDEPATH += ./src
HEADERS += src/common/config.h \ HEADERS += src/common/config.h \
@ -24,13 +22,14 @@ HEADERS += src/common/config.h \
src/GUI/mapaction.h \ src/GUI/mapaction.h \
src/GUI/mapitem.h \ src/GUI/mapitem.h \
src/GUI/marginswidget.h \ src/GUI/marginswidget.h \
src/GUI/markerinfoitem.h \
src/GUI/planeitem.h \ src/GUI/planeitem.h \
src/GUI/popup.h \ src/GUI/popup.h \
src/common/garmin.h \ src/common/garmin.h \
src/common/staticassert.h \
src/common/coordinates.h \ src/common/coordinates.h \
src/common/range.h \ src/common/range.h \
src/common/rectc.h \ src/common/rectc.h \
src/common/textcodec.h \
src/common/wgs84.h \ src/common/wgs84.h \
src/common/util.h \ src/common/util.h \
src/common/rtree.h \ src/common/rtree.h \
@ -58,7 +57,6 @@ HEADERS += src/common/config.h \
src/GUI/heartrategraph.h \ src/GUI/heartrategraph.h \
src/GUI/trackinfo.h \ src/GUI/trackinfo.h \
src/GUI/fileselectwidget.h \ src/GUI/fileselectwidget.h \
src/GUI/margins.h \
src/GUI/temperaturegraph.h \ src/GUI/temperaturegraph.h \
src/GUI/graphtab.h \ src/GUI/graphtab.h \
src/GUI/trackitem.h \ src/GUI/trackitem.h \
@ -74,7 +72,6 @@ HEADERS += src/common/config.h \
src/GUI/optionsdialog.h \ src/GUI/optionsdialog.h \
src/GUI/colorbox.h \ src/GUI/colorbox.h \
src/GUI/stylecombobox.h \ src/GUI/stylecombobox.h \
src/GUI/opengl.h \
src/GUI/timetype.h \ src/GUI/timetype.h \
src/GUI/percentslider.h \ src/GUI/percentslider.h \
src/GUI/elevationgraphitem.h \ src/GUI/elevationgraphitem.h \
@ -86,7 +83,6 @@ HEADERS += src/common/config.h \
src/GUI/gearratiographitem.h \ src/GUI/gearratiographitem.h \
src/GUI/oddspinbox.h \ src/GUI/oddspinbox.h \
src/GUI/settings.h \ src/GUI/settings.h \
src/GUI/cpuarch.h \
src/GUI/searchpointer.h \ src/GUI/searchpointer.h \
src/GUI/mapview.h \ src/GUI/mapview.h \
src/GUI/font.h \ src/GUI/font.h \
@ -102,11 +98,13 @@ HEADERS += src/common/config.h \
src/map/IMG/huffmantext.h \ src/map/IMG/huffmantext.h \
src/map/IMG/nodfile.h \ src/map/IMG/nodfile.h \
src/map/IMG/mapdata.h \ src/map/IMG/mapdata.h \
src/map/IMG/raster.h \
src/map/IMG/rastertile.h \ src/map/IMG/rastertile.h \
src/map/IMG/textpathitem.h \ src/map/IMG/textpathitem.h \
src/map/IMG/textpointitem.h \ src/map/IMG/textpointitem.h \
src/map/bsbmap.h \ src/map/bsbmap.h \
src/map/invalidmap.h \ src/map/invalidmap.h \
src/map/kmzmap.h \
src/map/polyconic.h \ src/map/polyconic.h \
src/map/projection.h \ src/map/projection.h \
src/map/ellipsoid.h \ src/map/ellipsoid.h \
@ -208,15 +206,21 @@ HEADERS += src/common/config.h \
src/data/address.h \ src/data/address.h \
src/data/smlparser.h \ src/data/smlparser.h \
src/GUI/pdfexportdialog.h \ src/GUI/pdfexportdialog.h \
src/GUI/pngexportdialog.h src/GUI/pngexportdialog.h \
src/data/geojsonparser.h \
src/GUI/timezoneinfo.h \
src/map/aqmmap.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/GUI/axislabelitem.cpp \ src/GUI/axislabelitem.cpp \
src/GUI/mapitem.cpp \ src/GUI/mapitem.cpp \
src/GUI/marginswidget.cpp \ src/GUI/marginswidget.cpp \
src/GUI/markerinfoitem.cpp \
src/GUI/popup.cpp \ src/GUI/popup.cpp \
src/common/coordinates.cpp \ src/common/coordinates.cpp \
src/common/rectc.cpp \ src/common/rectc.cpp \
src/common/range.cpp \ src/common/range.cpp \
src/common/textcodec.cpp \
src/common/util.cpp \ src/common/util.cpp \
src/common/greatcircle.cpp \ src/common/greatcircle.cpp \
src/common/programpaths.cpp \ src/common/programpaths.cpp \
@ -278,6 +282,7 @@ SOURCES += src/main.cpp \
src/map/IMG/textpathitem.cpp \ src/map/IMG/textpathitem.cpp \
src/map/IMG/textpointitem.cpp \ src/map/IMG/textpointitem.cpp \
src/map/bsbmap.cpp \ src/map/bsbmap.cpp \
src/map/kmzmap.cpp \
src/map/maplist.cpp \ src/map/maplist.cpp \
src/map/onlinemap.cpp \ src/map/onlinemap.cpp \
src/map/downloader.cpp \ src/map/downloader.cpp \
@ -362,19 +367,12 @@ SOURCES += src/main.cpp \
src/data/gpiparser.cpp \ src/data/gpiparser.cpp \
src/data/smlparser.cpp \ src/data/smlparser.cpp \
src/GUI/pdfexportdialog.cpp \ src/GUI/pdfexportdialog.cpp \
src/GUI/pngexportdialog.cpp src/GUI/pngexportdialog.cpp \
src/data/geojsonparser.cpp \
greaterThan(QT_MAJOR_VERSION, 4) { src/map/aqmmap.cpp
HEADERS += src/data/geojsonparser.h
SOURCES += src/data/geojsonparser.cpp
}
equals(QT_MAJOR_VERSION, 5):greaterThan(QT_MINOR_VERSION, 4) {
HEADERS += src/GUI/timezoneinfo.h
}
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \ DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
QT_NO_DEPRECATED_WARNINGS QT_NO_DEPRECATED_WARNINGS
DEFINES *= QT_USE_QSTRINGBUILDER
RESOURCES += gpxsee.qrc RESOURCES += gpxsee.qrc
TRANSLATIONS = lang/gpxsee_en.ts \ TRANSLATIONS = lang/gpxsee_en.ts \
@ -392,7 +390,8 @@ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_pt_BR.ts \ lang/gpxsee_pt_BR.ts \
lang/gpxsee_uk.ts \ lang/gpxsee_uk.ts \
lang/gpxsee_hu.ts \ lang/gpxsee_hu.ts \
lang/gpxsee_it.ts lang/gpxsee_it.ts \
lang/gpxsee_eo.ts
macx { macx {
ICON = icons/app/gpxsee.icns ICON = icons/app/gpxsee.icns
@ -413,7 +412,8 @@ macx {
lang/gpxsee_pt_BR.qm \ lang/gpxsee_pt_BR.qm \
lang/gpxsee_uk.qm \ lang/gpxsee_uk.qm \
lang/gpxsee_hu.qm \ lang/gpxsee_hu.qm \
lang/gpxsee_it.qm lang/gpxsee_it.qm \
lang/gpxsee_eo.qm
csv.path = Contents/Resources csv.path = Contents/Resources
csv.files = pkg/csv csv.files = pkg/csv
maps.path = Contents/Resources maps.path = Contents/Resources
@ -439,7 +439,8 @@ macx {
icons/formats/kap.icns \ icons/formats/kap.icns \
icons/formats/mbts.icns \ icons/formats/mbts.icns \
icons/formats/rmap.icns \ icons/formats/rmap.icns \
icons/formats/tba.icns icons/formats/tba.icns \
icons/formats/aqm.icns
QMAKE_BUNDLE_DATA += locale maps icons csv QMAKE_BUNDLE_DATA += locale maps icons csv
} }
@ -466,14 +467,14 @@ win32 {
icons/formats/map.ico \ icons/formats/map.ico \
icons/formats/mbts.ico \ icons/formats/mbts.ico \
icons/formats/rmap.ico \ icons/formats/rmap.ico \
icons/formats/tba.ico icons/formats/tba.ico \
icons/formats/aqm.ico
DEFINES += _USE_MATH_DEFINES \ DEFINES += _USE_MATH_DEFINES \
NOGDI NOGDI
} }
unix:!macx { unix:!macx {
isEmpty(PREFIX):PREFIX = /usr/local isEmpty(PREFIX):PREFIX = /usr/local
DEFINES += PREFIX=\\\"$$PREFIX\\\"
maps.files = pkg/maps/* maps.files = pkg/maps/*
maps.path = $$PREFIX/share/gpxsee/maps maps.path = $$PREFIX/share/gpxsee/maps

BIN
icons/formats/aqm.icns Normal file

Binary file not shown.

BIN
icons/formats/aqm.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 KiB

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 303 KiB

View File

@ -20,3 +20,4 @@ map:#f6ff00
mbts:#ff0062 mbts:#ff0062
rmap:#145cba rmap:#145cba
tba:#367050 tba:#367050
aqm:#32a89e

View File

@ -5,6 +5,6 @@ while read e; do
EXT=`echo $1 | tr /a-z/ /A-Z/` EXT=`echo $1 | tr /a-z/ /A-Z/`
sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg sed -e "s/\$EXTENSION/$EXT/" -e "s/\$COLOR/$2/" icon-template.svg > $1.svg
convert -density 400 $1.svg -define icon:auto-resize $1.ico convert -density 400 -background none $1.svg -define icon:auto-resize $1.ico
rm $1.svg rm $1.svg
done < extensions done < extensions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 304 KiB

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

2103
lang/gpxsee_eo.ts Normal file

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

File diff suppressed because it is too large Load Diff

View File

@ -67,6 +67,22 @@
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Viewer</string> <string>Viewer</string>
</dict> </dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>kmz</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.google-earth.kmz</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/kml.icns</string>
<key>CFBundleTypeName</key>
<string>KML geographic compressed data</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict> <dict>
<key>CFBundleTypeExtensions</key> <key>CFBundleTypeExtensions</key>
<array> <array>
@ -446,6 +462,22 @@
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Viewer</string> <string>Viewer</string>
</dict> </dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>aqm</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.alpinequest.aqm</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/aqm.icns</string>
<key>CFBundleTypeName</key>
<string>AlpineQuest Map File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array> </array>
<key>UTImportedTypeDeclarations</key> <key>UTImportedTypeDeclarations</key>
@ -513,6 +545,27 @@
<string>application/vnd.google-earth.kml+xml</string> <string>application/vnd.google-earth.kml+xml</string>
</dict> </dict>
</dict> </dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.google.kmz</string>
<key>UTTypeReferenceURL</key>
<string>https://developers.google.com/kml/documentation/kmlreference</string>
<key>UTTypeDescription</key>
<string>KML geographic compressed data</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.archive</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>kmz</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.google-earth.kmz</string>
</dict>
</dict>
<dict> <dict>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>com.geocaching.loc</string> <string>com.geocaching.loc</string>
@ -979,6 +1032,27 @@
<string>application/vnd.trekbuddy.tba</string> <string>application/vnd.trekbuddy.tba</string>
</dict> </dict>
</dict> </dict>
<dict>
<key>UTTypeIdentifier</key>
<string>net.alpinequest.aqm</string>
<key>UTTypeReferenceURL</key>
<string>https://svn.code.sf.net/p/mobac/code/trunk/MOBAC</string>
<key>UTTypeDescription</key>
<string>AlpineQuest Map File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>aqm</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.alpinequest.aqm</string>
</dict>
</dict>
<dict> <dict>
<key>UTTypeIdentifier</key> <key>UTTypeIdentifier</key>
<string>public.tiff</string> <string>public.tiff</string>

View File

@ -19,7 +19,7 @@
WMS, TMS, QuadTiles).</li> WMS, TMS, QuadTiles).</li>
<li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases, <li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
TwoNav RMaps, Garmin IMG &amp; JNX maps, GeoTIFF images, TwoNav RMaps, Garmin IMG &amp; JNX maps, GeoTIFF images,
BSB nautical charts).</li> BSB nautical charts, KMZ maps, AlpineQuest maps).</li>
<li>Elevation, speed, heart rate, cadence, power, temperature and <li>Elevation, speed, heart rate, cadence, power, temperature and
gear ratio graphs.</li> gear ratio graphs.</li>
<li>Support for multiple tracks in one view.</li> <li>Support for multiple tracks in one view.</li>
@ -33,10 +33,10 @@
<screenshots> <screenshots>
<screenshot type="default"> <screenshot type="default">
<image>http://www.gpxsee.org/gallery/lin1.png</image> <image>https://www.gpxsee.org/gallery/linux.png</image>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>http://www.gpxsee.org/gallery/lin2.png</image> <image>https://www.gpxsee.org/gallery/poi2.png</image>
</screenshot> </screenshot>
</screenshots> </screenshots>
@ -49,7 +49,7 @@
<category>DataVisualization</category> <category>DataVisualization</category>
</categories> </categories>
<url type="homepage">http://www.gpxsee.org</url> <url type="homepage">https://www.gpxsee.org</url>
<launchable type="desktop-id">gpxsee.desktop</launchable> <launchable type="desktop-id">gpxsee.desktop</launchable>
@ -86,5 +86,7 @@
<mimetype>application/vnd.gpxsee.map+xml</mimetype> <mimetype>application/vnd.gpxsee.map+xml</mimetype>
<mimetype>application/x-tar</mimetype> <mimetype>application/x-tar</mimetype>
<mimetype>image/tiff</mimetype> <mimetype>image/tiff</mimetype>
<mimetype>application/vnd.google-earth.kmz</mimetype>
<mimetype>application/vnd.alpinequest.aqm</mimetype>
</mimetypes> </mimetypes>
</component> </component>

View File

@ -15,4 +15,4 @@ Icon=gpxsee
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt; Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt;
MimeType=application/gpx+xml;application/vnd.garmin.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/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff; MimeType=application/gpx+xml;application/vnd.garmin.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/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm

View File

@ -1,13 +1,15 @@
!include "MUI2.nsh" !include "MUI2.nsh"
!include "x64.nsh" !include "x64.nsh"
!include "WinVer.nsh" !include "WinVer.nsh"
!include "macros.nsh" !include "macros.nsh"
Unicode true
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "7.38" !define VERSION "8.5"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}.exe" OutFile "GPXSee-${VERSION}.exe"
@ -101,7 +103,7 @@ Section "GPXSee" SEC_APP
; Write the uninstall keys for Windows ; Write the uninstall keys for Windows
WriteRegStr HKLM "${REGENTRY}" "DisplayName" "GPXSee" WriteRegStr HKLM "${REGENTRY}" "DisplayName" "GPXSee"
WriteRegStr HKLM "${REGENTRY}" "Publisher" "Martin Tuma" WriteRegStr HKLM "${REGENTRY}" "Publisher" "Martin Tůma"
WriteRegStr HKLM "${REGENTRY}" "DisplayVersion" "${VERSION}" WriteRegStr HKLM "${REGENTRY}" "DisplayVersion" "${VERSION}"
WriteRegStr HKLM "${REGENTRY}" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "${REGENTRY}" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegDWORD HKLM "${REGENTRY}" "NoModify" 1 WriteRegDWORD HKLM "${REGENTRY}" "NoModify" 1
@ -109,14 +111,6 @@ Section "GPXSee" SEC_APP
; Associate file formats ; Associate file formats
DetailPrint "Associating file types..." DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 18
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 19
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 20
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 21
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 22
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1 !insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2 !insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3 !insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
@ -127,10 +121,20 @@ Section "GPXSee" SEC_APP
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8 !insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9 !insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
!insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10 !insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
!insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12 !insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12
!insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13 !insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14 !insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15 !insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
!insertmacro FILE_ASSOCIATION_ADD "aqm" "AlpineQuest Map File" 16
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 17
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 18
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 18
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 19
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 20
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 21
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track File" 22
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 23
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
@ -163,7 +167,9 @@ Section "GPXSee" SEC_APP
WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".aqm\OpenWithList" "GPXSee.exe" ""
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
@ -217,6 +223,7 @@ SectionEnd
SectionGroup "Localization" SEC_LOCALIZATION SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Czech" "cs" !insertmacro LOCALIZATION "Czech" "cs"
!insertmacro LOCALIZATION "Danish" "da" !insertmacro LOCALIZATION "Danish" "da"
!insertmacro LOCALIZATION "Esperanto" "eo"
!insertmacro LOCALIZATION "Finnish" "fi" !insertmacro LOCALIZATION "Finnish" "fi"
!insertmacro LOCALIZATION "French" "fr" !insertmacro LOCALIZATION "French" "fr"
!insertmacro LOCALIZATION "German" "de" !insertmacro LOCALIZATION "German" "de"
@ -274,6 +281,8 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles" !insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
!insertmacro FILE_ASSOCIATION_REMOVE "rmap" !insertmacro FILE_ASSOCIATION_REMOVE "rmap"
!insertmacro FILE_ASSOCIATION_REMOVE "tba" !insertmacro FILE_ASSOCIATION_REMOVE "tba"
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
!insertmacro FILE_ASSOCIATION_REMOVE "aqm"
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
@ -306,6 +315,8 @@ Section "Uninstall"
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".aqm\OpenWithList" "GPXSee.exe"
DeleteRegKey HKCR "Applications\GPXSee.exe" DeleteRegKey HKCR "Applications\GPXSee.exe"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
@ -338,4 +349,4 @@ LangString DESC_LOCALIZATION ${LANG_ENGLISH} \
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_MSVC} $(DESC_MSVC) !insertmacro MUI_DESCRIPTION_TEXT ${SEC_MSVC} $(DESC_MSVC)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_APP} $(DESC_APP) !insertmacro MUI_DESCRIPTION_TEXT ${SEC_APP} $(DESC_APP)
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_LOCALIZATION} $(DESC_LOCALIZATION) !insertmacro MUI_DESCRIPTION_TEXT ${SEC_LOCALIZATION} $(DESC_LOCALIZATION)
!insertmacro MUI_FUNCTION_DESCRIPTION_END !insertmacro MUI_FUNCTION_DESCRIPTION_END

View File

@ -213,4 +213,21 @@
<glob pattern="*.xml"/> <glob pattern="*.xml"/>
</mime-type> </mime-type>
<mime-type type="application/vnd.google-earth.kmz">
<comment>KML geographic compressed data</comment>
<sub-class-of type="application/zip"/>
<generic-icon name="application/zip"/>
<glob pattern="*.kmz"/>
</mime-type>
<mime-type type="application/vnd.alpinequest.aqm">
<comment>AlpineQuest Map File</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application/octet-stream"/>
<magic>
<match type="string" offset="0" value="FLATPACK1"/>
</magic>
<glob pattern="*.aqm"/>
</mime-type>
</mime-info> </mime-info>

View File

@ -1,13 +1,15 @@
!include "MUI2.nsh" !include "MUI2.nsh"
!include "x64.nsh" !include "x64.nsh"
!include "WinVer.nsh" !include "WinVer.nsh"
!include "macros.nsh" !include "macros.nsh"
Unicode true
; The name of the installer ; The name of the installer
Name "GPXSee" Name "GPXSee"
; Program version ; Program version
!define VERSION "7.38" !define VERSION "8.5"
; The file to write ; The file to write
OutFile "GPXSee-${VERSION}_x64.exe" OutFile "GPXSee-${VERSION}_x64.exe"
@ -108,7 +110,7 @@ Section "GPXSee" SEC_APP
; Write the uninstall keys for Windows ; Write the uninstall keys for Windows
WriteRegStr HKLM "${REGENTRY}" "DisplayName" "GPXSee (x64)" WriteRegStr HKLM "${REGENTRY}" "DisplayName" "GPXSee (x64)"
WriteRegStr HKLM "${REGENTRY}" "Publisher" "Martin Tuma" WriteRegStr HKLM "${REGENTRY}" "Publisher" "Martin Tůma"
WriteRegStr HKLM "${REGENTRY}" "DisplayVersion" "${VERSION}" WriteRegStr HKLM "${REGENTRY}" "DisplayVersion" "${VERSION}"
WriteRegStr HKLM "${REGENTRY}" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "${REGENTRY}" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegDWORD HKLM "${REGENTRY}" "NoModify" 1 WriteRegDWORD HKLM "${REGENTRY}" "NoModify" 1
@ -116,14 +118,6 @@ Section "GPXSee" SEC_APP
; Associate file formats ; Associate file formats
DetailPrint "Associating file types..." DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 18
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 19
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 20
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 21
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 22
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1 !insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2 !insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3 !insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
@ -134,10 +128,20 @@ Section "GPXSee" SEC_APP
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8 !insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9 !insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
!insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10 !insertmacro FILE_ASSOCIATION_ADD "kap" "BSB Nautical Chart" 10
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 11
!insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12 !insertmacro FILE_ASSOCIATION_ADD "map" "OziExplorer Map File" 12
!insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13 !insertmacro FILE_ASSOCIATION_ADD "mbtiles" "MBTiles Map File" 13
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14 !insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15 !insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
!insertmacro FILE_ASSOCIATION_ADD "aqm" "AlpineQuest Map File" 16
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 17
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 18
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 18
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 19
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 20
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 21
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track File" 22
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 23
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\"" WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
@ -171,6 +175,8 @@ Section "GPXSee" SEC_APP
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" "" WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".aqm\OpenWithList" "GPXSee.exe" ""
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
@ -180,6 +186,17 @@ Section "QT framework" SEC_QT
SectionIn RO SectionIn RO
!ifdef QT6
File "Qt6Concurrent.dll"
File "Qt6Core.dll"
File "Qt6Gui.dll"
File "Qt6Network.dll"
File "Qt6OpenGL.dll"
File "Qt6OpenGLWidgets.dll"
File "Qt6PrintSupport.dll"
File "Qt6Sql.dll"
File "Qt6Widgets.dll"
!else
File "Qt5Core.dll" File "Qt5Core.dll"
File "Qt5Gui.dll" File "Qt5Gui.dll"
File "Qt5Widgets.dll" File "Qt5Widgets.dll"
@ -187,9 +204,10 @@ Section "QT framework" SEC_QT
File "Qt5Network.dll" File "Qt5Network.dll"
File "Qt5Sql.dll" File "Qt5Sql.dll"
File "Qt5Concurrent.dll" File "Qt5Concurrent.dll"
File /r "printsupport"
!endif
File /r "platforms" File /r "platforms"
File /r "imageformats" File /r "imageformats"
File /r "printsupport"
File /r "styles" File /r "styles"
File /r "sqldrivers" File /r "sqldrivers"
@ -213,6 +231,7 @@ Section "OpenSSL" SEC_OPENSSL
SectionEnd SectionEnd
!ifndef QT6
Section "ANGLE" SEC_ANGLE Section "ANGLE" SEC_ANGLE
File "libGLESv2.dll" File "libGLESv2.dll"
@ -220,10 +239,12 @@ Section "ANGLE" SEC_ANGLE
File "D3DCompiler_47.dll" File "D3DCompiler_47.dll"
SectionEnd SectionEnd
!endif
SectionGroup "Localization" SEC_LOCALIZATION SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Czech" "cs" !insertmacro LOCALIZATION "Czech" "cs"
!insertmacro LOCALIZATION "Danish" "da" !insertmacro LOCALIZATION "Danish" "da"
!insertmacro LOCALIZATION "Esperanto" "eo"
!insertmacro LOCALIZATION "Finnish" "fi" !insertmacro LOCALIZATION "Finnish" "fi"
!insertmacro LOCALIZATION "French" "fr" !insertmacro LOCALIZATION "French" "fr"
!insertmacro LOCALIZATION "German" "de" !insertmacro LOCALIZATION "German" "de"
@ -282,6 +303,8 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles" !insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
!insertmacro FILE_ASSOCIATION_REMOVE "rmap" !insertmacro FILE_ASSOCIATION_REMOVE "rmap"
!insertmacro FILE_ASSOCIATION_REMOVE "tba" !insertmacro FILE_ASSOCIATION_REMOVE "tba"
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
!insertmacro FILE_ASSOCIATION_REMOVE "aqm"
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
@ -314,6 +337,8 @@ Section "Uninstall"
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe" DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".aqm\OpenWithList" "GPXSee.exe"
DeleteRegKey HKCR "Applications\GPXSee.exe" DeleteRegKey HKCR "Applications\GPXSee.exe"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'

View File

@ -6,6 +6,7 @@
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QLibraryInfo> #include <QLibraryInfo>
#include <QSettings> #include <QSettings>
#include <QSurfaceFormat>
#include "common/programpaths.h" #include "common/programpaths.h"
#include "common/config.h" #include "common/config.h"
#include "map/downloader.h" #include "map/downloader.h"
@ -13,7 +14,6 @@
#include "map/gcs.h" #include "map/gcs.h"
#include "map/pcs.h" #include "map/pcs.h"
#include "data/dem.h" #include "data/dem.h"
#include "opengl.h"
#include "gui.h" #include "gui.h"
#include "settings.h" #include "settings.h"
#include "mapaction.h" #include "mapaction.h"
@ -30,18 +30,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
setApplicationVersion(APP_VERSION); setApplicationVersion(APP_VERSION);
QTranslator *gpxsee = new QTranslator(this); QTranslator *gpxsee = new QTranslator(this);
gpxsee->load(QLocale::system(), "gpxsee", "_", if (gpxsee->load(QLocale::system(), "gpxsee", "_",
ProgramPaths::translationsDir()); ProgramPaths::translationsDir()))
installTranslator(gpxsee); installTranslator(gpxsee);
QTranslator *qt = new QTranslator(this); QTranslator *qt = new QTranslator(this);
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC) #if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
qt->load(QLocale::system(), "qt", "_", ProgramPaths::translationsDir()); if (qt->load(QLocale::system(), "qt", "_", ProgramPaths::translationsDir()))
#else // Q_OS_WIN32 || Q_OS_MAC #else // Q_OS_WIN32 || Q_OS_MAC
qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location( if (qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location(
QLibraryInfo::TranslationsPath)); QLibraryInfo::TranslationsPath)))
#endif // Q_OS_WIN32 || Q_OS_MAC #endif // Q_OS_WIN32 || Q_OS_MAC
installTranslator(qt); installTranslator(qt);
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
setAttribute(Qt::AA_DontShowIconsInMenus); setAttribute(Qt::AA_DontShowIconsInMenus);
@ -52,17 +52,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
"QThreadStorage: Thread X exited after QThreadStorage Y destroyed" */ "QThreadStorage: Thread X exited after QThreadStorage Y destroyed" */
Downloader::setNetworkManager(new QNetworkAccessManager(this)); Downloader::setNetworkManager(new QNetworkAccessManager(this));
DEM::setDir(ProgramPaths::demDir()); DEM::setDir(ProgramPaths::demDir());
OPENGL_SET_FORMAT(4, 8); QSurfaceFormat fmt;
fmt.setStencilBufferSize(8);
fmt.setSamples(4);
QSurfaceFormat::setDefaultFormat(fmt);
loadDatums(); loadDatums();
loadPCSs(); loadPCSs();
QSettings settings(qApp->applicationName(), qApp->applicationName()); QSettings settings(qApp->applicationName(), qApp->applicationName());
settings.beginGroup(OPTIONS_SETTINGS_GROUP); settings.beginGroup(OPTIONS_SETTINGS_GROUP);
#ifdef ENABLE_HTTP2
Downloader::enableHTTP2(settings.value(ENABLE_HTTP2_SETTING, Downloader::enableHTTP2(settings.value(ENABLE_HTTP2_SETTING,
ENABLE_HTTP2_DEFAULT).toBool()); ENABLE_HTTP2_DEFAULT).toBool());
#endif // ENABLE_HTTP2
Downloader::setTimeout(settings.value(CONNECTION_TIMEOUT_SETTING, Downloader::setTimeout(settings.value(CONNECTION_TIMEOUT_SETTING,
CONNECTION_TIMEOUT_DEFAULT).toInt()); CONNECTION_TIMEOUT_DEFAULT).toInt());
settings.endGroup(); settings.endGroup();

View File

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

View File

@ -55,7 +55,8 @@ void ColorBox::mousePressEvent(QMouseEvent *event)
if (event->button() != Qt::LeftButton) if (event->button() != Qt::LeftButton)
return; return;
QColorDialog::ColorDialogOptions options = _alpha QColorDialog::ColorDialogOptions options = _alpha
? QColorDialog::ShowAlphaChannel : (QColorDialog::ColorDialogOptions)0; ? QColorDialog::ColorDialogOptions(QColorDialog::ShowAlphaChannel)
: QColorDialog::ColorDialogOptions();
QColor color = QColorDialog::getColor(_color, this, QString(), options); QColor color = QColorDialog::getColor(_color, this, QString(), options);
if (color.isValid()) { if (color.isValid()) {
_color = color; _color = color;

View File

@ -1,42 +0,0 @@
#ifndef CPUARCH_H
#define CPUARCH_H
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
#if defined(__arm64__)
#define CPU_ARCH_STR "arm64"
#elif defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM)
#define CPU_ARCH_STR "arm"
#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) \
|| defined(_M_X64)
#define CPU_ARCH_STR "x86_64"
#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
#define CPU_ARCH_STR "i386"
#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
#define CPU_ARCH_STR "ia64"
#elif defined(_MIPS_ARCH_MIPS64) || defined(__mips64)
#define CPU_ARCH_STR "mips64"
#elif defined(__mips) || defined(__mips__) || defined(_M_MRX000)
#define CPU_ARCH_STR "mips"
#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
#define CPU_ARCH_STR "power64"
#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \
|| defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \
|| defined(_M_MPPC) || defined(_M_PPC)
#define CPU_ARCH_STR "power"
#else
#define CPU_ARCH_STR "unknown"
#endif
#define CPU_ARCH QString(CPU_ARCH_STR)
#else // QT_VERSION < 5.4
#include <QSysInfo>
#define CPU_ARCH QSysInfo::buildCpuArchitecture()
#endif // QT_VERSION < 5.4
#endif // CPUARCH_H

View File

@ -24,7 +24,7 @@ FileSelectWidget::FileSelectWidget(QWidget *parent) : QWidget(parent)
connect(_button, SIGNAL(clicked()), this, SLOT(browse())); connect(_button, SIGNAL(clicked()), this, SLOT(browse()));
QHBoxLayout *layout = new QHBoxLayout(); QHBoxLayout *layout = new QHBoxLayout();
layout->setMargin(0); layout->setContentsMargins(QMargins());
layout->addWidget(_edit); layout->addWidget(_edit);
layout->addWidget(_button); layout->addWidget(_button);
setLayout(layout); setLayout(layout);

View File

@ -85,7 +85,7 @@ const GraphSegment *GraphItem::segment(qreal x, GraphType type) const
return 0; return 0;
} }
qreal GraphItem::yAtX(qreal x) qreal GraphItem::yAtX(qreal x) const
{ {
const GraphSegment *seg = segment(x, _type); const GraphSegment *seg = segment(x, _type);
if (!seg) if (!seg)
@ -106,7 +106,7 @@ qreal GraphItem::yAtX(qreal x)
else if (p.x(_type) < x) else if (p.x(_type) < x)
low = mid + 1; low = mid + 1;
else else
return -p.y(); return p.y();
} }
QLineF l; QLineF l;
@ -117,11 +117,14 @@ qreal GraphItem::yAtX(qreal x)
l = QLineF(seg->at(mid-1).x(_type), seg->at(mid-1).y(), l = QLineF(seg->at(mid-1).x(_type), seg->at(mid-1).y(),
seg->at(mid).x(_type), seg->at(mid).y()); seg->at(mid).x(_type), seg->at(mid).y());
return -l.pointAt((x - l.p1().x()) / (l.p2().x() - l.p1().x())).y(); return l.pointAt((x - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
} }
qreal GraphItem::distanceAtTime(qreal time) qreal GraphItem::distanceAtTime(qreal time) const
{ {
if (!_time)
return NAN;
const GraphSegment *seg = segment(time, Time); const GraphSegment *seg = segment(time, Time);
if (!seg) if (!seg)
return NAN; return NAN;
@ -155,12 +158,42 @@ qreal GraphItem::distanceAtTime(qreal time)
return l.pointAt((time - l.p1().x()) / (l.p2().x() - l.p1().x())).y(); return l.pointAt((time - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
} }
void GraphItem::emitSliderPositionChanged(qreal pos) qreal GraphItem::timeAtDistance(qreal distance) const
{ {
if (_type == Time) if (!_time)
emit sliderPositionChanged(_time ? distanceAtTime(pos) : NAN); return NAN;
const GraphSegment *seg = segment(distance, Distance);
if (!seg)
return NAN;
int low = 0;
int high = seg->count() - 1;
int mid = 0;
if (!(distance >= seg->at(low).s() && distance <= seg->at(high).s()))
return NAN;
while (low <= high) {
mid = low + ((high - low) / 2);
const GraphPoint &p = seg->at(mid);
if (p.s() > distance)
high = mid - 1;
else if (p.s() < distance)
low = mid + 1;
else
return seg->at(mid).t();
}
QLineF l;
if (seg->at(mid).s() < distance)
l = QLineF(seg->at(mid).s(), seg->at(mid).t(), seg->at(mid+1).s(),
seg->at(mid+1).t());
else else
emit sliderPositionChanged(pos); l = QLineF(seg->at(mid-1).s(), seg->at(mid-1).t(),
seg->at(mid).s(), seg->at(mid).t());
return l.pointAt((distance - l.p1().x()) / (l.p2().x() - l.p1().x())).y();
} }
void GraphItem::hover(bool hover) void GraphItem::hover(bool hover)

View File

@ -23,6 +23,7 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget); QWidget *widget);
GraphType graphType() const {return _type;}
const QRectF &bounds() const {return _bounds;} const QRectF &bounds() const {return _bounds;}
qreal max() const; qreal max() const;
@ -38,17 +39,16 @@ public:
GraphItem *secondaryGraph() const {return _secondaryGraph;} GraphItem *secondaryGraph() const {return _secondaryGraph;}
void setSecondaryGraph(GraphItem *graph) {_secondaryGraph = graph;} void setSecondaryGraph(GraphItem *graph) {_secondaryGraph = graph;}
qreal yAtX(qreal x); qreal yAtX(qreal x) const;
qreal distanceAtTime(qreal time); qreal distanceAtTime(qreal time) const;
qreal timeAtDistance(qreal distance) const;
void redraw(); void redraw();
signals: signals:
void sliderPositionChanged(qreal);
void selected(bool); void selected(bool);
public slots: public slots:
void emitSliderPositionChanged(qreal);
void hover(bool hover); void hover(bool hover);
protected: protected:

View File

@ -1,6 +1,7 @@
#ifndef GRAPHTAB_H #ifndef GRAPHTAB_H
#define GRAPHTAB_H #define GRAPHTAB_H
#include <QtGlobal>
#include <QList> #include <QList>
#include "graphview.h" #include "graphview.h"
#include "units.h" #include "units.h"
@ -14,7 +15,12 @@ class GraphTab : public GraphView
Q_OBJECT Q_OBJECT
public: public:
GraphTab(QWidget *parent = 0) : GraphView(parent) {} GraphTab(QWidget *parent = 0) : GraphView(parent)
{
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
setFrameShape(QFrame::NoFrame);
#endif // Q_OS_WIN32 || Q_OS_MAC
}
virtual ~GraphTab() {} virtual ~GraphTab() {}
virtual QString label() const = 0; virtual QString label() const = 0;

View File

@ -6,8 +6,8 @@
#include <QGraphicsSimpleTextItem> #include <QGraphicsSimpleTextItem>
#include <QPalette> #include <QPalette>
#include <QLocale> #include <QLocale>
#include <QOpenGLWidget>
#include "data/graph.h" #include "data/graph.h"
#include "opengl.h"
#include "axisitem.h" #include "axisitem.h"
#include "axislabelitem.h" #include "axislabelitem.h"
#include "slideritem.h" #include "slideritem.h"
@ -179,6 +179,13 @@ void GraphView::setGraphType(GraphType type)
_xLabel = tr("Time"); _xLabel = tr("Time");
setXUnits(); setXUnits();
if (singleGraph())
_sliderPos = (type == Distance)
? _graphs.first()->distanceAtTime(_sliderPos)
: _graphs.first()->timeAtDistance(_sliderPos);
else
_sliderPos = 0;
redraw(); redraw();
} }
@ -194,9 +201,6 @@ void GraphView::showSliderInfo(bool show)
void GraphView::addGraph(GraphItem *graph) void GraphView::addGraph(GraphItem *graph)
{ {
connect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
SLOT(emitSliderPositionChanged(qreal)));
_graphs.append(graph); _graphs.append(graph);
if (!graph->bounds().isNull()) if (!graph->bounds().isNull())
_scene->addItem(graph); _scene->addItem(graph);
@ -207,9 +211,6 @@ void GraphView::addGraph(GraphItem *graph)
void GraphView::removeGraph(GraphItem *graph) void GraphView::removeGraph(GraphItem *graph)
{ {
disconnect(this, SIGNAL(sliderPositionChanged(qreal)), graph,
SLOT(emitSliderPositionChanged(qreal)));
_graphs.removeOne(graph); _graphs.removeOne(graph);
_scene->removeItem(graph); _scene->removeItem(graph);
@ -351,23 +352,31 @@ void GraphView::wheelEvent(QWheelEvent *e)
{ {
static int deg = 0; static int deg = 0;
deg += e->delta() / 8; deg += e->angleDelta().y() / 8;
if (qAbs(deg) < 15) if (qAbs(deg) < 15)
return; return;
deg = 0; deg = 0;
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
QPointF pos = mapToScene(e->pos()); QPointF pos = mapToScene(e->pos());
#else // QT 5.15
QPointF pos = mapToScene(e->position().toPoint());
#endif // QT 5.15
QRectF gr(_grid->boundingRect()); QRectF gr(_grid->boundingRect());
QPointF r(pos.x() / gr.width(), pos.y() / gr.height()); QPointF r(pos.x() / gr.width(), pos.y() / gr.height());
_zoom = (e->delta() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0); _zoom = (e->angleDelta().y() > 0) ? _zoom * 1.25 : qMax(_zoom / 1.25, 1.0);
redraw(); redraw();
QRectF ngr(_grid->boundingRect()); QRectF ngr(_grid->boundingRect());
QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(), QPointF npos(mapFromScene(QPointF(r.x() * ngr.width(),
r.y() * ngr.height()))); r.y() * ngr.height())));
QScrollBar *sb = horizontalScrollBar(); QScrollBar *sb = horizontalScrollBar();
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x()); sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->pos().x());
#else // QT 5.15
sb->setSliderPosition(sb->sliderPosition() + npos.x() - e->position().x());
#endif // QT 5.15
QGraphicsView::wheelEvent(e); QGraphicsView::wheelEvent(e);
} }
@ -426,12 +435,17 @@ void GraphView::updateSliderPosition()
} }
} }
bool GraphView::singleGraph() const
{
return (_graphs.count() == 1
|| (_graphs.count() == 2 && _graphs.first()->secondaryGraph()));
}
void GraphView::updateSliderInfo() void GraphView::updateSliderInfo()
{ {
QLocale l(QLocale::system()); QLocale l(QLocale::system());
qreal r = 0, y = 0; qreal r = 0, y = 0;
GraphItem *cardinal = (_graphs.count() == 1 || (_graphs.count() == 2 GraphItem *cardinal = singleGraph() ? _graphs.first() : 0;
&& _graphs.first()->secondaryGraph())) ? _graphs.first() : 0;
if (cardinal) { if (cardinal) {
QRectF br(_bounds); QRectF br(_bounds);
@ -439,7 +453,7 @@ void GraphView::updateSliderInfo()
br.adjust(0, -(_minYRange/2 - br.height()/2), 0, br.adjust(0, -(_minYRange/2 - br.height()/2), 0,
_minYRange/2 - br.height()/2); _minYRange/2 - br.height()/2);
y = cardinal->yAtX(_sliderPos); y = -cardinal->yAtX(_sliderPos);
r = (y - br.bottom()) / br.height(); r = (y - br.bottom()) / br.height();
} }
@ -455,9 +469,9 @@ void GraphView::updateSliderInfo()
QString yText((!cardinal) ? QString() : l.toString(-y * _yScale + _yOffset, QString yText((!cardinal) ? QString() : l.toString(-y * _yScale + _yOffset,
'f', _precision) + UNIT_SPACE + _yUnits); 'f', _precision) + UNIT_SPACE + _yUnits);
if (cardinal && cardinal->secondaryGraph()) { if (cardinal && cardinal->secondaryGraph()) {
qreal delta = y - cardinal->secondaryGraph()->yAtX(_sliderPos); qreal delta = y + cardinal->secondaryGraph()->yAtX(_sliderPos);
yText += " " + QChar(0x0394) + l.toString(-delta * _yScale + _yOffset, yText += QString(" ") + QChar(0x0394) + l.toString(-delta * _yScale
'f', _precision) + UNIT_SPACE + _yUnits; + _yOffset, 'f', _precision) + UNIT_SPACE + _yUnits;
} }
_sliderInfo->setText(xText, yText); _sliderInfo->setText(xText, yText);
} }
@ -537,7 +551,7 @@ void GraphView::setGraphWidth(int width)
void GraphView::useOpenGL(bool use) void GraphView::useOpenGL(bool use)
{ {
if (use) if (use)
setViewport(new OPENGL_WIDGET); setViewport(new QOpenGLWidget);
else else
setViewport(new QWidget); setViewport(new QWidget);
} }

View File

@ -43,6 +43,8 @@ public:
void setSliderPosition(qreal pos); void setSliderPosition(qreal pos);
void setSliderColor(const QColor &color); void setSliderColor(const QColor &color);
qreal sliderPosition() const {return _sliderPos;}
signals: signals:
void sliderPositionChanged(qreal); void sliderPositionChanged(qreal);
@ -91,6 +93,7 @@ private:
void updateSliderInfo(); void updateSliderInfo();
void removeItem(QGraphicsItem *item); void removeItem(QGraphicsItem *item);
void addItem(QGraphicsItem *item); void addItem(QGraphicsItem *item);
bool singleGraph() const;
GraphicsScene *_scene; GraphicsScene *_scene;

View File

@ -1,4 +1,3 @@
#include "common/config.h"
#include <QApplication> #include <QApplication>
#include <QSplitter> #include <QSplitter>
#include <QVBoxLayout> #include <QVBoxLayout>
@ -23,10 +22,8 @@
#include <QMimeData> #include <QMimeData>
#include <QUrl> #include <QUrl>
#include <QPixmapCache> #include <QPixmapCache>
#ifdef ENABLE_HIDPI
#include <QWindow> #include <QWindow>
#include <QScreen> #include <QScreen>
#endif // ENABLE_HIDPI
#include <QStyle> #include <QStyle>
#include "common/programpaths.h" #include "common/programpaths.h"
#include "data/data.h" #include "data/data.h"
@ -47,7 +44,6 @@
#include "mapview.h" #include "mapview.h"
#include "trackinfo.h" #include "trackinfo.h"
#include "filebrowser.h" #include "filebrowser.h"
#include "cpuarch.h"
#include "graphtab.h" #include "graphtab.h"
#include "graphitem.h" #include "graphitem.h"
#include "pathitem.h" #include "pathitem.h"
@ -94,8 +90,7 @@ GUI::GUI()
_routeDistance = 0; _routeDistance = 0;
_time = 0; _time = 0;
_movingTime = 0; _movingTime = 0;
_lastGraphTab = 0;
_sliderPos = 0;
_dataDir = QDir::homePath(); _dataDir = QDir::homePath();
_mapDir = QDir::homePath(); _mapDir = QDir::homePath();
@ -174,8 +169,13 @@ void GUI::mapInitialized()
void GUI::createPOIFilesActions() void GUI::createPOIFilesActions()
{ {
_poiFilesSignalMapper = new QSignalMapper(this); _poiFilesSignalMapper = new QSignalMapper(this);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this, connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this,
SLOT(poiFileChecked(int))); SLOT(poiFileChecked(int)));
#else // QT 5.15
connect(_poiFilesSignalMapper, SIGNAL(mappedInt(int)), this,
SLOT(poiFileChecked(int)));
#endif // QT 5.15
for (int i = 0; i < _poi->files().count(); i++) for (int i = 0; i < _poi->files().count(); i++)
createPOIFileAction(_poi->files().at(i)); createPOIFileAction(_poi->files().at(i));
@ -283,7 +283,7 @@ void GUI::createActions()
_overlapPOIAction->setMenuRole(QAction::NoRole); _overlapPOIAction->setMenuRole(QAction::NoRole);
_overlapPOIAction->setCheckable(true); _overlapPOIAction->setCheckable(true);
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView, connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView,
SLOT(setPOIOverlap(bool))); SLOT(showOverlappedPOIs(bool)));
_showPOILabelsAction = new QAction(tr("Show POI labels"), this); _showPOILabelsAction = new QAction(tr("Show POI labels"), this);
_showPOILabelsAction->setMenuRole(QAction::NoRole); _showPOILabelsAction->setMenuRole(QAction::NoRole);
_showPOILabelsAction->setCheckable(true); _showPOILabelsAction->setCheckable(true);
@ -374,6 +374,16 @@ void GUI::createActions()
_showTicksAction->setCheckable(true); _showTicksAction->setCheckable(true);
connect(_showTicksAction, SIGNAL(triggered(bool)), _mapView, connect(_showTicksAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showTicks(bool))); SLOT(showTicks(bool)));
_showMarkersAction = new QAction(tr("Position markers"), this);
_showMarkersAction->setMenuRole(QAction::NoRole);
_showMarkersAction->setCheckable(true);
connect(_showMarkersAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showMarkers(bool)));
_showMarkerInfoAction = new QAction(tr("Position date/time"), this);
_showMarkerInfoAction->setMenuRole(QAction::NoRole);
_showMarkerInfoAction->setCheckable(true);
connect(_showMarkerInfoAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showMarkerInfo(bool)));
// Graph actions // Graph actions
_showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"), _showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"),
@ -410,11 +420,6 @@ void GUI::createActions()
_showGraphSliderInfoAction->setCheckable(true); _showGraphSliderInfoAction->setCheckable(true);
connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this, connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this,
SLOT(showGraphSliderInfo(bool))); SLOT(showGraphSliderInfo(bool)));
_showMarkersAction = new QAction(tr("Show path markers"), this);
_showMarkersAction->setMenuRole(QAction::NoRole);
_showMarkersAction->setCheckable(true);
connect(_showMarkersAction, SIGNAL(triggered(bool)), _mapView,
SLOT(showMarkers(bool)));
// Settings actions // Settings actions
_showToolbarsAction = new QAction(tr("Show toolbars"), this); _showToolbarsAction = new QAction(tr("Show toolbars"), this);
@ -543,7 +548,6 @@ void GUI::createMenus()
graphMenu->addSeparator(); graphMenu->addSeparator();
graphMenu->addAction(_showGraphGridAction); graphMenu->addAction(_showGraphGridAction);
graphMenu->addAction(_showGraphSliderInfoAction); graphMenu->addAction(_showGraphSliderInfoAction);
graphMenu->addAction(_showMarkersAction);
graphMenu->addSeparator(); graphMenu->addSeparator();
graphMenu->addAction(_showGraphsAction); graphMenu->addAction(_showGraphsAction);
@ -564,6 +568,8 @@ void GUI::createMenus()
displayMenu->addAction(_showWaypointLabelsAction); displayMenu->addAction(_showWaypointLabelsAction);
displayMenu->addAction(_showRouteWaypointsAction); displayMenu->addAction(_showRouteWaypointsAction);
displayMenu->addAction(_showTicksAction); displayMenu->addAction(_showTicksAction);
displayMenu->addAction(_showMarkersAction);
displayMenu->addAction(_showMarkerInfoAction);
dataMenu->addSeparator(); dataMenu->addSeparator();
dataMenu->addAction(_showTracksAction); dataMenu->addAction(_showTracksAction);
dataMenu->addAction(_showRoutesAction); dataMenu->addAction(_showRoutesAction);
@ -661,13 +667,8 @@ void GUI::createGraphTabs()
_tabs.append(new TemperatureGraph(_graphTabWidget)); _tabs.append(new TemperatureGraph(_graphTabWidget));
_tabs.append(new GearRatioGraph(_graphTabWidget)); _tabs.append(new GearRatioGraph(_graphTabWidget));
for (int i = 0; i < _tabs.count(); i++) { connect(_tabs.first(), SIGNAL(sliderPositionChanged(qreal)), _mapView,
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC) SLOT(setMarkerPosition(qreal)));
_tabs.at(i)->setFrameShape(QFrame::NoFrame);
#endif // Q_OS_WIN32 || Q_OS_MAC
connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this,
SLOT(sliderPositionChanged(qreal)));
}
} }
void GUI::createStatusBar() void GUI::createStatusBar()
@ -691,8 +692,8 @@ void GUI::about()
msgBox.setWindowTitle(tr("About GPXSee")); msgBox.setWindowTitle(tr("About GPXSee"));
msgBox.setText("<h2>" + QString(APP_NAME) + "</h2><p><p>" + tr("Version %1") msgBox.setText("<h2>" + QString(APP_NAME) + "</h2><p><p>" + tr("Version %1")
.arg(QString(APP_VERSION) + " (" + CPU_ARCH + ", Qt " + QT_VERSION_STR .arg(QString(APP_VERSION) + " (" + QSysInfo::buildCpuArchitecture()
+ ")") + "</p>"); + ", Qt " + QT_VERSION_STR + ")") + "</p>");
msgBox.setInformativeText("<table width=\"300\"><tr><td>" msgBox.setInformativeText("<table width=\"300\"><tr><td>"
+ tr("GPXSee is distributed under the terms of the GNU General Public " + tr("GPXSee is distributed under the terms of the GNU General Public "
"License version 3. For more info about GPXSee visit the project " "License version 3. For more info about GPXSee visit the project "
@ -835,12 +836,7 @@ void GUI::loadData(const Data &data)
_trackDistance += track.distance(); _trackDistance += track.distance();
_time += track.time(); _time += track.time();
_movingTime += track.movingTime(); _movingTime += track.movingTime();
#ifdef ENABLE_TIMEZONES const QDateTime date = track.date().toTimeZone(_options.timeZone.zone());
const QDateTime date = track.date().toTimeZone(
_options.timeZone.zone());
#else // ENABLE_TIMEZONES
const QDateTime &date = track.date();
#endif // ENABLE_TIMEZONES
if (_dateRange.first.isNull() || _dateRange.first > date) if (_dateRange.first.isNull() || _dateRange.first > date)
_dateRange.first = date; _dateRange.first = date;
if (_dateRange.second.isNull() || _dateRange.second < date) if (_dateRange.second.isNull() || _dateRange.second < date)
@ -869,16 +865,20 @@ void GUI::loadData(const Data &data)
_splitter->refresh(); _splitter->refresh();
paths = _mapView->loadData(data); paths = _mapView->loadData(data);
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->currentWidget());
int index = _graphTabWidget->currentIndex();
for (int i = 0; i < paths.count(); i++) { for (int i = 0; i < paths.count(); i++) {
const PathItem *pi = paths.at(i); PathItem *pi = paths.at(i);
for (int j = 0; j < graphs.count(); j++) { if (!pi)
const GraphItem *gi = graphs.at(j).at(i); continue;
if (!gi)
continue; for (int j = 0; j < graphs.count(); j++)
connect(gi, SIGNAL(sliderPositionChanged(qreal)), pi, pi->addGraph(graphs.at(j).at(i));
SLOT(moveMarker(qreal)));
connect(pi, SIGNAL(selected(bool)), gi, SLOT(hover(bool))); if (gt && index >= 0) {
connect(gi, SIGNAL(selected(bool)), pi, SLOT(hover(bool))); pi->setGraph(index);
pi->setMarkerPosition(gt->sliderPosition());
} }
} }
} }
@ -977,7 +977,8 @@ void GUI::openOptions()
SET_VIEW_OPTION(pathAntiAliasing, useAntiAliasing); SET_VIEW_OPTION(pathAntiAliasing, useAntiAliasing);
SET_VIEW_OPTION(useOpenGL, useOpenGL); SET_VIEW_OPTION(useOpenGL, useOpenGL);
SET_VIEW_OPTION(sliderColor, setMarkerColor); SET_VIEW_OPTION(sliderColor, setMarkerColor);
SET_VIEW_OPTION(projection, setProjection); SET_VIEW_OPTION(outputProjection, setOutputProjection);
SET_VIEW_OPTION(inputProjection, setInputProjection);
SET_TAB_OPTION(palette, setPalette); SET_TAB_OPTION(palette, setPalette);
SET_TAB_OPTION(graphWidth, setGraphWidth); SET_TAB_OPTION(graphWidth, setGraphWidth);
@ -1014,23 +1015,19 @@ void GUI::openOptions()
if (options.connectionTimeout != _options.connectionTimeout) if (options.connectionTimeout != _options.connectionTimeout)
Downloader::setTimeout(options.connectionTimeout); Downloader::setTimeout(options.connectionTimeout);
#ifdef ENABLE_HTTP2
if (options.enableHTTP2 != _options.enableHTTP2) if (options.enableHTTP2 != _options.enableHTTP2)
Downloader::enableHTTP2(options.enableHTTP2); Downloader::enableHTTP2(options.enableHTTP2);
#endif // ENABLE_HTTP2
#ifdef ENABLE_HIDPI
if (options.hidpiMap != _options.hidpiMap) if (options.hidpiMap != _options.hidpiMap)
_mapView->setDevicePixelRatio(devicePixelRatioF(), _mapView->setDevicePixelRatio(devicePixelRatioF(),
options.hidpiMap ? devicePixelRatioF() : 1.0); options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENABLE_HIDPI
#ifdef ENABLE_TIMEZONES
if (options.timeZone != _options.timeZone) { if (options.timeZone != _options.timeZone) {
_mapView->setTimeZone(options.timeZone.zone()); _mapView->setTimeZone(options.timeZone.zone());
_dateRange.first = _dateRange.first.toTimeZone(options.timeZone.zone()); _dateRange.first = _dateRange.first.toTimeZone(options.timeZone.zone());
_dateRange.second = _dateRange.second.toTimeZone(options.timeZone.zone()); _dateRange.second = _dateRange.second.toTimeZone(options.timeZone.zone());
reload = true;
} }
#endif // ENABLE_TIMEZONES
if (reload) if (reload)
reloadFiles(); reloadFiles();
@ -1058,12 +1055,9 @@ void GUI::exportPDFFile()
printer.setCreator(QString(APP_NAME) + QString(" ") printer.setCreator(QString(APP_NAME) + QString(" ")
+ QString(APP_VERSION)); + QString(APP_VERSION));
printer.setResolution(_pdfExport.resolution); printer.setResolution(_pdfExport.resolution);
printer.setOrientation(_pdfExport.orientation); printer.setPageLayout(QPageLayout(QPageSize(_pdfExport.paperSize),
_pdfExport.orientation, _pdfExport.margins, QPageLayout::Millimeter));
printer.setOutputFileName(_pdfExport.fileName); printer.setOutputFileName(_pdfExport.fileName);
printer.setPaperSize(_pdfExport.paperSize);
printer.setPageMargins(_pdfExport.margins.left(), _pdfExport.margins.top(),
_pdfExport.margins.right(), _pdfExport.margins.bottom(),
QPrinter::Millimeter);
plot(&printer); plot(&printer);
} }
@ -1319,8 +1313,6 @@ void GUI::reloadFiles()
_tabs.at(i)->clear(); _tabs.at(i)->clear();
_mapView->clear(); _mapView->clear();
_sliderPos = 0;
for (int i = 0; i < _files.size(); i++) { for (int i = 0; i < _files.size(); i++) {
if (!loadFile(_files.at(i))) { if (!loadFile(_files.at(i))) {
_files.removeAt(i); _files.removeAt(i);
@ -1349,8 +1341,6 @@ void GUI::closeFiles()
_dateRange = DateTimeRange(QDateTime(), QDateTime()); _dateRange = DateTimeRange(QDateTime(), QDateTime());
_pathName = QString(); _pathName = QString();
_sliderPos = 0;
for (int i = 0; i < _tabs.count(); i++) for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->clear(); _tabs.at(i)->clear();
_mapView->clear(); _mapView->clear();
@ -1690,18 +1680,25 @@ void GUI::poiFileChecked(int index)
_poiFilesActions.at(index)->isChecked()); _poiFilesActions.at(index)->isChecked());
} }
void GUI::sliderPositionChanged(qreal pos)
{
_sliderPos = pos;
}
void GUI::graphChanged(int index) void GUI::graphChanged(int index)
{ {
if (index < 0) if (index < 0)
return; return;
_mapView->setGraph(index);
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->widget(index)); GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->widget(index));
gt->setSliderPosition(_sliderPos); if (_lastGraphTab)
disconnect(_lastGraphTab, SIGNAL(sliderPositionChanged(qreal)),
_mapView, SLOT(setMarkerPosition(qreal)));
connect(gt, SIGNAL(sliderPositionChanged(qreal)), _mapView,
SLOT(setMarkerPosition(qreal)));
if (_lastGraphTab)
gt->setSliderPosition(_lastGraphTab->sliderPosition());
_lastGraphTab = gt;
} }
void GUI::updateNavigationActions() void GUI::updateNavigationActions()
@ -1780,12 +1777,8 @@ void GUI::setCoordinatesFormat(CoordinatesFormat format)
void GUI::setGraphType(GraphType type) void GUI::setGraphType(GraphType type)
{ {
_sliderPos = 0; for (int i = 0; i <_tabs.count(); i++)
for (int i = 0; i <_tabs.count(); i++) {
_tabs.at(i)->setGraphType(type); _tabs.at(i)->setGraphType(type);
_tabs.at(i)->setSliderPosition(0);
}
} }
void GUI::next() void GUI::next()
@ -1979,9 +1972,6 @@ void GUI::writeSettings()
!= SHOW_GRAPH_SLIDER_INFO_DEFAULT) != SHOW_GRAPH_SLIDER_INFO_DEFAULT)
settings.setValue(SHOW_GRAPH_SLIDER_INFO_SETTING, settings.setValue(SHOW_GRAPH_SLIDER_INFO_SETTING,
_showGraphSliderInfoAction->isChecked()); _showGraphSliderInfoAction->isChecked());
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
settings.setValue(SHOW_MARKERS_SETTING,
_showMarkersAction->isChecked());
settings.endGroup(); settings.endGroup();
settings.beginGroup(POI_SETTINGS_GROUP); settings.beginGroup(POI_SETTINGS_GROUP);
@ -2022,6 +2012,12 @@ void GUI::writeSettings()
if (_showTicksAction->isChecked() != SHOW_TICKS_DEFAULT) if (_showTicksAction->isChecked() != SHOW_TICKS_DEFAULT)
settings.setValue(SHOW_TICKS_SETTING, settings.setValue(SHOW_TICKS_SETTING,
_showTicksAction->isChecked()); _showTicksAction->isChecked());
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
settings.setValue(SHOW_MARKERS_SETTING,
_showMarkersAction->isChecked());
if (_showMarkerInfoAction->isChecked() != SHOW_MARKER_INFO_DEFAULT)
settings.setValue(SHOW_MARKER_INFO_SETTING,
_showMarkerInfoAction->isChecked());
settings.endGroup(); settings.endGroup();
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP); settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
@ -2127,21 +2123,17 @@ void GUI::writeSettings()
if (_options.showSecondarySpeed != SHOW_SECONDARY_SPEED_DEFAULT) if (_options.showSecondarySpeed != SHOW_SECONDARY_SPEED_DEFAULT)
settings.setValue(SHOW_SECONDARY_SPEED_SETTING, settings.setValue(SHOW_SECONDARY_SPEED_SETTING,
_options.showSecondarySpeed); _options.showSecondarySpeed);
#ifdef ENABLE_TIMEZONES
if (_options.timeZone != TimeZoneInfo()) if (_options.timeZone != TimeZoneInfo())
settings.setValue(TIME_ZONE_SETTING, QVariant::fromValue( settings.setValue(TIME_ZONE_SETTING, QVariant::fromValue(
_options.timeZone)); _options.timeZone));
#endif // ENABLE_TIMEZONES
if (_options.useSegments != USE_SEGMENTS_DEFAULT) if (_options.useSegments != USE_SEGMENTS_DEFAULT)
settings.setValue(USE_SEGMENTS_SETTING, _options.useSegments); settings.setValue(USE_SEGMENTS_SETTING, _options.useSegments);
if (_options.poiRadius != POI_RADIUS_DEFAULT) if (_options.poiRadius != POI_RADIUS_DEFAULT)
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius); settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
if (_options.useOpenGL != USE_OPENGL_DEFAULT) if (_options.useOpenGL != USE_OPENGL_DEFAULT)
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL); settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
#ifdef ENABLE_HTTP2
if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT) if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT)
settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2); settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2);
#endif // ENABLE_HTTP2
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT) if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache); settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT) if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT)
@ -2165,12 +2157,12 @@ void GUI::writeSettings()
_options.separateGraphPage); _options.separateGraphPage);
if (_options.sliderColor != SLIDER_COLOR_DEFAULT) if (_options.sliderColor != SLIDER_COLOR_DEFAULT)
settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor); settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor);
if (_options.projection != PROJECTION_DEFAULT) if (_options.outputProjection != OUTPUT_PROJECTION_DEFAULT)
settings.setValue(PROJECTION_SETTING, _options.projection); settings.setValue(OUTPUT_PROJECTION_SETTING, _options.outputProjection);
#ifdef ENABLE_HIDPI if (_options.inputProjection != INPUT_PROJECTION_DEFAULT)
settings.setValue(INPUT_PROJECTION_SETTING, _options.outputProjection);
if (_options.hidpiMap != HIDPI_MAP_DEFAULT) if (_options.hidpiMap != HIDPI_MAP_DEFAULT)
settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap); settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap);
#endif // ENABLE_HIDPI
settings.endGroup(); settings.endGroup();
} }
@ -2253,15 +2245,11 @@ void GUI::readSettings()
showGraphSliderInfo(false); showGraphSliderInfo(false);
else else
_showGraphSliderInfoAction->setChecked(true); _showGraphSliderInfoAction->setChecked(true);
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
_mapView->showMarkers(false);
else
_showMarkersAction->setChecked(true);
settings.endGroup(); settings.endGroup();
settings.beginGroup(POI_SETTINGS_GROUP); settings.beginGroup(POI_SETTINGS_GROUP);
if (!settings.value(OVERLAP_POI_SETTING, OVERLAP_POI_DEFAULT).toBool()) if (!settings.value(OVERLAP_POI_SETTING, OVERLAP_POI_DEFAULT).toBool())
_mapView->setPOIOverlap(false); _mapView->showOverlappedPOIs(false);
else else
_overlapPOIAction->setChecked(true); _overlapPOIAction->setChecked(true);
if (!settings.value(LABELS_POI_SETTING, LABELS_POI_DEFAULT).toBool()) if (!settings.value(LABELS_POI_SETTING, LABELS_POI_DEFAULT).toBool())
@ -2323,14 +2311,23 @@ void GUI::readSettings()
_mapView->showTicks(true); _mapView->showTicks(true);
_showTicksAction->setChecked(true); _showTicksAction->setChecked(true);
} }
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
_mapView->showMarkers(false);
else
_showMarkersAction->setChecked(true);
if (settings.value(SHOW_MARKER_INFO_SETTING,
SHOW_MARKER_INFO_DEFAULT).toBool()) {
_mapView->showMarkerInfo(true);
_showMarkerInfoAction->setChecked(true);
}
settings.endGroup(); settings.endGroup();
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP); settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
_pdfExport.orientation = (QPrinter::Orientation) settings.value( _pdfExport.orientation = (QPageLayout::Orientation) settings.value(
PAPER_ORIENTATION_SETTING, PAPER_ORIENTATION_DEFAULT).toInt(); PAPER_ORIENTATION_SETTING, PAPER_ORIENTATION_DEFAULT).toInt();
_pdfExport.resolution = settings.value(RESOLUTION_SETTING, _pdfExport.resolution = settings.value(RESOLUTION_SETTING,
RESOLUTION_DEFAULT).toInt(); RESOLUTION_DEFAULT).toInt();
_pdfExport.paperSize = (QPrinter::PaperSize) settings.value( _pdfExport.paperSize = (QPageSize::PageSizeId) settings.value(
PAPER_SIZE_SETTING, PAPER_SIZE_DEFAULT).toInt(); PAPER_SIZE_SETTING, PAPER_SIZE_DEFAULT).toInt();
qreal ml = settings.value(PDF_MARGIN_LEFT_SETTING, PDF_MARGIN_LEFT_DEFAULT) qreal ml = settings.value(PDF_MARGIN_LEFT_SETTING, PDF_MARGIN_LEFT_DEFAULT)
.toReal(); .toReal();
@ -2340,7 +2337,7 @@ void GUI::readSettings()
PDF_MARGIN_RIGHT_DEFAULT).toReal(); PDF_MARGIN_RIGHT_DEFAULT).toReal();
qreal mb = settings.value(PDF_MARGIN_BOTTOM_SETTING, qreal mb = settings.value(PDF_MARGIN_BOTTOM_SETTING,
PDF_MARGIN_BOTTOM_DEFAULT).toReal(); PDF_MARGIN_BOTTOM_DEFAULT).toReal();
_pdfExport.margins = MarginsF(ml, mt, mr, mb); _pdfExport.margins = QMarginsF(ml, mt, mr, mb);
_pdfExport.fileName = settings.value(PDF_FILENAME_SETTING, _pdfExport.fileName = settings.value(PDF_FILENAME_SETTING,
PDF_FILENAME_DEFAULT).toString(); PDF_FILENAME_DEFAULT).toString();
settings.endGroup(); settings.endGroup();
@ -2425,9 +2422,7 @@ void GUI::readSettings()
_options.showSecondarySpeed = settings.value( _options.showSecondarySpeed = settings.value(
SHOW_SECONDARY_SPEED_SETTING, SHOW_SECONDARY_SPEED_SETTING,
SHOW_SECONDARY_SPEED_DEFAULT).toBool(); SHOW_SECONDARY_SPEED_DEFAULT).toBool();
#ifdef ENABLE_TIMEZONES
_options.timeZone = settings.value(TIME_ZONE_SETTING).value<TimeZoneInfo>(); _options.timeZone = settings.value(TIME_ZONE_SETTING).value<TimeZoneInfo>();
#endif // ENABLE_TIMEZONES
_options.useSegments = settings.value(USE_SEGMENTS_SETTING, _options.useSegments = settings.value(USE_SEGMENTS_SETTING,
USE_SEGMENTS_DEFAULT).toBool(); USE_SEGMENTS_DEFAULT).toBool();
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING, _options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
@ -2438,10 +2433,8 @@ void GUI::readSettings()
.toInt(); .toInt();
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT) _options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
.toBool(); .toBool();
#ifdef ENABLE_HTTP2
_options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING, _options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING,
ENABLE_HTTP2_DEFAULT).toBool(); ENABLE_HTTP2_DEFAULT).toBool();
#endif // ENABLE_HTTP2
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING, _options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
PIXMAP_CACHE_DEFAULT).toInt(); PIXMAP_CACHE_DEFAULT).toInt();
_options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING, _options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING,
@ -2464,12 +2457,12 @@ void GUI::readSettings()
SEPARATE_GRAPH_PAGE_DEFAULT).toBool(); SEPARATE_GRAPH_PAGE_DEFAULT).toBool();
_options.sliderColor = settings.value(SLIDER_COLOR_SETTING, _options.sliderColor = settings.value(SLIDER_COLOR_SETTING,
SLIDER_COLOR_DEFAULT).value<QColor>(); SLIDER_COLOR_DEFAULT).value<QColor>();
_options.projection = settings.value(PROJECTION_SETTING, PROJECTION_DEFAULT) _options.outputProjection = settings.value(OUTPUT_PROJECTION_SETTING,
.toInt(); OUTPUT_PROJECTION_DEFAULT).toInt();
#ifdef ENABLE_HIDPI _options.inputProjection = settings.value(INPUT_PROJECTION_SETTING,
INPUT_PROJECTION_DEFAULT).toInt();
_options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING) _options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING)
.toBool(); .toBool();
#endif // ENABLE_HIDPI
_mapView->setPalette(_options.palette); _mapView->setPalette(_options.palette);
_mapView->setMapOpacity(_options.mapOpacity); _mapView->setMapOpacity(_options.mapOpacity);
@ -2489,14 +2482,11 @@ void GUI::readSettings()
_mapView->setMarkerColor(_options.sliderColor); _mapView->setMarkerColor(_options.sliderColor);
if (_options.useOpenGL) if (_options.useOpenGL)
_mapView->useOpenGL(true); _mapView->useOpenGL(true);
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(), _mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0); _options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENABLE_HIDPI _mapView->setOutputProjection(_options.outputProjection);
_mapView->setProjection(_options.projection); _mapView->setInputProjection(_options.inputProjection);
#ifdef ENABLE_TIMEZONES
_mapView->setTimeZone(_options.timeZone.zone()); _mapView->setTimeZone(_options.timeZone.zone());
#endif // ENABLE_TIMEZONES
for (int i = 0; i < _tabs.count(); i++) { for (int i = 0; i < _tabs.count(); i++) {
_tabs.at(i)->setPalette(_options.palette); _tabs.at(i)->setPalette(_options.palette);
@ -2587,20 +2577,17 @@ void GUI::show()
{ {
QMainWindow::show(); QMainWindow::show();
#ifdef ENABLE_HIDPI
QWindow *w = windowHandle(); QWindow *w = windowHandle();
connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this, connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal))); SLOT(logicalDotsPerInchChanged(qreal)));
connect(w, SIGNAL(screenChanged(QScreen*)), this, connect(w, SIGNAL(screenChanged(QScreen*)), this,
SLOT(screenChanged(QScreen*))); SLOT(screenChanged(QScreen*)));
#endif // ENABLE_HIDPI
_mapView->fitContentToSize(); _mapView->fitContentToSize();
} }
void GUI::screenChanged(QScreen *screen) void GUI::screenChanged(QScreen *screen)
{ {
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(), _mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0); _options.hidpiMap ? devicePixelRatioF() : 1.0);
@ -2608,17 +2595,12 @@ void GUI::screenChanged(QScreen *screen)
SLOT(logicalDotsPerInchChanged(qreal))); SLOT(logicalDotsPerInchChanged(qreal)));
connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this, connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal))); SLOT(logicalDotsPerInchChanged(qreal)));
#else // ENABLE_HIDPI
Q_UNUSED(screen);
#endif // ENABLE_HIDPI
} }
void GUI::logicalDotsPerInchChanged(qreal dpi) void GUI::logicalDotsPerInchChanged(qreal dpi)
{ {
Q_UNUSED(dpi) Q_UNUSED(dpi)
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(), _mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0); _options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENBLE_HIDPI
} }

View File

@ -91,7 +91,6 @@ private slots:
void setDegreesMinutes() {setCoordinatesFormat(DegreesMinutes);} void setDegreesMinutes() {setCoordinatesFormat(DegreesMinutes);}
void setDMS() {setCoordinatesFormat(DMS);} void setDMS() {setCoordinatesFormat(DMS);}
void sliderPositionChanged(qreal pos);
void screenChanged(QScreen *screen); void screenChanged(QScreen *screen);
void logicalDotsPerInchChanged(qreal dpi); void logicalDotsPerInchChanged(qreal dpi);
@ -207,6 +206,7 @@ private:
QAction *_showAreasAction; QAction *_showAreasAction;
QAction *_showRouteWaypointsAction; QAction *_showRouteWaypointsAction;
QAction *_showMarkersAction; QAction *_showMarkersAction;
QAction *_showMarkerInfoAction;
QAction *_showTicksAction; QAction *_showTicksAction;
QAction *_showCoordinatesAction; QAction *_showCoordinatesAction;
QAction *_openOptionsAction; QAction *_openOptionsAction;
@ -236,7 +236,7 @@ private:
DateTimeRange _dateRange; DateTimeRange _dateRange;
QString _pathName; QString _pathName;
qreal _sliderPos; GraphTab *_lastGraphTab;
QList<QByteArray> _windowStates; QList<QByteArray> _windowStates;
int _frameStyle; int _frameStyle;

View File

@ -18,9 +18,9 @@ void InfoItem::updateBoundingRect()
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin(); for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
i != _list.constEnd(); i++) { i != _list.constEnd(); i++) {
width += fm.width(i->key() + ": "); width += fm.horizontalAdvance(i->key() + ": " + i->value());
width += fm.width(i->value()) + ((i == _list.constEnd() - 1) if (i != _list.constEnd() - 1)
? 0 : PADDING); width += PADDING;
} }
_boundingRect = QRectF(0, 0, width, _list.isEmpty() ? 0 : fm.height()); _boundingRect = QRectF(0, 0, width, _list.isEmpty() ? 0 : fm.height());
@ -39,12 +39,11 @@ void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin(); for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
i != _list.constEnd(); i++) { i != _list.constEnd(); i++) {
painter->drawText(width, fm.height() - fm.descent(), i->key() + ": "); QString text(i->key() + ": " + i->value());
width += fm.width(i->key() + ": "); painter->drawText(width, fm.height() - fm.descent(), text);
painter->drawText(width, fm.height() - fm.descent(), i->value()); width += fm.horizontalAdvance(text);
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
? 0 : PADDING);
if (i != _list.constEnd() - 1) { if (i != _list.constEnd() - 1) {
width += PADDING;
painter->save(); painter->save();
painter->setPen(Qt::gray); painter->setPen(Qt::gray);
painter->drawLine(width - PADDING/2, fm.descent(), painter->drawLine(width - PADDING/2, fm.descent(),

View File

@ -4,11 +4,11 @@
#include <QApplication> #include <QApplication>
#include <QScrollBar> #include <QScrollBar>
#include <QClipboard> #include <QClipboard>
#include <QOpenGLWidget>
#include "data/poi.h" #include "data/poi.h"
#include "data/data.h" #include "data/data.h"
#include "map/map.h" #include "map/map.h"
#include "map/pcs.h" #include "map/pcs.h"
#include "opengl.h"
#include "trackitem.h" #include "trackitem.h"
#include "routeitem.h" #include "routeitem.h"
#include "waypointitem.h" #include "waypointitem.h"
@ -67,10 +67,12 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
_coordinates->setVisible(false); _coordinates->setVisible(false);
_scene->addItem(_coordinates); _scene->addItem(_coordinates);
_projection = PCS::pcs(3857); _outputProjection = PCS::pcs(3857);
_inputProjection = GCS::gcs(4326);
_map = map; _map = map;
_map->load(); _map->load();
_map->setProjection(_projection); _map->setOutputProjection(_outputProjection);
_map->setInputProjection(_inputProjection);
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap())); connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
_poi = poi; _poi = poi;
@ -91,6 +93,7 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
_overlapPOIs = true; _overlapPOIs = true;
_showRouteWaypoints = true; _showRouteWaypoints = true;
_showMarkers = true; _showMarkers = true;
_showMarkerInfo = false;
_showPathTicks = false; _showPathTicks = false;
_trackWidth = 3; _trackWidth = 3;
_routeWidth = 3; _routeWidth = 3;
@ -101,10 +104,8 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
_poiSize = 8; _poiSize = 8;
_poiColor = Qt::black; _poiColor = Qt::black;
#ifdef ENABLE_HIDPI
_deviceRatio = 1.0; _deviceRatio = 1.0;
_mapRatio = 1.0; _mapRatio = 1.0;
#endif // ENABLE_HIDPI
_opengl = false; _opengl = false;
_plot = false; _plot = false;
_digitalZoom = 0; _digitalZoom = 0;
@ -141,6 +142,7 @@ PathItem *MapView::addTrack(const Track &track)
ti->setDigitalZoom(_digitalZoom); ti->setDigitalZoom(_digitalZoom);
ti->setMarkerColor(_markerColor); ti->setMarkerColor(_markerColor);
ti->showMarker(_showMarkers); ti->showMarker(_showMarkers);
ti->showMarkerInfo(_showMarkerInfo);
ti->showTicks(_showPathTicks); ti->showTicks(_showPathTicks);
_scene->addItem(ti); _scene->addItem(ti);
@ -169,6 +171,7 @@ PathItem *MapView::addRoute(const Route &route)
ri->setDigitalZoom(_digitalZoom); ri->setDigitalZoom(_digitalZoom);
ri->setMarkerColor(_markerColor); ri->setMarkerColor(_markerColor);
ri->showMarker(_showMarkers); ri->showMarker(_showMarkers);
ri->showMarkerInfo(_showMarkerInfo);
ri->showTicks(_showPathTicks); ri->showTicks(_showPathTicks);
_scene->addItem(ri); _scene->addItem(ri);
@ -371,10 +374,9 @@ void MapView::setMap(Map *map)
_map = map; _map = map;
_map->load(); _map->load();
_map->setProjection(_projection); _map->setOutputProjection(_outputProjection);
#ifdef ENABLE_HIDPI _map->setInputProjection(_inputProjection);
_map->setDevicePixelRatio(_deviceRatio, _mapRatio); _map->setDevicePixelRatio(_deviceRatio, _mapRatio);
#endif // ENABLE_HIDPI
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap())); connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
digitalZoom(0); digitalZoom(0);
@ -413,6 +415,14 @@ void MapView::setPOI(POI *poi)
updatePOI(); updatePOI();
} }
void MapView::setGraph(int index)
{
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setGraph(index);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setGraph(index);
}
void MapView::updatePOI() void MapView::updatePOI()
{ {
for (POIHash::const_iterator it = _pois.constBegin(); for (POIHash::const_iterator it = _pois.constBegin();
@ -480,12 +490,8 @@ void MapView::setCoordinatesFormat(CoordinatesFormat format)
void MapView::setTimeZone(const QTimeZone &zone) void MapView::setTimeZone(const QTimeZone &zone)
{ {
#ifdef ENABLE_TIMEZONES
WaypointItem::setTimeZone(zone); WaypointItem::setTimeZone(zone);
PathItem::setTimeZone(zone); PathItem::setTimeZone(zone);
#else // ENABLE_TIMEZONES
Q_UNUSED(zone);
#endif // ENABLE_TIMEZONES
} }
void MapView::clearMapCache() void MapView::clearMapCache()
@ -520,10 +526,8 @@ void MapView::digitalZoom(int zoom)
_coordinates->setDigitalZoom(_digitalZoom); _coordinates->setDigitalZoom(_digitalZoom);
} }
void MapView::zoom(int zoom, const QPoint &pos) void MapView::zoom(int zoom, const QPoint &pos, bool shift)
{ {
bool shift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
if (_digitalZoom) { if (_digitalZoom) {
if (((_digitalZoom > 0 && zoom > 0) && (!shift || _digitalZoom if (((_digitalZoom > 0 && zoom > 0) && (!shift || _digitalZoom
>= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift >= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
@ -549,17 +553,28 @@ void MapView::zoom(int zoom, const QPoint &pos)
void MapView::wheelEvent(QWheelEvent *event) void MapView::wheelEvent(QWheelEvent *event)
{ {
static int deg = 0; static int deg = 0;
bool shift = (event->modifiers() & MODIFIER) ? true : false;
// Shift inverts the wheel axis on OS X, so use scrolling in both axes for
// the zoom.
int delta = event->angleDelta().y()
? event->angleDelta().y() : event->angleDelta().x();
deg += event->delta() / 8; deg += delta / 8;
if (qAbs(deg) < 15) if (qAbs(deg) < 15)
return; return;
deg = 0; deg = 0;
zoom((event->delta() > 0) ? 1 : -1, event->pos()); #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
zoom((delta > 0) ? 1 : -1, event->pos(), shift);
#else // QT 5.15
zoom((delta > 0) ? 1 : -1, event->position().toPoint(), shift);
#endif // QT 5.15
} }
void MapView::mouseDoubleClickEvent(QMouseEvent *event) void MapView::mouseDoubleClickEvent(QMouseEvent *event)
{ {
bool shift = (event->modifiers() & MODIFIER) ? true : false;
QGraphicsView::mouseDoubleClickEvent(event); QGraphicsView::mouseDoubleClickEvent(event);
if (event->isAccepted()) if (event->isAccepted())
return; return;
@ -567,13 +582,13 @@ void MapView::mouseDoubleClickEvent(QMouseEvent *event)
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton) if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
return; return;
zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos()); zoom((event->button() == Qt::LeftButton) ? 1 : -1, event->pos(), shift);
} }
void MapView::keyPressEvent(QKeyEvent *event) void MapView::keyPressEvent(QKeyEvent *event)
{ {
int z; int z;
bool shift = (event->modifiers() & MODIFIER) ? true : false;
QPoint pos = viewport()->rect().center(); QPoint pos = viewport()->rect().center();
if (event->key() == ZOOM_IN) if (event->key() == ZOOM_IN)
@ -593,7 +608,7 @@ void MapView::keyPressEvent(QKeyEvent *event)
return; return;
} }
zoom(z, pos); zoom(z, pos, shift);
} }
void MapView::keyReleaseEvent(QKeyEvent *event) void MapView::keyReleaseEvent(QKeyEvent *event)
@ -626,9 +641,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
// Enter plot mode // Enter plot mode
setUpdatesEnabled(false); setUpdatesEnabled(false);
_plot = true; _plot = true;
#ifdef ENABLE_HIDPI
_map->setDevicePixelRatio(_deviceRatio, 1.0); _map->setDevicePixelRatio(_deviceRatio, 1.0);
#endif // ENABLE_HIDPI
// Compute sizes & ratios // Compute sizes & ratios
orig = viewport()->rect(); orig = viewport()->rect();
@ -695,9 +708,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
_mapScale->setPos(origPos); _mapScale->setPos(origPos);
// Exit plot mode // Exit plot mode
#ifdef ENABLE_HIDPI
_map->setDevicePixelRatio(_deviceRatio, _mapRatio); _map->setDevicePixelRatio(_deviceRatio, _mapRatio);
#endif // ENABLE_HIDPI
_plot = false; _plot = false;
setUpdatesEnabled(true); setUpdatesEnabled(true);
} }
@ -797,6 +808,16 @@ void MapView::showMarkers(bool show)
_routes.at(i)->showMarker(show); _routes.at(i)->showMarker(show);
} }
void MapView::showMarkerInfo(bool show)
{
_showMarkerInfo = show;
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->showMarkerInfo(show);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->showMarkerInfo(show);
}
void MapView::showTicks(bool show) void MapView::showTicks(bool show)
{ {
_showPathTicks = show; _showPathTicks = show;
@ -840,9 +861,9 @@ void MapView::showCoordinates(bool show)
setMouseTracking(show); setMouseTracking(show);
} }
void MapView::setPOIOverlap(bool overlap) void MapView::showOverlappedPOIs(bool show)
{ {
_overlapPOIs = overlap; _overlapPOIs = show;
updatePOIVisibility(); updatePOIVisibility();
} }
@ -1019,7 +1040,7 @@ void MapView::useOpenGL(bool use)
_opengl = use; _opengl = use;
if (use) if (use)
setViewport(new OPENGL_WIDGET); setViewport(new QOpenGLWidget);
else else
setViewport(new QWidget); setViewport(new QWidget);
} }
@ -1039,6 +1060,14 @@ void MapView::setMarkerColor(const QColor &color)
_routes.at(i)->setMarkerColor(color); _routes.at(i)->setMarkerColor(color);
} }
void MapView::setMarkerPosition(qreal pos)
{
for (int i = 0; i < _tracks.size(); i++)
_tracks.at(i)->setMarkerPosition(pos);
for (int i = 0; i < _routes.size(); i++)
_routes.at(i)->setMarkerPosition(pos);
}
void MapView::reloadMap() void MapView::reloadMap()
{ {
_scene->invalidate(); _scene->invalidate();
@ -1046,7 +1075,6 @@ void MapView::reloadMap()
void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio) void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
{ {
#ifdef ENABLE_HIDPI
if (_deviceRatio == deviceRatio && _mapRatio == mapRatio) if (_deviceRatio == deviceRatio && _mapRatio == mapRatio)
return; return;
@ -1079,26 +1107,40 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
centerOn(nc); centerOn(nc);
reloadMap(); reloadMap();
#else // ENABLE_HIDPI
Q_UNUSED(deviceRatio);
Q_UNUSED(mapRatio);
#endif // ENABLE_HIDPI
} }
void MapView::setProjection(int id) void MapView::setOutputProjection(int id)
{ {
const PCS *pcs; const PCS *pcs;
const GCS *gcs; const GCS *gcs;
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center())); Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
if ((pcs = PCS::pcs(id))) if ((pcs = PCS::pcs(id)))
_projection = Projection(pcs); _outputProjection = Projection(pcs);
else if ((gcs = GCS::gcs(id))) else if ((gcs = GCS::gcs(id)))
_projection = Projection(gcs); _outputProjection = Projection(gcs);
else else
qWarning("%d: Unknown PCS/GCS id", id); qWarning("%d: Unknown PCS/GCS id", id);
_map->setProjection(_projection); _map->setOutputProjection(_outputProjection);
rescale();
centerOn(_map->ll2xy(center));
}
void MapView::setInputProjection(int id)
{
const PCS *pcs;
const GCS *gcs;
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
if ((pcs = PCS::pcs(id)))
_inputProjection = Projection(pcs);
else if ((gcs = GCS::gcs(id)))
_inputProjection = Projection(gcs);
else
qWarning("%d: Unknown PCS/GCS id", id);
_map->setInputProjection(_inputProjection);
rescale(); rescale();
centerOn(_map->ll2xy(center)); centerOn(_map->ll2xy(center));
} }

View File

@ -56,6 +56,7 @@ public:
void setPalette(const Palette &palette); void setPalette(const Palette &palette);
void setPOI(POI *poi); void setPOI(POI *poi);
void setMap(Map *map); void setMap(Map *map);
void setGraph(int index);
void plot(QPainter *painter, const QRectF &target, qreal scale, void plot(QPainter *painter, const QRectF &target, qreal scale,
PlotFlags flags); PlotFlags flags);
@ -79,28 +80,30 @@ public:
void setBackgroundColor(const QColor &color); void setBackgroundColor(const QColor &color);
void useOpenGL(bool use); void useOpenGL(bool use);
void useAntiAliasing(bool use); void useAntiAliasing(bool use);
void setCoordinatesFormat(CoordinatesFormat format);
void setTimeZone(const QTimeZone &zone);
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
void setOutputProjection(int id);
void setInputProjection(int id);
void clearMapCache();
void fitContentToSize();
public slots: public slots:
void showMap(bool show); void showMap(bool show);
void showPOI(bool show); void showPOI(bool show);
void setPOIOverlap(bool overlap);
void showWaypointLabels(bool show);
void showPOILabels(bool show); void showPOILabels(bool show);
void showCoordinates(bool show);
void showTicks(bool show);
void showMarkers(bool show);
void showMarkerInfo(bool show);
void showOverlappedPOIs(bool show);
void showWaypointLabels(bool show);
void showTracks(bool show); void showTracks(bool show);
void showRoutes(bool show); void showRoutes(bool show);
void showAreas(bool show); void showAreas(bool show);
void showWaypoints(bool show); void showWaypoints(bool show);
void showRouteWaypoints(bool show); void showRouteWaypoints(bool show);
void showMarkers(bool show); void setMarkerPosition(qreal pos);
void showCoordinates(bool show);
void showTicks(bool show);
void clearMapCache();
void setCoordinatesFormat(CoordinatesFormat format);
void setTimeZone(const QTimeZone &zone);
void setDevicePixelRatio(qreal deviceRatio, qreal mapRatio);
void setProjection(int id);
void fitContentToSize();
private slots: private slots:
void updatePOI(); void updatePOI();
@ -122,7 +125,7 @@ private:
QPointF contentCenter() const; QPointF contentCenter() const;
void rescale(); void rescale();
void centerOn(const QPointF &pos); void centerOn(const QPointF &pos);
void zoom(int zoom, const QPoint &pos); void zoom(int zoom, const QPoint &pos, bool shift);
void digitalZoom(int zoom); void digitalZoom(int zoom);
void updatePOIVisibility(); void updatePOIVisibility();
void skipColor() {_palette.nextColor();} void skipColor() {_palette.nextColor();}
@ -155,11 +158,11 @@ private:
Palette _palette; Palette _palette;
qreal _mapOpacity; qreal _mapOpacity;
Projection _projection; Projection _outputProjection, _inputProjection;
bool _showMap, _showTracks, _showRoutes, _showAreas, _showWaypoints, bool _showMap, _showTracks, _showRoutes, _showAreas, _showWaypoints,
_showWaypointLabels, _showPOI, _showPOILabels, _showRouteWaypoints, _showWaypointLabels, _showPOI, _showPOILabels, _showRouteWaypoints,
_showMarkers, _showPathTicks; _showMarkers, _showMarkerInfo, _showPathTicks;
bool _overlapPOIs; bool _overlapPOIs;
int _trackWidth, _routeWidth, _areaWidth; int _trackWidth, _routeWidth, _areaWidth;
Qt::PenStyle _trackStyle, _routeStyle, _areaStyle; Qt::PenStyle _trackStyle, _routeStyle, _areaStyle;
@ -171,10 +174,8 @@ private:
bool _plot; bool _plot;
QCursor _cursor; QCursor _cursor;
#ifdef ENABLE_HIDPI
qreal _deviceRatio; qreal _deviceRatio;
qreal _mapRatio; qreal _mapRatio;
#endif // ENABLE_HIDPI
bool _opengl; bool _opengl;
}; };

View File

@ -1,44 +0,0 @@
#ifndef MARGINS_H
#define MARGINS_H
#include <QtGlobal>
#include <QDebug>
class MarginsF
{
public:
MarginsF() {_left = 0; _top = 0; _right = 0; _bottom = 0;}
MarginsF(qreal left, qreal top, qreal right, qreal bottom)
{_left = left, _top = top; _right = right; _bottom = bottom;}
qreal left() const {return _left;}
qreal top() const {return _top;}
qreal right() const {return _right;}
qreal bottom() const {return _bottom;}
private:
qreal _left, _top, _right, _bottom;
};
inline MarginsF operator*(const MarginsF &margins, qreal factor)
{
return MarginsF(margins.left() * factor, margins.top() * factor,
margins.right() * factor, margins.bottom() * factor);
}
inline MarginsF operator/(const MarginsF &margins, qreal factor)
{
return MarginsF(margins.left() / factor, margins.top() / factor,
margins.right() / factor, margins.bottom() / factor);
}
#ifndef QT_NO_DEBUG
inline QDebug operator<<(QDebug dbg, const MarginsF &margins)
{
dbg.nospace() << "MarginsF(" << margins.left() << ", " << margins.top()
<< ", " << margins.right() << margins.bottom() << ")";
return dbg.space();
}
#endif // QT_NO_DEBUG
#endif // MARGINS_H

View File

@ -75,7 +75,7 @@ MarginsFWidget::MarginsFWidget(QWidget *parent) : QWidget(parent)
setLayout(layout); setLayout(layout);
} }
void MarginsFWidget::setValue(const MarginsF &value) void MarginsFWidget::setValue(const QMarginsF &value)
{ {
_top->setValue(value.top()); _top->setValue(value.top());
_bottom->setValue(value.bottom()); _bottom->setValue(value.bottom());
@ -104,8 +104,8 @@ void MarginsFWidget::setSingleStep(qreal step)
_right->setSingleStep(step); _right->setSingleStep(step);
} }
MarginsF MarginsFWidget::value() const QMarginsF MarginsFWidget::value() const
{ {
return MarginsF(_left->value(), _top->value(), _right->value(), return QMarginsF(_left->value(), _top->value(), _right->value(),
_bottom->value()); _bottom->value());
} }

View File

@ -3,7 +3,6 @@
#include <QWidget> #include <QWidget>
#include <QMargins> #include <QMargins>
#include "margins.h"
class QSpinBox; class QSpinBox;
class QDoubleSpinBox; class QDoubleSpinBox;
@ -33,8 +32,8 @@ class MarginsFWidget : public QWidget
public: public:
MarginsFWidget(QWidget *parent = 0); MarginsFWidget(QWidget *parent = 0);
MarginsF value() const; QMarginsF value() const;
void setValue(const MarginsF &value); void setValue(const QMarginsF &value);
void setUnits(const QString &units); void setUnits(const QString &units);
void setSingleStep(qreal step); void setSingleStep(qreal step);

View File

@ -0,0 +1,73 @@
#include <QPainter>
#include <QDateTime>
#include <QLocale>
#include "font.h"
#include "markerinfoitem.h"
#define OFFSET 7
MarkerInfoItem::MarkerInfoItem(QGraphicsItem *parent) : QGraphicsItem(parent)
{
_color = Qt::red;
_font.setPixelSize(FONT_SIZE);
_font.setFamily(FONT_FAMILY);
}
void MarkerInfoItem::setDate(const QDateTime &date)
{
prepareGeometryChange();
QLocale l;
_date = l.toString(date.date(), QLocale::ShortFormat);
_time = l.toString(date.time(), QLocale::ShortFormat);
updateBoundingRect();
}
void MarkerInfoItem::updateBoundingRect()
{
QFontMetrics fm(_font);
qreal width = qMax(fm.boundingRect(_date).width(),
fm.boundingRect(_time).width());
qreal height = 2 * fm.height() - 2*fm.descent();
_boundingRect = QRectF(-OFFSET/2, -height/2, width + 1.5*OFFSET, height);
}
void MarkerInfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
*option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
QFontMetrics fm(_font);
QRectF rd(OFFSET, -fm.height() + fm.descent(),
fm.boundingRect(_date).width(), fm.height() - fm.descent());
QRectF rt(OFFSET, 0, fm.boundingRect(_time).width(), fm.height()
- fm.descent());
painter->setPen(Qt::NoPen);
QColor bc(painter->background().color());
bc.setAlpha(196);
painter->setBrush(QBrush(bc));
painter->drawRect(rt);
painter->drawRect(rd);
painter->setBrush(Qt::NoBrush);
painter->setFont(_font);
painter->setPen(_color);
painter->drawText(OFFSET, -fm.descent()/2, _date);
painter->drawText(OFFSET, fm.height() - fm.descent()*1.5, _time);
//painter->drawRect(boundingRect());
}
void MarkerInfoItem::setColor(const QColor &color)
{
_color = color;
update();
}

27
src/GUI/markerinfoitem.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef MARKERINFOITEM_H
#define MARKERINFOITEM_H
#include <QGraphicsItem>
class MarkerInfoItem : public QGraphicsItem
{
public:
MarkerInfoItem(QGraphicsItem *parent = 0);
QRectF boundingRect() const {return _boundingRect;}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
void setDate(const QDateTime &date);
void setColor(const QColor &color);
private:
void updateBoundingRect();
QString _date, _time;
QRectF _boundingRect;
QColor _color;
QFont _font;
};
#endif // MARKERINFOITEM_H

View File

@ -1,28 +0,0 @@
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
#include <QGLWidget>
#include <QGLFormat>
#else
#include <QOpenGLWidget>
#include <QSurfaceFormat>
#endif
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
#define OPENGL_WIDGET QGLWidget
#else
#define OPENGL_WIDGET QOpenGLWidget
#endif
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
#define OPENGL_SET_FORMAT(samples, stencilBuffer) \
{QGLFormat fmt; \
fmt.setStencilBufferSize(stencilBuffer); \
fmt.setSamples(samples); \
QGLFormat::setDefaultFormat(fmt);}
#else
#define OPENGL_SET_FORMAT(samples, stencilBuffer) \
{QSurfaceFormat fmt; \
fmt.setStencilBufferSize(stencilBuffer); \
fmt.setSamples(samples); \
QSurfaceFormat::setDefaultFormat(fmt);}
#endif

View File

@ -46,19 +46,53 @@ void OptionsDialog::automaticPauseDetectionSet(bool set)
QWidget *OptionsDialog::createMapPage() QWidget *OptionsDialog::createMapPage()
{ {
_projection = new LimitedComboBox(200); int last = -1;
_outputProjection = new LimitedComboBox(200);
QList<KV<int, QString> > projections(GCS::list() + PCS::list()); QList<KV<int, QString> > projections(GCS::list() + PCS::list());
qSort(projections); std::sort(projections.begin(), projections.end());
for (int i = 0; i < projections.size(); i++) { for (int i = 0; i < projections.size(); i++) {
QString text = QString::number(projections.at(i).key()) + " - " const KV<int, QString> &proj = projections.at(i);
+ projections.at(i).value(); // There may be same EPSG codes with different names
_projection->addItem(text, QVariant(projections.at(i).key())); if (proj.key() == last)
continue;
else
last = proj.key();
QString text = QString::number(proj.key()) + " - " + proj.value();
_outputProjection->addItem(text, QVariant(proj.key()));
} }
_projection->setCurrentIndex(_projection->findData(_options.projection)); _outputProjection->setCurrentIndex(_outputProjection->findData(
_options.outputProjection));
_inputProjection = new LimitedComboBox(200);
last = -1;
for (int i = 0; i < projections.size(); i++) {
const KV<int, QString> &proj = projections.at(i);
// There may be same EPSG codes with different names
if (proj.key() == last)
continue;
else
last = proj.key();
if (proj.key() == 4326 || proj.key() == 3857) {
QString text = QString::number(proj.key()) + " - " + proj.value();
_inputProjection->addItem(text, QVariant(proj.key()));
}
}
_inputProjection->setCurrentIndex(_inputProjection->findData(
_options.inputProjection));
QLabel *inInfo = new QLabel(tr("Select the proper projection of"
" JNX and KMZ maps. Both EPSG:3857 and EPSG:4326 projected maps"
" exist and there is no projection info in the map file."));
QLabel *outInfo = new QLabel(tr("Select the desired projection of IMG"
" maps. The projection must be valid for the whole map area."));
QFont f = inInfo->font();
f.setPointSize(f.pointSize() - 1);
inInfo->setWordWrap(true);
outInfo->setWordWrap(true);
inInfo->setFont(f);
outInfo->setFont(f);
#ifdef ENABLE_HIDPI
_hidpi = new QRadioButton(tr("High-resolution")); _hidpi = new QRadioButton(tr("High-resolution"));
_lodpi = new QRadioButton(tr("Standard")); _lodpi = new QRadioButton(tr("Standard"));
if (_options.hidpiMap) if (_options.hidpiMap)
@ -69,24 +103,39 @@ QWidget *OptionsDialog::createMapPage()
"The map is sharp but map objects are small/hard to read.")); "The map is sharp but map objects are small/hard to read."));
QLabel *llo = new QLabel(tr("Non-HiDPI maps are loaded such as they are. " QLabel *llo = new QLabel(tr("Non-HiDPI maps are loaded such as they are. "
"Map objects have the expected size but the map is blurry.")); "Map objects have the expected size but the map is blurry."));
QFont f = lhi->font();
f.setPointSize(f.pointSize() - 1);
lhi->setWordWrap(true); lhi->setWordWrap(true);
llo->setWordWrap(true); llo->setWordWrap(true);
lhi->setFont(f); lhi->setFont(f);
llo->setFont(f); llo->setFont(f);
#endif // ENABLE_HIDPI
QFormLayout *vectorLayout = new QFormLayout(); QVBoxLayout *inLayout = new QVBoxLayout();
vectorLayout->addRow(tr("Projection:"), _projection); inLayout->addWidget(_inputProjection);
inLayout->addWidget(inInfo);
QVBoxLayout *outLayout = new QVBoxLayout();
outLayout->addWidget(_outputProjection);
outLayout->addWidget(outInfo);
#ifndef Q_OS_MAC
QGroupBox *inBox = new QGroupBox(tr("Input"));
inBox->setLayout(inLayout);
QGroupBox *outBox = new QGroupBox(tr("Output"));
outBox->setLayout(outLayout);
#endif // Q_OS_MAC
QWidget *vectorMapsTab = new QWidget(); QWidget *projectionTab = new QWidget();
QVBoxLayout *vectorMapsTabLayout = new QVBoxLayout(); QVBoxLayout *projectionTabLayout = new QVBoxLayout();
vectorMapsTabLayout->addLayout(vectorLayout); #ifdef Q_OS_MAC
vectorMapsTabLayout->addStretch(); projectionTabLayout->addWidget(new QLabel(tr("Input:")));
vectorMapsTab->setLayout(vectorMapsTabLayout); projectionTabLayout->addLayout(inLayout);
projectionTabLayout->addWidget(line());
projectionTabLayout->addWidget(new QLabel(tr("Output:")));
projectionTabLayout->addLayout(outLayout);
#else // Q_OS_MAC
projectionTabLayout->addWidget(inBox);
projectionTabLayout->addWidget(outBox);
#endif // Q_OS_MAC
projectionTabLayout->addStretch();
projectionTab->setLayout(projectionTabLayout);
#ifdef ENABLE_HIDPI
QVBoxLayout *hidpiTabLayout = new QVBoxLayout(); QVBoxLayout *hidpiTabLayout = new QVBoxLayout();
hidpiTabLayout->addWidget(_lodpi); hidpiTabLayout->addWidget(_lodpi);
hidpiTabLayout->addWidget(llo); hidpiTabLayout->addWidget(llo);
@ -97,13 +146,10 @@ QWidget *OptionsDialog::createMapPage()
QWidget *hidpiTab = new QWidget(); QWidget *hidpiTab = new QWidget();
hidpiTab->setLayout(hidpiTabLayout); hidpiTab->setLayout(hidpiTabLayout);
#endif // ENABLE_HIDPI
QTabWidget *mapPage = new QTabWidget(); QTabWidget *mapPage = new QTabWidget();
mapPage->addTab(vectorMapsTab, tr("Vector maps")); mapPage->addTab(projectionTab, tr("Projection"));
#ifdef ENABLE_HIDPI
mapPage->addTab(hidpiTab, tr("HiDPI display mode")); mapPage->addTab(hidpiTab, tr("HiDPI display mode"));
#endif // ENABLE_HIDPI
return mapPage; return mapPage;
} }
@ -416,7 +462,6 @@ QWidget *OptionsDialog::createDataPage()
_showSecondaryElevation = new QCheckBox(tr("Show secondary elevation")); _showSecondaryElevation = new QCheckBox(tr("Show secondary elevation"));
_showSecondaryElevation->setChecked(_options.showSecondaryElevation); _showSecondaryElevation->setChecked(_options.showSecondaryElevation);
#ifdef ENABLE_TIMEZONES
_utcZone = new QRadioButton(tr("UTC")); _utcZone = new QRadioButton(tr("UTC"));
_systemZone = new QRadioButton(tr("System")); _systemZone = new QRadioButton(tr("System"));
_customZone = new QRadioButton(tr("Custom")); _customZone = new QRadioButton(tr("Custom"));
@ -437,7 +482,6 @@ QWidget *OptionsDialog::createDataPage()
QHBoxLayout *customZoneLayout = new QHBoxLayout(); QHBoxLayout *customZoneLayout = new QHBoxLayout();
customZoneLayout->addSpacing(20); customZoneLayout->addSpacing(20);
customZoneLayout->addWidget(_timeZone); customZoneLayout->addWidget(_timeZone);
#endif // ENABLE_TIMEZONES
_useSegments = new QCheckBox(tr("Use segments")); _useSegments = new QCheckBox(tr("Use segments"));
_useSegments->setChecked(_options.useSegments); _useSegments->setChecked(_options.useSegments);
@ -462,7 +506,6 @@ QWidget *OptionsDialog::createDataPage()
elevationOptions->addWidget(_dataDEMElevation); elevationOptions->addWidget(_dataDEMElevation);
elevationOptions->addWidget(_showSecondaryElevation); elevationOptions->addWidget(_showSecondaryElevation);
#ifdef ENABLE_TIMEZONES
QButtonGroup *timeZoneGroup = new QButtonGroup(this); QButtonGroup *timeZoneGroup = new QButtonGroup(this);
timeZoneGroup->addButton(_utcZone); timeZoneGroup->addButton(_utcZone);
timeZoneGroup->addButton(_systemZone); timeZoneGroup->addButton(_systemZone);
@ -472,15 +515,12 @@ QWidget *OptionsDialog::createDataPage()
zoneOptions->addWidget(_systemZone); zoneOptions->addWidget(_systemZone);
zoneOptions->addWidget(_customZone); zoneOptions->addWidget(_customZone);
zoneOptions->addItem(customZoneLayout); zoneOptions->addItem(customZoneLayout);
#endif // ENABLE_TIMEZONES
QFormLayout *formLayout = new QFormLayout(); QFormLayout *formLayout = new QFormLayout();
formLayout->addRow(tr("Speed:"), speedOptions); formLayout->addRow(tr("Speed:"), speedOptions);
formLayout->addRow(tr("Elevation:"), elevationOptions); formLayout->addRow(tr("Elevation:"), elevationOptions);
#ifdef ENABLE_TIMEZONES
formLayout->addRow(tr("Time zone:"), zoneOptions); formLayout->addRow(tr("Time zone:"), zoneOptions);
#endif // ENABLE_TIMEZONES
QFormLayout *segmentsLayout = new QFormLayout(); QFormLayout *segmentsLayout = new QFormLayout();
segmentsLayout->addWidget(_useSegments); segmentsLayout->addWidget(_useSegments);
@ -492,9 +532,7 @@ QWidget *OptionsDialog::createDataPage()
#else // Q_OS_MAC #else // Q_OS_MAC
QFormLayout *speedLayout = new QFormLayout(); QFormLayout *speedLayout = new QFormLayout();
QFormLayout *elevationLayout = new QFormLayout(); QFormLayout *elevationLayout = new QFormLayout();
#ifdef ENABLE_TIMEZONES
QFormLayout *timeZoneLayout = new QFormLayout(); QFormLayout *timeZoneLayout = new QFormLayout();
#endif // ENABLE_TIMEZONES
QFormLayout *segmentsLayout = new QFormLayout(); QFormLayout *segmentsLayout = new QFormLayout();
speedLayout->addWidget(_computedSpeed); speedLayout->addWidget(_computedSpeed);
@ -511,7 +549,6 @@ QWidget *OptionsDialog::createDataPage()
QGroupBox *elevationBox = new QGroupBox(tr("Elevation")); QGroupBox *elevationBox = new QGroupBox(tr("Elevation"));
elevationBox->setLayout(elevationLayout); elevationBox->setLayout(elevationLayout);
#ifdef ENABLE_TIMEZONES
timeZoneLayout->addWidget(_utcZone); timeZoneLayout->addWidget(_utcZone);
timeZoneLayout->addWidget(_systemZone); timeZoneLayout->addWidget(_systemZone);
timeZoneLayout->addWidget(_customZone); timeZoneLayout->addWidget(_customZone);
@ -519,15 +556,12 @@ QWidget *OptionsDialog::createDataPage()
QGroupBox *timeZoneBox = new QGroupBox(tr("Time zone")); QGroupBox *timeZoneBox = new QGroupBox(tr("Time zone"));
timeZoneBox->setLayout(timeZoneLayout); timeZoneBox->setLayout(timeZoneLayout);
#endif // ENABLE_TIMEZONES
segmentsLayout->addWidget(_useSegments); segmentsLayout->addWidget(_useSegments);
sourceTabLayout->addWidget(speedBox); sourceTabLayout->addWidget(speedBox);
sourceTabLayout->addWidget(elevationBox); sourceTabLayout->addWidget(elevationBox);
#ifdef ENABLE_TIMEZONES
sourceTabLayout->addWidget(timeZoneBox); sourceTabLayout->addWidget(timeZoneBox);
#endif // ENABLE_TIMEZONES
sourceTabLayout->addLayout(segmentsLayout); sourceTabLayout->addLayout(segmentsLayout);
#endif // Q_OS_MAC #endif // Q_OS_MAC
sourceTabLayout->addStretch(); sourceTabLayout->addStretch();
@ -648,10 +682,8 @@ QWidget *OptionsDialog::createSystemPage()
{ {
_useOpenGL = new QCheckBox(tr("Use OpenGL")); _useOpenGL = new QCheckBox(tr("Use OpenGL"));
_useOpenGL->setChecked(_options.useOpenGL); _useOpenGL->setChecked(_options.useOpenGL);
#ifdef ENABLE_HTTP2
_enableHTTP2 = new QCheckBox(tr("Enable HTTP/2")); _enableHTTP2 = new QCheckBox(tr("Enable HTTP/2"));
_enableHTTP2->setChecked(_options.enableHTTP2); _enableHTTP2->setChecked(_options.enableHTTP2);
#endif // ENABLE_HTTP2
_pixmapCache = new QSpinBox(); _pixmapCache = new QSpinBox();
_pixmapCache->setMinimum(16); _pixmapCache->setMinimum(16);
@ -670,9 +702,7 @@ QWidget *OptionsDialog::createSystemPage()
formLayout->addRow(tr("Connection timeout:"), _connectionTimeout); formLayout->addRow(tr("Connection timeout:"), _connectionTimeout);
QFormLayout *checkboxLayout = new QFormLayout(); QFormLayout *checkboxLayout = new QFormLayout();
#ifdef ENABLE_HTTP2
checkboxLayout->addWidget(_enableHTTP2); checkboxLayout->addWidget(_enableHTTP2);
#endif // ENABLE_HTTP2
checkboxLayout->addWidget(_useOpenGL); checkboxLayout->addWidget(_useOpenGL);
QWidget *systemTab = new QWidget(); QWidget *systemTab = new QWidget();
@ -764,11 +794,11 @@ void OptionsDialog::accept()
_options.sliderColor = _sliderColor->color(); _options.sliderColor = _sliderColor->color();
_options.graphAntiAliasing = _graphAA->isChecked(); _options.graphAntiAliasing = _graphAA->isChecked();
_options.projection = _projection->itemData(_projection->currentIndex()) _options.outputProjection = _outputProjection->itemData(
.toInt(); _outputProjection->currentIndex()).toInt();
#ifdef ENABLE_HIDPI _options.inputProjection = _inputProjection->itemData(
_inputProjection->currentIndex()).toInt();
_options.hidpiMap = _hidpi->isChecked(); _options.hidpiMap = _hidpi->isChecked();
#endif // ENABLE_HIDPI
_options.elevationFilter = _elevationFilter->value(); _options.elevationFilter = _elevationFilter->value();
_options.speedFilter = _speedFilter->value(); _options.speedFilter = _speedFilter->value();
@ -787,13 +817,11 @@ void OptionsDialog::accept()
_options.dataUseDEM = _dataDEMElevation->isChecked(); _options.dataUseDEM = _dataDEMElevation->isChecked();
_options.showSecondaryElevation = _showSecondaryElevation->isChecked(); _options.showSecondaryElevation = _showSecondaryElevation->isChecked();
_options.showSecondarySpeed = _showSecondarySpeed->isChecked(); _options.showSecondarySpeed = _showSecondarySpeed->isChecked();
#ifdef ENABLE_TIMEZONES
_options.timeZone.setType(_utcZone->isChecked() _options.timeZone.setType(_utcZone->isChecked()
? TimeZoneInfo::UTC : _systemZone->isChecked() ? TimeZoneInfo::UTC : _systemZone->isChecked()
? TimeZoneInfo::System : TimeZoneInfo::Custom); ? TimeZoneInfo::System : TimeZoneInfo::Custom);
_options.timeZone.setCustomZone(QTimeZone(_timeZone->currentText() _options.timeZone.setCustomZone(QTimeZone(_timeZone->currentText()
.toLatin1())); .toLatin1()));
#endif // ENABLE_TIMEZONES
_options.useSegments = _useSegments->isChecked(); _options.useSegments = _useSegments->isChecked();
qreal poiRadius = (_units == Imperial) qreal poiRadius = (_units == Imperial)
@ -803,9 +831,7 @@ void OptionsDialog::accept()
_options.poiRadius = poiRadius; _options.poiRadius = poiRadius;
_options.useOpenGL = _useOpenGL->isChecked(); _options.useOpenGL = _useOpenGL->isChecked();
#ifdef ENABLE_HTTP2
_options.enableHTTP2 = _enableHTTP2->isChecked(); _options.enableHTTP2 = _enableHTTP2->isChecked();
#endif // ENABLE_HTTP2
_options.pixmapCache = _pixmapCache->value(); _options.pixmapCache = _pixmapCache->value();
_options.connectionTimeout = _connectionTimeout->value(); _options.connectionTimeout = _connectionTimeout->value();

View File

@ -2,12 +2,9 @@
#define OPTIONSDIALOG_H #define OPTIONSDIALOG_H
#include <QDialog> #include <QDialog>
#include "common/config.h"
#include "palette.h" #include "palette.h"
#include "units.h" #include "units.h"
#ifdef ENABLE_TIMEZONES
#include "timezoneinfo.h" #include "timezoneinfo.h"
#endif // ENABLE_TIMEZONES
class ColorBox; class ColorBox;
class StyleComboBox; class StyleComboBox;
@ -42,10 +39,9 @@ struct Options {
int mapOpacity; int mapOpacity;
QColor backgroundColor; QColor backgroundColor;
// Map // Map
int projection; int outputProjection;
#ifdef ENABLE_HIDPI int inputProjection;
bool hidpiMap; bool hidpiMap;
#endif // ENABLE_HIDPI
// Data // Data
int elevationFilter; int elevationFilter;
int speedFilter; int speedFilter;
@ -60,17 +56,13 @@ struct Options {
bool dataUseDEM; bool dataUseDEM;
bool showSecondaryElevation; bool showSecondaryElevation;
bool showSecondarySpeed; bool showSecondarySpeed;
#ifdef ENABLE_TIMEZONES
TimeZoneInfo timeZone; TimeZoneInfo timeZone;
#endif // ENABLE_TIMEZONES
bool useSegments; bool useSegments;
// POI // POI
int poiRadius; int poiRadius;
// System // System
bool useOpenGL; bool useOpenGL;
#ifdef ENABLE_HTTP2
bool enableHTTP2; bool enableHTTP2;
#endif // ENABLE_HTTP2
int pixmapCache; int pixmapCache;
int connectionTimeout; int connectionTimeout;
// Print/Export // Print/Export
@ -129,11 +121,10 @@ private:
ColorBox *_sliderColor; ColorBox *_sliderColor;
QCheckBox *_graphAA; QCheckBox *_graphAA;
// Map // Map
LimitedComboBox *_projection; LimitedComboBox *_outputProjection;
#ifdef ENABLE_HIDPI LimitedComboBox *_inputProjection;
QRadioButton *_hidpi; QRadioButton *_hidpi;
QRadioButton *_lodpi; QRadioButton *_lodpi;
#endif // ENABLE_HIDPI
// Data // Data
OddSpinBox *_elevationFilter; OddSpinBox *_elevationFilter;
OddSpinBox *_speedFilter; OddSpinBox *_speedFilter;
@ -151,12 +142,10 @@ private:
QRadioButton *_dataDEMElevation; QRadioButton *_dataDEMElevation;
QCheckBox *_showSecondaryElevation; QCheckBox *_showSecondaryElevation;
QCheckBox *_showSecondarySpeed; QCheckBox *_showSecondarySpeed;
#ifdef ENABLE_TIMEZONES
QRadioButton *_utcZone; QRadioButton *_utcZone;
QRadioButton *_systemZone; QRadioButton *_systemZone;
QRadioButton *_customZone; QRadioButton *_customZone;
QComboBox *_timeZone; QComboBox *_timeZone;
#endif // ENABLE_TIMEZONES
QCheckBox *_useSegments; QCheckBox *_useSegments;
// POI // POI
QDoubleSpinBox *_poiRadius; QDoubleSpinBox *_poiRadius;
@ -164,9 +153,7 @@ private:
QSpinBox *_pixmapCache; QSpinBox *_pixmapCache;
QSpinBox *_connectionTimeout; QSpinBox *_connectionTimeout;
QCheckBox *_useOpenGL; QCheckBox *_useOpenGL;
#ifdef ENABLE_HTTP2
QCheckBox *_enableHTTP2; QCheckBox *_enableHTTP2;
#endif // ENABLE_HTTP2
// Print/Export // Print/Export
QRadioButton *_wysiwyg; QRadioButton *_wysiwyg;
QRadioButton *_hires; QRadioButton *_hires;

View File

@ -24,8 +24,13 @@ public:
{return !(*this == other);} {return !(*this == other);}
private: private:
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
qreal _h, _s, _v, _a, _shift; qreal _h, _s, _v, _a, _shift;
qreal _state; qreal _state;
#else // QT6
float _h, _s, _v, _a, _shift;
float _state;
#endif // QT6
}; };
#ifndef QT_NO_DEBUG #ifndef QT_NO_DEBUG

View File

@ -6,9 +6,18 @@
#include "map/map.h" #include "map/map.h"
#include "pathtickitem.h" #include "pathtickitem.h"
#include "popup.h" #include "popup.h"
#include "graphitem.h"
#include "markeritem.h"
#include "markerinfoitem.h"
#include "pathitem.h" #include "pathitem.h"
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#define INTERSECTS intersect
#else // QT 5.15
#define INTERSECTS intersects
#endif // QT 5.15
#define GEOGRAPHICAL_MILE 1855.3248 #define GEOGRAPHICAL_MILE 1855.3248
static inline bool isValid(const QPointF &p) static inline bool isValid(const QPointF &p)
@ -22,12 +31,10 @@ static inline unsigned segments(qreal distance)
} }
Units PathItem::_units = Metric; Units PathItem::_units = Metric;
#ifdef ENABLE_TIMEZONES
QTimeZone PathItem::_timeZone = QTimeZone::utc(); QTimeZone PathItem::_timeZone = QTimeZone::utc();
#endif // ENABLE_TIMEZONES
PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent) PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
: GraphicsItem(parent), _path(path), _map(map) : GraphicsItem(parent), _path(path), _map(map), _graph(0)
{ {
Q_ASSERT(_path.isValid()); Q_ASSERT(_path.isValid());
@ -46,6 +53,8 @@ PathItem::PathItem(const Path &path, Map *map, QGraphicsItem *parent)
_marker = new MarkerItem(this); _marker = new MarkerItem(this);
_marker->setZValue(1); _marker->setZValue(1);
_marker->setPos(position(_markerDistance)); _marker->setPos(position(_markerDistance));
_markerInfo = new MarkerInfoItem(_marker);
_markerInfo->setVisible(false);
setCursor(Qt::ArrowCursor); setCursor(Qt::ArrowCursor);
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
@ -68,14 +77,14 @@ void PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360, QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360,
c2.lat())); c2.lat()));
QLineF dl(QPointF(180, -90), QPointF(180, 90)); QLineF dl(QPointF(180, -90), QPointF(180, 90));
l.intersect(dl, &p); l.INTERSECTS(dl, &p);
_painterPath.lineTo(_map->ll2xy(Coordinates(180, p.y()))); _painterPath.lineTo(_map->ll2xy(Coordinates(180, p.y())));
_painterPath.moveTo(_map->ll2xy(Coordinates(-180, p.y()))); _painterPath.moveTo(_map->ll2xy(Coordinates(-180, p.y())));
} else { } else {
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360, QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360,
c2.lat())); c2.lat()));
QLineF dl(QPointF(-180, -90), QPointF(-180, 90)); QLineF dl(QPointF(-180, -90), QPointF(-180, 90));
l.intersect(dl, &p); l.INTERSECTS(dl, &p);
_painterPath.lineTo(_map->ll2xy(Coordinates(-180, p.y()))); _painterPath.lineTo(_map->ll2xy(Coordinates(-180, p.y())));
_painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y()))); _painterPath.moveTo(_map->ll2xy(Coordinates(180, p.y())));
} }
@ -260,21 +269,38 @@ QPointF PathItem::position(qreal x) const
} }
} }
void PathItem::moveMarker(qreal distance) void PathItem::setMarkerPosition(qreal pos)
{ {
_markerDistance = distance; qreal distance = _graph
QPointF pos(position(distance)); ? (_graph->graphType() == Time) ? _graph->distanceAtTime(pos) : pos
: NAN;
if (isValid(pos)) { _markerDistance = distance;
QPointF pp(position(distance));
if (isValid(pp)) {
_marker->setVisible(_showMarker); _marker->setVisible(_showMarker);
_marker->setPos(pos); _marker->setPos(pp);
setMarkerInfo(pos);
} else } else
_marker->setVisible(false); _marker->setVisible(false);
} }
void PathItem::setMarkerInfo(qreal pos)
{
qreal time = _graph
? (_graph->graphType() == Time) ? pos : _graph->timeAtDistance(pos)
: NAN;
QDateTime d(date());
if (!std::isnan(time) && d.isValid())
_markerInfo->setDate(d.addSecs(time).toTimeZone(_timeZone));
}
void PathItem::setMarkerColor(const QColor &color) void PathItem::setMarkerColor(const QColor &color)
{ {
_marker->setColor(color); _marker->setColor(color);
_markerInfo->setColor(color);
} }
void PathItem::hover(bool hover) void PathItem::hover(bool hover)
@ -299,6 +325,11 @@ void PathItem::showMarker(bool show)
_marker->setVisible(show && isValid(position(_markerDistance))); _marker->setVisible(show && isValid(position(_markerDistance)));
} }
void PathItem::showMarkerInfo(bool show)
{
_markerInfo->setVisible(show);
}
qreal PathItem::xInM() const qreal PathItem::xInM() const
{ {
return (_units == Nautical) ? NMIINM : (_units == Imperial) ? MIINM : KMINM; return (_units == Nautical) ? NMIINM : (_units == Imperial) ? MIINM : KMINM;
@ -356,6 +387,21 @@ void PathItem::showTicks(bool show)
updateTicks(); updateTicks();
} }
void PathItem::addGraph(GraphItem *graph)
{
_graphs.append(graph);
if (graph) {
connect(this, SIGNAL(selected(bool)), graph, SLOT(hover(bool)));
connect(graph, SIGNAL(selected(bool)), this, SLOT(hover(bool)));
}
}
void PathItem::setGraph(int index)
{
_graph = _graphs.at(index);
}
void PathItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void PathItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);

View File

@ -1,19 +1,18 @@
#ifndef PATHITEM_H #ifndef PATHITEM_H
#define PATHITEM_H #define PATHITEM_H
#include "common/config.h"
#include <QGraphicsObject> #include <QGraphicsObject>
#include <QPen> #include <QPen>
#ifdef ENABLE_TIMEZONES
#include <QTimeZone> #include <QTimeZone>
#endif // ENABLE_TIMEZONES
#include "data/path.h" #include "data/path.h"
#include "markeritem.h"
#include "units.h"
#include "graphicsscene.h" #include "graphicsscene.h"
#include "units.h"
class Map; class Map;
class PathTickItem; class PathTickItem;
class GraphItem;
class MarkerItem;
class MarkerInfoItem;
class PathItem : public QObject, public GraphicsItem class PathItem : public QObject, public GraphicsItem
{ {
@ -28,9 +27,14 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget); QWidget *widget);
virtual QDateTime date() const = 0;
const Path &path() const {return _path;} const Path &path() const {return _path;}
void addGraph(GraphItem *graph);
void setMap(Map *map); void setMap(Map *map);
void setGraph(int index);
void setColor(const QColor &color); void setColor(const QColor &color);
void setWidth(qreal width); void setWidth(qreal width);
@ -38,17 +42,17 @@ public:
void setDigitalZoom(int zoom); void setDigitalZoom(int zoom);
void setMarkerColor(const QColor &color); void setMarkerColor(const QColor &color);
void showMarker(bool show); void showMarker(bool show);
void showMarkerInfo(bool show);
void showTicks(bool show); void showTicks(bool show);
void setMarkerPosition(qreal pos);
void updateTicks(); void updateTicks();
static void setUnits(Units units) {_units = units;} static void setUnits(Units units) {_units = units;}
#ifdef ENABLE_TIMEZONES
static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;} static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;}
#endif // ENABLE_TIMEZONES
public slots: public slots:
void moveMarker(qreal distance);
void hover(bool hover); void hover(bool hover);
signals: signals:
@ -60,9 +64,7 @@ protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event);
static Units _units; static Units _units;
#ifdef ENABLE_TIMEZONES
static QTimeZone _timeZone; static QTimeZone _timeZone;
#endif // ENABLE_TIMEZONES
private: private:
const PathSegment *segment(qreal x) const; const PathSegment *segment(qreal x) const;
@ -70,12 +72,15 @@ private:
void updatePainterPath(); void updatePainterPath();
void updateShape(); void updateShape();
void addSegment(const Coordinates &c1, const Coordinates &c2); void addSegment(const Coordinates &c1, const Coordinates &c2);
void setMarkerInfo(qreal pos);
qreal xInM() const; qreal xInM() const;
unsigned tickSize() const; unsigned tickSize() const;
Path _path; Path _path;
Map *_map; Map *_map;
QList<GraphItem *> _graphs;
GraphItem *_graph;
qreal _markerDistance; qreal _markerDistance;
int _digitalZoom; int _digitalZoom;
@ -87,6 +92,7 @@ private:
bool _showTicks; bool _showTicks;
MarkerItem *_marker; MarkerItem *_marker;
MarkerInfoItem *_markerInfo;
QVector<PathTickItem*> _ticks; QVector<PathTickItem*> _ticks;
}; };

View File

@ -24,18 +24,18 @@ PDFExportDialog::PDFExportDialog(PDFExport &exp, Units units, QWidget *parent)
_fileSelect->setFile(_export.fileName); _fileSelect->setFile(_export.fileName);
_paperSize = new QComboBox(); _paperSize = new QComboBox();
_paperSize->addItem("A2", QPrinter::A2); _paperSize->addItem("A2", QPageSize::PageSizeId::A2);
_paperSize->addItem("A3", QPrinter::A3); _paperSize->addItem("A3", QPageSize::PageSizeId::A3);
_paperSize->addItem("A4", QPrinter::A4); _paperSize->addItem("A4", QPageSize::PageSizeId::A4);
_paperSize->addItem("A5", QPrinter::A5); _paperSize->addItem("A5", QPageSize::PageSizeId::A5);
_paperSize->addItem("A6", QPrinter::A6); _paperSize->addItem("A6", QPageSize::PageSizeId::A6);
_paperSize->addItem("B3", QPrinter::B3); _paperSize->addItem("B3", QPageSize::PageSizeId::B3);
_paperSize->addItem("B4", QPrinter::B4); _paperSize->addItem("B4", QPageSize::PageSizeId::B4);
_paperSize->addItem("B5", QPrinter::B5); _paperSize->addItem("B5", QPageSize::PageSizeId::B5);
_paperSize->addItem("B6", QPrinter::B6); _paperSize->addItem("B6", QPageSize::PageSizeId::B6);
_paperSize->addItem("Tabloid", QPrinter::Tabloid); _paperSize->addItem("Tabloid", QPageSize::PageSizeId::Tabloid);
_paperSize->addItem("Legal", QPrinter::Legal); _paperSize->addItem("Legal", QPageSize::PageSizeId::Legal);
_paperSize->addItem("Letter", QPrinter::Letter); _paperSize->addItem("Letter", QPageSize::PageSizeId::Letter);
if ((index = _paperSize->findData(_export.paperSize)) >= 0) if ((index = _paperSize->findData(_export.paperSize)) >= 0)
_paperSize->setCurrentIndex(index); _paperSize->setCurrentIndex(index);
@ -51,7 +51,7 @@ PDFExportDialog::PDFExportDialog(PDFExport &exp, Units units, QWidget *parent)
QHBoxLayout *orientationLayout = new QHBoxLayout(); QHBoxLayout *orientationLayout = new QHBoxLayout();
orientationLayout->addWidget(_portrait); orientationLayout->addWidget(_portrait);
orientationLayout->addWidget(_landscape); orientationLayout->addWidget(_landscape);
if (_export.orientation == QPrinter::Portrait) if (_export.orientation == QPageLayout::Orientation::Portrait)
_portrait->setChecked(true); _portrait->setChecked(true);
else else
_landscape->setChecked(true); _landscape->setChecked(true);
@ -116,9 +116,9 @@ void PDFExportDialog::accept()
return; return;
} }
QPrinter::Orientation orientation = _portrait->isChecked() QPageLayout::Orientation orientation = _portrait->isChecked()
? QPrinter::Portrait : QPrinter::Landscape; ? QPageLayout::Orientation::Portrait : QPageLayout::Orientation::Landscape;
QPrinter::PaperSize paperSize = static_cast<QPrinter::PaperSize> QPageSize::PageSizeId paperSize = static_cast<QPageSize::PageSizeId>
(_paperSize->itemData(_paperSize->currentIndex()).toInt()); (_paperSize->itemData(_paperSize->currentIndex()).toInt());
int resolution = _resolution->itemData(_resolution->currentIndex()).toInt(); int resolution = _resolution->itemData(_resolution->currentIndex()).toInt();

View File

@ -3,7 +3,6 @@
#include <QDialog> #include <QDialog>
#include <QPrinter> #include <QPrinter>
#include "margins.h"
#include "units.h" #include "units.h"
class QComboBox; class QComboBox;
@ -14,9 +13,9 @@ class MarginsFWidget;
struct PDFExport struct PDFExport
{ {
QString fileName; QString fileName;
QPrinter::PaperSize paperSize; QPageSize::PageSizeId paperSize;
QPrinter::Orientation orientation; QPageLayout::Orientation orientation;
MarginsF margins; QMarginsF margins;
int resolution; int resolution;
}; };

View File

@ -3,7 +3,6 @@
#include <QDialog> #include <QDialog>
#include <QMargins> #include <QMargins>
#include "margins.h"
class FileSelectWidget; class FileSelectWidget;
class MarginsWidget; class MarginsWidget;

View File

@ -4,9 +4,12 @@
#include <QStyleOptionFrame> #include <QStyleOptionFrame>
#include <QLabel> #include <QLabel>
#include <QMouseEvent> #include <QMouseEvent>
#include <QApplication>
#include <QDesktopWidget>
#include <QBasicTimer> #include <QBasicTimer>
#include <QScreen>
#include <QApplication>
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
#include <QDesktopWidget>
#endif // QT 5.15
#include "popup.h" #include "popup.h"
@ -36,10 +39,7 @@ PopupLabel *PopupLabel::_instance = 0;
PopupLabel::PopupLabel(const QString &text, QWidget *parent) PopupLabel::PopupLabel(const QString &text, QWidget *parent)
: QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget : QLabel(text, parent, Qt::ToolTip | Qt::BypassGraphicsProxyWidget
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) | Qt::WindowDoesNotAcceptFocus)
| Qt::WindowDoesNotAcceptFocus
#endif // QT5
)
{ {
delete _instance; delete _instance;
_instance = this; _instance = this;
@ -74,7 +74,7 @@ void PopupLabel::paintEvent(QPaintEvent *event)
{ {
QStylePainter p(this); QStylePainter p(this);
QStyleOptionFrame opt; QStyleOptionFrame opt;
opt.init(this); opt.initFrom(this);
p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
p.end(); p.end();
QLabel::paintEvent(event); QLabel::paintEvent(event);
@ -125,7 +125,11 @@ bool PopupLabel::eventFilter(QObject *o, QEvent *ev)
void PopupLabel::place(const QPoint &pos, QWidget *w) void PopupLabel::place(const QPoint &pos, QWidget *w)
{ {
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
QRect screen = QApplication::desktop()->screenGeometry(w); QRect screen = QApplication::desktop()->screenGeometry(w);
#else // QT 5.15
QRect screen = w->screen()->geometry();
#endif // QT 5.15
QPoint p(pos.x() + 2, pos.y() + 16); QPoint p(pos.x() + 2, pos.y() + 16);
if (p.x() + width() > screen.x() + screen.width()) if (p.x() + width() > screen.x() + screen.width())
@ -153,6 +157,9 @@ void PopupLabel::deleteAfterTimer()
void Popup::show(const QPoint &pos, const QString &text, QWidget *w) void Popup::show(const QPoint &pos, const QString &text, QWidget *w)
{ {
if (text.isEmpty())
return;
if (PopupLabel::_instance) { if (PopupLabel::_instance) {
PopupLabel::_instance->stopTimer(); PopupLabel::_instance->stopTimer();
PopupLabel::_instance->setText(text); PopupLabel::_instance->setText(text);

View File

@ -1,5 +1,6 @@
#include <QPainter> #include <QPainter>
#include "data/waypoint.h" #include "data/waypoint.h"
#include "data/route.h"
#include "map/map.h" #include "map/map.h"
#include "format.h" #include "format.h"
#include "waypointitem.h" #include "waypointitem.h"

View File

@ -1,13 +1,11 @@
#ifndef ROUTEITEM_H #ifndef ROUTEITEM_H
#define ROUTEITEM_H #define ROUTEITEM_H
#include "data/route.h" #include "data/link.h"
#include "pathitem.h" #include "pathitem.h"
#include "units.h"
#include "format.h"
#include "graphicsscene.h"
class Map; class Map;
class Route;
class WaypointItem; class WaypointItem;
class RouteItem : public PathItem class RouteItem : public PathItem
@ -23,6 +21,7 @@ public:
void showWaypointLabels(bool show); void showWaypointLabels(bool show);
QString info() const; QString info() const;
QDateTime date() const {return QDateTime();}
private: private:
QString _name; QString _name;

View File

@ -61,9 +61,9 @@ void ScaleItem::computeScale()
qreal res = _res * pow(2, -_digitalZoom); qreal res = _res * pow(2, -_digitalZoom);
if (_units == Imperial) { if (_units == Imperial) {
_length = niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true); _length = Util::niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
if (_length >= MIINFT) { if (_length >= MIINFT) {
_length = niceNum((res * M2MI * SCALE_WIDTH) / SEGMENTS, true); _length = Util::niceNum((res * M2MI * SCALE_WIDTH) / SEGMENTS, true);
_width = (_length / (res * M2MI)); _width = (_length / (res * M2MI));
_scale = true; _scale = true;
} else { } else {
@ -71,9 +71,9 @@ void ScaleItem::computeScale()
_scale = false; _scale = false;
} }
} else if (_units == Nautical) { } else if (_units == Nautical) {
_length = niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true); _length = Util::niceNum((res * M2FT * SCALE_WIDTH) / SEGMENTS, true);
if (_length >= NMIINFT) { if (_length >= NMIINFT) {
_length = niceNum((res * M2NMI * SCALE_WIDTH) / SEGMENTS, true); _length = Util::niceNum((res * M2NMI * SCALE_WIDTH) / SEGMENTS, true);
_width = (_length / (res * M2NMI)); _width = (_length / (res * M2NMI));
_scale = true; _scale = true;
} else { } else {
@ -81,7 +81,7 @@ void ScaleItem::computeScale()
_scale = false; _scale = false;
} }
} else { } else {
_length = niceNum((res * SCALE_WIDTH) / SEGMENTS, true); _length = Util::niceNum((res * SCALE_WIDTH) / SEGMENTS, true);
if (_length >= KMINM) { if (_length >= KMINM) {
_length *= M2KM; _length *= M2KM;
_width = (_length / (res * M2KM)); _width = (_length / (res * M2KM));

View File

@ -1,6 +1,8 @@
#ifndef SEARCHPOINTER_H #ifndef SEARCHPOINTER_H
#define SEARCHPOINTER_H #define SEARCHPOINTER_H
#include "common/config.h"
template <class T> template <class T>
class SearchPointer class SearchPointer
{ {
@ -16,7 +18,7 @@ private:
}; };
template <class T> template <class T>
inline uint qHash(const SearchPointer<T> &t) inline HASH_T qHash(const SearchPointer<T> &t)
{ {
return ::qHash(*(t.data())); return ::qHash(*(t.data()));
} }

View File

@ -30,8 +30,6 @@
#define SHOW_GRAPH_GRIDS_DEFAULT true #define SHOW_GRAPH_GRIDS_DEFAULT true
#define SHOW_GRAPH_SLIDER_INFO_SETTING "sliderInfo" #define SHOW_GRAPH_SLIDER_INFO_SETTING "sliderInfo"
#define SHOW_GRAPH_SLIDER_INFO_DEFAULT true #define SHOW_GRAPH_SLIDER_INFO_DEFAULT true
#define SHOW_MARKERS_SETTING "pathMarkers"
#define SHOW_MARKERS_DEFAULT true
#define SHOW_TICKS_SETTING "pathTicks" #define SHOW_TICKS_SETTING "pathTicks"
#define SHOW_TICKS_DEFAULT false #define SHOW_TICKS_DEFAULT false
@ -65,13 +63,18 @@
#define SHOW_ROUTE_WAYPOINTS_DEFAULT true #define SHOW_ROUTE_WAYPOINTS_DEFAULT true
#define SHOW_WAYPOINT_LABELS_SETTING "waypointLabels" #define SHOW_WAYPOINT_LABELS_SETTING "waypointLabels"
#define SHOW_WAYPOINT_LABELS_DEFAULT true #define SHOW_WAYPOINT_LABELS_DEFAULT true
#define SHOW_MARKERS_SETTING "positionMarkers"
#define SHOW_MARKERS_DEFAULT true
#define SHOW_MARKER_INFO_SETTING "markerInfo"
#define SHOW_MARKER_INFO_DEFAULT false
#define PDF_EXPORT_SETTINGS_GROUP "Export" #define PDF_EXPORT_SETTINGS_GROUP "Export"
#define PAPER_ORIENTATION_SETTING "orientation" #define PAPER_ORIENTATION_SETTING "orientation"
#define PAPER_ORIENTATION_DEFAULT QPrinter::Portrait #define PAPER_ORIENTATION_DEFAULT QPageLayout::Orientation::Portrait
#define PAPER_SIZE_SETTING "size" #define PAPER_SIZE_SETTING "size"
#define PAPER_SIZE_DEFAULT (IMPERIAL_UNITS() ? QPrinter::Letter \ #define PAPER_SIZE_DEFAULT (IMPERIAL_UNITS() \
: QPrinter::A4) ? QPageSize::PageSizeId::Letter \
: QPageSize::PageSizeId::A4)
#define PDF_MARGIN_LEFT_SETTING "marginLeft" #define PDF_MARGIN_LEFT_SETTING "marginLeft"
#define PDF_MARGIN_LEFT_DEFAULT 5 /* mm */ #define PDF_MARGIN_LEFT_DEFAULT 5 /* mm */
#define PDF_MARGIN_TOP_SETTING "marginTop" #define PDF_MARGIN_TOP_SETTING "marginTop"
@ -199,8 +202,10 @@
#define SEPARATE_GRAPH_PAGE_DEFAULT false #define SEPARATE_GRAPH_PAGE_DEFAULT false
#define SLIDER_COLOR_SETTING "sliderColor" #define SLIDER_COLOR_SETTING "sliderColor"
#define SLIDER_COLOR_DEFAULT QColor(Qt::red) #define SLIDER_COLOR_DEFAULT QColor(Qt::red)
#define PROJECTION_SETTING "projection" #define OUTPUT_PROJECTION_SETTING "outputProjection"
#define PROJECTION_DEFAULT 3857 #define OUTPUT_PROJECTION_DEFAULT 3857
#define INPUT_PROJECTION_SETTING "inputProjection"
#define INPUT_PROJECTION_DEFAULT 4326
#define HIDPI_MAP_SETTING "HiDPIMap" #define HIDPI_MAP_SETTING "HiDPIMap"
#define HIDPI_MAP_DEFAULT true #define HIDPI_MAP_DEFAULT true

View File

@ -18,7 +18,7 @@ void SliderInfoItem::updateBoundingRect()
{ {
QFontMetrics fm(_font); QFontMetrics fm(_font);
qreal width = qMax(fm.width(_x), fm.width(_y)); qreal width = qMax(fm.boundingRect(_x).width(), fm.boundingRect(_y).width());
qreal height = 2 * fm.height() - 2*fm.descent(); qreal height = 2 * fm.height() - 2*fm.descent();
_boundingRect = (_side == Right) _boundingRect = (_side == Right)
@ -35,16 +35,16 @@ void SliderInfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
QRectF rx, ry; QRectF rx, ry;
qreal width = qMax(fm.width(_x), fm.width(_y)); qreal width = qMax(fm.boundingRect(_x).width(), fm.boundingRect(_y).width());
if (_side == Right) { if (_side == Right) {
ry = QRectF(SIZE, -fm.height() + fm.descent(), fm.width(_y), ry = QRectF(SIZE, -fm.height() + fm.descent(), fm.boundingRect(_y).width(),
fm.height() - fm.descent()); fm.height() - fm.descent());
rx = QRectF(SIZE, 0, fm.width(_x), fm.height() rx = QRectF(SIZE, 0, fm.boundingRect(_x).width(), fm.height()
- fm.descent()); - fm.descent());
} else { } else {
ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(), fm.width(_y), ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(),
fm.height() - fm.descent()); fm.boundingRect(_y).width(), fm.height() - fm.descent());
rx = QRectF(-(width + SIZE), 0, fm.width(_x), fm.height() rx = QRectF(-(width + SIZE), 0, fm.boundingRect(_x).width(), fm.height()
- fm.descent()); - fm.descent());
} }

View File

@ -3,6 +3,7 @@
#include <QTimeZone> #include <QTimeZone>
#include <QDataStream> #include <QDataStream>
#include <QDebug>
class TimeZoneInfo class TimeZoneInfo
{ {
@ -42,6 +43,7 @@ public:
private: private:
friend QDataStream& operator<<(QDataStream &out, const TimeZoneInfo &info); friend QDataStream& operator<<(QDataStream &out, const TimeZoneInfo &info);
friend QDataStream& operator>>(QDataStream &in, TimeZoneInfo &info); friend QDataStream& operator>>(QDataStream &in, TimeZoneInfo &info);
friend QDebug operator<<(QDebug dbg, const TimeZoneInfo &info);
Type _type; Type _type;
QTimeZone _customZone; QTimeZone _customZone;
@ -66,4 +68,12 @@ inline QDataStream &operator>>(QDataStream &in, TimeZoneInfo &info)
return in; return in;
} }
// Required in Qt6 even in release builds
inline QDebug operator<<(QDebug dbg, const TimeZoneInfo &info)
{
dbg.nospace() << "TimeZoneInfo(" << static_cast<int>(info._type)
<< ", " << info._customZone << ")";
return dbg.space();
}
#endif // TIMEZONEINFO_H #endif // TIMEZONEINFO_H

View File

@ -1,5 +1,6 @@
#include <QPainter> #include <QPainter>
#include "map/map.h" #include "map/map.h"
#include "data/track.h"
#include "format.h" #include "format.h"
#include "tooltip.h" #include "tooltip.h"
#include "trackitem.h" #include "trackitem.h"
@ -8,6 +9,7 @@
QString TrackItem::info() const QString TrackItem::info() const
{ {
ToolTip tt; ToolTip tt;
QLocale l;
if (!_name.isEmpty()) if (!_name.isEmpty())
tt.insert(tr("Name"), _name); tt.insert(tr("Name"), _name);
@ -22,13 +24,7 @@ QString TrackItem::info() const
if (_movingTime > 0) if (_movingTime > 0)
tt.insert(tr("Moving time"), Format::timeSpan(_movingTime)); tt.insert(tr("Moving time"), Format::timeSpan(_movingTime));
if (!_date.isNull()) if (!_date.isNull())
tt.insert(tr("Date"), tt.insert(tr("Date"), l.toString(_date.toTimeZone(_timeZone)));
#ifdef ENABLE_TIMEZONES
_date.toTimeZone(_timeZone)
#else // ENABLE_TIMEZONES
_date
#endif // ENABLE_TIMEZONES
.toString(Qt::SystemLocaleShortDate));
if (!_links.isEmpty()) { if (!_links.isEmpty()) {
QString links; QString links;
for (int i = 0; i < _links.size(); i++) { for (int i = 0; i < _links.size(); i++) {

View File

@ -2,13 +2,11 @@
#define TRACKITEM_H #define TRACKITEM_H
#include <QDateTime> #include <QDateTime>
#include <QPen> #include "data/link.h"
#include "data/track.h"
#include "pathitem.h" #include "pathitem.h"
#include "units.h"
#include "graphicsscene.h"
class Map; class Map;
class Track;
class TrackItem : public PathItem class TrackItem : public PathItem
{ {
@ -18,6 +16,7 @@ public:
TrackItem(const Track &track, Map *map, QGraphicsItem *parent = 0); TrackItem(const Track &track, Map *map, QGraphicsItem *parent = 0);
QString info() const; QString info() const;
QDateTime date() const {return _date;}
private: private:
QString _name; QString _name;

View File

@ -16,13 +16,12 @@
Units WaypointItem::_units = Metric; Units WaypointItem::_units = Metric;
CoordinatesFormat WaypointItem::_format = DecimalDegrees; CoordinatesFormat WaypointItem::_format = DecimalDegrees;
#ifdef ENABLE_TIMEZONES
QTimeZone WaypointItem::_timeZone = QTimeZone::utc(); QTimeZone WaypointItem::_timeZone = QTimeZone::utc();
#endif // ENABLE_TIMEZONES
QString WaypointItem::info() const QString WaypointItem::info() const
{ {
ToolTip tt; ToolTip tt;
QLocale l;
if (!_waypoint.name().isEmpty()) if (!_waypoint.name().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name()); tt.insert(qApp->translate("WaypointItem", "Name"), _waypoint.name());
@ -37,12 +36,8 @@ QString WaypointItem::info() const
} }
if (_waypoint.timestamp().isValid()) if (_waypoint.timestamp().isValid())
tt.insert(qApp->translate("WaypointItem", "Date"), tt.insert(qApp->translate("WaypointItem", "Date"),
#ifdef ENABLE_TIMEZONES l.toString(_waypoint.timestamp().toTimeZone(_timeZone),
_waypoint.timestamp().toTimeZone(_timeZone) QLocale::ShortFormat));
#else // ENABLE_TIMEZONES
_waypoint.timestamp()
#endif // ENABLE_TIMEZONES
.toString(Qt::SystemLocaleShortDate));
if (!_waypoint.description().isEmpty()) if (!_waypoint.description().isEmpty())
tt.insert(qApp->translate("WaypointItem", "Description"), tt.insert(qApp->translate("WaypointItem", "Description"),
_waypoint.description()); _waypoint.description());

View File

@ -1,13 +1,10 @@
#ifndef WAYPOINTITEM_H #ifndef WAYPOINTITEM_H
#define WAYPOINTITEM_H #define WAYPOINTITEM_H
#include "common/config.h"
#include <cmath> #include <cmath>
#include <QGraphicsItem> #include <QGraphicsItem>
#include <QFont> #include <QFont>
#ifdef ENABLE_TIMEZONES
#include <QTimeZone> #include <QTimeZone>
#endif // ENABLE_TIMEZONES
#include "data/waypoint.h" #include "data/waypoint.h"
#include "map/map.h" #include "map/map.h"
#include "units.h" #include "units.h"
@ -38,9 +35,7 @@ public:
static void setUnits(Units units) {_units = units;} static void setUnits(Units units) {_units = units;}
static void setCoordinatesFormat(CoordinatesFormat format) static void setCoordinatesFormat(CoordinatesFormat format)
{_format = format;} {_format = format;}
#ifdef ENABLE_TIMEZONES
static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;} static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;}
#endif // ENABLE_TIMEZONES
protected: protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
@ -60,9 +55,7 @@ private:
static Units _units; static Units _units;
static CoordinatesFormat _format; static CoordinatesFormat _format;
#ifdef ENABLE_TIMEZONES
static QTimeZone _timeZone; static QTimeZone _timeZone;
#endif // ENABLE_TIMEZONES
}; };
#endif // WAYPOINTITEM_H #endif // WAYPOINTITEM_H

View File

@ -2,24 +2,20 @@
#define CONFIG_H #define CONFIG_H
#include <QtGlobal> #include <QtGlobal>
#include <QPoint>
#define APP_NAME "GPXSee" #define APP_NAME "GPXSee"
#define APP_HOMEPAGE "http://www.gpxsee.org" #define APP_HOMEPAGE "http://www.gpxsee.org"
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 1) #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#define ENABLE_HTTP2 #define HASH_T uint
#endif // QT >= 5.10.1 #else // QT6
#define HASH_T size_t
#endif // QT6
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) inline HASH_T qHash(const QPoint &p)
#define ENABLE_HIDPI {
#endif // QT >= 5.6 return ::qHash(p.x()) ^ ::qHash(p.y());
}
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#define ENABLE_GEOJSON
#endif // QT >= 5.0
#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
#define ENABLE_TIMEZONES
#endif // QT >= 5.5
#endif /* CONFIG_H */ #endif /* CONFIG_H */

View File

@ -1,5 +1,6 @@
#include <QtGlobal> #include <QtGlobal>
#include <QDir> #include <QDir>
#include <QStandardPaths>
#include "programpaths.h" #include "programpaths.h"
@ -16,119 +17,6 @@
#define TYP_FILE "style.typ" #define TYP_FILE "style.typ"
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0)
#include <QApplication>
#if defined(Q_OS_WIN32)
#define USER_DIR QDir::homePath() + QString("/AppData/Roaming/") \
+ qApp->applicationName()
#define GLOBAL_DIR QApplication::applicationDirPath()
#elif defined(Q_OS_MAC)
#define USER_DIR QDir::homePath() \
+ QString("/Library/Application Support/") \
+ qApp->applicationName()
#define GLOBAL_DIR QApplication::applicationDirPath() \
+ QString("/../Resources")
#else
#define USER_DIR QDir::homePath() + QString("/.local/share/") \
+ qApp->applicationName()
#define GLOBAL_DIR QString(PREFIX "/share/") + qApp->applicationName()
#endif
static QString dir(const QString &dirName, bool writable = false)
{
QDir userDir(QDir(USER_DIR).filePath(dirName));
if (writable || userDir.exists())
return userDir.absolutePath();
else {
QDir globalDir(QDir(GLOBAL_DIR).filePath(dirName));
if (globalDir.exists())
return globalDir.absolutePath();
else
return QString();
}
}
static QString file(const QString &path, const QString &fileName)
{
if (path.isNull())
return QString();
QFileInfo fi(QDir(path).filePath(fileName));
return fi.exists() ? fi.absoluteFilePath() : QString();
}
QString ProgramPaths::mapDir(bool writable)
{
return dir(MAP_DIR, writable);
}
QString ProgramPaths::poiDir(bool writable)
{
return dir(POI_DIR, writable);
}
QString ProgramPaths::csvDir(bool writable)
{
return dir(CSV_DIR, writable);
}
QString ProgramPaths::demDir(bool writable)
{
return dir(DEM_DIR, writable);
}
QString ProgramPaths::styleDir(bool writable)
{
return dir(STYLE_DIR, writable);
}
QString ProgramPaths::tilesDir()
{
#if defined(Q_OS_WIN32)
return QDir::homePath() + QString("/AppData/Local/")
+ qApp->applicationName() + QString("/cache/") + QString(TILES_DIR);
#elif defined(Q_OS_MAC)
return QDir::homePath() + QString("/Library/Caches/")
+ qApp->applicationName() + QString("/" TILES_DIR);
#else
return QDir::homePath() + QString("/.cache/") + qApp->applicationName()
+ QString("/" TILES_DIR);
#endif
}
QString ProgramPaths::translationsDir()
{
return dir(TRANSLATIONS_DIR);
}
QString ProgramPaths::ellipsoidsFile()
{
return file(dir(CSV_DIR), ELLIPSOID_FILE);
}
QString ProgramPaths::gcsFile()
{
return file(dir(CSV_DIR), GCS_FILE);
}
QString ProgramPaths::pcsFile()
{
return file(dir(CSV_DIR), PCS_FILE);
}
QString ProgramPaths::typFile()
{
return file(dir(STYLE_DIR), TYP_FILE);
}
#else // QT_VERSION < 5
#include <QStandardPaths>
QString ProgramPaths::mapDir(bool writable) QString ProgramPaths::mapDir(bool writable)
{ {
if (writable) if (writable)
@ -214,5 +102,3 @@ QString ProgramPaths::typFile()
return QStandardPaths::locate(QStandardPaths::AppDataLocation, return QStandardPaths::locate(QStandardPaths::AppDataLocation,
STYLE_DIR "/" TYP_FILE, QStandardPaths::LocateFile); STYLE_DIR "/" TYP_FILE, QStandardPaths::LocateFile);
} }
#endif // QT_VERSION < 5

View File

@ -1,11 +0,0 @@
#ifndef ASSERT_H
#define ASSERT_H
template<bool> struct CompileTimeAssert;
template<> struct CompileTimeAssert <true> {};
#define STATIC_ASSERT(e) \
(CompileTimeAssert <(e) != 0>())
#endif // ASSERT_H

214
src/common/textcodec.cpp Normal file
View File

@ -0,0 +1,214 @@
#include <QVector>
#include "textcodec.h"
static const char32_t cp1250[] = {
0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
};
static const char32_t cp1251[] = {
0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
};
static const char32_t cp1252[] = {
0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
};
static const char32_t cp1253[] = {
0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
};
static const char32_t cp1254[] = {
0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
};
static const char32_t cp1255[] = {
0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
};
static const char32_t cp1256[] = {
0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
};
static const char32_t cp1257[] = {
0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
};
TextCodec::TextCodec() : _table(cp1252)
{
}
TextCodec::TextCodec(int codepage)
{
switch (codepage) {
case 65001:
_table = 0;
break;
case 1250:
_table = cp1250;
break;
case 1251:
_table = cp1251;
break;
case 1253:
_table = cp1253;
break;
case 1254:
_table = cp1254;
break;
case 1255:
_table = cp1255;
break;
case 1256:
_table = cp1256;
break;
case 1257:
_table = cp1257;
break;
default:
_table = cp1252;
}
}
QString TextCodec::toString(const QByteArray &ba) const
{
if (_table)
return from8bCp(ba);
else
return QString::fromUtf8(ba);
}
QString TextCodec::from8bCp(const QByteArray &ba) const
{
QVector<char32_t> ucs4(ba.size());
for (int i = 0; i < ba.size(); i++) {
quint8 c = (quint8)ba.at(i);
if (c < 0x80)
ucs4[i] = (char32_t)c;
else
ucs4[i] = _table[c - 0x80];
}
return QString::fromUcs4(ucs4.constData(), ucs4.size());
}

20
src/common/textcodec.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef TEXTCODEC_H
#define TEXTCODEC_H
#include <QString>
class TextCodec
{
public:
TextCodec();
TextCodec(int codepage);
QString toString(const QByteArray &ba) const;
private:
QString from8bCp(const QByteArray &ba) const;
const char32_t *_table;
};
#endif // TEXTCODEC_H

View File

@ -1,9 +1,10 @@
#include <cctype> #include <cctype>
#include <cmath> #include <cmath>
#include <QFileInfo>
#include "util.h" #include "util.h"
int str2int(const char *str, int len) int Util::str2int(const char *str, int len)
{ {
int res = 0; int res = 0;
@ -17,7 +18,7 @@ int str2int(const char *str, int len)
return res; return res;
} }
double niceNum(double x, bool round) double Util::niceNum(double x, bool round)
{ {
int expv; int expv;
double f; double f;
@ -48,3 +49,9 @@ double niceNum(double x, bool round)
return nf * pow(10.0, expv); return nf * pow(10.0, expv);
} }
QString Util::file2name(const QString &path)
{
QFileInfo fi(path);
return fi.baseName().replace('_', ' ');
}

View File

@ -1,7 +1,13 @@
#ifndef UTIL_H #ifndef UTIL_H
#define UTIL_H #define UTIL_H
int str2int(const char *str, int len); #include <QString>
double niceNum(double x, bool round);
namespace Util
{
int str2int(const char *str, int len);
double niceNum(double x, bool round);
QString file2name(const QString &path);
}
#endif // UTIL_H #endif // UTIL_H

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