1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-07-04 14:49:30 +02:00

Compare commits

...

194 Commits
7.37 ... 8.2

Author SHA1 Message Date
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
84d5673e17 Merge branch 'origin/master' into Weblate. 2020-12-15 21:51:38 +01:00
e40836e6bb Added missing file associations + icons 2020-12-15 21:51:08 +01:00
88aef38f9d Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2020-12-15 02:29:30 +01:00
7d8dcec88b Try to break even less bounding box transformations 2020-12-14 22:06:59 +01:00
561d8362a9 Fixed projection comparison 2020-12-14 22:04:50 +01:00
7f9fde76e9 Merge branch 'origin/master' into Weblate. 2020-12-13 19:41:17 +01:00
239e571358 Provide propper map bounds for overviews 2020-12-13 19:40:09 +01:00
44b28e3d4d Merge branch 'origin/master' into Weblate. 2020-12-12 10:20:19 +01:00
4cef089c81 A more robust RectC to RectD algorithm 2020-12-12 10:19:48 +01:00
05ac5ccedb Merge branch 'origin/master' into Weblate. 2020-12-10 22:02:22 +01:00
22fb6071f7 Refactoring 2020-12-10 22:02:09 +01:00
2c78772a67 Merge branch 'origin/master' into Weblate. 2020-12-10 01:09:42 +01:00
0f03ef4af7 Yet another map load crash fix 2020-12-10 01:09:23 +01:00
351cc49ec9 Merge branch 'origin/master' into Weblate. 2020-12-09 23:08:07 +01:00
743a937f41 Fixed crashing async map loading
fixes #331
2020-12-09 23:07:05 +01:00
033225502f Merge branch 'origin/master' into Weblate. 2020-12-08 21:30:37 +01:00
75b8b9eab0 Upadte linux file associations 2020-12-08 21:30:17 +01:00
e76e7b71ed Check for duplicit map loads 2020-12-08 21:29:20 +01:00
41ea07d020 Merge branch 'origin/master' into Weblate. 2020-12-08 01:13:05 +01:00
4bad086152 Enable maps drag&drop 2020-12-08 01:12:39 +01:00
8be088be0a Merge branch 'origin/master' into Weblate. 2020-12-08 01:01:57 +01:00
73021bec01 Added "Open with GPXSee" associations 2020-12-08 01:01:26 +01:00
7584116168 Removed cut&paste remains 2020-12-08 00:59:18 +01:00
59b734c402 Cosmetics 2020-12-08 00:58:01 +01:00
8168d52f09 Merge branch 'origin/master' into Weblate. 2020-12-06 23:32:07 +01:00
74796e3e41 Only trigger the last maploaded 2020-12-06 23:31:45 +01:00
676024854a Merge branch 'origin/master' into Weblate. 2020-12-06 19:18:14 +01:00
10e1b5c4fb Open map files passed as program arguments
closes #327
2020-12-06 19:17:09 +01:00
54570ed97e Merge branch 'origin/master' into Weblate. 2020-12-06 13:05:35 +01:00
07fa377e38 Remove the weired file lists copies
It used to be written in the Qt4 documentation to iterate over a copy, but
there is aparently no real reason doing that...
2020-12-06 13:03:32 +01:00
2b8c3f64ac Only trigger the last loaded map 2020-12-06 12:53:39 +01:00
a60cccb57e Merge branch 'origin/master' into Weblate. 2020-12-06 00:12:05 +01:00
c2e50e5213 Use a smooth digital zoom 2020-12-06 00:11:47 +01:00
0ea8e008c2 Merge branch 'origin/master' into Weblate. 2020-12-05 12:26:33 +01:00
082435c83d Translated using Weblate (Hungarian)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2020-12-05 12:26:33 +01:00
e63ad7a244 Make the maps submenus work with large amount of items 2020-12-05 12:25:59 +01:00
32a4365543 Merge branch 'origin/master' into Weblate. 2020-12-04 00:26:20 +01:00
abd1dc2450 Added support for polyconic projections 2020-12-04 00:25:57 +01:00
5674534efd Merge branch 'origin/master' into Weblate. 2020-12-03 21:15:19 +01:00
33287f9d76 Translated using Weblate (Hungarian)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/hu/
2020-12-03 21:15:18 +01:00
1dfe84c4af Translated using Weblate (Ukrainian)
Currently translated at 98.4% (377 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/uk/
2020-12-03 21:15:18 +01:00
7fe8d204bc Translated using Weblate (Turkish)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/tr/
2020-12-03 21:15:18 +01:00
5080247e10 Translated using Weblate (Russian)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/ru/
2020-12-03 21:15:18 +01:00
13d6c7c643 Translated using Weblate (Finnish)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/fi/
2020-12-03 21:15:17 +01:00
547d7a5f23 Fix the POI search algorithm
(At least so, that it does not trigger the rtree assert. The whole RectC logic
has to be fixed to properly handle poles/dateline "overflows")
2020-12-03 21:12:41 +01:00
9e03d85b7a Fixed actions logic 2020-12-03 20:58:22 +01:00
b811132394 Translated using Weblate (Swedish)
Currently translated at 100.0% (383 of 383 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/sv/
2020-12-03 06:51:47 +01:00
ca33328d99 Merge branch 'origin/master' into Weblate. 2020-12-03 00:11:58 +01:00
41c8a4d935 Version++ 2020-12-03 00:11:49 +01:00
acd09400be Localization update 2020-12-03 00:10:24 +01:00
16bfd593c7 Merge branch 'origin/master' into Weblate. 2020-12-02 23:58:59 +01:00
9e70a1ffbb Added the "Load map dir" feature 2020-12-02 23:58:11 +01:00
1b590fbf76 Merge branch 'origin/master' into Weblate. 2020-12-02 20:51:37 +01:00
8d52dbf59f Fixed issue with Mercator projections 2020-12-02 20:51:19 +01:00
c6fd32fc61 Merge branch 'origin/master' into Weblate. 2020-12-01 20:17:58 +01:00
af6082425e Propper map size must be known from the start 2020-12-01 20:17:19 +01:00
785123f005 Merge branch 'origin/master' into Weblate. 2020-12-01 19:04:34 +01:00
df3ee11f42 Properly handle skewed charts 2020-12-01 19:03:58 +01:00
6af1ff35ab Merge branch 'origin/master' into Weblate. 2020-11-28 20:34:53 +01:00
8423fc1230 Remove the untested and broken NOS stuff 2020-11-28 20:34:25 +01:00
a62d84da67 Merge branch 'origin/master' into Weblate. 2020-11-28 14:50:31 +01:00
2431f432d4 Use the right Mercator 2020-11-28 14:50:10 +01:00
6c4ebc40ca Merge branch 'origin/master' into Weblate. 2020-11-28 14:48:55 +01:00
0cc6908b30 Fixed broken projection comparsion
+ refactoring/code cleanup
2020-11-28 14:48:20 +01:00
becf57e4eb Merge branch 'origin/master' into Weblate. 2020-11-27 01:12:51 +01:00
96733883cb Added support for BSB charts maps 2020-11-27 01:11:50 +01:00
973c086029 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (376 of 376 strings)

Translation: GPXSee/Translations
Translate-URL: https://hosted.weblate.org/projects/gpxsee/translations/pt_BR/
2020-11-25 17:29:14 +01:00
197 changed files with 12490 additions and 6352 deletions

View File

@ -1,32 +1,39 @@
version: 7.37.{build}
version: 8.2.{build}
configuration:
- Release
image:
- Visual Studio 2017
- Visual Studio 2019
environment:
NSISDIR: C:\Program Files (x86)\NSIS
matrix:
- QTDIR: C:\Qt\5.13\msvc2017
- QTDIR: C:\Qt\5.15\msvc2019
NSI: gpxsee.nsi
VCVARS: vcvars32.bat
OPENSSLDIR: C:\OpenSSL-v111-Win32\bin
LIBCRYPTO: libssl-1_1.dll
LIBSSL: libcrypto-1_1.dll
- QTDIR: C:\Qt\5.13\msvc2017_64
- QTDIR: C:\Qt\5.15\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
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:
- cmd: >-
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:
- cmd: >-
@ -60,6 +67,6 @@ build_script:
copy %OPENSSLDIR%\%LIBSSL% installer
makensis.exe installer\%NSI%
makensis.exe %NSISDEF% installer\%NSI%
artifacts:
- path: installer\GPXSee-*.exe

View File

@ -4,13 +4,15 @@ os:
- linux
- osx
dist: focal
before_install:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get -qq update; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install qt; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libqt4-dev 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:
- 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
* 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).
* 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).
* Elevation, speed, heart rate, cadence, power, temperature and gear ratio/shifts graphs.
* Support for DEM files (SRTM HGT).
* 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 requirements:
* Qt 4.8 or QT 5.x (Qt >= 5.10.1 recommended for all features)
* C++03 or newer compiler (tested: msvc2015, gcc >= 4.8, clang/Apple LLVM version 8.1.0)
* Qt5 >= 5.11 or Qt 6.x
* C++11 or newer compiler (tested: msvc2017, gcc 7.5.0, clang/Apple LLVM version 10.0.0)
Build steps:
```shell
@ -51,6 +51,7 @@ licenses:
* [Mapbox Maki icons](icons/POI) - CC0
* [RTree implementation](src/common/rtree.h) - Public domain
* [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)
and [Transverse Mercator](src/map/transversemercator.cpp) projections - NIMA Source Code Disclaimer
[Mercator](src/map/mercator.cpp), [Polar Stereographic](src/map/polarstereographic.cpp),
[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

View File

@ -3,32 +3,32 @@ unix:!macx {
} else {
TARGET = GPXSee
}
VERSION = 7.37
VERSION = 8.2
QT += core \
gui \
gui-private \
network \
sql \
concurrent
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
QT += printsupport
}
lessThan(QT_MAJOR_VERSION, 5) {QT += opengl}
equals(QT_MAJOR_VERSION, 5) : lessThan(QT_MINOR_VERSION, 4) {QT += opengl}
concurrent \
widgets \
printsupport
greaterThan(QT_MAJOR_VERSION, 5) {QT += openglwidgets}
INCLUDEPATH += ./src
HEADERS += src/common/config.h \
src/GUI/axislabelitem.h \
src/GUI/graphicsscene.h \
src/GUI/mapaction.h \
src/GUI/mapitem.h \
src/GUI/marginswidget.h \
src/GUI/planeitem.h \
src/GUI/popup.h \
src/common/garmin.h \
src/common/staticassert.h \
src/common/coordinates.h \
src/common/range.h \
src/common/rectc.h \
src/common/textcodec.h \
src/common/wgs84.h \
src/common/util.h \
src/common/rtree.h \
@ -56,7 +56,6 @@ HEADERS += src/common/config.h \
src/GUI/heartrategraph.h \
src/GUI/trackinfo.h \
src/GUI/fileselectwidget.h \
src/GUI/margins.h \
src/GUI/temperaturegraph.h \
src/GUI/graphtab.h \
src/GUI/trackitem.h \
@ -72,7 +71,6 @@ HEADERS += src/common/config.h \
src/GUI/optionsdialog.h \
src/GUI/colorbox.h \
src/GUI/stylecombobox.h \
src/GUI/opengl.h \
src/GUI/timetype.h \
src/GUI/percentslider.h \
src/GUI/elevationgraphitem.h \
@ -84,7 +82,6 @@ HEADERS += src/common/config.h \
src/GUI/gearratiographitem.h \
src/GUI/oddspinbox.h \
src/GUI/settings.h \
src/GUI/cpuarch.h \
src/GUI/searchpointer.h \
src/GUI/mapview.h \
src/GUI/font.h \
@ -103,6 +100,10 @@ HEADERS += src/common/config.h \
src/map/IMG/rastertile.h \
src/map/IMG/textpathitem.h \
src/map/IMG/textpointitem.h \
src/map/bsbmap.h \
src/map/invalidmap.h \
src/map/kmzmap.h \
src/map/polyconic.h \
src/map/projection.h \
src/map/ellipsoid.h \
src/map/datum.h \
@ -203,14 +204,19 @@ HEADERS += src/common/config.h \
src/data/address.h \
src/data/smlparser.h \
src/GUI/pdfexportdialog.h \
src/GUI/pngexportdialog.h
src/GUI/pngexportdialog.h \
src/data/geojsonparser.h \
src/GUI/timezoneinfo.h
SOURCES += src/main.cpp \
src/GUI/axislabelitem.cpp \
src/GUI/mapitem.cpp \
src/GUI/marginswidget.cpp \
src/GUI/popup.cpp \
src/common/coordinates.cpp \
src/common/rectc.cpp \
src/common/range.cpp \
src/common/textcodec.cpp \
src/common/util.cpp \
src/common/greatcircle.cpp \
src/common/programpaths.cpp \
@ -271,11 +277,14 @@ SOURCES += src/main.cpp \
src/map/IMG/rastertile.cpp \
src/map/IMG/textpathitem.cpp \
src/map/IMG/textpointitem.cpp \
src/map/bsbmap.cpp \
src/map/kmzmap.cpp \
src/map/maplist.cpp \
src/map/onlinemap.cpp \
src/map/downloader.cpp \
src/map/emptymap.cpp \
src/map/ozimap.cpp \
src/map/polyconic.cpp \
src/map/tar.cpp \
src/map/atlas.cpp \
src/map/ozf.cpp \
@ -354,19 +363,11 @@ SOURCES += src/main.cpp \
src/data/gpiparser.cpp \
src/data/smlparser.cpp \
src/GUI/pdfexportdialog.cpp \
src/GUI/pngexportdialog.cpp
greaterThan(QT_MAJOR_VERSION, 4) {
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
}
src/GUI/pngexportdialog.cpp \
src/data/geojsonparser.cpp
DEFINES += APP_VERSION=\\\"$$VERSION\\\" \
QT_NO_DEPRECATED_WARNINGS
DEFINES *= QT_USE_QSTRINGBUILDER
RESOURCES += gpxsee.qrc
TRANSLATIONS = lang/gpxsee_en.ts \
@ -384,7 +385,8 @@ TRANSLATIONS = lang/gpxsee_en.ts \
lang/gpxsee_pt_BR.ts \
lang/gpxsee_uk.ts \
lang/gpxsee_hu.ts \
lang/gpxsee_it.ts
lang/gpxsee_it.ts \
lang/gpxsee_eo.ts
macx {
ICON = icons/app/gpxsee.icns
@ -425,7 +427,13 @@ macx {
icons/formats/json.icns \
icons/formats/cup.icns \
icons/formats/gpi.icns \
icons/formats/sml.icns
icons/formats/sml.icns \
icons/formats/img.icns \
icons/formats/jnx.icns \
icons/formats/kap.icns \
icons/formats/mbts.icns \
icons/formats/rmap.icns \
icons/formats/tba.icns
QMAKE_BUNDLE_DATA += locale maps icons csv
}
@ -445,14 +453,20 @@ win32 {
icons/formats/json.ico \
icons/formats/cup.ico \
icons/formats/gpi.ico \
icons/formats/sml.ico
icons/formats/sml.ico \
icons/formats/img.ico \
icons/formats/jnx.ico \
icons/formats/kap.ico \
icons/formats/map.ico \
icons/formats/mbts.ico \
icons/formats/rmap.ico \
icons/formats/tba.ico
DEFINES += _USE_MATH_DEFINES \
NOGDI
}
unix:!macx {
isEmpty(PREFIX):PREFIX = /usr/local
DEFINES += PREFIX=\\\"$$PREFIX\\\"
maps.files = pkg/maps/*
maps.path = $$PREFIX/share/gpxsee/maps

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

BIN
icons/formats/img.icns Normal file

Binary file not shown.

BIN
icons/formats/img.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

BIN
icons/formats/jnx.icns Normal file

Binary file not shown.

BIN
icons/formats/jnx.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

After

Width:  |  Height:  |  Size: 307 KiB

BIN
icons/formats/kap.icns Normal file

Binary file not shown.

BIN
icons/formats/kap.ico Normal file

Binary file not shown.

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

BIN
icons/formats/map.icns Normal file

Binary file not shown.

BIN
icons/formats/map.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

BIN
icons/formats/mbts.icns Normal file

Binary file not shown.

BIN
icons/formats/mbts.ico Normal file

Binary file not shown.

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

BIN
icons/formats/rmap.icns Normal file

Binary file not shown.

BIN
icons/formats/rmap.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 303 KiB

View File

@ -13,3 +13,10 @@ slf:#881199
cup:#20a810
gpi:#fca314
sml:#6434eb
img:#cf0a0a
jnx:#aeff00
kap:#080045
map:#f6ff00
mbts:#ff0062
rmap:#145cba
tba:#367050

View File

@ -5,6 +5,6 @@ while read e; do
EXT=`echo $1 | tr /a-z/ /A-Z/`
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
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

BIN
icons/formats/tba.icns Normal file

Binary file not shown.

BIN
icons/formats/tba.ico Normal file

Binary file not shown.

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

2097
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

@ -42,7 +42,7 @@
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/tcx+xml</string>
<string>application/vnd.garmin.tcx+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/tcx.icns</string>
@ -67,6 +67,22 @@
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</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>
<key>CFBundleTypeExtensions</key>
<array>
@ -74,7 +90,7 @@
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/loc+xml</string>
<string>application/vnd.groundspeak.loc+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/loc.icns</string>
@ -90,7 +106,7 @@
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/slf+xml</string>
<string>application/vnd.sigma.slf+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/slf.icns</string>
@ -250,7 +266,7 @@
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/sml+xml</string>
<string>application/vnd.suunto.sml+xml</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/sml.icns</string>
@ -259,6 +275,193 @@
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>jpeg</string>
<string>jpg</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>image/jpeg</string>
</array>
<key>CFBundleTypeName</key>
<string>JPEG Image</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>csv</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>text/csv</string>
</array>
<key>CFBundleTypeName</key>
<string>Comma-Separated Values (CSV) Files</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>img</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.garmin.img</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/img.icns</string>
<key>CFBundleTypeName</key>
<string>Garmin IMG Map</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>gmap</string>
<string>gmapi</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.garmin.gmap</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/img.icns</string>
<key>CFBundleTypeName</key>
<string>Garmin Map Product File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>jnx</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.garmin.jnx</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/jnx.icns</string>
<key>CFBundleTypeName</key>
<string>Garmin JNX Map</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>kap</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.maptech.kap</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/kap.icns</string>
<key>CFBundleTypeName</key>
<string>BSB Nautical Charts</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>map</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.oziexplorer.map</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/map.icns</string>
<key>CFBundleTypeName</key>
<string>OziExplorer Map File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>rmap</string>
<string>rtmap</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.twonav.rmap</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/rmap.icns</string>
<key>CFBundleTypeName</key>
<string>TwoNav Raster Map File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>tba</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.trekbuddy.tba</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/tba.icns</string>
<key>CFBundleTypeName</key>
<string>TrekBuddy Atlas</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mbtiles</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.mapbox.mbtiles</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icons/mbts.icns</string>
<key>CFBundleTypeName</key>
<string>MBTiles Map File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>tiff</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>image/tiff</string>
</array>
<key>CFBundleTypeName</key>
<string>GeoTIFF Image</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>xml</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.gpxsee.map+xml</string>
</array>
<key>CFBundleTypeName</key>
<string>GPXSee Map Definition File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
@ -302,7 +505,7 @@
<string>tcx</string>
</array>
<key>public.mime-type</key>
<string>application/tcx+xml</string>
<string>application/vnd.garmin.tcx+xml</string>
</dict>
</dict>
<dict>
@ -326,6 +529,27 @@
<string>application/vnd.google-earth.kml+xml</string>
</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>
<key>UTTypeIdentifier</key>
<string>com.geocaching.loc</string>
@ -344,7 +568,7 @@
<string>loc</string>
</array>
<key>public.mime-type</key>
<string>application/loc+xml</string>
<string>application/vnd.groundspeak.loc+xml</string>
</dict>
</dict>
<dict>
@ -365,7 +589,7 @@
<string>slf</string>
</array>
<key>public.mime-type</key>
<string>application/slf+xml</string>
<string>application/vnd.sigma.slf+xml</string>
</dict>
</dict>
<dict>
@ -575,7 +799,269 @@
<string>sml</string>
</array>
<key>public.mime-type</key>
<string>application/sml+xml</string>
<string>application/vnd.suunto.sml+xml</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>public.jpeg</string>
<key>UTTypeReferenceURL</key>
<string>http://www.w3.org/Graphics/JPEG/</string>
<key>UTTypeDescription</key>
<string>JPEG Image</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>jpeg</string>
<string>jpg</string>
</array>
<key>public.mime-type</key>
<string>image/jpeg</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>public.csv</string>
<key>UTTypeReferenceURL</key>
<string>https://tools.ietf.org/html/rfc4180</string>
<key>UTTypeDescription</key>
<string>Comma-Separated Values (CSV) Files</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>csv</string>
</array>
<key>public.mime-type</key>
<string>text/csv</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.garmin.img</string>
<key>UTTypeReferenceURL</key>
<string>https://sourceforge.net/projects/garmin-img/</string>
<key>UTTypeDescription</key>
<string>Garmin IMG map</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>img</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.garmin.img</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.garmin.jnx</string>
<key>UTTypeReferenceURL</key>
<string>http://whiter.brinkster.net/en/JNX.shtml</string>
<key>UTTypeDescription</key>
<string>Garmin JNX Map</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>jnx</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.garmin.jnx</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.garmin.gmap</string>
<key>UTTypeReferenceURL</key>
<string>https://sourceforge.net/projects/garmin-img/</string>
<key>UTTypeDescription</key>
<string>Garmin Map Product File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>xml</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.garmin.gmap</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.maptech.kap</string>
<key>UTTypeReferenceURL</key>
<string>http://libbsb.sourceforge.net/bsb_file_format.html</string>
<key>UTTypeDescription</key>
<string>BSB Nautical Charts</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>kap</string>
</array>
<key>public.mime-type</key>
<string>image/vnd.maptech.kap</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.oziexplorer3.map</string>
<key>UTTypeReferenceURL</key>
<string>https://www.oziexplorer3.com/eng/help/map_file_format.html</string>
<key>UTTypeDescription</key>
<string>OziExplorer Map File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>map</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.oziexplorer.map</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.mapbox.mbtiles</string>
<key>UTTypeReferenceURL</key>
<string>https://github.com/mapbox/mbtiles-spec</string>
<key>UTTypeDescription</key>
<string>MBTiles Map File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>mbtiles</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.mapbox.mbtiles</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>com.twonav.rmap</string>
<key>UTTypeReferenceURL</key>
<string>https://wiki.openstreetmap.org/wiki/TwoNav_RMAP</string>
<key>UTTypeDescription</key>
<string>TwoNav Raster Map File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>rmap</string>
<string>rtmap</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.twonav.rmap</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>net.trekbuddy.tba</string>
<key>UTTypeReferenceURL</key>
<string>https://github.com/kruhc/trekbuddy</string>
<key>UTTypeDescription</key>
<string>TrekBuddy Atlas</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>tba</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.trekbuddy.tba</string>
</dict>
</dict>
<dict>
<key>UTTypeIdentifier</key>
<string>public.tiff</string>
<key>UTTypeReferenceURL</key>
<string>https://www.adobe.io/open/standards/TIFF.html</string>
<key>UTTypeDescription</key>
<string>TIFF Image</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>tiff</string>
<string>tif</string>
</array>
<key>public.mime-type</key>
<string>image/tiff</string>
</dict>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>org.gpxsee.map</string>
<key>UTTypeReferenceURL</key>
<string>http://www.gpxsee.org/map/1.4/</string>
<key>UTTypeDescription</key>
<string>GPXSee Map Definition File</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.xml</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>xml</string>
</array>
<key>public.mime-type</key>
<string>application/vnd.gpxsee.map+xml</string>
</dict>
</dict>
</array>

View File

@ -18,13 +18,14 @@
<li>User-definable online maps (OpenStreetMap/Google tiles, WMTS,
WMS, TMS, QuadTiles).</li>
<li>Offline maps (MBTiles, OziExplorer maps, TrekBuddy maps/atlases,
TwoNav RMaps, Garmin IMG &amp; JNX, GeoTIFF images).</li>
TwoNav RMaps, Garmin IMG &amp; JNX maps, GeoTIFF images,
BSB nautical charts, KMZ maps).</li>
<li>Elevation, speed, heart rate, cadence, power, temperature and
gear ratio graphs.</li>
<li>Support for multiple tracks in one view.</li>
<li>Support for POI files.</li>
<li>Support for DEM files (SRTM HGT).</li>
<li>Print/export to PDF.</li>
<li>Print/export to PDF &amp; PNG.</li>
<li>Full-screen mode.</li>
<li>HiDPI/Retina displays &amp; maps support.</li>
</ul>
@ -32,10 +33,10 @@
<screenshots>
<screenshot type="default">
<image>http://www.gpxsee.org/gallery/lin1.png</image>
<image>https://www.gpxsee.org/gallery/linux.png</image>
</screenshot>
<screenshot>
<image>http://www.gpxsee.org/gallery/lin2.png</image>
<image>https://www.gpxsee.org/gallery/poi2.png</image>
</screenshot>
</screenshots>
@ -48,7 +49,7 @@
<category>DataVisualization</category>
</categories>
<url type="homepage">http://www.gpxsee.org</url>
<url type="homepage">https://www.gpxsee.org</url>
<launchable type="desktop-id">gpxsee.desktop</launchable>
@ -58,7 +59,7 @@
<mimetypes>
<mimetype>application/gpx+xml</mimetype>
<mimetype>application/tcx+xml</mimetype>
<mimetype>application/vnd.garmin.tcx+xml</mimetype>
<mimetype>application/vnd.ant.fit</mimetype>
<mimetype>application/vnd.google-earth.kml+xml</mimetype>
<mimetype>application/vnd.fai.igc</mimetype>
@ -66,11 +67,25 @@
<mimetype>application/vnd.oziexplorer.plt</mimetype>
<mimetype>application/vnd.oziexplorer.rte</mimetype>
<mimetype>application/vnd.oziexplorer.wpt</mimetype>
<mimetype>application/loc+xml</mimetype>
<mimetype>application/slf+xml</mimetype>
<mimetype>application/vnd.groundspeak.loc+xml</mimetype>
<mimetype>application/vnd.sigma.slf+xml</mimetype>
<mimetype>application/geo+json</mimetype>
<mimetype>application/vnd.naviter.seeyou.cup</mimetype>
<mimetype>application/vnd.garmin.gpi</mimetype>
<mimetype>application/sml+xml</mimetype>
<mimetype>application/vnd.suunto.sml+xml</mimetype>
<mimetype>image/jpeg</mimetype>
<mimetype>text/csv</mimetype>
<mimetype>application/vnd.garmin.img</mimetype>
<mimetype>application/vnd.garmin.jnx</mimetype>
<mimetype>application/vnd.garmin.gmap+xml</mimetype>
<mimetype>image/vnd.maptech.kap</mimetype>
<mimetype>application/vnd.oziexplorer.map</mimetype>
<mimetype>application/vnd.mapbox.mbtiles</mimetype>
<mimetype>application/vnd.twonav.rmap</mimetype>
<mimetype>application/vnd.trekbuddy.tba</mimetype>
<mimetype>application/vnd.gpxsee.map+xml</mimetype>
<mimetype>application/x-tar</mimetype>
<mimetype>image/tiff</mimetype>
<mimetype>application/vnd.google-earth.kmz</mimetype>
</mimetypes>
</component>

View File

@ -1887,6 +1887,7 @@ CI1971 / Chatham Islands Map Grid,5518,4672,5517,9001,9807,4500,8801,-44,9110,88
CI1979 / Chatham Islands Map Grid,5519,4673,5517,9001,9807,4500,8801,-44,9110,8802,-176.3,9110,8805,1,9201,8806,350000,9001,8807,650000,9001,,,,,,
DHDN / 3-degree Gauss-Kruger zone 1,5520,4314,16261,9001,9807,4530,8801,0,9102,8802,3,9102,8805,1,9201,8806,1500000,9001,8807,0,9001,,,,,,
WGS 84 / Gabon TM 2011,5523,4326,5522,9001,9807,4499,8801,0,9102,8802,11.3,9110,8805,0.9996,9201,8806,1500000,9001,8807,5500000,9001,,,,,,
SAD69(96) / Brazil Polyconic,5530,5527,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
SAD69(96) / UTM zone 21S,5531,5527,16121,9001,9807,4400,8801,0,9102,8802,-57,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
SAD69(96) / UTM zone 22S,5532,4618,16122,9001,9807,4400,8801,0,9102,8802,-51,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
SAD69(96) / UTM zone 23S,5533,5527,16123,9001,9807,4400,8801,0,9102,8802,-45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
@ -1970,6 +1971,7 @@ SAD69(96) / UTM zone 18S,5875,5527,16118,9001,9807,4400,8801,0,9102,8802,-75,910
SAD69(96) / UTM zone 19S,5876,5527,16119,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
SAD69(96) / UTM zone 20S,5877,5527,16120,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
Cadastre 1997 / UTM zone 38S,5879,4475,16138,9001,9807,4400,8801,0,9102,8802,45,9102,8805,0.9996,9201,8806,500000,9001,8807,10000000,9001,,,,,,
SIRGAS 2000 / Brazil Polyconic,5880,4674,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
WGS 84 / EPSG Arctic Regional zone A1,5921,4326,5906,9001,9802,4400,8821,81.19020136,9110,8822,-111,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
WGS 84 / EPSG Arctic Regional zone A2,5922,4326,5907,9001,9802,4400,8821,81.19020136,9110,8822,-39,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
WGS 84 / EPSG Arctic Regional zone A3,5923,4326,5908,9001,9802,4400,8821,81.19020136,9110,8822,33,9102,8823,85,9102,8824,77,9102,8826,0,9001,8827,0,9001,,,
@ -3046,6 +3048,8 @@ Pulkovo 1942 / Gauss-Kruger 32N,28492,4284,16332,9001,9807,4530,8801,0,9102,8802
Qatar 1974 / Qatar National Grid,28600,4285,19919,9001,9807,4400,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000,9001,8807,300000,9001,,,,,,
Amersfoort / RD Old,28991,4289,19913,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0,9001,8807,0,9001,,,,,,
Amersfoort / RD New,28992,4289,19914,9001,9809,4499,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000,9001,8807,463000,9001,,,,,,
SAD69 / Brazil Polyconic,29100,4291,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
SAD69 / Brazil Polyconic,29101,4618,19941,9001,9818,4499,8801,0,9102,8802,-54,9102,8806,5000000,9001,8807,10000000,9001,,,,,,,,,
SAD69 / UTM zone 18N,29118,4291,16018,9001,9807,4400,8801,0,9102,8802,-75,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
SAD69 / UTM zone 19N,29119,4291,16019,9001,9807,4400,8801,0,9102,8802,-69,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,
SAD69 / UTM zone 20N,29120,4291,16020,9001,9807,4400,8801,0,9102,8802,-63,9102,8805,0.9996,9201,8806,500000,9001,8807,0,9001,,,,,,

Can't render this file because it is too large.

View File

@ -15,4 +15,4 @@ Icon=gpxsee
Terminal=false
Type=Application
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt;
MimeType=application/gpx+xml;application/tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/loc+xml;application/slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/sml+xml;
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;

View File

@ -7,7 +7,7 @@
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "7.37"
!define VERSION "8.2"
; The file to write
OutFile "GPXSee-${VERSION}.exe"
@ -109,14 +109,6 @@ Section "GPXSee" SEC_APP
; Associate file formats
DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
@ -124,6 +116,57 @@ Section "GPXSee" SEC_APP
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
!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 "mbtiles" "MBTiles Map File" 13
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 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
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tcx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".fit\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".igc\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".nmea\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".plt\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rte\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".wpt\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".loc\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".slf\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".geojson\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".cup\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".gpi\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".sml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".csv\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".json\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jpg\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jpeg\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".img\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jnx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".map\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".mbtiles\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rmap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rtmap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tar\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -176,6 +219,7 @@ SectionEnd
SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Czech" "cs"
!insertmacro LOCALIZATION "Danish" "da"
!insertmacro LOCALIZATION "Esperanto" "eo"
!insertmacro LOCALIZATION "Finnish" "fi"
!insertmacro LOCALIZATION "French" "fr"
!insertmacro LOCALIZATION "German" "de"
@ -210,7 +254,7 @@ Section "Uninstall"
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
RMDir "$SMPROGRAMS\$StartMenuFolder"
; Remove GPX file association
; Remove file associations
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
@ -226,6 +270,49 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
!insertmacro FILE_ASSOCIATION_REMOVE "img"
!insertmacro FILE_ASSOCIATION_REMOVE "jnx"
!insertmacro FILE_ASSOCIATION_REMOVE "kap"
!insertmacro FILE_ASSOCIATION_REMOVE "map"
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
!insertmacro FILE_ASSOCIATION_REMOVE "rmap"
!insertmacro FILE_ASSOCIATION_REMOVE "tba"
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".fit\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".igc\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".nmea\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".plt\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rte\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".wpt\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".loc\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".slf\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".geojson\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".cup\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".gpi\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".sml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".csv\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".json\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jpg\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jpeg\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".img\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jnx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".map\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".mbtiles\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rmap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rtmap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tar\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tba\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
DeleteRegKey HKCR "Applications\GPXSee.exe"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd

View File

@ -1,35 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<!-- Data files -->
<mime-type type="application/gpx+xml">
<comment>GPS Exchange Format</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.topografix.com/GPX/1/0" localName="gpx"/>
<root-XML namespaceURI="http://www.topografix.com/GPX/1/1" localName="gpx"/>
<glob pattern="*.gpx"/>
</mime-type>
<mime-type type="application/tcx+xml">
<mime-type type="application/vnd.garmin.tcx+xml">
<comment>Training Center XML</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" localName="TrainingCenterDatabase"/>
<glob pattern="*.tcx"/>
</mime-type>
<mime-type type="application/kml+xml">
<mime-type type="application/vnd.google-earth.kml+xml">
<comment>Keyhole Markup Language</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.opengis.net/kml/2.2" localName="kml"/>
<glob pattern="*.kml"/>
</mime-type>
<mime-type type="application/loc+xml">
<mime-type type="application/vnd.groundspeak.loc+xml">
<comment>Geocaching.com Waypoint File</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<glob pattern="*.loc"/>
</mime-type>
<mime-type type="application/slf+xml">
<mime-type type="application/vnd.sigma.slf+xml">
<comment>Sigma Log Format</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
@ -40,6 +46,9 @@
<comment>Flexible and Interoperable Data Transfer</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application-octet-stream"/>
<magic>
<match type="string" offset="8" value=".FIT"/>
</magic>
<glob pattern="*.fit"/>
</mime-type>
@ -61,6 +70,9 @@
<comment>OziExplorer Track Point File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<magic>
<match type="string" offset="0" value="OziExplorer Track Point File"/>
</magic>
<glob pattern="*.plt"/>
</mime-type>
@ -68,6 +80,9 @@
<comment>OziExplorer Route File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<magic>
<match type="string" offset="0" value="OziExplorer Route File"/>
</magic>
<glob pattern="*.rte"/>
</mime-type>
@ -75,6 +90,9 @@
<comment>OziExplorer Waypoint File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<magic>
<match type="string" offset="0" value="OziExplorer Waypoint File"/>
</magic>
<glob pattern="*.wpt"/>
</mime-type>
@ -96,13 +114,110 @@
<comment>Garmin POI File</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application/octet-stream"/>
<magic>
<match type="string" offset="8" value="GRMREC"/>
</magic>
<glob pattern="*.gpi"/>
</mime-type>
<mime-type type="application/sml+xml">
<mime-type type="application/vnd.suunto.sml+xml">
<comment>Suunto Markup Language</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.suunto.com/schemas/sml" localName="sml"/>
<glob pattern="*.sml"/>
</mime-type>
<!-- Maps -->
<mime-type type="application/vnd.garmin.img">
<comment>Garmin IMG Map</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application-octet-stream"/>
<magic>
<match type="string" offset="16" value="DSKIMG"/>
</magic>
<glob pattern="*.img"/>
</mime-type>
<mime-type type="application/vnd.garmin.jnx">
<comment>Garmin JNX Map</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application-octet-stream"/>
<glob pattern="*.jnx"/>
</mime-type>
<mime-type type="application/vnd.garmin.gmap+xml">
<comment>Garmin Map Product File</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/MapProduct/v1" localName="MapProduct"/>
<root-XML namespaceURI="http://www.garmin.com/xmlschemas/MapProduct/v2" localName="MapProduct"/>
<glob pattern="*.xml"/>
</mime-type>
<mime-type type="image/vnd.maptech.kap">
<comment>BSB Nautical Chart</comment>
<generic-icon name="image-x-generic"/>
<glob pattern="*.kap"/>
</mime-type>
<mime-type type="application/vnd.oziexplorer.map">
<comment>OziExplorer Map File</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<magic>
<match type="string" offset="0" value="OziExplorer Map Data File"/>
</magic>
<glob pattern="*.map"/>
</mime-type>
<mime-type type="application/vnd.mapbox.mbtiles">
<comment>MBTiles Map File</comment>
<sub-class-of type="application/vnd.sqlite3"/>
<generic-icon name="application/octet-stream"/>
<glob pattern="*.mbtiles"/>
</mime-type>
<mime-type type="application/vnd.twonav.rmap">
<comment>TwoNav Raster Map File</comment>
<sub-class-of type="application/octet-stream"/>
<generic-icon name="application/octet-stream"/>
<magic>
<match type="string" offset="0" value="CompeGPSRasterImage"/>
</magic>
<glob pattern="*.rmap"/>
<glob pattern="*.rtmap"/>
</mime-type>
<mime-type type="application/vnd.trekbuddy.tba">
<comment>TrekBuddy Atlas</comment>
<sub-class-of type="text/plain"/>
<generic-icon name="text-plain"/>
<magic>
<match type="string" offset="0" value="Atlas 1.0"/>
</magic>
<glob pattern="*.tba"/>
</mime-type>
<mime-type type="application/vnd.gpxsee.map+xml">
<comment>GPXSee Map Definition File</comment>
<sub-class-of type="application/xml"/>
<generic-icon name="application-xml"/>
<root-XML namespaceURI="http://www.gpxsee.org/map/1.0" localName="map"/>
<root-XML namespaceURI="http://www.gpxsee.org/map/1.1" localName="map"/>
<root-XML namespaceURI="http://www.gpxsee.org/map/1.2" localName="map"/>
<root-XML namespaceURI="http://www.gpxsee.org/map/1.3" localName="map"/>
<root-XML namespaceURI="http://www.gpxsee.org/map/1.4" localName="map"/>
<glob pattern="*.xml"/>
</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-info>

View File

@ -7,7 +7,7 @@
; The name of the installer
Name "GPXSee"
; Program version
!define VERSION "7.37"
!define VERSION "8.2"
; The file to write
OutFile "GPXSee-${VERSION}_x64.exe"
@ -116,14 +116,6 @@ Section "GPXSee" SEC_APP
; Associate file formats
DetailPrint "Associating file types..."
!insertmacro FILE_ASSOCIATION_ADD "gpx" "GPS Exchange Format" 8
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 9
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 10
!insertmacro FILE_ASSOCIATION_ADD "fit" "Flexible and Interoperable Data Transfer" 11
!insertmacro FILE_ASSOCIATION_ADD "igc" "Flight Recorder Data Format" 12
!insertmacro FILE_ASSOCIATION_ADD "nmea" "NMEA 0183 Data" 13
!insertmacro FILE_ASSOCIATION_ADD "plt" "OziExplorer Track Point File" 14
!insertmacro FILE_ASSOCIATION_ADD "rte" "OziExplorer Route File" 15
!insertmacro FILE_ASSOCIATION_ADD "wpt" "OziExplorer Waypoint File" 1
!insertmacro FILE_ASSOCIATION_ADD "loc" "Geocaching.com Waypoint File" 2
!insertmacro FILE_ASSOCIATION_ADD "slf" "Sigma Log File" 3
@ -131,6 +123,57 @@ Section "GPXSee" SEC_APP
!insertmacro FILE_ASSOCIATION_ADD "cup" "SeeYou CUP File" 5
!insertmacro FILE_ASSOCIATION_ADD "gpi" "Garmin POI File" 6
!insertmacro FILE_ASSOCIATION_ADD "sml" "Suunto Markup Language" 7
!insertmacro FILE_ASSOCIATION_ADD "img" "Garmin IMG Map" 8
!insertmacro FILE_ASSOCIATION_ADD "jnx" "Garmin JNX Map" 9
!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 "mbtiles" "MBTiles Map File" 13
!insertmacro FILE_ASSOCIATION_ADD "rmap" "TwoNav Raster Map File" 14
!insertmacro FILE_ASSOCIATION_ADD "tba" "TrekBuddy Atlas" 15
!insertmacro FILE_ASSOCIATION_ADD "tcx" "Training Center XML" 16
!insertmacro FILE_ASSOCIATION_ADD "kml" "Keyhole Markup Language" 17
!insertmacro FILE_ASSOCIATION_ADD "kmz" "KML geographic compressed data" 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
WriteRegStr HKCR "Applications\GPXSee.exe\shell\open\command" "" "$\"$INSTDIR\GPXSee.exe$\" $\"%1$\""
WriteRegStr HKCR ".gpx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tcx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".fit\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".igc\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".nmea\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".plt\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rte\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".wpt\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".loc\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".slf\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".geojson\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".cup\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".gpi\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".sml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".csv\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".json\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jpg\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jpeg\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".img\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".jnx\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".map\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".mbtiles\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rmap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".rtmap\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tar\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tba\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tif\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".tiff\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".xml\OpenWithList" "GPXSee.exe" ""
WriteRegStr HKCR ".kmz\OpenWithList" "GPXSee.exe" ""
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd
@ -139,6 +182,17 @@ Section "QT framework" SEC_QT
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 "Qt5Gui.dll"
File "Qt5Widgets.dll"
@ -146,9 +200,10 @@ Section "QT framework" SEC_QT
File "Qt5Network.dll"
File "Qt5Sql.dll"
File "Qt5Concurrent.dll"
File /r "printsupport"
!endif
File /r "platforms"
File /r "imageformats"
File /r "printsupport"
File /r "styles"
File /r "sqldrivers"
@ -172,6 +227,7 @@ Section "OpenSSL" SEC_OPENSSL
SectionEnd
!ifndef QT6
Section "ANGLE" SEC_ANGLE
File "libGLESv2.dll"
@ -179,10 +235,12 @@ Section "ANGLE" SEC_ANGLE
File "D3DCompiler_47.dll"
SectionEnd
!endif
SectionGroup "Localization" SEC_LOCALIZATION
!insertmacro LOCALIZATION "Czech" "cs"
!insertmacro LOCALIZATION "Danish" "da"
!insertmacro LOCALIZATION "Esperanto" "eo"
!insertmacro LOCALIZATION "Finnish" "fi"
!insertmacro LOCALIZATION "French" "fr"
!insertmacro LOCALIZATION "German" "de"
@ -218,7 +276,7 @@ Section "Uninstall"
Delete "$SMPROGRAMS\$StartMenuFolder\*.*"
RMDir "$SMPROGRAMS\$StartMenuFolder"
; Remove File associations
; Remove file associations
!insertmacro FILE_ASSOCIATION_REMOVE "gpx"
!insertmacro FILE_ASSOCIATION_REMOVE "tcx"
!insertmacro FILE_ASSOCIATION_REMOVE "kml"
@ -234,6 +292,49 @@ Section "Uninstall"
!insertmacro FILE_ASSOCIATION_REMOVE "cup"
!insertmacro FILE_ASSOCIATION_REMOVE "gpi"
!insertmacro FILE_ASSOCIATION_REMOVE "sml"
!insertmacro FILE_ASSOCIATION_REMOVE "img"
!insertmacro FILE_ASSOCIATION_REMOVE "jnx"
!insertmacro FILE_ASSOCIATION_REMOVE "kap"
!insertmacro FILE_ASSOCIATION_REMOVE "map"
!insertmacro FILE_ASSOCIATION_REMOVE "mbtiles"
!insertmacro FILE_ASSOCIATION_REMOVE "rmap"
!insertmacro FILE_ASSOCIATION_REMOVE "tba"
!insertmacro FILE_ASSOCIATION_REMOVE "kmz"
DeleteRegValue HKCR ".gpx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tcx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".fit\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".igc\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".nmea\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".plt\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rte\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".wpt\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".loc\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".slf\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".geojson\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".cup\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".gpi\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".sml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".csv\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".json\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jpg\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jpeg\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".img\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".jnx\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".map\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".mbtiles\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rmap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".rtmap\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tar\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tba\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tif\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".tiff\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".xml\OpenWithList" "GPXSee.exe"
DeleteRegValue HKCR ".kmz\OpenWithList" "GPXSee.exe"
DeleteRegKey HKCR "Applications\GPXSee.exe"
System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)'
SectionEnd

View File

@ -6,6 +6,7 @@
#include <QNetworkAccessManager>
#include <QLibraryInfo>
#include <QSettings>
#include <QSurfaceFormat>
#include "common/programpaths.h"
#include "common/config.h"
#include "map/downloader.h"
@ -13,9 +14,9 @@
#include "map/gcs.h"
#include "map/pcs.h"
#include "data/dem.h"
#include "opengl.h"
#include "gui.h"
#include "settings.h"
#include "mapaction.h"
#include "app.h"
@ -29,18 +30,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
setApplicationVersion(APP_VERSION);
QTranslator *gpxsee = new QTranslator(this);
gpxsee->load(QLocale::system(), "gpxsee", "_",
ProgramPaths::translationsDir());
installTranslator(gpxsee);
if (gpxsee->load(QLocale::system(), "gpxsee", "_",
ProgramPaths::translationsDir()))
installTranslator(gpxsee);
QTranslator *qt = new QTranslator(this);
#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
qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location(
QLibraryInfo::TranslationsPath));
if (qt->load(QLocale::system(), "qt", "_", QLibraryInfo::location(
QLibraryInfo::TranslationsPath)))
#endif // Q_OS_WIN32 || Q_OS_MAC
installTranslator(qt);
installTranslator(qt);
#ifdef Q_OS_MAC
setAttribute(Qt::AA_DontShowIconsInMenus);
@ -51,17 +52,18 @@ App::App(int &argc, char **argv) : QApplication(argc, argv)
"QThreadStorage: Thread X exited after QThreadStorage Y destroyed" */
Downloader::setNetworkManager(new QNetworkAccessManager(this));
DEM::setDir(ProgramPaths::demDir());
OPENGL_SET_FORMAT(4, 8);
QSurfaceFormat fmt;
fmt.setStencilBufferSize(8);
fmt.setSamples(4);
QSurfaceFormat::setDefaultFormat(fmt);
loadDatums();
loadPCSs();
QSettings settings(qApp->applicationName(), qApp->applicationName());
settings.beginGroup(OPTIONS_SETTINGS_GROUP);
#ifdef ENABLE_HTTP2
Downloader::enableHTTP2(settings.value(ENABLE_HTTP2_SETTING,
ENABLE_HTTP2_DEFAULT).toBool());
#endif // ENABLE_HTTP2
Downloader::setTimeout(settings.value(CONNECTION_TIMEOUT_SETTING,
CONNECTION_TIMEOUT_DEFAULT).toInt());
settings.endGroup();
@ -76,11 +78,25 @@ App::~App()
int App::run()
{
MapAction *lastReady = 0;
QStringList args(arguments());
_gui->show();
QStringList args(arguments());
for (int i = 1; i < args.count(); i++)
_gui->openFile(args.at(i));
for (int i = 1; i < args.count(); i++) {
if (!_gui->openFile(args.at(i), true)) {
MapAction *a;
if (!_gui->loadMap(args.at(i), a, true))
_gui->openFile(args.at(i), false);
else {
if (a)
lastReady = a;
}
}
}
if (lastReady)
lastReady->trigger();
return exec();
}
@ -89,7 +105,18 @@ bool App::event(QEvent *event)
{
if (event->type() == QEvent::FileOpen) {
QFileOpenEvent *e = static_cast<QFileOpenEvent *>(event);
return _gui->openFile(e->file());
if (!_gui->openFile(e->file(), true)) {
MapAction *a;
if (!_gui->loadMap(e->file(), a, true))
return _gui->openFile(e->file(), false);
else {
if (a)
a->trigger();
return true;
}
} else
return true;
}
return QApplication::event(event);

View File

@ -5,6 +5,7 @@
#include <QGraphicsSceneMouseEvent>
#include "map/map.h"
#include "popup.h"
#include "tooltip.h"
#include "areaitem.h"
@ -22,7 +23,7 @@ QString AreaItem::info() const
}
AreaItem::AreaItem(const Area &area, Map *map, GraphicsItem *parent)
: GraphicsItem(parent), _area(area)
: PlaneItem(parent), _area(area)
{
_map = map;
_digitalZoom = 0;
@ -158,7 +159,6 @@ void AreaItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Q_UNUSED(event);
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
setZValue(zValue() + 1.0);
update();
}
@ -167,12 +167,5 @@ void AreaItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Q_UNUSED(event);
_pen.setWidthF(_width * pow(2, -_digitalZoom));
setZValue(zValue() - 1.0);
update();
}
void AreaItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Popup::show(event->screenPos(), info(), event->widget());
QGraphicsItem::mousePressEvent(event);
}

View File

@ -2,12 +2,9 @@
#define AREAITEM_H
#include "data/area.h"
#include "graphicsscene.h"
#include "tooltip.h"
#include "planeitem.h"
class Map;
class AreaItem : public GraphicsItem
class AreaItem : public PlaneItem
{
public:
AreaItem(const Area &area, Map *map, GraphicsItem *parent = 0);
@ -19,6 +16,7 @@ public:
const Area &area() const {return _area;}
RectC bounds() const {return _area.boundingRect();}
void setMap(Map *map);
void setColor(const QColor &color);
@ -27,17 +25,15 @@ public:
void setStyle(Qt::PenStyle style);
void setDigitalZoom(int zoom);
virtual QString info() const;
QString info() const;
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
QPainterPath painterPath(const Polygon &polygon);
void updatePainterPath();
ToolTip toolTip() const;
Area _area;
Map *_map;

View File

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

View File

@ -55,7 +55,8 @@ void ColorBox::mousePressEvent(QMouseEvent *event)
if (event->button() != Qt::LeftButton)
return;
QColorDialog::ColorDialogOptions options = _alpha
? QColorDialog::ShowAlphaChannel : (QColorDialog::ColorDialogOptions)0;
? QColorDialog::ColorDialogOptions(QColorDialog::ShowAlphaChannel)
: QColorDialog::ColorDialogOptions();
QColor color = QColorDialog::getColor(_color, this, QString(), options);
if (color.isValid()) {
_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()));
QHBoxLayout *layout = new QHBoxLayout();
layout->setMargin(0);
layout->setContentsMargins(QMargins());
layout->addWidget(_edit);
layout->addWidget(_button);
setLayout(layout);

View File

@ -85,7 +85,7 @@ const GraphSegment *GraphItem::segment(qreal x, GraphType type) const
return 0;
}
qreal GraphItem::yAtX(qreal x)
qreal GraphItem::yAtX(qreal x) const
{
const GraphSegment *seg = segment(x, _type);
if (!seg)
@ -106,7 +106,7 @@ qreal GraphItem::yAtX(qreal x)
else if (p.x(_type) < x)
low = mid + 1;
else
return -p.y();
return p.y();
}
QLineF l;
@ -117,11 +117,14 @@ qreal GraphItem::yAtX(qreal x)
l = QLineF(seg->at(mid-1).x(_type), seg->at(mid-1).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);
if (!seg)
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();
}
void GraphItem::emitSliderPositionChanged(qreal pos)
qreal GraphItem::timeAtDistance(qreal distance) const
{
if (_type == Time)
emit sliderPositionChanged(_time ? distanceAtTime(pos) : NAN);
if (!_time)
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
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)

View File

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

View File

@ -1,6 +1,7 @@
#ifndef GRAPHTAB_H
#define GRAPHTAB_H
#include <QtGlobal>
#include <QList>
#include "graphview.h"
#include "units.h"
@ -14,7 +15,12 @@ class GraphTab : public GraphView
Q_OBJECT
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 QString label() const = 0;

View File

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

View File

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

View File

@ -1,4 +1,3 @@
#include "common/config.h"
#include <QApplication>
#include <QSplitter>
#include <QVBoxLayout>
@ -23,10 +22,8 @@
#include <QMimeData>
#include <QUrl>
#include <QPixmapCache>
#ifdef ENABLE_HIDPI
#include <QWindow>
#include <QScreen>
#endif // ENABLE_HIDPI
#include <QStyle>
#include "common/programpaths.h"
#include "data/data.h"
@ -47,10 +44,10 @@
#include "mapview.h"
#include "trackinfo.h"
#include "filebrowser.h"
#include "cpuarch.h"
#include "graphtab.h"
#include "graphitem.h"
#include "pathitem.h"
#include "mapitem.h"
#include "mapaction.h"
#include "gui.h"
@ -93,8 +90,7 @@ GUI::GUI()
_routeDistance = 0;
_time = 0;
_movingTime = 0;
_sliderPos = 0;
_lastGraphTab = 0;
_dataDir = QDir::homePath();
_mapDir = QDir::homePath();
@ -130,11 +126,17 @@ void GUI::createMapActions()
if (mapDir.isNull())
return;
QString unused;
QList<Map*> maps(MapList::loadMaps(mapDir, unused));
QList<Map*> maps(MapList::loadMaps(mapDir));
for (int i = 0; i < maps.count(); i++) {
MapAction *a = createMapAction(maps.at(i));
connect(a, SIGNAL(loaded()), this, SLOT(mapInitialized()));
Map *map = maps.at(i);
if (map->isValid()) {
MapAction *a = createMapAction(map);
connect(a, SIGNAL(loaded()), this, SLOT(mapInitialized()));
} else {
qWarning("%s: %s", qPrintable(map->path()),
qPrintable(map->errorString()));
delete map;
}
}
}
@ -159,7 +161,7 @@ void GUI::mapInitialized()
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
} else {
qWarning("%s: %s", qPrintable(map->name()), qPrintable(map->errorString()));
qWarning("%s: %s", qPrintable(map->path()), qPrintable(map->errorString()));
action->deleteLater();
}
}
@ -167,8 +169,13 @@ void GUI::mapInitialized()
void GUI::createPOIFilesActions()
{
_poiFilesSignalMapper = new QSignalMapper(this);
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
connect(_poiFilesSignalMapper, SIGNAL(mapped(int)), this,
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++)
createPOIFileAction(_poi->files().at(i));
@ -276,7 +283,7 @@ void GUI::createActions()
_overlapPOIAction->setMenuRole(QAction::NoRole);
_overlapPOIAction->setCheckable(true);
connect(_overlapPOIAction, SIGNAL(triggered(bool)), _mapView,
SLOT(setPOIOverlap(bool)));
SLOT(showOverlappedPOIs(bool)));
_showPOILabelsAction = new QAction(tr("Show POI labels"), this);
_showPOILabelsAction->setMenuRole(QAction::NoRole);
_showPOILabelsAction->setCheckable(true);
@ -306,10 +313,14 @@ void GUI::createActions()
this);
_loadMapAction->setMenuRole(QAction::NoRole);
connect(_loadMapAction, SIGNAL(triggered()), this, SLOT(loadMap()));
_loadMapDirAction = new QAction(QIcon(OPEN_FILE_ICON),
tr("Load map directory..."), this);
_loadMapDirAction->setMenuRole(QAction::NoRole);
connect(_loadMapDirAction, SIGNAL(triggered()), this, SLOT(loadMapDir()));
_clearMapCacheAction = new QAction(tr("Clear tile cache"), this);
_clearMapCacheAction->setEnabled(false);
_clearMapCacheAction->setMenuRole(QAction::NoRole);
connect(_clearMapCacheAction, SIGNAL(triggered()), _mapView,
connect(_clearMapCacheAction, SIGNAL(triggered()), this,
SLOT(clearMapCache()));
_nextMapAction = new QAction(tr("Next map"), this);
_nextMapAction->setMenuRole(QAction::NoRole);
@ -363,6 +374,11 @@ void GUI::createActions()
_showTicksAction->setCheckable(true);
connect(_showTicksAction, SIGNAL(triggered(bool)), _mapView,
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)));
// Graph actions
_showGraphsAction = new QAction(QIcon(SHOW_GRAPHS_ICON), tr("Show graphs"),
@ -399,11 +415,6 @@ void GUI::createActions()
_showGraphSliderInfoAction->setCheckable(true);
connect(_showGraphSliderInfoAction, SIGNAL(triggered(bool)), this,
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
_showToolbarsAction = new QAction(tr("Show toolbars"), this);
@ -519,6 +530,7 @@ void GUI::createMenus()
_mapMenu->addActions(_mapsActionGroup->actions());
_mapsEnd = _mapMenu->addSeparator();
_mapMenu->addAction(_loadMapAction);
_mapMenu->addAction(_loadMapDirAction);
_mapMenu->addAction(_clearMapCacheAction);
_mapMenu->addSeparator();
_mapMenu->addAction(_showCoordinatesAction);
@ -531,7 +543,6 @@ void GUI::createMenus()
graphMenu->addSeparator();
graphMenu->addAction(_showGraphGridAction);
graphMenu->addAction(_showGraphSliderInfoAction);
graphMenu->addAction(_showMarkersAction);
graphMenu->addSeparator();
graphMenu->addAction(_showGraphsAction);
@ -552,6 +563,7 @@ void GUI::createMenus()
displayMenu->addAction(_showWaypointLabelsAction);
displayMenu->addAction(_showRouteWaypointsAction);
displayMenu->addAction(_showTicksAction);
displayMenu->addAction(_showMarkersAction);
dataMenu->addSeparator();
dataMenu->addAction(_showTracksAction);
dataMenu->addAction(_showRoutesAction);
@ -649,13 +661,8 @@ void GUI::createGraphTabs()
_tabs.append(new TemperatureGraph(_graphTabWidget));
_tabs.append(new GearRatioGraph(_graphTabWidget));
for (int i = 0; i < _tabs.count(); i++) {
#if defined(Q_OS_WIN32) || defined(Q_OS_MAC)
_tabs.at(i)->setFrameShape(QFrame::NoFrame);
#endif // Q_OS_WIN32 || Q_OS_MAC
connect(_tabs.at(i), SIGNAL(sliderPositionChanged(qreal)), this,
SLOT(sliderPositionChanged(qreal)));
}
connect(_tabs.first(), SIGNAL(sliderPositionChanged(qreal)), _mapView,
SLOT(setMarkerPosition(qreal)));
}
void GUI::createStatusBar()
@ -679,8 +686,8 @@ void GUI::about()
msgBox.setWindowTitle(tr("About GPXSee"));
msgBox.setText("<h2>" + QString(APP_NAME) + "</h2><p><p>" + tr("Version %1")
.arg(QString(APP_VERSION) + " (" + CPU_ARCH + ", Qt " + QT_VERSION_STR
+ ")") + "</p>");
.arg(QString(APP_VERSION) + " (" + QSysInfo::buildCpuArchitecture()
+ ", Qt " + QT_VERSION_STR + ")") + "</p>");
msgBox.setInformativeText("<table width=\"300\"><tr><td>"
+ tr("GPXSee is distributed under the terms of the GNU General Public "
"License version 3. For more info about GPXSee visit the project "
@ -759,101 +766,45 @@ void GUI::paths()
void GUI::openFile()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open file"),
_dataDir, Data::formats());
QStringList list = files;
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open file"),
_dataDir, Data::formats()));
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
openFile(*it);
if (!list.isEmpty())
_dataDir = QFileInfo(list.first()).path();
for (int i = 0; i < files.size(); i++)
openFile(files.at(i));
if (!files.isEmpty())
_dataDir = QFileInfo(files.last()).path();
}
bool GUI::openFile(const QString &fileName)
bool GUI::openFile(const QString &fileName, bool silent)
{
if (fileName.isEmpty() || _files.contains(fileName))
return false;
if (loadFile(fileName)) {
_files.append(fileName);
_browser->setCurrent(fileName);
_fileActionGroup->setEnabled(true);
_navigationActionGroup->setEnabled(true);
updateNavigationActions();
updateStatusBarInfo();
updateWindowTitle();
if (_files.contains(fileName))
return true;
} else {
if (_files.isEmpty())
_fileActionGroup->setEnabled(false);
if (!loadFile(fileName, silent))
return false;
}
_files.append(fileName);
_browser->setCurrent(fileName);
_fileActionGroup->setEnabled(true);
// Explicitly enable the reload action as it may be disabled by loadMapDir()
_reloadFileAction->setEnabled(true);
_navigationActionGroup->setEnabled(true);
updateNavigationActions();
updateStatusBarInfo();
updateWindowTitle();
return true;
}
bool GUI::loadFile(const QString &fileName)
bool GUI::loadFile(const QString &fileName, bool silent)
{
Data data(fileName);
QList<QList<GraphItem*> > graphs;
QList<PathItem*> paths;
Data data(fileName, !silent);
if (data.isValid()) {
for (int i = 0; i < data.tracks().count(); i++) {
const Track &track = data.tracks().at(i);
_trackDistance += track.distance();
_time += track.time();
_movingTime += track.movingTime();
#ifdef ENABLE_TIMEZONES
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)
_dateRange.first = date;
if (_dateRange.second.isNull() || _dateRange.second < date)
_dateRange.second = date;
}
_trackCount += data.tracks().count();
for (int i = 0; i < data.routes().count(); i++)
_routeDistance += data.routes().at(i).distance();
_routeCount += data.routes().count();
_waypointCount += data.waypoints().count();
_areaCount += data.areas().count();
if (_pathName.isNull()) {
if (data.tracks().count() == 1 && !data.routes().count())
_pathName = data.tracks().first().name();
else if (data.routes().count() == 1 && !data.tracks().count())
_pathName = data.routes().first().name();
} else
_pathName = QString();
for (int i = 0; i < _tabs.count(); i++)
graphs.append(_tabs.at(i)->loadData(data));
if (updateGraphTabs())
_splitter->refresh();
paths = _mapView->loadData(data);
for (int i = 0; i < paths.count(); i++) {
const PathItem *pi = paths.at(i);
for (int j = 0; j < graphs.count(); j++) {
const GraphItem *gi = graphs.at(j).at(i);
if (!gi)
continue;
connect(gi, SIGNAL(sliderPositionChanged(qreal)), pi,
SLOT(moveMarker(qreal)));
connect(pi, SIGNAL(selected(bool)), gi, SLOT(hover(bool)));
connect(gi, SIGNAL(selected(bool)), pi, SLOT(hover(bool)));
}
}
loadData(data);
return true;
} else {
} else if (!silent) {
updateNavigationActions();
updateStatusBarInfo();
updateWindowTitle();
@ -865,25 +816,78 @@ bool GUI::loadFile(const QString &fileName)
error.append("\n" + tr("Line: %1").arg(data.errorLine()));
QMessageBox::critical(this, APP_NAME, error);
return false;
} else
return false;
}
void GUI::loadData(const Data &data)
{
QList<QList<GraphItem*> > graphs;
QList<PathItem*> paths;
for (int i = 0; i < data.tracks().count(); i++) {
const Track &track = data.tracks().at(i);
_trackDistance += track.distance();
_time += track.time();
_movingTime += track.movingTime();
const QDateTime date = track.date().toTimeZone(_options.timeZone.zone());
if (_dateRange.first.isNull() || _dateRange.first > date)
_dateRange.first = date;
if (_dateRange.second.isNull() || _dateRange.second < date)
_dateRange.second = date;
}
_trackCount += data.tracks().count();
for (int i = 0; i < data.routes().count(); i++)
_routeDistance += data.routes().at(i).distance();
_routeCount += data.routes().count();
_waypointCount += data.waypoints().count();
_areaCount += data.areas().count();
if (_pathName.isNull()) {
if (data.tracks().count() == 1 && !data.routes().count())
_pathName = data.tracks().first().name();
else if (data.routes().count() == 1 && !data.tracks().count())
_pathName = data.routes().first().name();
} else
_pathName = QString();
for (int i = 0; i < _tabs.count(); i++)
graphs.append(_tabs.at(i)->loadData(data));
if (updateGraphTabs())
_splitter->refresh();
paths = _mapView->loadData(data);
GraphTab *gt = static_cast<GraphTab*>(_graphTabWidget->currentWidget());
int index = _graphTabWidget->currentIndex();
for (int i = 0; i < paths.count(); i++) {
PathItem *pi = paths.at(i);
for (int j = 0; j < graphs.count(); j++)
pi->addGraph(graphs.at(j).at(i));
pi->setGraph(index);
pi->setMarkerPosition(gt->sliderPosition());
}
}
void GUI::openPOIFile()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open POI file"),
_poiDir, Data::formats());
QStringList list = files;
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open POI file"),
_poiDir, Data::formats()));
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
openPOIFile(*it);
if (!list.isEmpty())
_poiDir = QFileInfo(list.first()).path();
for (int i = 0; i < files.size(); i++)
openPOIFile(files.at(i));
if (!files.isEmpty())
_poiDir = QFileInfo(files.last()).path();
}
bool GUI::openPOIFile(const QString &fileName)
{
if (fileName.isEmpty() || _poi->files().contains(fileName))
return false;
if (_poi->files().contains(fileName))
return true;
if (_poi->loadFile(fileName)) {
_mapView->showPOI(true);
@ -963,7 +967,8 @@ void GUI::openOptions()
SET_VIEW_OPTION(pathAntiAliasing, useAntiAliasing);
SET_VIEW_OPTION(useOpenGL, useOpenGL);
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(graphWidth, setGraphWidth);
@ -1000,23 +1005,18 @@ void GUI::openOptions()
if (options.connectionTimeout != _options.connectionTimeout)
Downloader::setTimeout(options.connectionTimeout);
#ifdef ENABLE_HTTP2
if (options.enableHTTP2 != _options.enableHTTP2)
Downloader::enableHTTP2(options.enableHTTP2);
#endif // ENABLE_HTTP2
#ifdef ENABLE_HIDPI
if (options.hidpiMap != _options.hidpiMap)
_mapView->setDevicePixelRatio(devicePixelRatioF(),
options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENABLE_HIDPI
#ifdef ENABLE_TIMEZONES
if (options.timeZone != _options.timeZone) {
_mapView->setTimeZone(options.timeZone.zone());
_dateRange.first = _dateRange.first.toTimeZone(options.timeZone.zone());
_dateRange.second = _dateRange.second.toTimeZone(options.timeZone.zone());
}
#endif // ENABLE_TIMEZONES
if (reload)
reloadFiles();
@ -1044,12 +1044,9 @@ void GUI::exportPDFFile()
printer.setCreator(QString(APP_NAME) + QString(" ")
+ QString(APP_VERSION));
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.setPaperSize(_pdfExport.paperSize);
printer.setPageMargins(_pdfExport.margins.left(), _pdfExport.margins.top(),
_pdfExport.margins.right(), _pdfExport.margins.bottom(),
QPrinter::Millimeter);
plot(&printer);
}
@ -1227,7 +1224,7 @@ void GUI::plotMainPage(QPainter *painter, const QRectF &rect, qreal ratio,
sc = 1;
}
MapView::PlotFlags flags = MapView::NoFlags;
MapView::PlotFlags flags;
if (_options.hiresPrint)
flags |= MapView::HiRes;
if (expand)
@ -1305,8 +1302,6 @@ void GUI::reloadFiles()
_tabs.at(i)->clear();
_mapView->clear();
_sliderPos = 0;
for (int i = 0; i < _files.size(); i++) {
if (!loadFile(_files.at(i))) {
_files.removeAt(i);
@ -1335,8 +1330,6 @@ void GUI::closeFiles()
_dateRange = DateTimeRange(QDateTime(), QDateTime());
_pathName = QString();
_sliderPos = 0;
for (int i = 0; i < _tabs.count(); i++)
_tabs.at(i)->clear();
_mapView->clear();
@ -1427,45 +1420,73 @@ void GUI::showGraphSliderInfo(bool show)
void GUI::loadMap()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open map file"),
_mapDir, MapList::formats());
QStringList list = files;
QStringList files(QFileDialog::getOpenFileNames(this, tr("Open map file"),
_mapDir, MapList::formats()));
MapAction *a, *lastReady = 0;
for (QStringList::Iterator it = list.begin(); it != list.end(); it++)
loadMap(*it);
if (!list.isEmpty())
_mapDir = QFileInfo(list.first()).path();
for (int i = 0; i < files.size(); i++) {
if (loadMap(files.at(i), a) && a)
lastReady = a;
}
if (!files.isEmpty())
_mapDir = QFileInfo(files.last()).path();
if (lastReady)
lastReady->trigger();
}
bool GUI::loadMap(const QString &fileName)
static MapAction *findMapAction(const QList<QAction*> &mapActions,
const Map *map)
{
// On OS X fileName may be a directory!
if (fileName.isEmpty())
return false;
QString error;
QList<Map*> maps = MapList::loadMaps(fileName, error);
if (maps.isEmpty()) {
error = tr("Error loading map:") + "\n\n"
+ fileName + "\n\n" + error;
QMessageBox::critical(this, APP_NAME, error);
return false;
for (int i = 0; i < mapActions.count(); i++) {
const Map *m = mapActions.at(i)->data().value<Map*>();
if (map->path() == m->path())
return static_cast<MapAction*>(mapActions.at(i));
}
return 0;
}
bool GUI::loadMap(const QString &fileName, MapAction *&action, bool silent)
{
QList<Map*> maps(MapList::loadMaps(fileName));
QList<QAction*> existingActions(_mapsActionGroup->actions());
MapAction *lastReady = 0;
bool valid = false;
for (int i = 0; i < maps.size(); i++) {
Map *map = maps.at(i);
MapAction *a = createMapAction(map);
_mapMenu->insertAction(_mapsEnd, a);
if (map->isReady()) {
a->trigger();
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
} else
connect(a, SIGNAL(loaded()), this, SLOT(mapLoaded()));
MapAction *a;
if (!(a = findMapAction(existingActions, map))) {
if (!map->isValid()) {
if (!silent)
QMessageBox::critical(this, APP_NAME,
tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
+ map->errorString());
delete map;
} else {
valid = true;
a = createMapAction(map);
_mapMenu->insertAction(_mapsEnd, a);
if (map->isReady()) {
lastReady = a;
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
} else
connect(a, SIGNAL(loaded()), this, SLOT(mapLoaded()));
}
} else {
valid = true;
map = a->data().value<Map*>();
if (map->isReady())
lastReady = a;
}
}
return true;
action = lastReady;
return valid;
}
void GUI::mapLoaded()
@ -1478,13 +1499,94 @@ void GUI::mapLoaded()
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
} else {
QString error = tr("Error loading map:") + "\n\n"
+ map->name() + "\n\n" + map->errorString();
QString error = tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
+ map->errorString();
QMessageBox::critical(this, APP_NAME, error);
action->deleteLater();
}
}
void GUI::mapLoadedDir()
{
MapAction *action = static_cast<MapAction*>(QObject::sender());
Map *map = action->data().value<Map*>();
if (map->isValid()) {
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
QList<MapAction*> actions;
actions.append(action);
_mapView->loadMaps(actions);
} else {
QString error = tr("Error loading map:") + "\n\n" + map->path() + "\n\n"
+ map->errorString();
QMessageBox::critical(this, APP_NAME, error);
action->deleteLater();
}
}
void GUI::loadMapDir()
{
QString dir(QFileDialog::getExistingDirectory(this,
tr("Select map directory"), _mapDir, QFileDialog::ShowDirsOnly));
if (dir.isEmpty())
return;
QList<Map*> maps(MapList::loadMaps(dir));
QList<MapAction*> actions;
QList<QAction*> existingActions(_mapsActionGroup->actions());
QFileInfo fi(dir);
QMenu *menu = new QMenu(fi.fileName());
for (int i = 0; i < maps.size(); i++) {
Map *map = maps.at(i);
MapAction *a;
if (!(a = findMapAction(existingActions, map))) {
if (!map->isValid()) {
QMessageBox::critical(this, APP_NAME, tr("Error loading map:")
+ "\n\n" + map->path() + "\n\n" + map->errorString());
delete map;
} else {
a = createMapAction(map);
menu->addAction(a);
if (map->isReady()) {
_showMapAction->setEnabled(true);
_clearMapCacheAction->setEnabled(true);
actions.append(a);
} else
connect(a, SIGNAL(loaded()), this, SLOT(mapLoadedDir()));
}
} else {
map = a->data().value<Map*>();
if (map->isReady())
actions.append(a);
}
}
_mapView->loadMaps(actions);
if (menu->isEmpty())
delete menu;
else {
menu->setStyleSheet("QMenu { menu-scrollable: 1; }");
_mapMenu->insertMenu(_mapsEnd, menu);
}
_mapDir = fi.absolutePath();
_areaCount += maps.size();
_fileActionGroup->setEnabled(true);
_reloadFileAction->setEnabled(false);
}
void GUI::clearMapCache()
{
if (QMessageBox::question(this, APP_NAME,
tr("Clear the map tile cache?")) == QMessageBox::Yes)
_mapView->clearMapCache();
}
void GUI::updateStatusBarInfo()
{
if (_files.count() == 0)
@ -1535,7 +1637,7 @@ void GUI::nextMap()
if (!checked)
return;
QList<QAction*> maps = _mapsActionGroup->actions();
QList<QAction*> maps(_mapsActionGroup->actions());
for (int i = 1; i < maps.size(); i++) {
int next = (maps.indexOf(checked) + i) % maps.count();
if (maps.at(next)->isEnabled()) {
@ -1551,7 +1653,7 @@ void GUI::prevMap()
if (!checked)
return;
QList<QAction*> maps = _mapsActionGroup->actions();
QList<QAction*> maps(_mapsActionGroup->actions());
for (int i = 1; i < maps.size(); i++) {
int prev = (maps.indexOf(checked) + maps.count() - i) % maps.count();
if (maps.at(prev)->isEnabled()) {
@ -1567,18 +1669,25 @@ void GUI::poiFileChecked(int index)
_poiFilesActions.at(index)->isChecked());
}
void GUI::sliderPositionChanged(qreal pos)
{
_sliderPos = pos;
}
void GUI::graphChanged(int index)
{
if (index < 0)
return;
_mapView->setGraph(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()
@ -1657,12 +1766,8 @@ void GUI::setCoordinatesFormat(CoordinatesFormat format)
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)->setSliderPosition(0);
}
}
void GUI::next()
@ -1777,9 +1882,25 @@ void GUI::dragEnterEvent(QDragEnterEvent *event)
void GUI::dropEvent(QDropEvent *event)
{
QList<QUrl> urls = event->mimeData()->urls();
for (int i = 0; i < urls.size(); i++)
openFile(urls.at(i).toLocalFile());
MapAction *lastReady = 0;
QList<QUrl> urls(event->mimeData()->urls());
for (int i = 0; i < urls.size(); i++) {
QString file(urls.at(i).toLocalFile());
if (!openFile(file, true)) {
MapAction *a;
if (!loadMap(file, a, true))
openFile(file, false);
else {
if (a)
lastReady = a;
}
}
}
if (lastReady)
lastReady->trigger();
event->acceptProposedAction();
}
@ -1840,9 +1961,6 @@ void GUI::writeSettings()
!= SHOW_GRAPH_SLIDER_INFO_DEFAULT)
settings.setValue(SHOW_GRAPH_SLIDER_INFO_SETTING,
_showGraphSliderInfoAction->isChecked());
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
settings.setValue(SHOW_MARKERS_SETTING,
_showMarkersAction->isChecked());
settings.endGroup();
settings.beginGroup(POI_SETTINGS_GROUP);
@ -1883,6 +2001,9 @@ void GUI::writeSettings()
if (_showTicksAction->isChecked() != SHOW_TICKS_DEFAULT)
settings.setValue(SHOW_TICKS_SETTING,
_showTicksAction->isChecked());
if (_showMarkersAction->isChecked() != SHOW_MARKERS_DEFAULT)
settings.setValue(SHOW_MARKERS_SETTING,
_showMarkersAction->isChecked());
settings.endGroup();
settings.beginGroup(PDF_EXPORT_SETTINGS_GROUP);
@ -1988,21 +2109,17 @@ void GUI::writeSettings()
if (_options.showSecondarySpeed != SHOW_SECONDARY_SPEED_DEFAULT)
settings.setValue(SHOW_SECONDARY_SPEED_SETTING,
_options.showSecondarySpeed);
#ifdef ENABLE_TIMEZONES
if (_options.timeZone != TimeZoneInfo())
settings.setValue(TIME_ZONE_SETTING, QVariant::fromValue(
_options.timeZone));
#endif // ENABLE_TIMEZONES
if (_options.useSegments != USE_SEGMENTS_DEFAULT)
settings.setValue(USE_SEGMENTS_SETTING, _options.useSegments);
if (_options.poiRadius != POI_RADIUS_DEFAULT)
settings.setValue(POI_RADIUS_SETTING, _options.poiRadius);
if (_options.useOpenGL != USE_OPENGL_DEFAULT)
settings.setValue(USE_OPENGL_SETTING, _options.useOpenGL);
#ifdef ENABLE_HTTP2
if (_options.enableHTTP2 != ENABLE_HTTP2_DEFAULT)
settings.setValue(ENABLE_HTTP2_SETTING, _options.enableHTTP2);
#endif // ENABLE_HTTP2
if (_options.pixmapCache != PIXMAP_CACHE_DEFAULT)
settings.setValue(PIXMAP_CACHE_SETTING, _options.pixmapCache);
if (_options.connectionTimeout != CONNECTION_TIMEOUT_DEFAULT)
@ -2026,12 +2143,12 @@ void GUI::writeSettings()
_options.separateGraphPage);
if (_options.sliderColor != SLIDER_COLOR_DEFAULT)
settings.setValue(SLIDER_COLOR_SETTING, _options.sliderColor);
if (_options.projection != PROJECTION_DEFAULT)
settings.setValue(PROJECTION_SETTING, _options.projection);
#ifdef ENABLE_HIDPI
if (_options.outputProjection != OUTPUT_PROJECTION_DEFAULT)
settings.setValue(OUTPUT_PROJECTION_SETTING, _options.outputProjection);
if (_options.inputProjection != INPUT_PROJECTION_DEFAULT)
settings.setValue(INPUT_PROJECTION_SETTING, _options.outputProjection);
if (_options.hidpiMap != HIDPI_MAP_DEFAULT)
settings.setValue(HIDPI_MAP_SETTING, _options.hidpiMap);
#endif // ENABLE_HIDPI
settings.endGroup();
}
@ -2114,15 +2231,11 @@ void GUI::readSettings()
showGraphSliderInfo(false);
else
_showGraphSliderInfoAction->setChecked(true);
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
_mapView->showMarkers(false);
else
_showMarkersAction->setChecked(true);
settings.endGroup();
settings.beginGroup(POI_SETTINGS_GROUP);
if (!settings.value(OVERLAP_POI_SETTING, OVERLAP_POI_DEFAULT).toBool())
_mapView->setPOIOverlap(false);
_mapView->showOverlappedPOIs(false);
else
_overlapPOIAction->setChecked(true);
if (!settings.value(LABELS_POI_SETTING, LABELS_POI_DEFAULT).toBool())
@ -2184,14 +2297,18 @@ void GUI::readSettings()
_mapView->showTicks(true);
_showTicksAction->setChecked(true);
}
if (!settings.value(SHOW_MARKERS_SETTING, SHOW_MARKERS_DEFAULT).toBool())
_mapView->showMarkers(false);
else
_showMarkersAction->setChecked(true);
settings.endGroup();
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();
_pdfExport.resolution = settings.value(RESOLUTION_SETTING,
RESOLUTION_DEFAULT).toInt();
_pdfExport.paperSize = (QPrinter::PaperSize) settings.value(
_pdfExport.paperSize = (QPageSize::PageSizeId) settings.value(
PAPER_SIZE_SETTING, PAPER_SIZE_DEFAULT).toInt();
qreal ml = settings.value(PDF_MARGIN_LEFT_SETTING, PDF_MARGIN_LEFT_DEFAULT)
.toReal();
@ -2201,7 +2318,7 @@ void GUI::readSettings()
PDF_MARGIN_RIGHT_DEFAULT).toReal();
qreal mb = settings.value(PDF_MARGIN_BOTTOM_SETTING,
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,
PDF_FILENAME_DEFAULT).toString();
settings.endGroup();
@ -2286,9 +2403,7 @@ void GUI::readSettings()
_options.showSecondarySpeed = settings.value(
SHOW_SECONDARY_SPEED_SETTING,
SHOW_SECONDARY_SPEED_DEFAULT).toBool();
#ifdef ENABLE_TIMEZONES
_options.timeZone = settings.value(TIME_ZONE_SETTING).value<TimeZoneInfo>();
#endif // ENABLE_TIMEZONES
_options.useSegments = settings.value(USE_SEGMENTS_SETTING,
USE_SEGMENTS_DEFAULT).toBool();
_options.automaticPause = settings.value(AUTOMATIC_PAUSE_SETTING,
@ -2299,10 +2414,8 @@ void GUI::readSettings()
.toInt();
_options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT)
.toBool();
#ifdef ENABLE_HTTP2
_options.enableHTTP2 = settings.value(ENABLE_HTTP2_SETTING,
ENABLE_HTTP2_DEFAULT).toBool();
#endif // ENABLE_HTTP2
_options.pixmapCache = settings.value(PIXMAP_CACHE_SETTING,
PIXMAP_CACHE_DEFAULT).toInt();
_options.connectionTimeout = settings.value(CONNECTION_TIMEOUT_SETTING,
@ -2325,12 +2438,12 @@ void GUI::readSettings()
SEPARATE_GRAPH_PAGE_DEFAULT).toBool();
_options.sliderColor = settings.value(SLIDER_COLOR_SETTING,
SLIDER_COLOR_DEFAULT).value<QColor>();
_options.projection = settings.value(PROJECTION_SETTING, PROJECTION_DEFAULT)
.toInt();
#ifdef ENABLE_HIDPI
_options.outputProjection = settings.value(OUTPUT_PROJECTION_SETTING,
OUTPUT_PROJECTION_DEFAULT).toInt();
_options.inputProjection = settings.value(INPUT_PROJECTION_SETTING,
INPUT_PROJECTION_DEFAULT).toInt();
_options.hidpiMap = settings.value(HIDPI_MAP_SETTING, HIDPI_MAP_SETTING)
.toBool();
#endif // ENABLE_HIDPI
_mapView->setPalette(_options.palette);
_mapView->setMapOpacity(_options.mapOpacity);
@ -2350,14 +2463,11 @@ void GUI::readSettings()
_mapView->setMarkerColor(_options.sliderColor);
if (_options.useOpenGL)
_mapView->useOpenGL(true);
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENABLE_HIDPI
_mapView->setProjection(_options.projection);
#ifdef ENABLE_TIMEZONES
_mapView->setOutputProjection(_options.outputProjection);
_mapView->setInputProjection(_options.inputProjection);
_mapView->setTimeZone(_options.timeZone.zone());
#endif // ENABLE_TIMEZONES
for (int i = 0; i < _tabs.count(); i++) {
_tabs.at(i)->setPalette(_options.palette);
@ -2397,7 +2507,7 @@ void GUI::readSettings()
QAction *GUI::mapAction(const QString &name)
{
QList<QAction *> maps = _mapsActionGroup->actions();
QList<QAction *> maps(_mapsActionGroup->actions());
// Last map
for (int i = 0; i < maps.count(); i++) {
@ -2448,20 +2558,17 @@ void GUI::show()
{
QMainWindow::show();
#ifdef ENABLE_HIDPI
QWindow *w = windowHandle();
connect(w->screen(), SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal)));
connect(w, SIGNAL(screenChanged(QScreen*)), this,
SLOT(screenChanged(QScreen*)));
#endif // ENABLE_HIDPI
_mapView->fitContentToSize();
}
void GUI::screenChanged(QScreen *screen)
{
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0);
@ -2469,17 +2576,12 @@ void GUI::screenChanged(QScreen *screen)
SLOT(logicalDotsPerInchChanged(qreal)));
connect(screen, SIGNAL(logicalDotsPerInchChanged(qreal)), this,
SLOT(logicalDotsPerInchChanged(qreal)));
#else // ENABLE_HIDPI
Q_UNUSED(screen);
#endif // ENABLE_HIDPI
}
void GUI::logicalDotsPerInchChanged(qreal dpi)
{
Q_UNUSED(dpi)
#ifdef ENABLE_HIDPI
_mapView->setDevicePixelRatio(devicePixelRatioF(),
_options.hidpiMap ? devicePixelRatioF() : 1.0);
#endif // ENBLE_HIDPI
}

View File

@ -30,6 +30,7 @@ class Map;
class POI;
class QScreen;
class MapAction;
class Data;
class GUI : public QMainWindow
{
@ -38,7 +39,9 @@ class GUI : public QMainWindow
public:
GUI();
bool openFile(const QString &fileName);
bool openFile(const QString &fileName, bool silent = false);
bool loadMap(const QString &fileName, MapAction *&action,
bool silent = false);
void show();
private slots:
@ -62,9 +65,11 @@ private slots:
void showTracks(bool show);
void showRoutes(bool show);
void loadMap();
void loadMapDir();
void nextMap();
void prevMap();
void openOptions();
void clearMapCache();
void mapChanged();
void graphChanged(int);
@ -86,11 +91,11 @@ private slots:
void setDegreesMinutes() {setCoordinatesFormat(DegreesMinutes);}
void setDMS() {setCoordinatesFormat(DMS);}
void sliderPositionChanged(qreal pos);
void screenChanged(QScreen *screen);
void logicalDotsPerInchChanged(qreal dpi);
void mapLoaded();
void mapLoadedDir();
void mapInitialized();
private:
@ -117,8 +122,8 @@ private:
void createBrowser();
bool openPOIFile(const QString &fileName);
bool loadFile(const QString &fileName);
bool loadMap(const QString &fileName);
bool loadFile(const QString &fileName, bool silent = false);
void loadData(const Data &data);
void updateStatusBarInfo();
void updateWindowTitle();
void updateNavigationActions();
@ -172,6 +177,7 @@ private:
QAction *_showMapAction;
QAction *_fullscreenAction;
QAction *_loadMapAction;
QAction *_loadMapDirAction;
QAction *_clearMapCacheAction;
QAction *_showGraphsAction;
QAction *_showGraphGridAction;
@ -229,7 +235,7 @@ private:
DateTimeRange _dateRange;
QString _pathName;
qreal _sliderPos;
GraphTab *_lastGraphTab;
QList<QByteArray> _windowStates;
int _frameStyle;

View File

@ -18,9 +18,9 @@ void InfoItem::updateBoundingRect()
for (QList<KV<QString, QString> >::const_iterator i = _list.constBegin();
i != _list.constEnd(); i++) {
width += fm.width(i->key() + ": ");
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
? 0 : PADDING);
width += fm.horizontalAdvance(i->key() + ": " + i->value());
if (i != _list.constEnd() - 1)
width += PADDING;
}
_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();
i != _list.constEnd(); i++) {
painter->drawText(width, fm.height() - fm.descent(), i->key() + ": ");
width += fm.width(i->key() + ": ");
painter->drawText(width, fm.height() - fm.descent(), i->value());
width += fm.width(i->value()) + ((i == _list.constEnd() - 1)
? 0 : PADDING);
QString text(i->key() + ": " + i->value());
painter->drawText(width, fm.height() - fm.descent(), text);
width += fm.horizontalAdvance(text);
if (i != _list.constEnd() - 1) {
width += PADDING;
painter->save();
painter->setPen(Qt::gray);
painter->drawLine(width - PADDING/2, fm.descent(),

230
src/GUI/mapitem.cpp Normal file
View File

@ -0,0 +1,230 @@
#include <cmath>
#include <QCursor>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include "map/map.h"
#include "mapaction.h"
#include "popup.h"
#include "tooltip.h"
#include "mapitem.h"
static void growLeft(Map *map, const Coordinates &c, QRectF &rect)
{
QPointF p(map->ll2xy(c));
if (p.x() < rect.left())
rect.setLeft(p.x());
}
static void growRight(Map *map, const Coordinates &c, QRectF &rect)
{
QPointF p(map->ll2xy(c));
if (p.x() > rect.right())
rect.setRight(p.x());
}
static void growTop(Map *map, const Coordinates &c, QRectF &rect)
{
QPointF p(map->ll2xy(c));
if (p.y() > rect.top())
rect.setTop(p.y());
}
static void growBottom(Map *map, const Coordinates &c, QRectF &rect)
{
QPointF p(map->ll2xy(c));
if (p.y() < rect.bottom())
rect.setBottom(p.y());
}
static QRectF bbox(const RectC &rect, Map *map, int samples = 100)
{
if (!rect.isValid())
return QRectF();
double dx = rect.width() / samples;
double dy = rect.height() / samples;
QPointF tl(map->ll2xy(rect.topLeft()));
QPointF br(map->ll2xy(rect.bottomRight()));
QRectF prect(tl, br);
for (int i = 0; i <= samples; i++) {
double x = remainder(rect.left() + i * dx, 360.0);
growTop(map, Coordinates(x, rect.bottom()), prect);
growBottom(map, Coordinates(x, rect.top()), prect);
}
for (int i = 0; i <= samples; i++) {
double y = rect.bottom() + i * dy;
growLeft(map, Coordinates(rect.left(), y), prect);
growRight(map, Coordinates(rect.right(), y), prect);
}
return prect;
}
QString MapItem::info() const
{
ToolTip tt;
if (!_name.isEmpty())
tt.insert(tr("Name"), _name);
if (!_fileName.isEmpty())
tt.insert(tr("File"), _fileName);
return tt.toString();
}
MapItem::MapItem(MapAction *action, Map *map, GraphicsItem *parent)
: PlaneItem(parent)
{
Map *src = action->data().value<Map*>();
Q_ASSERT(map->isReady());
_name = src->name();
_fileName = src->path();
_bounds = src->llBounds();
connect(this, SIGNAL(triggered()), action, SLOT(trigger()));
_map = map;
_digitalZoom = 0;
_width = 2;
_opacity = 0.5;
QBrush brush(Qt::SolidPattern);
_pen = QPen(brush, _width);
updatePainterPath();
setCursor(Qt::ArrowCursor);
setAcceptHoverEvents(true);
}
void MapItem::updatePainterPath()
{
_painterPath = QPainterPath();
QRectF r(bbox(_bounds, _map));
if (r.left() > r.right()) {
QRectF r1(bbox(RectC(_bounds.topLeft(),
Coordinates(180, _bounds.bottomRight().lat())), _map));
QRectF r2(bbox(RectC(Coordinates(-180, _bounds.topLeft().lat()),
_bounds.bottomRight()), _map));
_painterPath.addRect(r1);
_painterPath.addRect(r2);
} else
_painterPath.addRect(r);
}
void MapItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->setPen(_width ? _pen : QPen(Qt::NoPen));
painter->drawPath(_painterPath);
painter->fillPath(_painterPath, _brush);
//QPen p = QPen(QBrush(Qt::red), 0);
//painter->setPen(p);
//painter->drawRect(boundingRect());
}
void MapItem::setMap(Map *map)
{
prepareGeometryChange();
_map = map;
updatePainterPath();
}
void MapItem::setColor(const QColor &color)
{
if (_pen.color() == color)
return;
QColor bc(color);
bc.setAlphaF(_opacity * color.alphaF());
_pen.setColor(color);
_brush = QBrush(bc);
update();
}
void MapItem::setOpacity(qreal opacity)
{
if (_opacity == opacity)
return;
_opacity = opacity;
QColor bc(_pen.color());
bc.setAlphaF(_opacity * _pen.color().alphaF());
_brush = QBrush(bc);
update();
}
void MapItem::setWidth(qreal width)
{
if (_width == width)
return;
prepareGeometryChange();
_width = width;
_pen.setWidthF(_width * pow(2, -_digitalZoom));
}
void MapItem::setStyle(Qt::PenStyle style)
{
if (_pen.style() == style)
return;
_pen.setStyle(style);
update();
}
void MapItem::setDigitalZoom(int zoom)
{
if (_digitalZoom == zoom)
return;
prepareGeometryChange();
_digitalZoom = zoom;
_pen.setWidthF(_width * pow(2, -_digitalZoom));
}
void MapItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF((_width + 1) * pow(2, -_digitalZoom));
update();
}
void MapItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
Q_UNUSED(event);
_pen.setWidthF(_width * pow(2, -_digitalZoom));
update();
}
void MapItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event);
emit triggered();
}

57
src/GUI/mapitem.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef MAPITEM_H
#define MAPITEM_H
#include "planeitem.h"
class MapAction;
class MapItem : public QObject, public PlaneItem
{
Q_OBJECT
public:
MapItem(MapAction *action, Map *map, GraphicsItem *parent = 0);
QPainterPath shape() const {return _painterPath;}
QRectF boundingRect() const {return _painterPath.boundingRect();}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
RectC bounds() const {return _bounds;}
void setMap(Map *map);
void setColor(const QColor &color);
void setOpacity(qreal opacity);
void setWidth(qreal width);
void setStyle(Qt::PenStyle style);
void setDigitalZoom(int zoom);
QString info() const;
signals:
void triggered();
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
private:
void updatePainterPath();
RectC _bounds;
QString _name;
QString _fileName;
Map *_map;
int _digitalZoom;
qreal _width;
QPen _pen;
QBrush _brush;
qreal _opacity;
QPainterPath _painterPath;
};
#endif // MAPITEM_H

View File

@ -4,19 +4,21 @@
#include <QApplication>
#include <QScrollBar>
#include <QClipboard>
#include <QOpenGLWidget>
#include "data/poi.h"
#include "data/data.h"
#include "map/map.h"
#include "map/pcs.h"
#include "opengl.h"
#include "trackitem.h"
#include "routeitem.h"
#include "waypointitem.h"
#include "areaitem.h"
#include "scaleitem.h"
#include "coordinatesitem.h"
#include "mapitem.h"
#include "keys.h"
#include "graphicsscene.h"
#include "mapaction.h"
#include "mapview.h"
@ -27,6 +29,20 @@
#define COORDINATES_OFFSET SCALE_OFFSET
template<typename T>
static void updateZValues(T &items)
{
for (int i = 0; i < items.size(); i++) {
const QGraphicsItem *ai = items.at(i);
for (int j = 0; j < items.size(); j++) {
QGraphicsItem *aj = items[j];
if (aj->boundingRect().contains(ai->boundingRect()))
aj->setZValue(qMin(ai->zValue() - 1, aj->zValue()));
}
}
}
MapView::MapView(Map *map, POI *poi, QWidget *parent)
: QGraphicsView(parent)
{
@ -39,7 +55,7 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHint(QPainter::Antialiasing, true);
setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
setResizeAnchor(QGraphicsView::AnchorViewCenter);
setAcceptDrops(false);
@ -51,10 +67,12 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
_coordinates->setVisible(false);
_scene->addItem(_coordinates);
_projection = PCS::pcs(3857);
_outputProjection = PCS::pcs(3857);
_inputProjection = GCS::gcs(4326);
_map = map;
_map->load();
_map->setProjection(_projection);
_map->setOutputProjection(_outputProjection);
_map->setInputProjection(_inputProjection);
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
_poi = poi;
@ -85,10 +103,8 @@ MapView::MapView(Map *map, POI *poi, QWidget *parent)
_poiSize = 8;
_poiColor = Qt::black;
#ifdef ENABLE_HIDPI
_deviceRatio = 1.0;
_mapRatio = 1.0;
#endif // ENABLE_HIDPI
_opengl = false;
_plot = false;
_digitalZoom = 0;
@ -170,18 +186,19 @@ void MapView::addArea(const Area &area)
}
AreaItem *ai = new AreaItem(area, _map);
_areas.append(ai);
_ar |= ai->area().boundingRect();
ai->setColor(_palette.nextColor());
ai->setWidth(_areaWidth);
ai->setStyle(_areaStyle);
ai->setOpacity(_areaOpacity);
ai->setDigitalZoom(_digitalZoom);
ai->setVisible(_showAreas);
_scene->addItem(ai);
_ar |= ai->bounds();
_areas.append(ai);
if (_showAreas)
addPOI(_poi->points(ai->area()));
addPOI(_poi->points(ai->bounds()));
}
void MapView::addWaypoints(const QVector<Waypoint> &waypoints)
@ -205,6 +222,26 @@ void MapView::addWaypoints(const QVector<Waypoint> &waypoints)
}
}
MapItem *MapView::addMap(MapAction *map)
{
MapItem *mi = new MapItem(map, _map);
mi->setColor(_palette.nextColor());
mi->setWidth(_areaWidth);
mi->setStyle(_areaStyle);
mi->setOpacity(_areaOpacity);
mi->setDigitalZoom(_digitalZoom);
mi->setVisible(_showAreas);
_scene->addItem(mi);
_ar |= mi->bounds();
_areas.append(mi);
if (_showAreas)
addPOI(_poi->points(mi->bounds()));
return mi;
}
QList<PathItem *> MapView::loadData(const Data &data)
{
QList<PathItem *> paths;
@ -227,18 +264,37 @@ QList<PathItem *> MapView::loadData(const Data &data)
else
updatePOIVisibility();
if (!data.areas().isEmpty())
updateZValues(_areas);
centerOn(contentCenter());
return paths;
}
void MapView::loadMaps(const QList<MapAction *> &maps)
{
int zoom = _map->zoom();
for (int i = 0; i < maps.size(); i++)
addMap(maps.at(i));
if (fitMapZoom() != zoom)
rescale();
else
updatePOIVisibility();
updateZValues(_areas);
centerOn(contentCenter());
}
int MapView::fitMapZoom() const
{
RectC br = _tr | _rr | _wr | _ar;
return _map->zoomFit(viewport()->size() - QSize(2*MARGIN, 2*MARGIN),
br.isNull() ? RectC(_map->xy2ll(_map->bounds().topLeft()),
_map->xy2ll(_map->bounds().bottomRight())) : br);
br.isNull() ? _map->llBounds() : br);
}
QPointF MapView::contentCenter() const
@ -315,10 +371,9 @@ void MapView::setMap(Map *map)
_map = map;
_map->load();
_map->setProjection(_projection);
#ifdef ENABLE_HIDPI
_map->setOutputProjection(_outputProjection);
_map->setInputProjection(_inputProjection);
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
#endif // ENABLE_HIDPI
connect(_map, SIGNAL(tilesLoaded()), this, SLOT(reloadMap()));
digitalZoom(0);
@ -357,6 +412,14 @@ void MapView::setPOI(POI *poi)
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()
{
for (POIHash::const_iterator it = _pois.constBegin();
@ -373,7 +436,7 @@ void MapView::updatePOI()
addPOI(_poi->points(_routes.at(i)->path()));
if (_showAreas)
for (int i = 0; i < _areas.size(); i++)
addPOI(_poi->points(_areas.at(i)->area()));
addPOI(_poi->points(_areas.at(i)->bounds()));
if (_showWaypoints)
for (int i = 0; i< _waypoints.size(); i++)
addPOI(_poi->points(_waypoints.at(i)->waypoint()));
@ -424,12 +487,8 @@ void MapView::setCoordinatesFormat(CoordinatesFormat format)
void MapView::setTimeZone(const QTimeZone &zone)
{
#ifdef ENABLE_TIMEZONES
WaypointItem::setTimeZone(zone);
PathItem::setTimeZone(zone);
#else // ENABLE_TIMEZONES
Q_UNUSED(zone);
#endif // ENABLE_TIMEZONES
}
void MapView::clearMapCache()
@ -464,10 +523,8 @@ void MapView::digitalZoom(int zoom)
_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 > 0 && zoom > 0) && (!shift || _digitalZoom
>= MAX_DIGITAL_ZOOM)) || ((_digitalZoom < 0 && zoom < 0) && (!shift
@ -493,27 +550,42 @@ void MapView::zoom(int zoom, const QPoint &pos)
void MapView::wheelEvent(QWheelEvent *event)
{
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)
return;
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)
{
bool shift = (event->modifiers() & MODIFIER) ? true : false;
QGraphicsView::mouseDoubleClickEvent(event);
if (event->isAccepted())
return;
if (event->button() != Qt::LeftButton && event->button() != Qt::RightButton)
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)
{
int z;
bool shift = (event->modifiers() & MODIFIER) ? true : false;
QPoint pos = viewport()->rect().center();
if (event->key() == ZOOM_IN)
@ -533,7 +605,7 @@ void MapView::keyPressEvent(QKeyEvent *event)
return;
}
zoom(z, pos);
zoom(z, pos, shift);
}
void MapView::keyReleaseEvent(QKeyEvent *event)
@ -566,9 +638,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
// Enter plot mode
setUpdatesEnabled(false);
_plot = true;
#ifdef ENABLE_HIDPI
_map->setDevicePixelRatio(_deviceRatio, 1.0);
#endif // ENABLE_HIDPI
// Compute sizes & ratios
orig = viewport()->rect();
@ -635,9 +705,7 @@ void MapView::plot(QPainter *painter, const QRectF &target, qreal scale,
_mapScale->setPos(origPos);
// Exit plot mode
#ifdef ENABLE_HIDPI
_map->setDevicePixelRatio(_deviceRatio, _mapRatio);
#endif // ENABLE_HIDPI
_plot = false;
setUpdatesEnabled(true);
}
@ -780,9 +848,9 @@ void MapView::showCoordinates(bool show)
setMouseTracking(show);
}
void MapView::setPOIOverlap(bool overlap)
void MapView::showOverlappedPOIs(bool show)
{
_overlapPOIs = overlap;
_overlapPOIs = show;
updatePOIVisibility();
}
@ -959,7 +1027,7 @@ void MapView::useOpenGL(bool use)
_opengl = use;
if (use)
setViewport(new OPENGL_WIDGET);
setViewport(new QOpenGLWidget);
else
setViewport(new QWidget);
}
@ -979,6 +1047,14 @@ void MapView::setMarkerColor(const QColor &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()
{
_scene->invalidate();
@ -986,7 +1062,6 @@ void MapView::reloadMap()
void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
{
#ifdef ENABLE_HIDPI
if (_deviceRatio == deviceRatio && _mapRatio == mapRatio)
return;
@ -1019,26 +1094,40 @@ void MapView::setDevicePixelRatio(qreal deviceRatio, qreal mapRatio)
centerOn(nc);
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 GCS *gcs;
Coordinates center = _map->xy2ll(mapToScene(viewport()->rect().center()));
if ((pcs = PCS::pcs(id)))
_projection = Projection(pcs);
_outputProjection = Projection(pcs);
else if ((gcs = GCS::gcs(id)))
_projection = Projection(gcs);
_outputProjection = Projection(gcs);
else
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();
centerOn(_map->ll2xy(center));
}

View File

@ -29,10 +29,12 @@ class ScaleItem;
class CoordinatesItem;
class PathItem;
class GraphItem;
class AreaItem;
class PlaneItem;
class MapItem;
class Area;
class GraphicsScene;
class QTimeZone;
class MapAction;
class MapView : public QGraphicsView
{
@ -49,10 +51,12 @@ public:
MapView(Map *map, POI *poi, QWidget *parent = 0);
QList<PathItem *> loadData(const Data &data);
void loadMaps(const QList<MapAction*> &maps);
void setPalette(const Palette &palette);
void setPOI(POI *poi);
void setMap(Map *map);
void setGraph(int index);
void plot(QPainter *painter, const QRectF &target, qreal scale,
PlotFlags flags);
@ -76,28 +80,29 @@ public:
void setBackgroundColor(const QColor &color);
void useOpenGL(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:
void showMap(bool show);
void showPOI(bool show);
void setPOIOverlap(bool overlap);
void showWaypointLabels(bool show);
void showPOILabels(bool show);
void showCoordinates(bool show);
void showTicks(bool show);
void showMarkers(bool show);
void showOverlappedPOIs(bool show);
void showWaypointLabels(bool show);
void showTracks(bool show);
void showRoutes(bool show);
void showAreas(bool show);
void showWaypoints(bool show);
void showRouteWaypoints(bool show);
void showMarkers(bool show);
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();
void setMarkerPosition(qreal pos);
private slots:
void updatePOI();
@ -108,6 +113,7 @@ private:
PathItem *addTrack(const Track &track);
PathItem *addRoute(const Route &route);
MapItem *addMap(MapAction *map);
void addArea(const Area &area);
void addWaypoints(const QVector<Waypoint> &waypoints);
void addPOI(const QList<Waypoint> &waypoints);
@ -118,7 +124,7 @@ private:
QPointF contentCenter() const;
void rescale();
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 updatePOIVisibility();
void skipColor() {_palette.nextColor();}
@ -140,7 +146,7 @@ private:
QList<TrackItem*> _tracks;
QList<RouteItem*> _routes;
QList<WaypointItem*> _waypoints;
QList<AreaItem*> _areas;
QList<PlaneItem*> _areas;
POIHash _pois;
RectC _tr, _rr, _wr, _ar;
@ -151,7 +157,7 @@ private:
Palette _palette;
qreal _mapOpacity;
Projection _projection;
Projection _outputProjection, _inputProjection;
bool _showMap, _showTracks, _showRoutes, _showAreas, _showWaypoints,
_showWaypointLabels, _showPOI, _showPOILabels, _showRouteWaypoints,
@ -167,10 +173,8 @@ private:
bool _plot;
QCursor _cursor;
#ifdef ENABLE_HIDPI
qreal _deviceRatio;
qreal _mapRatio;
#endif // ENABLE_HIDPI
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);
}
void MarginsFWidget::setValue(const MarginsF &value)
void MarginsFWidget::setValue(const QMarginsF &value)
{
_top->setValue(value.top());
_bottom->setValue(value.bottom());
@ -104,8 +104,8 @@ void MarginsFWidget::setSingleStep(qreal 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());
}

View File

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

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()
{
_projection = new LimitedComboBox(200);
int last = -1;
_outputProjection = new LimitedComboBox(200);
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++) {
QString text = QString::number(projections.at(i).key()) + " - "
+ projections.at(i).value();
_projection->addItem(text, QVariant(projections.at(i).key()));
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();
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"));
_lodpi = new QRadioButton(tr("Standard"));
if (_options.hidpiMap)
@ -69,24 +103,39 @@ QWidget *OptionsDialog::createMapPage()
"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. "
"Map objects have the expected size but the map is blurry."));
QFont f = lhi->font();
f.setPointSize(f.pointSize() - 1);
lhi->setWordWrap(true);
llo->setWordWrap(true);
lhi->setFont(f);
llo->setFont(f);
#endif // ENABLE_HIDPI
QFormLayout *vectorLayout = new QFormLayout();
vectorLayout->addRow(tr("Projection:"), _projection);
QVBoxLayout *inLayout = new QVBoxLayout();
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();
QVBoxLayout *vectorMapsTabLayout = new QVBoxLayout();
vectorMapsTabLayout->addLayout(vectorLayout);
vectorMapsTabLayout->addStretch();
vectorMapsTab->setLayout(vectorMapsTabLayout);
QWidget *projectionTab = new QWidget();
QVBoxLayout *projectionTabLayout = new QVBoxLayout();
#ifdef Q_OS_MAC
projectionTabLayout->addWidget(new QLabel(tr("Input:")));
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();
hidpiTabLayout->addWidget(_lodpi);
hidpiTabLayout->addWidget(llo);
@ -97,13 +146,10 @@ QWidget *OptionsDialog::createMapPage()
QWidget *hidpiTab = new QWidget();
hidpiTab->setLayout(hidpiTabLayout);
#endif // ENABLE_HIDPI
QTabWidget *mapPage = new QTabWidget();
mapPage->addTab(vectorMapsTab, tr("Vector maps"));
#ifdef ENABLE_HIDPI
mapPage->addTab(projectionTab, tr("Projection"));
mapPage->addTab(hidpiTab, tr("HiDPI display mode"));
#endif // ENABLE_HIDPI
return mapPage;
}
@ -416,7 +462,6 @@ QWidget *OptionsDialog::createDataPage()
_showSecondaryElevation = new QCheckBox(tr("Show secondary elevation"));
_showSecondaryElevation->setChecked(_options.showSecondaryElevation);
#ifdef ENABLE_TIMEZONES
_utcZone = new QRadioButton(tr("UTC"));
_systemZone = new QRadioButton(tr("System"));
_customZone = new QRadioButton(tr("Custom"));
@ -437,7 +482,6 @@ QWidget *OptionsDialog::createDataPage()
QHBoxLayout *customZoneLayout = new QHBoxLayout();
customZoneLayout->addSpacing(20);
customZoneLayout->addWidget(_timeZone);
#endif // ENABLE_TIMEZONES
_useSegments = new QCheckBox(tr("Use segments"));
_useSegments->setChecked(_options.useSegments);
@ -462,7 +506,6 @@ QWidget *OptionsDialog::createDataPage()
elevationOptions->addWidget(_dataDEMElevation);
elevationOptions->addWidget(_showSecondaryElevation);
#ifdef ENABLE_TIMEZONES
QButtonGroup *timeZoneGroup = new QButtonGroup(this);
timeZoneGroup->addButton(_utcZone);
timeZoneGroup->addButton(_systemZone);
@ -472,15 +515,12 @@ QWidget *OptionsDialog::createDataPage()
zoneOptions->addWidget(_systemZone);
zoneOptions->addWidget(_customZone);
zoneOptions->addItem(customZoneLayout);
#endif // ENABLE_TIMEZONES
QFormLayout *formLayout = new QFormLayout();
formLayout->addRow(tr("Speed:"), speedOptions);
formLayout->addRow(tr("Elevation:"), elevationOptions);
#ifdef ENABLE_TIMEZONES
formLayout->addRow(tr("Time zone:"), zoneOptions);
#endif // ENABLE_TIMEZONES
QFormLayout *segmentsLayout = new QFormLayout();
segmentsLayout->addWidget(_useSegments);
@ -492,9 +532,7 @@ QWidget *OptionsDialog::createDataPage()
#else // Q_OS_MAC
QFormLayout *speedLayout = new QFormLayout();
QFormLayout *elevationLayout = new QFormLayout();
#ifdef ENABLE_TIMEZONES
QFormLayout *timeZoneLayout = new QFormLayout();
#endif // ENABLE_TIMEZONES
QFormLayout *segmentsLayout = new QFormLayout();
speedLayout->addWidget(_computedSpeed);
@ -511,7 +549,6 @@ QWidget *OptionsDialog::createDataPage()
QGroupBox *elevationBox = new QGroupBox(tr("Elevation"));
elevationBox->setLayout(elevationLayout);
#ifdef ENABLE_TIMEZONES
timeZoneLayout->addWidget(_utcZone);
timeZoneLayout->addWidget(_systemZone);
timeZoneLayout->addWidget(_customZone);
@ -519,15 +556,12 @@ QWidget *OptionsDialog::createDataPage()
QGroupBox *timeZoneBox = new QGroupBox(tr("Time zone"));
timeZoneBox->setLayout(timeZoneLayout);
#endif // ENABLE_TIMEZONES
segmentsLayout->addWidget(_useSegments);
sourceTabLayout->addWidget(speedBox);
sourceTabLayout->addWidget(elevationBox);
#ifdef ENABLE_TIMEZONES
sourceTabLayout->addWidget(timeZoneBox);
#endif // ENABLE_TIMEZONES
sourceTabLayout->addLayout(segmentsLayout);
#endif // Q_OS_MAC
sourceTabLayout->addStretch();
@ -648,10 +682,8 @@ QWidget *OptionsDialog::createSystemPage()
{
_useOpenGL = new QCheckBox(tr("Use OpenGL"));
_useOpenGL->setChecked(_options.useOpenGL);
#ifdef ENABLE_HTTP2
_enableHTTP2 = new QCheckBox(tr("Enable HTTP/2"));
_enableHTTP2->setChecked(_options.enableHTTP2);
#endif // ENABLE_HTTP2
_pixmapCache = new QSpinBox();
_pixmapCache->setMinimum(16);
@ -670,9 +702,7 @@ QWidget *OptionsDialog::createSystemPage()
formLayout->addRow(tr("Connection timeout:"), _connectionTimeout);
QFormLayout *checkboxLayout = new QFormLayout();
#ifdef ENABLE_HTTP2
checkboxLayout->addWidget(_enableHTTP2);
#endif // ENABLE_HTTP2
checkboxLayout->addWidget(_useOpenGL);
QWidget *systemTab = new QWidget();
@ -764,11 +794,11 @@ void OptionsDialog::accept()
_options.sliderColor = _sliderColor->color();
_options.graphAntiAliasing = _graphAA->isChecked();
_options.projection = _projection->itemData(_projection->currentIndex())
.toInt();
#ifdef ENABLE_HIDPI
_options.outputProjection = _outputProjection->itemData(
_outputProjection->currentIndex()).toInt();
_options.inputProjection = _inputProjection->itemData(
_inputProjection->currentIndex()).toInt();
_options.hidpiMap = _hidpi->isChecked();
#endif // ENABLE_HIDPI
_options.elevationFilter = _elevationFilter->value();
_options.speedFilter = _speedFilter->value();
@ -787,13 +817,11 @@ void OptionsDialog::accept()
_options.dataUseDEM = _dataDEMElevation->isChecked();
_options.showSecondaryElevation = _showSecondaryElevation->isChecked();
_options.showSecondarySpeed = _showSecondarySpeed->isChecked();
#ifdef ENABLE_TIMEZONES
_options.timeZone.setType(_utcZone->isChecked()
? TimeZoneInfo::UTC : _systemZone->isChecked()
? TimeZoneInfo::System : TimeZoneInfo::Custom);
_options.timeZone.setCustomZone(QTimeZone(_timeZone->currentText()
.toLatin1()));
#endif // ENABLE_TIMEZONES
_options.useSegments = _useSegments->isChecked();
qreal poiRadius = (_units == Imperial)
@ -803,9 +831,7 @@ void OptionsDialog::accept()
_options.poiRadius = poiRadius;
_options.useOpenGL = _useOpenGL->isChecked();
#ifdef ENABLE_HTTP2
_options.enableHTTP2 = _enableHTTP2->isChecked();
#endif // ENABLE_HTTP2
_options.pixmapCache = _pixmapCache->value();
_options.connectionTimeout = _connectionTimeout->value();

View File

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

View File

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

View File

@ -6,9 +6,17 @@
#include "map/map.h"
#include "pathtickitem.h"
#include "popup.h"
#include "graphitem.h"
#include "markeritem.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
static inline bool isValid(const QPointF &p)
@ -22,12 +30,10 @@ static inline unsigned segments(qreal distance)
}
Units PathItem::_units = Metric;
#ifdef ENABLE_TIMEZONES
QTimeZone PathItem::_timeZone = QTimeZone::utc();
#endif // ENABLE_TIMEZONES
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());
@ -68,14 +74,14 @@ void PathItem::addSegment(const Coordinates &c1, const Coordinates &c2)
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() + 360,
c2.lat()));
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.moveTo(_map->ll2xy(Coordinates(-180, p.y())));
} else {
QLineF l(QPointF(c1.lon(), c1.lat()), QPointF(c2.lon() - 360,
c2.lat()));
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.moveTo(_map->ll2xy(Coordinates(180, p.y())));
}
@ -260,14 +266,18 @@ QPointF PathItem::position(qreal x) const
}
}
void PathItem::moveMarker(qreal distance)
void PathItem::setMarkerPosition(qreal pos)
{
_markerDistance = distance;
QPointF pos(position(distance));
qreal distance = _graph
? (_graph->graphType() == Time) ? _graph->distanceAtTime(pos) : pos
: NAN;
if (isValid(pos)) {
_markerDistance = distance;
QPointF pp(position(distance));
if (isValid(pp)) {
_marker->setVisible(_showMarker);
_marker->setPos(pos);
_marker->setPos(pp);
} else
_marker->setVisible(false);
}
@ -356,6 +366,21 @@ void PathItem::showTicks(bool show)
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)
{
Q_UNUSED(event);

View File

@ -1,19 +1,17 @@
#ifndef PATHITEM_H
#define PATHITEM_H
#include "common/config.h"
#include <QGraphicsObject>
#include <QPen>
#ifdef ENABLE_TIMEZONES
#include <QTimeZone>
#endif // ENABLE_TIMEZONES
#include "data/path.h"
#include "markeritem.h"
#include "units.h"
#include "graphicsscene.h"
#include "units.h"
class Map;
class PathTickItem;
class GraphItem;
class MarkerItem;
class PathItem : public QObject, public GraphicsItem
{
@ -30,7 +28,10 @@ public:
const Path &path() const {return _path;}
void addGraph(GraphItem *graph);
void setMap(Map *map);
void setGraph(int index);
void setColor(const QColor &color);
void setWidth(qreal width);
@ -40,15 +41,14 @@ public:
void showMarker(bool show);
void showTicks(bool show);
void setMarkerPosition(qreal pos);
void updateTicks();
static void setUnits(Units units) {_units = units;}
#ifdef ENABLE_TIMEZONES
static void setTimeZone(const QTimeZone &zone) {_timeZone = zone;}
#endif // ENABLE_TIMEZONES
public slots:
void moveMarker(qreal distance);
void hover(bool hover);
signals:
@ -60,9 +60,7 @@ protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
static Units _units;
#ifdef ENABLE_TIMEZONES
static QTimeZone _timeZone;
#endif // ENABLE_TIMEZONES
private:
const PathSegment *segment(qreal x) const;
@ -76,6 +74,8 @@ private:
Path _path;
Map *_map;
QList<GraphItem *> _graphs;
GraphItem *_graph;
qreal _markerDistance;
int _digitalZoom;

View File

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

View File

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

24
src/GUI/planeitem.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef PLANEITEM_H
#define PLANEITEM_H
#include "common/rectc.h"
#include "graphicsscene.h"
class Map;
class PlaneItem : public GraphicsItem
{
public:
PlaneItem(GraphicsItem *parent = 0) : GraphicsItem(parent) {}
virtual RectC bounds() const = 0;
virtual void setMap(Map *map) = 0;
virtual void setColor(const QColor &color) = 0;
virtual void setOpacity(qreal opacity) = 0;
virtual void setWidth(qreal width) = 0;
virtual void setStyle(Qt::PenStyle style) = 0;
virtual void setDigitalZoom(int zoom) = 0;
};
#endif // PLANEITEM_H

View File

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

View File

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

View File

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

View File

@ -1,13 +1,11 @@
#ifndef ROUTEITEM_H
#define ROUTEITEM_H
#include "data/route.h"
#include "data/link.h"
#include "pathitem.h"
#include "units.h"
#include "format.h"
#include "graphicsscene.h"
class Map;
class Route;
class WaypointItem;
class RouteItem : public PathItem

View File

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

View File

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

View File

@ -30,8 +30,6 @@
#define SHOW_GRAPH_GRIDS_DEFAULT true
#define SHOW_GRAPH_SLIDER_INFO_SETTING "sliderInfo"
#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_DEFAULT false
@ -65,13 +63,16 @@
#define SHOW_ROUTE_WAYPOINTS_DEFAULT true
#define SHOW_WAYPOINT_LABELS_SETTING "waypointLabels"
#define SHOW_WAYPOINT_LABELS_DEFAULT true
#define SHOW_MARKERS_SETTING "positionMarkers"
#define SHOW_MARKERS_DEFAULT true
#define PDF_EXPORT_SETTINGS_GROUP "Export"
#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_DEFAULT (IMPERIAL_UNITS() ? QPrinter::Letter \
: QPrinter::A4)
#define PAPER_SIZE_DEFAULT (IMPERIAL_UNITS() \
? QPageSize::PageSizeId::Letter \
: QPageSize::PageSizeId::A4)
#define PDF_MARGIN_LEFT_SETTING "marginLeft"
#define PDF_MARGIN_LEFT_DEFAULT 5 /* mm */
#define PDF_MARGIN_TOP_SETTING "marginTop"
@ -199,8 +200,10 @@
#define SEPARATE_GRAPH_PAGE_DEFAULT false
#define SLIDER_COLOR_SETTING "sliderColor"
#define SLIDER_COLOR_DEFAULT QColor(Qt::red)
#define PROJECTION_SETTING "projection"
#define PROJECTION_DEFAULT 3857
#define OUTPUT_PROJECTION_SETTING "outputProjection"
#define OUTPUT_PROJECTION_DEFAULT 3857
#define INPUT_PROJECTION_SETTING "inputProjection"
#define INPUT_PROJECTION_DEFAULT 4326
#define HIDPI_MAP_SETTING "HiDPIMap"
#define HIDPI_MAP_DEFAULT true

View File

@ -18,7 +18,7 @@ void SliderInfoItem::updateBoundingRect()
{
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();
_boundingRect = (_side == Right)
@ -35,16 +35,16 @@ void SliderInfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
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) {
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());
rx = QRectF(SIZE, 0, fm.width(_x), fm.height()
rx = QRectF(SIZE, 0, fm.boundingRect(_x).width(), fm.height()
- fm.descent());
} else {
ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(), fm.width(_y),
fm.height() - fm.descent());
rx = QRectF(-(width + SIZE), 0, fm.width(_x), fm.height()
ry = QRectF(-(width + SIZE), -fm.height() + fm.descent(),
fm.boundingRect(_y).width(), fm.height() - fm.descent());
rx = QRectF(-(width + SIZE), 0, fm.boundingRect(_x).width(), fm.height()
- fm.descent());
}

View File

@ -3,6 +3,7 @@
#include <QTimeZone>
#include <QDataStream>
#include <QDebug>
class TimeZoneInfo
{
@ -42,6 +43,7 @@ public:
private:
friend QDataStream& operator<<(QDataStream &out, const TimeZoneInfo &info);
friend QDataStream& operator>>(QDataStream &in, TimeZoneInfo &info);
friend QDebug operator<<(QDebug dbg, const TimeZoneInfo &info);
Type _type;
QTimeZone _customZone;
@ -66,4 +68,12 @@ inline QDataStream &operator>>(QDataStream &in, TimeZoneInfo &info)
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

View File

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

View File

@ -2,13 +2,11 @@
#define TRACKITEM_H
#include <QDateTime>
#include <QPen>
#include "data/track.h"
#include "data/link.h"
#include "pathitem.h"
#include "units.h"
#include "graphicsscene.h"
class Map;
class Track;
class TrackItem : public PathItem
{

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