[qmapshack] 01/02: Imported Upstream version 0.3.0
Jaromír Mikeš
mira-guest at moszumanska.debian.org
Fri Aug 15 21:42:53 UTC 2014
This is an automated email from the git hooks/post-receive script.
mira-guest pushed a commit to branch master
in repository qmapshack.
commit f040497703d2bda06dce5da5e73b6cf75f93850d
Author: Jaromír Mikeš <mira.mikes at seznam.cz>
Date: Fri Aug 15 23:42:02 2014 +0200
Imported Upstream version 0.3.0
---
3rdparty/CGetOpt/CGetOpt.cpp | 35 +
3rdparty/CGetOpt/getopt.pro | 4 -
3rdparty/CGetOpt/main.cpp | 36 -
CMakeLists.txt | 4 +-
CMakeLists.txt.user | 10 +-
CPackConfig.cmake | 2 +-
changelog.txt | 9 +
cmake/Modules/FindGDAL.cmake | 8 +-
cmake/Modules/FindPROJ.cmake | 8 +-
nsi/3rdparty.txt | 86 +
nsi/Help.ico | Bin 0 -> 9662 bytes
nsi/QMapShack.ico | Bin 0 -> 9662 bytes
nsi/QMapShack_Installer.nsi | 254 +++
nsi/copyfiles.bat | 87 +
nsi/kfm_home.ico | Bin 0 -> 15086 bytes
nsi/konsole.ico | Bin 0 -> 15086 bytes
qmapshack.1 | 26 +-
src/CMainWindow.cpp | 74 +-
src/CMainWindow.h | 15 +
src/CMakeLists.txt | 78 +-
src/GeoMath.cpp | 29 +-
src/GeoMath.h | 4 +
src/IAbout.ui | 2 +-
src/IMainWindow.ui | 10 +
src/animation/COPYRIGHT | 14 +
src/animation/README | 3 -
src/animation/WTFPL-2 | 14 +
src/canvas/CCanvas.cpp | 69 +-
src/canvas/CCanvas.h | 33 +-
src/canvas/CCanvasSetup.cpp | 2 +-
src/canvas/ICanvasSetup.ui | 12 +-
src/canvas/IDrawContext.cpp | 57 +-
src/canvas/IDrawContext.h | 14 +-
src/cursors/COPYRIGHT | 14 +
src/cursors/cursorArrow.png | Bin
src/cursors/cursorMove.png | Bin
src/cursors/cursorMoveWpt.png | Bin 0 -> 1386 bytes
src/cursors/wptHighlight.png | Bin 0 -> 3546 bytes
src/cursors/wptHighlight.svg | 142 ++
src/dem/CDemDraw.cpp | 6 +-
src/dem/CDemDraw.h | 2 +-
src/dem/CDemVRT.cpp | 47 +-
src/dem/CDemVRT.h | 6 +-
src/dem/IDem.h | 2 +-
src/dem/IDemPathSetup.ui | 10 -
src/gis/CGisDraw.cpp | 2 +-
src/gis/CGisListWks.cpp | 104 +-
src/gis/CGisListWks.h | 11 +
src/gis/CGisProject.cpp | 294 ++-
src/gis/CGisProject.h | 84 +
src/gis/CGisWidget.cpp | 114 +-
src/gis/CGisWidget.h | 41 +
src/gis/IGisItem.cpp | 126 +-
src/gis/IGisItem.h | 230 ++-
src/gis/IGisWidget.ui | 10 +-
src/gis/WptIcons.cpp | 30 +-
src/gis/WptIcons.h | 11 +
src/gis/rte/CGisItemRte.cpp | 88 +-
src/gis/rte/CGisItemRte.h | 12 +-
src/gis/rte/CScrOptRte.cpp | 82 +
src/{mouse/CMouseNormal.h => gis/rte/CScrOptRte.h} | 34 +-
src/gis/rte/IScrOptRte.ui | 84 +
src/gis/trk/CGisItemTrk.cpp | 377 +++-
src/gis/trk/CGisItemTrk.h | 69 +-
src/gis/trk/CScrOptTrk.cpp | 82 +
src/{mouse/CMouseNormal.h => gis/trk/CScrOptTrk.h} | 34 +-
src/gis/trk/IScrOptTrk.ui | 99 +
src/gis/wpt/CDetailsGeoCache.cpp | 108 +
.../CMouseNormal.h => gis/wpt/CDetailsGeoCache.h} | 31 +-
src/gis/wpt/CDetailsWpt.cpp | 247 +++
src/gis/{CGisListWks.h => wpt/CDetailsWpt.h} | 40 +-
src/gis/wpt/CGisItemWpt.cpp | 403 +++-
src/gis/wpt/CGisItemWpt.h | 89 +-
src/gis/wpt/CProjWpt.cpp | 121 ++
src/{mouse/CMouseNormal.h => gis/wpt/CProjWpt.h} | 33 +-
src/gis/wpt/CScrOptWpt.cpp | 108 +
src/gis/{CGisWidget.h => wpt/CScrOptWpt.h} | 40 +-
src/gis/wpt/IDetailsGeoCache.ui | 290 +++
src/gis/wpt/IDetailsWpt.ui | 341 ++++
.../ICanvasSetup.ui => gis/wpt/IProjWpt.ui} | 114 +-
src/gis/wpt/IScrOptWpt.ui | 161 ++
src/grid/CGrid.cpp | 14 +-
src/grid/CProjWizard.cpp | 15 +-
src/grid/IGridSetup.ui | 12 +-
src/grid/IProjWizard.ui | 37 +-
.../CCanvasSetup.cpp => helpers/CInputDialog.cpp} | 50 +-
.../CMouseNormal.h => helpers/CInputDialog.h} | 33 +-
src/helpers/CPositionDialog.cpp | 154 ++
.../CMouseNormal.h => helpers/CPositionDialog.h} | 31 +-
src/helpers/CTextEditWidget.cpp | 351 ++++
src/helpers/CTextEditWidget.h | 85 +
src/helpers/CWptIconDialog.cpp | 110 +
.../CMouseNormal.h => helpers/CWptIconDialog.h} | 30 +-
src/helpers/IInputDialog.ui | 84 +
src/helpers/IPositionDialog.ui | 100 +
src/helpers/ITextEditWidget.ui | 456 +++++
src/helpers/IWptIconDialog.ui | 31 +
src/icons/16x16/Copy.png | Bin 0 -> 323 bytes
src/icons/16x16/Cut.png | Bin 0 -> 574 bytes
src/icons/16x16/EditDetails.png | Bin 0 -> 725 bytes
src/icons/16x16/EditText.png | Bin 0 -> 586 bytes
src/icons/16x16/Lock.png | Bin 0 -> 539 bytes
src/icons/16x16/Paste.png | Bin 0 -> 346 bytes
src/icons/16x16/Redo.png | Bin 0 -> 484 bytes
src/icons/16x16/Tainted.png | Bin 0 -> 594 bytes
src/icons/16x16/TextBold.png | Bin 0 -> 344 bytes
src/icons/16x16/TextCenter.png | Bin 0 -> 272 bytes
src/icons/16x16/TextItalic.png | Bin 0 -> 243 bytes
src/icons/16x16/TextJustified.png | Bin 0 -> 234 bytes
src/icons/16x16/TextLeft.png | Bin 0 -> 264 bytes
src/icons/16x16/TextRight.png | Bin 0 -> 262 bytes
src/icons/16x16/TextUnderlined.png | Bin 0 -> 332 bytes
src/icons/16x16/TimeZoneSetup.png | Bin 0 -> 847 bytes
src/icons/16x16/Track.png | Bin 0 -> 432 bytes
src/icons/16x16/UnLock.png | Bin 0 -> 541 bytes
src/icons/16x16/Undo.png | Bin 0 -> 493 bytes
src/icons/16x16/WptMove.png | Bin 0 -> 518 bytes
src/icons/16x16/WptProj.png | Bin 0 -> 453 bytes
src/icons/32x32/Copy.png | Bin 0 -> 415 bytes
src/icons/32x32/Cut.png | Bin 0 -> 1241 bytes
src/icons/32x32/EditDetails.png | Bin 0 -> 1671 bytes
src/icons/32x32/EditText.png | Bin 0 -> 1069 bytes
src/icons/32x32/Lock.png | Bin 0 -> 932 bytes
src/icons/32x32/Paste.png | Bin 0 -> 454 bytes
src/icons/32x32/Redo.png | Bin 0 -> 932 bytes
src/icons/32x32/Tainted.png | Bin 0 -> 1206 bytes
src/icons/32x32/TextBold.png | Bin 0 -> 535 bytes
src/icons/32x32/TextCenter.png | Bin 0 -> 371 bytes
src/icons/32x32/TextItalic.png | Bin 0 -> 378 bytes
src/icons/32x32/TextJustified.png | Bin 0 -> 315 bytes
src/icons/32x32/TextLeft.png | Bin 0 -> 334 bytes
src/icons/32x32/TextRight.png | Bin 0 -> 364 bytes
src/icons/32x32/TextUnderlined.png | Bin 0 -> 491 bytes
src/icons/32x32/TimeZoneSetup.png | Bin 0 -> 2257 bytes
src/icons/32x32/Track.png | Bin 0 -> 832 bytes
src/icons/32x32/UnLock.png | Bin 0 -> 1019 bytes
src/icons/32x32/Undo.png | Bin 0 -> 937 bytes
src/icons/32x32/WptMove.png | Bin 0 -> 998 bytes
src/icons/32x32/WptProj.png | Bin 0 -> 821 bytes
src/icons/48x48/Copy.png | Bin 0 -> 517 bytes
src/icons/48x48/Cut.png | Bin 0 -> 2027 bytes
src/icons/48x48/EditDetails.png | Bin 0 -> 2565 bytes
src/icons/48x48/EditText.png | Bin 0 -> 1529 bytes
src/icons/48x48/Lock.png | Bin 0 -> 1372 bytes
src/icons/48x48/Paste.png | Bin 0 -> 544 bytes
src/icons/48x48/Redo.png | Bin 0 -> 1344 bytes
src/icons/48x48/Tainted.png | Bin 0 -> 1971 bytes
src/icons/48x48/TextBold.png | Bin 0 -> 742 bytes
src/icons/48x48/TextCenter.png | Bin 0 -> 407 bytes
src/icons/48x48/TextItalic.png | Bin 0 -> 493 bytes
src/icons/48x48/TextJustified.png | Bin 0 -> 381 bytes
src/icons/48x48/TextLeft.png | Bin 0 -> 403 bytes
src/icons/48x48/TextRight.png | Bin 0 -> 405 bytes
src/icons/48x48/TextUnderlined.png | Bin 0 -> 629 bytes
src/icons/48x48/TimeZoneSetup.png | Bin 0 -> 3847 bytes
src/icons/48x48/Track.png | Bin 0 -> 1270 bytes
src/icons/48x48/UnLock.png | Bin 0 -> 1509 bytes
src/icons/48x48/Undo.png | Bin 0 -> 1370 bytes
src/icons/48x48/WptMove.png | Bin 0 -> 1537 bytes
src/icons/48x48/WptProj.png | Bin 0 -> 1239 bytes
src/icons/Copy.svg | 81 +
src/icons/Cut.svg | 113 ++
src/icons/EditDetails.svg | 126 ++
src/icons/EditText.svg | 151 ++
src/icons/Lock.svg | 88 +
src/icons/Paste.svg | 88 +
src/icons/Redo.svg | 68 +
src/icons/Tainted.svg | 162 ++
src/icons/TextBold.svg | 78 +
src/icons/TextCenter.svg | 102 +
src/icons/TextItalic.svg | 79 +
src/icons/TextJustified.svg | 102 +
src/icons/TextLeft.svg | 102 +
src/icons/TextRight.svg | 102 +
src/icons/TextUnderlined.svg | 88 +
src/icons/TimeZoneSetup.svg | 146 ++
src/icons/Track.svg | 179 ++
src/icons/UnLock.svg | 87 +
src/icons/Undo.svg | 68 +
src/icons/WptMove.svg | 164 ++
src/icons/WptProj.svg | 196 ++
src/icons/cache/Apache-2.0 | 202 ++
src/icons/cache/COPYRIGHT | 1 +
src/icons/waypoints/32x32/Default.png | Bin 1559 -> 1923 bytes
src/icons/waypoints/Default.svg | 27 +-
src/locale/qmapshack_cs.ts | 2127 +++++++++++++++++++
src/locale/qmapshack_de.ts | 2143 ++++++++++++++++++++
src/locale/qmapshack_es.ts | 2127 +++++++++++++++++++
src/main.cpp | 56 +-
src/map/CMapDraw.cpp | 2 +-
src/map/CMapIMG.cpp | 24 +-
src/map/CMapIMG.h | 2 +-
src/map/CMapRMAP.cpp | 4 +-
src/map/CMapVRT.cpp | 68 +-
src/map/IMapPathSetup.ui | 10 -
src/map/garmin/CGarminPolygon.cpp | 4 +-
src/mouse/CMouseMoveWpt.cpp | 138 ++
src/mouse/{CMouseNormal.h => CMouseMoveWpt.h} | 31 +-
src/mouse/CMouseNormal.cpp | 176 +-
src/mouse/CMouseNormal.h | 38 +-
src/mouse/CScrOptUnclutter.cpp | 161 ++
src/mouse/{CMouseNormal.h => CScrOptUnclutter.h} | 46 +-
src/mouse/IMouse.cpp | 48 +-
src/mouse/IMouse.h | 17 +-
src/mouse/{IMouse.cpp => IScrOpt.cpp} | 17 +-
src/mouse/{CMouseNormal.h => IScrOpt.h} | 33 +-
src/pics/compass.png | Bin 0 -> 9906 bytes
src/pics/compass.svg | 343 ++++
src/pics/splash.png | Bin 0 -> 376705 bytes
src/pics/timezones.png | Bin 0 -> 83526 bytes
src/resources.qrc | 75 +-
src/units/CTimeZoneSetup.cpp | 88 +
src/{mouse/IMouse.cpp => units/CTimeZoneSetup.h} | 22 +-
.../ICanvasSetup.ui => units/ITimeZoneSetup.ui} | 66 +-
src/units/IUnit.cpp | 449 +++-
src/units/IUnit.h | 27 +-
216 files changed, 17146 insertions(+), 761 deletions(-)
diff --git a/3rdparty/CGetOpt/CGetOpt.cpp b/3rdparty/CGetOpt/CGetOpt.cpp
index 679582e..eb430e2 100644
--- a/3rdparty/CGetOpt/CGetOpt.cpp
+++ b/3rdparty/CGetOpt/CGetOpt.cpp
@@ -1,3 +1,38 @@
+/**********************************************************************
+ * Copyright (c) 2003, 2004, froglogic Porten & Stadlbauer GbR
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * * Neither the name of the froglogic nor the names of its
+ * contributors may be used to endorse or promote products
+ * derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **********************************************************************/
#define QT_NO_CAST_ASCII
#define QT_NO_ASCII_CAST
diff --git a/3rdparty/CGetOpt/getopt.pro b/3rdparty/CGetOpt/getopt.pro
deleted file mode 100644
index 3ae1f27..0000000
--- a/3rdparty/CGetOpt/getopt.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-INCLUDEPATH = .
-
-HEADERS = getopt.h
-SOURCES = getopt.cpp main.cpp
diff --git a/3rdparty/CGetOpt/main.cpp b/3rdparty/CGetOpt/main.cpp
deleted file mode 100644
index 532bf81..0000000
--- a/3rdparty/CGetOpt/main.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "getopt.h"
-#include <iostream>
-
-using namespace std;
-
-int main(int argc, char **argv)
-{
- // construct class from command line arguments
- GetOpt opts(argc, argv);
-
- // add some switches
- bool verbose;
- opts.addSwitch("verbose", &verbose);
- QString arg;
- opts.addOptionalArgument("file", &arg);
- QStringList defines;
- opts.addRepeatableOption('D', &defines);
-
- // do the parsing and check for errors
- if (!opts.parse()) {
- cerr << "Usage: " << (const char *)opts.appName().toAscii()
- << " [--verbose]"
- << " [-Ddefine]*"
- << " [file]" << endl;
- return 1;
- }
-
- cout << "\nVerbose mode: " << (verbose ? "yes" : "no") << endl;
- cout << "Optional file argument: " <<
- (arg.isNull() ? "(none)" : (const char *)arg.toAscii()) << endl;
- cout << "Defines: " << (defines.isEmpty() ? "(none)" :
- (const char *)defines.join(", ").toAscii()) << endl;
- cout << endl;
-
- return 0;
-}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6e9dfe0..c2dbd9f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,13 +11,15 @@ endif(UNIX)
if(WIN32)
set(CMAKE_PREFIX_PATH C:/Qt5/5.3/msvc2013_64)
+set(GDAL_DEV_PATH "" CACHE PATH "Path to directory containing GDAL include and lib, e.g. M:\\lib\\gdal")
+set(PROJ_DEV_PATH "" CACHE PATH "Path to directory containing PROJ.4 include and lib, e.g. M:\\lib\\PROJ")
endif(WIN32)
set(APPLICATION_NAME qmapshack)
set(APPLICATION_VERSION_MAJOR "0")
-set(APPLICATION_VERSION_MINOR "2")
+set(APPLICATION_VERSION_MINOR "3")
set(APPLICATION_VERSION_PATCH "0")
add_definitions(-DVER_MAJOR=${APPLICATION_VERSION_MAJOR} -DVER_MINOR=${APPLICATION_VERSION_MINOR} -DVER_STEP=${APPLICATION_VERSION_PATCH} -DAPPLICATION_NAME=${PROJECT_NAME})
diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
index 1d91c66..19e2a20 100644
--- a/CMakeLists.txt.user
+++ b/CMakeLists.txt.user
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.1.1, 2014-07-20T15:41:22. -->
+<!-- Written by QtCreator 3.1.1, 2014-08-15T18:18:03. -->
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -54,9 +54,9 @@
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
- <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.4 in Pfad (System)</value>
- <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 4.8.4 in Pfad (System)</value>
- <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{b3896d75-6773-49ab-b85b-a90805c4269a}</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.3.0 GCC 64bit</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.3.0 GCC 64bit</value>
+ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.53.gcc_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
@@ -156,7 +156,7 @@
<value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments"></value>
<value type="bool" key="CMakeProjectManager.CMakeRunConfiguration.UseTerminal">false</value>
<value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
- <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+ <value type="int" key="PE.EnvironmentAspect.Base">-1</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">maproom (deaktiviert)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
diff --git a/CPackConfig.cmake b/CPackConfig.cmake
index 08043e9..a390d69 100644
--- a/CPackConfig.cmake
+++ b/CPackConfig.cmake
@@ -18,7 +18,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSI
### source package settings
set(CPACK_SOURCE_GENERATOR "TGZ")
-set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]svn/;/[.]git/;.gitignore;/build/;tags;cscope.*")
+set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]svn/;/[.]hg/;/[.]git/;.gitignore;/build/;tags;cscope.*")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
include(CPack)
diff --git a/changelog.txt b/changelog.txt
new file mode 100644
index 0000000..c0f83e2
--- /dev/null
+++ b/changelog.txt
@@ -0,0 +1,9 @@
+V 0.3.0
+
+* A lot of little fixes to prevent crashes and glitches due to multithreading
+* Take special care of the +-180 degree problem
+* Add RGB support to raster maps
+* Add a lot of cursor stuff to select items and to display on-screen-options
+* Add timezone support
+* Add dialog to view/edit waypoint data
+* Add 'moving waypoint' and 'project waypoint' as functions to on-screen-options
\ No newline at end of file
diff --git a/cmake/Modules/FindGDAL.cmake b/cmake/Modules/FindGDAL.cmake
index 5e93d30..e85b063 100644
--- a/cmake/Modules/FindGDAL.cmake
+++ b/cmake/Modules/FindGDAL.cmake
@@ -22,7 +22,9 @@ else (GDAL_LIBRARIES AND GDAL_INCLUDE_DIRS)
NAMES
gdal.h
PATHS
- D:/gdal/include
+if(WIN32)
+ ${GDAL_DEV_PATH}/include
+endif(WIN32)
/usr/include
/usr/local/include
/opt/local/include
@@ -50,7 +52,9 @@ else (GDAL_LIBRARIES AND GDAL_INCLUDE_DIRS)
gdal
gdal_i
PATHS
- D:/gdal/lib
+if(WIN32)
+ ${GDAL_DEV_PATH}/lib
+endif(WIN32)
/usr/lib
/usr/local/lib
/opt/local/lib
diff --git a/cmake/Modules/FindPROJ.cmake b/cmake/Modules/FindPROJ.cmake
index 2a37c6e..b73e355 100644
--- a/cmake/Modules/FindPROJ.cmake
+++ b/cmake/Modules/FindPROJ.cmake
@@ -23,7 +23,9 @@ else (PROJ_LIBRARIES AND PROJ_INCLUDE_DIRS)
NAMES
proj_api.h
PATHS
- d:/proj/include
+if(WIN32)
+ ${PROJ_DEV_PATH}/include
+endif(WIN32)
/usr/include
/usr/local/include
/opt/local/include
@@ -40,7 +42,9 @@ else (PROJ_LIBRARIES AND PROJ_INCLUDE_DIRS)
proj
proj_i
PATHS
- d:/proj/lib
+if(WIN32)
+ ${PROJ_DEV_PATH}/lib
+endif(WIN32)
/usr/lib
/usr/local/lib
/opt/local/lib
diff --git a/nsi/3rdparty.txt b/nsi/3rdparty.txt
new file mode 100644
index 0000000..81fe572
--- /dev/null
+++ b/nsi/3rdparty.txt
@@ -0,0 +1,86 @@
+QMapShack for Windows (short: QMS) is build with Visual Studio 2013 as 64bit application
+It depends on the 3rd party software listed below
+
+Compile instructions are given at the end of this file
+
+
+1.) Microsoft Visual C++ 2013 Redistributable Package
+ The installer vcredist_x64.exe (ca 7MB size) as downloaded from
+ http://www.microsoft.com/en-us/download/details.aspx?id=40784
+ is contained in the QLGT Installer package and may be executed if selected by the user.
+ Note: Those runtime libraries may already be contained in Windows 7 or WIndows 8 installations.
+
+2.) Qt5 runtime libraries
+ The Qt DLL's are deployed in the QLGT installation directory.
+ They are part of the "Qt libraries for Windows (VS 2008)" package.
+ This can be retrieved from http://qt.nokia.com/downloads/windows-cpp-vs2008.
+
+3.) The GDAL library, http://www.gdal.org/
+
+4.) The PROJ library http://trac.osgeo.org/proj/
+
+5.) Icons for the Windows Start Menu ==> We should get rid of them and use own icons
+ kfm_home.ico, kget.ico, khelpcenter.ico, konsole.ico, xmag.ico
+ have been created from the Nuvola 1.0 icon set (http://www.icon-king.com/projects/nuvola/)
+
+
+Additional tools for building and installing
+============================================
+- CMake 2.8, available at http://www.cmake.org/
+- NSIS, available at http://nsis.sourceforge.net/Main_Page
+
+
+Compile instructions - to be verified
+====================
+
+1.) Compile the GDAL library, http://www.gdal.org/
+[Build instructions inspired by http://trac.osgeo.org/gdal/wiki/BuildingOnWindows, http://dominoc925.blogspot.de/2013/03/build-64-bit-gdal-for-windows.html]
+- Download the source code of the version 1.11 (or latest) from http://trac.osgeo.org/gdal/wiki/DownloadSource and unzip
+- In nmake.opt, adapt the following lines, according to your build environment [my settings are given as example]
+ MSVC_VER=1800
+ GDAL_HOME = "M:\lib\gdal"
+ PYDIR = "C:\Python34"
+ SWIG = D:\gdal111\swig.exe
+ WIN64=YES
+- From the start menu, enter the VS2013, x64 native command prompt
+- nmake /f makefile.vc
+- nmake /f makefile.vc devinstall
+
+2.) Compile the PROJ library http://trac.osgeo.org/proj/
+- Download the source code of the version 4.8 (or latest) from http://trac.osgeo.org/proj/ and unzip
+- In nmake.opt, adapt the following lines, according to your build environment [my settings are given as example]
+ INSTDIR=M:\lib\\PROJ
+- From the start menu, enter the VS2013, x64 native command prompt
+- nmake /f makefile.vc
+- nmake /f makefile.vc devinstall
+
+3.) Install QT5.3 or later
+- Download and run the Qt5 Windows Online Installe from http://qt-project.org/downloads
+ Install for VS2013, x64
+- Append or (better?) prepend the Qt5 binary path to your PATH environment variable, e.g.
+ C:\Qt5\5.3\msvc2013_64\bin;%PATH%
+
+4.) Get the QMapshack source from the repository, e.g.
+ hg clone https://bitbucket.org/maproom/qmapshack QMapShack
+Note: you might have to install TortoiseHG
+
+5.) TODO Adapt the search path to GDAL and PROJ.4 in the respective CMake Files
+ FindGDAL.cmake and FindPROJ.cmake
+
+6.) Start the CMake GUI (you did install CMake before, didn't you)
+- Configure (and be sure that it finds GDAL and PROJ.4 )
+ TODO If Oliver accepts my CMake Files contribution from 22-July-2014, you can enter GDAL and PROJ.4 paths here directly
+- Generate
+
+7.) Open the generated QMapShack.sln with VS2013
+- Compile the Release Version
+
+8.) Create the installer by executing
+- nsi/copyfiles.bat
+- nsi/QMapShack_Installer.nsi
+
+
+
+
+
+
diff --git a/nsi/Help.ico b/nsi/Help.ico
new file mode 100644
index 0000000..3e15f55
Binary files /dev/null and b/nsi/Help.ico differ
diff --git a/nsi/QMapShack.ico b/nsi/QMapShack.ico
new file mode 100644
index 0000000..8696acc
Binary files /dev/null and b/nsi/QMapShack.ico differ
diff --git a/nsi/QMapShack_Installer.nsi b/nsi/QMapShack_Installer.nsi
new file mode 100644
index 0000000..cd1875e
--- /dev/null
+++ b/nsi/QMapShack_Installer.nsi
@@ -0,0 +1,254 @@
+;NSIS Installer Script for https://bitbucket.org/maproom/qmapshack/wiki/Home
+
+;NSIS References/Documentation
+;http://nsis.sourceforge.net/Docs/Modern%20UI%202/Readme.html
+;http://nsis.sourceforge.net/Docs/Modern%20UI/Readme.html
+;http://nsis.sourceforge.net/Docs/Chapter4.html
+;http://nsis.sourceforge.net/Many_Icons_Many_shortcuts
+
+;Deployment issues
+;Deploying Qt5 for Windows:
+; http://qt-project.org/doc/qt-5/windows-deployment.html
+;Deploying MSVC runtime libraries
+; http://msdn.microsoft.com/en-us/library/dd293574.aspx ==> Central Deployment is preferred: by using a redistributable package enables automatic updating by Microsoft.
+; http://msdn.microsoft.com/en-us/library/8kche8ah.aspx ==> Distribute msvcr120.dll and msvcp120.dll
+; http://www.microsoft.com/en-us/download/details.aspx?id=40784 ==> Download the vcredist_x64.exe from here !!!
+; http://msdn.microsoft.com/en-us/vstudio/dn501987.aspx ==> Legal stuff
+
+;Revision Log
+; 03-Aug-2014 First version of QMapShack installer based on the existing QLandkarteGT installer
+
+;=================== BEGIN SCRIPT ====================
+; Include for nice Setup UI
+!include MUI2.nsh
+
+;------------------------------------------------------------------------
+; Modern UI2 definition -
+;------------------------------------------------------------------------
+; Description
+Name "QMapShack"
+
+;Default installation folder
+InstallDir "$PROGRAMFILES64\QMapShack"
+
+;Get installation folder from registry if available
+InstallDirRegKey HKCU "Software\QMapShack" ""
+
+;Request application privileges for Windows Vista
+RequestExecutionLevel admin
+
+
+; The file to write
+OutFile "QMapShack_Install.exe"
+
+;------------------------------------------------------------------------
+; Modern UI definition -
+;------------------------------------------------------------------------
+;!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
+!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors
+
+!define MUI_HEADERIMAGE
+;!define MUI_HEADERIMAGE_BITMAP "logo_small.bmp"
+;!define MUI_WELCOMEFINISHPAGE_BITMAP "logo_big.bmp"
+
+; Page welcome description
+!define MUI_WELCOMEPAGE_TITLE "QMapShack"
+!define MUI_WELCOMEPAGE_TITLE_3LINES
+!define MUI_WELCOMEPAGE_TEXT "QMapShack is the successor of QLandkarte GT, based on a different concept. It allows the use of several workspaces and of several maps on a workspace. GIS data is handled project-oriented and can be exchange with the device by drag-n-drop."
+
+!define MUI_LICENSEPAGE_CHECKBOX
+
+;------------------------------------------------------------------------
+; Pages definition order -
+;------------------------------------------------------------------------
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+Var StartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+;------------------------------------------------------------------------
+
+;------------------------------------------------------------------------
+;Uninstaller -
+;------------------------------------------------------------------------
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language settings
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "German"
+
+
+;------------------------------------------------------------------------
+; Component add -
+;------------------------------------------------------------------------
+;Components description
+
+Section "MSVC++ 2013 SP1 Runtime" MSVC
+
+ SetOutPath $INSTDIR
+ File Files\vcredist_x64.exe
+ ExecWait '"$INSTDIR\vcredist_x64.exe"'
+ Delete "$INSTDIR\vcredist_x64.exe"
+
+SectionEnd
+LangString DESC_MSVC ${LANG_ENGLISH} "Microsoft Visual C++ 2013 SP1 Runtime Libraries. Typically already installed on your PC. You only need to install them if it doesn't work without ;-)."
+LangString DESC_MSVC ${LANG_GERMAN} "Microsoft Visual C++ 2013 SP1 Laufzeitbibliotheken. Diese sind meist bereits auf dem Rechner installiert. Versuchen Sie die Installation zun�chst einmal ohne dies."
+
+Section "QMapShack" QMapShack
+
+ ;Install for all users
+ SetShellVarContext all
+
+ ;BEGIN QMapShack Files
+ SetOutPath $INSTDIR
+ File Files\qmapshack.exe
+ File Files\qmapshack_*.qm
+ File Files\*.ico
+ ;File Files\*.png
+ File Files\qt_??.qm
+ ;END QMapShack Files
+
+ ;BEGIN Qt Files
+ SetOutPath $INSTDIR
+ File Files\Qt5Core.dll
+ File Files\Qt5Gui.dll
+ File Files\Qt5Network.dll
+ File Files\Qt5OpenGL.dll
+ File Files\Qt5Script.dll
+ File Files\Qt5Sql.dll
+ File Files\Qt5Svg.dll
+ File Files\Qt5WebKit.dll
+ File Files\Qt5Widgets.dll
+ File Files\Qt5Xml.dll
+ File Files\icudt52.dll
+ File Files\icuin52.dll
+ File Files\icuuc52.dll
+ File Files\libEGL.dll
+ File Files\libGLESv2.dll
+
+ SetOutPath "$INSTDIR\imageformats\"
+ File Files\imageformats\qgif.dll
+ File Files\imageformats\qjpeg.dll
+ File Files\imageformats\qmng.dll
+ File Files\imageformats\qsvg.dll
+ File Files\imageformats\qtiff.dll
+ File Files\imageformats\qico.dll
+ File Files\imageformats\qtga.dll
+
+ SetOutPath "$INSTDIR\sqldrivers\"
+ File Files\sqldrivers\qsqlite.dll
+
+ SetOutPath "$INSTDIR\platforms\"
+ File Files\platforms\qwindows.dll
+
+ ;END Qt Files
+
+ ;BEGIN GDAL and PROJ.4 Files
+ SetOutPath $INSTDIR
+ File Files\gdal*.dll
+ File Files\gdal*.exe
+ SetOutPath "$INSTDIR\data\"
+ File /r Files\data\*.*
+ ;END GDAL and PROJ.4 Files
+
+ ;BEGIN PROJ.4 Files
+ SetOutPath $INSTDIR
+ File Files\proj*.dll
+ File Files\proj*.exe
+ SetOutPath "$INSTDIR\share\"
+ File /r Files\share\*.*
+ ;END PROJ.4 Files
+
+
+ ;BEGIN additional Files
+ SetOutPath $INSTDIR
+ File Files\3rdparty.txt
+ ;File Files\libexif-12.dll
+ ;END additional Files
+
+ ;the last "SetOutPath" will be the default directory
+ SetOutPath $INSTDIR
+
+
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+SectionEnd
+LangString DESC_QMapShack ${LANG_ENGLISH} "View GeoTiff and Garmin Maps. Visualize and analyze GPX files and much more!"
+LangString DESC_QMapShack ${LANG_GERMAN} "Landkarten im GeoTiff und Garmin Format betrachten. GPX Dateien visualisieren und analysieren und vieles mehr!"
+
+
+Section "StartMenue" StartMenue
+ ;create batch file for a GDAL shell
+ ;fileOpen $0 "$INSTDIR\gdal.bat" w
+ ;fileWrite $0 "cd /D $\"$INSTDIR\gdal\apps$\"$\r$\n"
+ ;fileWrite $0 "SET PATH=$INSTDIR;$INSTDIR\gdal\python\osgeo;$INSTDIR\proj\apps;$INSTDIR\gdal\apps;$INSTDIR\curl;%PATH%$\r$\n"
+ ;fileWrite $0 "SET GDAL_DATA=$INSTDIR\gdal-data$\r$\n"
+ ;fileWrite $0 "SET GDAL_DRIVER_PATH=$INSTDIR\gdal\plugins$\r$\n"
+ ;fileWrite $0 "SET PYTHONPATH=$INSTDIR\gdal\python;%PYTHONPATH%$\r$\n"
+ ;fileWrite $0 "SET PROJ_LIB=$INSTDIR\proj\SHARE$\r$\n"
+ ;fileClose $0
+
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ ;Create shortcuts
+ CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\QMapShack.lnk" "$INSTDIR\qmapshack.exe" "" "$INSTDIR\QMapShack.ico"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\qmapshack.org.lnk" "https://bitbucket.org/maproom/qmapshack/wiki/Home" "" "$INSTDIR\kfm_home.ico"
+ CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Help.lnk" "https://bitbucket.org/maproom/qmapshack/wiki/DocMain" "" "$INSTDIR\Help.ico"
+ ;CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Download.lnk" "http://sourceforge.net/projects/qlandkartegt/" "" "$INSTDIR\kget.ico"
+ ;CreateShortCut "$SMPROGRAMS\$StartMenuFolder\GDAL.lnk" %COMSPEC% "/k $\"$INSTDIR\gdal.bat$\""
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+ ;Create registry entries
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QMapShack" "DisplayName" "QMapShack (remove only)"
+ WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QMapShack" "UninstallString" "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+LangString DESC_StartMenue ${LANG_ENGLISH} "Create Start Menue (deselect if you want install QMapShack as portable app)"
+LangString DESC_StartMenue ${LANG_GERMAN} "Erzeuge Start Men� (weglassen, wenn QMapShack als portable app installiert werden soll)"
+
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${QMapShack} $(DESC_QMapShack)
+ !insertmacro MUI_DESCRIPTION_TEXT ${StartMenue} $(DESC_StartMenue)
+ !insertmacro MUI_DESCRIPTION_TEXT ${MSVC} $(DESC_MSVC)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;------------------------------------------------------------------------
+;Uninstaller Sections -
+;------------------------------------------------------------------------
+Section "Uninstall"
+
+ ;Install for all users
+ SetShellVarContext all
+
+ Delete "$INSTDIR\Uninstall.exe"
+
+ SetOutPath $TEMP
+
+ RMDir /r $INSTDIR
+
+ !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
+
+ Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
+ Delete "$SMPROGRAMS\$StartMenuFolder\QMapShack.lnk"
+ Delete "$SMPROGRAMS\$StartMenuFolder\qmapshack.org.lnk"
+ Delete "$SMPROGRAMS\$StartMenuFolder\Help.lnk"
+ ;Delete "$SMPROGRAMS\$StartMenuFolder\Download.lnk"
+ ;Delete "$SMPROGRAMS\$StartMenuFolder\GDAL.lnk"
+
+ RMDir "$SMPROGRAMS\$StartMenuFolder"
+
+ DeleteRegKey /ifempty HKCU "Software\QMapShack"
+ DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QMapShack"
+
+SectionEnd
+
+Function .onInit
+ # set section 'MSVC' as unselected
+ SectionSetFlags ${MSVC} 0
+FunctionEnd
+
diff --git a/nsi/copyfiles.bat b/nsi/copyfiles.bat
new file mode 100644
index 0000000..6813588
--- /dev/null
+++ b/nsi/copyfiles.bat
@@ -0,0 +1,87 @@
+rem Batch file to copy the necessary files for the Windows Installer
+rem Please adapt environment variables in section 1) to your system
+
+rem useful links
+rem http://technet.microsoft.com/en-us/library/bb491035.aspx
+rem http://vlaurie.com/computers2/Articles/environment.htm
+
+rem Section 1.) Define path to Qt, MSVC, .... installations
+set QMSI_QT_PATH="C:\Qt5\5.3\msvc2013_64"
+set QMSI_VCREDIST_PATH="M:\deploy"
+rem set QLGTI_LIBEXIF_PATH="D:\qlgt\tools\libexif"
+set QMSI_GDAL_PATH="M:\lib\gdal"
+set QMSI_PROJ_PATH="M:\lib\PROJ"
+
+rem Section 2.) Copy Files
+del /s/q Files
+mkdir Files
+cd Files
+
+rem Section 2.1) Copy Qt files
+copy %QMSI_QT_PATH%\bin\Qt5Core.dll
+copy %QMSI_QT_PATH%\bin\Qt5Gui.dll
+copy %QMSI_QT_PATH%\bin\Qt5Network.dll
+copy %QMSI_QT_PATH%\bin\Qt5OpenGL.dll
+copy %QMSI_QT_PATH%\bin\Qt5Script.dll
+copy %QMSI_QT_PATH%\bin\Qt5Sql.dll
+copy %QMSI_QT_PATH%\bin\Qt5Svg.dll
+copy %QMSI_QT_PATH%\bin\Qt5WebKit.dll
+copy %QMSI_QT_PATH%\bin\Qt5Widgets.dll
+copy %QMSI_QT_PATH%\bin\Qt5Xml.dll
+copy %QMSI_QT_PATH%\bin\icudt52.dll
+copy %QMSI_QT_PATH%\bin\icuin52.dll
+copy %QMSI_QT_PATH%\bin\icuuc52.dll
+copy %QMSI_QT_PATH%\bin\libEGL.dll
+copy %QMSI_QT_PATH%\bin\libGLESv2.dll
+mkdir imageformats
+cd imageformats
+copy %QMSI_QT_PATH%\plugins\imageformats\qgif.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qjpeg.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qmng.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qsvg.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qtiff.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qico.dll
+copy %QMSI_QT_PATH%\plugins\imageformats\qtga.dll
+cd ..
+mkdir sqldrivers
+cd sqldrivers
+copy %QMSI_QT_PATH%\plugins\sqldrivers\qsqlite.dll
+cd ..
+mkdir platforms
+cd platforms
+copy %QMSI_QT_PATH%\plugins\platforms\qwindows.dll
+cd ..
+rem The qt_??.qm files must have been created before by
+rem opening a qt shell, going to the translations directory and running
+rem for %f in (qt_??.ts) do lrelease %f
+rem Oops, probably they are already preinstalled for Qt5
+copy %QMSI_QT_PATH%\translations\qt_??.qm
+
+rem section 2.2) Copy GDAL and PROJ.4 Files
+rem put them in the same directory as the .exe for better testing
+rem section 2.2.1) GDAL
+xcopy %QMSI_GDAL_PATH%\data data /s /i
+copy %QMSI_GDAL_PATH%\bin\*.dll
+rem ?? Which GDAL executables do we need ??
+copy %QMSI_GDAL_PATH%\bin\gdalinfo.exe
+copy %QMSI_GDAL_PATH%\bin\gdal_translate.exe
+copy %QMSI_GDAL_PATH%\bin\gdalwarp.exe
+rem section 2.2.4) PROJ.4
+xcopy %QMSI_PROJ_PATH%\share share /s /i
+copy %QMSI_PROJ_PATH%\bin\*.dll
+copy %QMSI_PROJ_PATH%\bin\proj.exe
+
+rem section 2.3) Copy MSVC Redist Files
+copy %QMSI_VCREDIST_PATH%\vcredist_x64.exe
+rem section 2.4) Copy libexif Files
+rem copy %QLGTI_LIBEXIF_PATH%\libexif-12.dll
+rem section 2.5) Copy QMapShack GT Files
+copy ..\..\build\bin\Release\qmapshack.exe
+copy ..\..\build\src\*.qm
+rem copy ..\..\src\icons\48x48\QMapShack.png
+rem copy ..\..\src\icons\48x48\Help.png
+copy ..\*.ico
+rem section 2.6) 3rd party SW description
+copy ..\3rdparty.txt
+
+pause
\ No newline at end of file
diff --git a/nsi/kfm_home.ico b/nsi/kfm_home.ico
new file mode 100644
index 0000000..9d64694
Binary files /dev/null and b/nsi/kfm_home.ico differ
diff --git a/nsi/konsole.ico b/nsi/konsole.ico
new file mode 100644
index 0000000..a4e60cc
Binary files /dev/null and b/nsi/konsole.ico differ
diff --git a/qmapshack.1 b/qmapshack.1
index 5fa5366..3f1b379 100644
--- a/qmapshack.1
+++ b/qmapshack.1
@@ -1,8 +1,8 @@
-.TH QMapShack 1 "July 2014" "" ""
+.TH QMAPSHACK 1 "July 2014" "" ""
.SH NAME
QMapShack \- GPS mapping (GeoTiff and vector) and GPSr management
.SH SYNOPSIS
-.B qmapshack
+\fBqmapshack\fP [\options\fP]
[
.B \-d
|
@@ -22,11 +22,27 @@ QMapShack \- GPS mapping (GeoTiff and vector) and GPSr management
.IR files ...
]
.SH DESCRIPTION
-TODO
+GPS mapping (GeoTiff and vector) and GPSr management.
+QMapShack provides a versatile tool for GPS maps in GeoTiff format as well as Garmin's img vector map format.
+You can also view and edit your GPX tracks.q QMapShack is the successor of QLandkarteGT.
+.TP
+Main features:
+ \- Use of several workspaces.
+ \- Use several maps on a workspace.
+ \- Handle data project-oriented.
.SH OPTIONS
-TODO
+.TP
+\fB\-d\fR, \fB\-\-debug\fR
+Run with debuging output.
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Displays the help message.
+.TP
+\fB\-n\fR, \fB\-\-no-splash\fR
+Start without splash screen.
+.TP
.SH SEE ALSO
-TODO
+<https://bitbucket.org/maproom/qmapshack/wiki/DocMain>.
.SH AUTHOR
\fIQMapShack\fR was written and is currently maintained by Oliver Eichler
\fB<oliver.eichler at gmx.de>\fR.
diff --git a/src/CMainWindow.cpp b/src/CMainWindow.cpp
index 9b89951..9dc3fba 100644
--- a/src/CMainWindow.cpp
+++ b/src/CMainWindow.cpp
@@ -25,6 +25,7 @@
#include "dem/CDemList.h"
#include "dem/CDemDraw.h"
#include "units/IUnit.h"
+#include "units/CTimeZoneSetup.h"
#include "version.h"
#include "CAbout.h"
#include "gis/CGisWidget.h"
@@ -71,7 +72,7 @@ CMainWindow::CMainWindow()
connect(actionHelp, SIGNAL(triggered()), this, SLOT(slotHelp()));
connect(actionAddMapWorkspace, SIGNAL(triggered()), this, SLOT(slotAddCanvas()));
connect(actionShowScale, SIGNAL(changed()), this, SLOT(slotUpdateCurrentWidget()));
- connect(actionShowGrid, SIGNAL(changed()), this, SLOT(slotUpdateCurrentWidget()));
+ connect(actionShowGrid, SIGNAL(changed()), this, SLOT(update()));
connect(actionPOIText, SIGNAL(changed()), this, SLOT(slotUpdateCurrentWidget()));
connect(actionMapToolTip, SIGNAL(changed()), this, SLOT(slotUpdateCurrentWidget()));
connect(actionNightDay, SIGNAL(changed()), this, SLOT(slotUpdateCurrentWidget()));
@@ -80,6 +81,7 @@ CMainWindow::CMainWindow()
connect(actionSetupMapPaths, SIGNAL(triggered()), this, SLOT(slotSetupMapPath()));
connect(actionSetupDEMPaths, SIGNAL(triggered()), this, SLOT(slotSetupDemPath()));
connect(actionSetupMapWks, SIGNAL(triggered()), this, SLOT(slotSetupMapWks()));
+ connect(actionSetupTimeZone, SIGNAL(triggered()), this, SLOT(slotSetupTimeZone()));
connect(actionSaveGISData, SIGNAL(triggered()), gisWidget, SLOT(slotSaveAll()));
connect(actionLoadGISData, SIGNAL(triggered()), this, SLOT(slotLoadGISData()));
connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(slotTabCloseRequest(int)));
@@ -120,6 +122,13 @@ CMainWindow::CMainWindow()
tabWidget->setCurrentIndex(cfg.value("visibleCanvas",0).toInt());
cfg.endGroup(); // Canvas
+ QByteArray tz;
+ IUnit::tz_mode_e tzmode;
+ tz = cfg.value("Units/timezone", "UTC").toByteArray();
+ tzmode = (IUnit::tz_mode_e)cfg.value("Units/timezone/mode", IUnit::eTZUtc).toInt();
+ IUnit::setTimeZoneSetup(tzmode, tz);
+
+
QStatusBar * status = statusBar();
lblPosWGS84 = new QLabel(status);
status->addPermanentWidget(lblPosWGS84);
@@ -172,6 +181,13 @@ CMainWindow::~CMainWindow()
CDemDraw::saveDemPath(cfg);
cfg.endGroup(); // Canvas
+ QByteArray tz;
+ IUnit::tz_mode_e tzmode;
+ IUnit::getTimeZoneSetup(tzmode, tz);
+
+ cfg.setValue("Units/timezone", tz);
+ cfg.setValue("Units/timezone/mode", tzmode);
+
}
bool CMainWindow::isScaleVisible()
@@ -213,6 +229,31 @@ void CMainWindow::addDemList(CDemList * list, const QString &name)
{
tabDem->addTab(list,name);
}
+
+CCanvas * CMainWindow::getVisibleCanvas()
+{
+ return dynamic_cast<CCanvas*>(tabWidget->currentWidget());
+}
+
+void CMainWindow::zoomCanvasTo(const QRectF rect)
+{
+ CCanvas * canvas = getVisibleCanvas();
+ if(canvas)
+ {
+ canvas->zoomTo(rect);
+ }
+}
+
+qreal CMainWindow::getEelevationAt(const QPointF& pos)
+{
+ CCanvas * canvas = getVisibleCanvas();
+ if(canvas)
+ {
+ return canvas->getElevationAt(pos);
+ }
+ return NOFLOAT;
+}
+
void CMainWindow::slotAbout()
{
CAbout dlg(this);
@@ -275,6 +316,11 @@ void CMainWindow::slotCurrentTabCanvas(int i)
tabDem->setCurrentIndex(n);
break;
}
+ }
+ CCanvas * canvas = getVisibleCanvas();
+ if(canvas)
+ {
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
}
}
@@ -297,6 +343,11 @@ void CMainWindow::slotCurrentTabMaps(int i)
break;
}
}
+ CCanvas * canvas = getVisibleCanvas();
+ if(canvas)
+ {
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+ }
}
void CMainWindow::slotCurrentTabDem(int i)
@@ -318,6 +369,11 @@ void CMainWindow::slotCurrentTabDem(int i)
break;
}
}
+ CCanvas * canvas = getVisibleCanvas();
+ if(canvas)
+ {
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+ }
}
void CMainWindow::slotMousePosition(const QPointF& pos, qreal ele)
@@ -340,7 +396,7 @@ void CMainWindow::slotMousePosition(const QPointF& pos, qreal ele)
if(actionShowGrid->isChecked())
{
- CCanvas * canvas = dynamic_cast<CCanvas*>(tabWidget->currentWidget());
+ CCanvas * canvas = getVisibleCanvas();
if(canvas)
{
QString str;
@@ -357,10 +413,10 @@ void CMainWindow::slotMousePosition(const QPointF& pos, qreal ele)
void CMainWindow::slotUpdateCurrentWidget()
{
- CCanvas * canvas = dynamic_cast<CCanvas*>(tabWidget->currentWidget());
+ CCanvas * canvas = getVisibleCanvas();
if(canvas)
{
- canvas->slotTriggerCompleteUpdate();
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawAll);
return;
}
@@ -392,7 +448,7 @@ void CMainWindow::slotSetupMapFont()
void CMainWindow::slotSetupGrid()
{
- CCanvas * canvas = dynamic_cast<CCanvas*>(tabWidget->currentWidget());
+ CCanvas * canvas = getVisibleCanvas();
if(canvas == 0)
{
return;
@@ -412,7 +468,7 @@ void CMainWindow::slotSetupDemPath()
void CMainWindow::slotSetupMapWks()
{
- CCanvas * canvas = dynamic_cast<CCanvas*>(tabWidget->currentWidget());
+ CCanvas * canvas = getVisibleCanvas();
if(canvas == 0)
{
return;
@@ -420,6 +476,12 @@ void CMainWindow::slotSetupMapWks()
canvas->setup();
}
+void CMainWindow::slotSetupTimeZone()
+{
+ CTimeZoneSetup dlg(this);
+ dlg.exec();
+}
+
void CMainWindow::slotLoadGISData()
{
SETTINGS;
diff --git a/src/CMainWindow.h b/src/CMainWindow.h
index 5867012..c1b23f3 100644
--- a/src/CMainWindow.h
+++ b/src/CMainWindow.h
@@ -26,6 +26,7 @@ class CMapList;
class CDemList;
class QLabel;
class CGisWidget;
+class CCanvas;
class CMainWindow : public QMainWindow, private Ui::IMainWindow
{
@@ -45,6 +46,19 @@ class CMainWindow : public QMainWindow, private Ui::IMainWindow
bool flipMouseWheel();
const QFont& getMapFont(){return mapFont;}
+ void zoomCanvasTo(const QRectF rect);
+ /**
+ @brief Read the elevation from DEM data attached to the currently visible canvas for a given location
+ @param pos a poistion in units of [rad]
+ @return If no elevation value can be found for the position NOFLOAT is returned.
+ */
+ qreal getEelevationAt(const QPointF &pos);
+ /**
+ @brief Get pointer to the currently visibale canvas object.
+ @return If the currently visible tab does not contain a CCanvas object 0 is returned.
+ */
+ CCanvas * getVisibleCanvas();
+
private slots:
void slotAbout();
void slotHelp();
@@ -60,6 +74,7 @@ class CMainWindow : public QMainWindow, private Ui::IMainWindow
void slotSetupMapPath();
void slotSetupDemPath();
void slotSetupMapWks();
+ void slotSetupTimeZone();
void slotLoadGISData();
private:
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index cf316b2..4466ce5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -8,6 +8,8 @@ set(CMAKE_AUTOMOC ON)
find_package(Qt5Widgets)
find_package(Qt5Core)
find_package(Qt5Xml)
+find_package(Qt5WebKitWidgets)
+find_package(Qt5LinguistTools)
find_package(GDAL REQUIRED)
find_package(PROJ REQUIRED)
@@ -16,6 +18,10 @@ set( SRCS
GeoMath.cpp
CMainWindow.cpp
CAbout.cpp
+ helpers/CInputDialog.cpp
+ helpers/CPositionDialog.cpp
+ helpers/CWptIconDialog.cpp
+ helpers/CTextEditWidget.cpp
canvas/CCanvas.cpp
canvas/CCanvasSetup.cpp
canvas/IDrawContext.cpp
@@ -51,22 +57,32 @@ set( SRCS
units/CUnitImperial.cpp
units/CUnitMetric.cpp
units/CUnitNautic.cpp
+ units/CTimeZoneSetup.cpp
grid/CGrid.cpp
grid/CGridSetup.cpp
grid/CProjWizard.cpp
grid/mitab.cpp
mouse/IMouse.cpp
+ mouse/IScrOpt.cpp
mouse/CMouseNormal.cpp
+ mouse/CMouseMoveWpt.cpp
+ mouse/CScrOptUnclutter.cpp
gis/WptIcons.cpp
gis/CGisDraw.cpp
gis/IGisItem.cpp
gis/wpt/CGisItemWpt.cpp
+ gis/wpt/CScrOptWpt.cpp
+ gis/wpt/CDetailsWpt.cpp
+ gis/wpt/CDetailsGeoCache.cpp
+ gis/wpt/CProjWpt.cpp
gis/trk/CGisItemTrk.cpp
+ gis/trk/CScrOptTrk.cpp
gis/rte/CGisItemRte.cpp
+ gis/rte/CScrOptRte.cpp
gis/CGisWidget.cpp
gis/CGisListDB.cpp
gis/CGisListWks.cpp
- gis/CGisProject.cpp
+ gis/CGisProject.cpp
)
set( HDRS
@@ -79,6 +95,10 @@ set( HDRS
helpers/CFileExt.h
helpers/CAppOpts.h
helpers/CSettings.h
+ helpers/CInputDialog.h
+ helpers/CPositionDialog.h
+ helpers/CWptIconDialog.h
+ helpers/CTextEditWidget.h
canvas/CCanvas.h
canvas/CCanvasSetup.h
canvas/IDrawContext.h
@@ -115,27 +135,41 @@ set( HDRS
units/CUnitImperial.h
units/CUnitMetric.h
units/CUnitNautic.h
+ units/CTimeZoneSetup.h
grid/CGrid.h
grid/CGridSetup.h
grid/CProjWizard.h
grid/mitab.h
mouse/IMouse.h
+ mouse/IScrOpt.h
mouse/CMouseNormal.h
+ mouse/CMouseMoveWpt.h
+ mouse/CScrOptUnclutter.h
gis/WptIcons.h
gis/CGisDraw.h
gis/IGisItem.h
gis/wpt/CGisItemWpt.h
+ gis/wpt/CScrOptWpt.h
+ gis/wpt/CDetailsWpt.h
+ gis/wpt/CDetailsGeoCache.h
+ gis/wpt/CProjWpt.h
gis/trk/CGisItemTrk.h
+ gis/trk/CScrOptTrk.h
gis/rte/CGisItemRte.h
+ gis/rte/CScrOptRte.h
gis/CGisWidget.h
gis/CGisListDB.h
gis/CGisListWks.h
- gis/CGisProject.h
+ gis/CGisProject.h
)
set( UIS
IMainWindow.ui
IAbout.ui
+ helpers/IInputDialog.ui
+ helpers/IPositionDialog.ui
+ helpers/IWptIconDialog.ui
+ helpers/ITextEditWidget.ui
canvas/ICanvasSetup.ui
dem/IDemList.ui
dem/IDemPathSetup.ui
@@ -146,6 +180,13 @@ set( UIS
grid/IGridSetup.ui
grid/IProjWizard.ui
gis/IGisWidget.ui
+ gis/wpt/IScrOptWpt.ui
+ gis/wpt/IDetailsWpt.ui
+ gis/wpt/IDetailsGeoCache.ui
+ gis/wpt/IProjWpt.ui
+ gis/trk/IScrOptTrk.ui
+ gis/rte/IScrOptRte.ui
+ units/ITimeZoneSetup.ui
)
set( RCS
@@ -156,11 +197,26 @@ set( RCS
qt5_wrap_ui(UI_HDRS ${UIS})
qt5_add_resources(RC_SRCS ${RCS})
+if(UNIX)
+ add_definitions(-Wall)
+endif(UNIX)
+
+
+file(GLOB TRANSLATIONS_FILES locale/*.ts)
+
+
+qt5_add_translation(
+ ${APPLICATION_NAME}_QM_FILES
+ ${TRANSLATIONS_FILES}
+)
+
+
set(ALLINP
${SRCS}
${HDRS}
${UI_HDRS}
${RC_SRCS}
+ ${${APPLICATION_NAME}_QM_FILES}
)
include_directories(
@@ -171,6 +227,8 @@ include_directories(
)
+
+
# Tell CMake to create the helloworld executable
add_executable(${APPLICATION_NAME} WIN32 ${ALLINP})
@@ -178,6 +236,7 @@ add_executable(${APPLICATION_NAME} WIN32 ${ALLINP})
target_link_libraries(${APPLICATION_NAME}
Qt5::Widgets
Qt5::Xml
+ Qt5::WebKitWidgets
CGetOpt
${GDAL_LIBRARIES}
${PROJ_LIBRARIES}
@@ -190,3 +249,18 @@ install(
DESTINATION
${BIN_INSTALL_DIR}
)
+
+if (UNIX AND NOT WIN32 AND NOT APPLE)
+install(
+ FILES
+ ${${APPLICATION_NAME}_QM_FILES}
+ DESTINATION
+ ${DATA_INSTALL_PREFIX}/${APPLICATION_NAME}/translations)
+endif (UNIX AND NOT WIN32 AND NOT APPLE)
+
+if (APPLE)
+add_custom_target(locversion.plist ALL
+ COMMAND
+ ${CMAKE_SOURCE_DIR}/MacOSX/mklocversion.sh ${MAC_BUNDLE_PATH} ${${APPLICATION_NAME}_QM_FILES}
+)
+endif (APPLE)
diff --git a/src/GeoMath.cpp b/src/GeoMath.cpp
index fed9d4a..2ee865e 100644
--- a/src/GeoMath.cpp
+++ b/src/GeoMath.cpp
@@ -28,11 +28,24 @@
#define PI M_PI
#define TWOPI (2*PI)
-static bool GPS_Math_Deg_To_DegMin(qreal v, qint32 *d, qreal *m)
+void GPS_Math_DegMinSec_To_Deg(bool sign, const int32_t d, const int32_t m, const int32_t s, qreal °)
+{
+
+ deg = qAbs(d) + qreal(m) / 60.0 + qreal(s) / 3600;
+ if(sign)
+ {
+ deg = -deg;
+ }
+
+ return;
+}
+
+
+bool GPS_Math_Deg_To_DegMin(qreal v, qint32 *d, qreal *m)
{
bool sign = v < 0;
- qint32 deg = abs(v);
- qreal min = (fabs(v) - deg) * 60.0;
+ qint32 deg = qAbs(v);
+ qreal min = (qAbs(v) - deg) * 60.0;
*d = deg;
*m = min;
@@ -41,10 +54,10 @@ static bool GPS_Math_Deg_To_DegMin(qreal v, qint32 *d, qreal *m)
}
-static void GPS_Math_DegMin_To_Deg(bool sign, const qint32 d, const qreal m, qreal& deg)
+void GPS_Math_DegMin_To_Deg(bool sign, const qint32 d, const qreal m, qreal& deg)
{
- deg = abs(d) + m / 60.0;
+ deg = qAbs(d) + m / 60.0;
if(sign) {
deg = -deg;
}
@@ -64,7 +77,7 @@ void GPS_Math_Deg_To_Str(const qreal& x, const qreal& y, QString& str)
QString lat,lng;
lat = signLat ? "S" : "N";
lng = signLon ? "W" : "E";
- str.sprintf("%s%02d° %06.3f %s%03d° %06.3f",lat.toUtf8().data(),abs(degN),minN,lng.toUtf8().data(),abs(degE),minE);
+ str.sprintf("%s%02d° %06.3f %s%03d° %06.3f",lat.toUtf8().data(),qAbs(degN),minN,lng.toUtf8().data(),qAbs(degE),minE);
}
@@ -113,7 +126,7 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
qreal lambda = L, lambdaP = 2*PI;
unsigned iterLimit = 20;
- while ((fabs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
+ while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
sinLambda = sin(lambda);
cosLambda = cos(lambda);
sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
@@ -170,7 +183,7 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
qreal lambda = L, lambdaP = 2*PI;
unsigned iterLimit = 20;
- while ((fabs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
+ while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
sinLambda = sin(lambda);
cosLambda = cos(lambda);
sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
diff --git a/src/GeoMath.h b/src/GeoMath.h
index 4ff21c5..591f6ee 100644
--- a/src/GeoMath.h
+++ b/src/GeoMath.h
@@ -23,6 +23,8 @@
#include <QPointF>
#include <QRectF>
+#include <stdint.h>
+
struct point3D
{
qreal x;
@@ -38,6 +40,8 @@ struct pointDP : public point3D
extern void GPS_Math_Deg_To_Str(const qreal& x, const qreal& y, QString& str);
extern bool GPS_Math_Str_To_Deg(const QString& str, qreal& lon, qreal& lat);
+extern void GPS_Math_DegMin_To_Deg(bool sign, const qint32 d, const qreal m, qreal& deg);
+extern void GPS_Math_DegMinSec_To_Deg(bool sign, const int32_t d, const int32_t m, const int32_t s, qreal& deg);
/// use for long distances
extern qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qreal v2, qreal& a1, qreal& a2);
extern qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qreal v2);
diff --git a/src/IAbout.ui b/src/IAbout.ui
index 44c30f7..8afc92c 100644
--- a/src/IAbout.ui
+++ b/src/IAbout.ui
@@ -35,7 +35,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>QMapShack, Version</string>
+ <string><b>QMapShack</b>, Version</string>
</property>
</widget>
</item>
diff --git a/src/IMainWindow.ui b/src/IMainWindow.ui
index d5a8bb8..7134415 100644
--- a/src/IMainWindow.ui
+++ b/src/IMainWindow.ui
@@ -81,6 +81,7 @@
<addaction name="actionSetupMapFont"/>
<addaction name="actionSetupGrid"/>
<addaction name="actionSetupMapWks"/>
+ <addaction name="actionSetupTimeZone"/>
</widget>
<widget class="QMenu" name="menuWindow">
<property name="title">
@@ -368,6 +369,15 @@
<string>Ctrl+S</string>
</property>
</action>
+ <action name="actionSetupTimeZone">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/icons/32x32/TimeZoneSetup.png</normaloff>:/icons/32x32/TimeZoneSetup.png</iconset>
+ </property>
+ <property name="text">
+ <string>Setup Time Zone</string>
+ </property>
+ </action>
</widget>
<resources>
<include location="resources.qrc"/>
diff --git a/src/animation/COPYRIGHT b/src/animation/COPYRIGHT
new file mode 100644
index 0000000..7674827
--- /dev/null
+++ b/src/animation/COPYRIGHT
@@ -0,0 +1,14 @@
+Loading indicators are from:
+
+http://ajaxload.info/
+
+Quote from web pages:
+------------------------------------------
+
+Generated gifs can be used, modified and distributed under the terms of the "Do What The Fuck You Want To Public License"
+
+http://www.wtfpl.net/
+
+------------------------------------------
+
+License: WTFPL-2
diff --git a/src/animation/README b/src/animation/README
deleted file mode 100644
index 9ca54f2..0000000
--- a/src/animation/README
+++ /dev/null
@@ -1,3 +0,0 @@
-Loading indicators are from:
-
-http://ajaxload.info/
\ No newline at end of file
diff --git a/src/animation/WTFPL-2 b/src/animation/WTFPL-2
new file mode 100644
index 0000000..ee7d6a5
--- /dev/null
+++ b/src/animation/WTFPL-2
@@ -0,0 +1,14 @@
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Copyright (C) 2004 Sam Hocevar <sam at hocevar.net>
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
+
diff --git a/src/canvas/CCanvas.cpp b/src/canvas/CCanvas.cpp
index 48bf201..8c0f05f 100644
--- a/src/canvas/CCanvas.cpp
+++ b/src/canvas/CCanvas.cpp
@@ -26,11 +26,17 @@
#include "grid/CGridSetup.h"
#include "units/IUnit.h"
#include "mouse/CMouseNormal.h"
+#include "mouse/CMouseMoveWpt.h"
#include "gis/CGisDraw.h"
#include <QtWidgets>
+QPen CCanvas::penBorderBlue(QColor(10,10,150,220),2);
+QPen CCanvas::penBorderGray(Qt::lightGray,2);
+QPen CCanvas::penBorderBlack(QColor(0,0,0,200),2);
+QBrush CCanvas::brushBackWhite(QColor(255,255,255,255));
+QBrush CCanvas::brushBackYellow(QColor(0xff, 0xff, 0xcc, 0xE0));
CCanvas::CCanvas(QWidget *parent)
@@ -57,11 +63,11 @@ CCanvas::CCanvas(QWidget *parent)
grid = new CGrid(map);
dem = new CDemDraw(this);
gis = new CGisDraw(this);
- mouse = new CMouseNormal(this);
+ mouse = new CMouseNormal(gis, this);
- connect(map, SIGNAL(sigCanvasUpdate()), this, SLOT(slotTriggerCompleteUpdate()));
- connect(dem, SIGNAL(sigCanvasUpdate()), this, SLOT(slotTriggerCompleteUpdate()));
- connect(gis, SIGNAL(sigCanvasUpdate()), this, SLOT(slotTriggerCompleteUpdate()));
+ connect(map, SIGNAL(sigCanvasUpdate(CCanvas::redraw_e)), this, SLOT(slotTriggerCompleteUpdate(CCanvas::redraw_e)));
+ connect(dem, SIGNAL(sigCanvasUpdate(CCanvas::redraw_e)), this, SLOT(slotTriggerCompleteUpdate(CCanvas::redraw_e)));
+ connect(gis, SIGNAL(sigCanvasUpdate(CCanvas::redraw_e)), this, SLOT(slotTriggerCompleteUpdate(CCanvas::redraw_e)));
timerToolTip = new QTimer(this);
timerToolTip->setSingleShot(true);
@@ -116,9 +122,32 @@ void CCanvas::loadConfig(QSettings& cfg)
gis->zoom(map->zoom());
}
+void CCanvas::resetMouse()
+{
+ mouse->deleteLater();
+ mouse = new CMouseNormal(gis, this);
+ if(underMouse())
+ {
+ QApplication::restoreOverrideCursor();
+ QApplication::setOverrideCursor(*mouse);
+ }
+}
+
+void CCanvas::setMouseMoveWpt(CGisItemWpt& wpt)
+{
+ mouse->deleteLater();
+ mouse = new CMouseMoveWpt(wpt, gis, this);
+ if(underMouse())
+ {
+ QApplication::restoreOverrideCursor();
+ QApplication::setOverrideCursor(*mouse);
+ }
+}
+
+
void CCanvas::resizeEvent(QResizeEvent * e)
{
- needsRedraw = true;
+ needsRedraw = eRedrawAll;
QSize s = e->size();
if(map) map->resize(s);
@@ -166,11 +195,12 @@ void CCanvas::paintEvent(QPaintEvent * e)
// ----- start to draw static content -----
grid->draw(p, rect());
+ mouse->draw(p, rect());
drawScale(p);
p.end();
- needsRedraw = false;
+ needsRedraw = eRedrawNone;
}
@@ -185,7 +215,7 @@ void CCanvas::mouseMoveEvent(QMouseEvent * e)
qreal ele = NOFLOAT;
QPointF pos = e->pos();
map->convertPx2Rad(pos);
- ele = dem->getElevation(pos);
+ ele = dem->getEelevationAt(pos);
emit sigMousePosition(pos * RAD_TO_DEG, ele);
mouse->mouseMoveEvent(e);
@@ -200,8 +230,11 @@ void CCanvas::mouseReleaseEvent(QMouseEvent *e)
void CCanvas::wheelEvent(QWheelEvent * e)
{
+ mouse->wheelEvent(e);
+
QPointF pos = e->posF();
QPointF pt1 = pos;
+
map->convertPx2Rad(pt1);
setZoom(CMainWindow::self().flipMouseWheel() ? (e->delta() < 0) : (e->delta() > 0), needsRedraw);
map->convertRad2Px(pt1);
@@ -398,9 +431,9 @@ void CCanvas::drawScale(QPainter& p)
drawText(QString("%1 %2").arg(val).arg(unit), p, pt3, Qt::black);
}
-void CCanvas::slotTriggerCompleteUpdate()
+void CCanvas::slotTriggerCompleteUpdate(CCanvas::redraw_e flags)
{
- needsRedraw = true;
+ needsRedraw = (redraw_e)(needsRedraw | flags);
update();
}
@@ -423,7 +456,16 @@ void CCanvas::moveMap(const QPointF& delta)
posFocus -= delta;
map->convertPx2Rad(posFocus);
- slotTriggerCompleteUpdate();
+ slotTriggerCompleteUpdate(eRedrawAll);
+}
+
+void CCanvas::zoomTo(const QRectF& rect)
+{
+ posFocus = rect.center();
+ map->zoom(rect);
+ dem->zoom(map->zoom());
+ gis->zoom(map->zoom());
+ slotTriggerCompleteUpdate(eRedrawAll);
}
void CCanvas::setupGrid()
@@ -468,7 +510,12 @@ void CCanvas::setProjection(const QString& proj)
gis->setProjection(proj);
}
-void CCanvas::setZoom(bool in, bool& needsRedraw)
+qreal CCanvas::getElevationAt(const QPointF& pos)
+{
+ return dem->getEelevationAt(pos);
+}
+
+void CCanvas::setZoom(bool in, redraw_e& needsRedraw)
{
map->zoom(in, needsRedraw);
dem->zoom(map->zoom());
diff --git a/src/canvas/CCanvas.h b/src/canvas/CCanvas.h
index d3a28ef..2f58d50 100644
--- a/src/canvas/CCanvas.h
+++ b/src/canvas/CCanvas.h
@@ -25,6 +25,7 @@ class CMapDraw;
class CGrid;
class CDemDraw;
class CGisDraw;
+class CGisItemWpt;
class QSettings;
class QPointF;
class IMouse;
@@ -45,6 +46,8 @@ progress.setWindowModality(Qt::WindowModal);\
progress.setValue(x); \
if (progress.wasCanceled()) cmd;\
+#define PAINT_ROUNDED_RECT(p,r) p.drawRoundedRect(r,5,5)
+
class CCanvas : public QWidget
{
@@ -61,20 +64,40 @@ class CCanvas : public QWidget
void setup();
QString getProjection();
- void setProjection(const QString& proj);
+ void setProjection(const QString& proj);
+ qreal getElevationAt(const QPointF &pos);
void moveMap(const QPointF &delta);
- void displayInfo(const QPoint& px);
+ void zoomTo(const QRectF& rect);
+ void displayInfo(const QPoint& px);
static void drawText(const QString& str, QPainter& p, const QPoint& center, const QColor& color);
static void drawText(const QString& str, QPainter& p, const QPoint& center, const QColor& color, const QFont& font);
static void drawText(const QString& str, QPainter& p, const QRect& r, const QColor& color);
+ enum redraw_e
+ {
+ eRedrawNone = 0
+ , eRedrawMap = 0x01
+ , eRedrawDem = 0x02
+ , eRedrawGis = 0x04
+ , eRedrawAll = 0xFFFFFFFF
+ };
+
+ static QPen penBorderBlue;
+ static QPen penBorderGray;
+ static QPen penBorderBlack;
+ static QBrush brushBackWhite;
+ static QBrush brushBackYellow;
+
+ void resetMouse();
+ void setMouseMoveWpt(CGisItemWpt& wpt);
+
signals:
void sigMousePosition(const QPointF& pos, qreal ele);
public slots:
- void slotTriggerCompleteUpdate();
+ void slotTriggerCompleteUpdate(CCanvas::redraw_e flags);
protected:
void resizeEvent(QResizeEvent * e);
@@ -93,10 +116,10 @@ class CCanvas : public QWidget
private:
void drawScale(QPainter& p);
- void setZoom(bool in, bool& needsRedraw);
+ void setZoom(bool in, redraw_e &needsRedraw);
/// set true to initiate a complete redraw of the screen content
- bool needsRedraw;
+ redraw_e needsRedraw;
/// the map object attached to this canvas
CMapDraw * map;
diff --git a/src/canvas/CCanvasSetup.cpp b/src/canvas/CCanvasSetup.cpp
index 772b17a..2aceacb 100644
--- a/src/canvas/CCanvasSetup.cpp
+++ b/src/canvas/CCanvasSetup.cpp
@@ -51,6 +51,6 @@ void CCanvasSetup::accept()
return;
}
canvas->setProjection(lineProjection->text());
- canvas->slotTriggerCompleteUpdate();
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawAll);
QDialog::accept();
}
diff --git a/src/canvas/ICanvasSetup.ui b/src/canvas/ICanvasSetup.ui
index f3c57e7..f1148e0 100644
--- a/src/canvas/ICanvasSetup.ui
+++ b/src/canvas/ICanvasSetup.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>446</width>
- <height>109</height>
+ <height>98</height>
</rect>
</property>
<property name="windowTitle">
@@ -70,16 +70,6 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/SetupMapWorkspace.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
diff --git a/src/canvas/IDrawContext.cpp b/src/canvas/IDrawContext.cpp
index 489a9bf..8b4c00e 100644
--- a/src/canvas/IDrawContext.cpp
+++ b/src/canvas/IDrawContext.cpp
@@ -46,6 +46,7 @@
// ,52428.8
//};
+#define BUFFER_BORDER 50
#define N_ZOOM_LEVELS 31
const qreal IDrawContext::scales[N_ZOOM_LEVELS] =
{
@@ -98,9 +99,10 @@ QPointF operator/(const QPointF& p1, const QPointF& p2)
}
-IDrawContext::IDrawContext(const QString& name, CCanvas *parent)
+IDrawContext::IDrawContext(const QString& name, CCanvas::redraw_e maskRedraw, CCanvas *parent)
: QThread(parent)
, canvas(parent)
+ , maskRedraw(maskRedraw)
, bufIndex(false)
, bufWidth(100)
, bufHeight(100)
@@ -133,7 +135,7 @@ IDrawContext::~IDrawContext()
void IDrawContext::emitSigCanvasUpdate()
{
- emit sigCanvasUpdate();
+ emit sigCanvasUpdate(maskRedraw);
}
@@ -148,8 +150,8 @@ void IDrawContext::resize(const QSize& size)
viewHeight = size.height();
center = QPointF(viewWidth/2.0, viewHeight/2.0);
- bufWidth = viewWidth + 100;
- bufHeight = viewHeight + 100;
+ bufWidth = viewWidth + 2 * BUFFER_BORDER;
+ bufHeight = viewHeight + 2 * BUFFER_BORDER;
buffer[0].image = QImage(bufWidth, bufHeight, QImage::Format_ARGB32);
buffer[1].image = QImage(bufWidth, bufHeight, QImage::Format_ARGB32);
@@ -184,11 +186,40 @@ bool IDrawContext::needsRedraw()
return res;
}
-void IDrawContext::zoom(bool in, bool &needsRedraw)
+void IDrawContext::zoom(const QRectF& rect)
+{
+ if(pjsrc == 0) return;
+
+ // special case for elements with no extent
+ if(rect.width() == 0 || rect.height() == 0)
+ {
+ zoom(8);
+ return;
+ }
+
+ // zoom out from closest zoom level until a match is found
+ for(int i = 0; i < N_ZOOM_LEVELS; i++)
+ {
+ zoom(i);
+ QPointF pt1 = rect.topLeft();
+ QPointF pt2 = rect.bottomRight();
+
+ convertRad2Px(pt1);
+ convertRad2Px(pt2);
+
+ QPointF pt = pt2 - pt1;
+ if(qAbs(pt.x()) < (bufWidth - 2 * BUFFER_BORDER) && qAbs(pt.y() < (bufHeight - 2 * BUFFER_BORDER)))
+ {
+ break;
+ }
+ }
+}
+
+void IDrawContext::zoom(bool in, CCanvas::redraw_e& needsRedraw)
{
if(pjsrc == 0) return;
zoom(zoomIndex + (in ? -1 : 1));
- needsRedraw = true;
+ needsRedraw = CCanvas::eRedrawAll;
}
void IDrawContext::zoom(int idx)
@@ -311,7 +342,7 @@ void IDrawContext::convertRad2Px(QPolygonF& poly)
mutex.unlock(); // --------- stop serialize with thread
}
-void IDrawContext::draw(QPainter& p, bool needsRedraw, const QPointF& f, const QRectF &r)
+void IDrawContext::draw(QPainter& p, CCanvas::redraw_e needsRedraw, const QPointF& f, const QRectF &r)
{
if(pjsrc == 0) return;
@@ -340,20 +371,20 @@ void IDrawContext::draw(QPainter& p, bool needsRedraw, const QPointF& f, const Q
// adjust west <-> east boundaries
if(ref1.x() > ref2.x())
{
- if(fabs(ref1.x()) > fabs(ref2.x()))
+ if(qAbs(ref1.x()) > qAbs(ref2.x()))
{
ref1.rx() = -2*(180*DEG_TO_RAD) + ref1.rx();
}
- if(fabs(ref4.x()) > fabs(ref3.x()))
+ if(qAbs(ref4.x()) > qAbs(ref3.x()))
{
ref4.rx() = -2*(180*DEG_TO_RAD) + ref4.rx();
}
- if(fabs(ref1.x()) < fabs(ref2.x()))
+ if(qAbs(ref1.x()) < qAbs(ref2.x()))
{
ref2.rx() = 2*(180*DEG_TO_RAD) + ref2.rx();
}
- if(fabs(ref4.x()) < fabs(ref3.x()))
+ if(qAbs(ref4.x()) < qAbs(ref3.x()))
{
ref3.rx() = 2*(180*DEG_TO_RAD) + ref3.rx();
}
@@ -383,10 +414,10 @@ void IDrawContext::draw(QPainter& p, bool needsRedraw, const QPointF& f, const Q
p.restore();
// intNeedsRedraw is reset by the thread
- if(needsRedraw) intNeedsRedraw = true;
+ if(needsRedraw & maskRedraw) intNeedsRedraw = true;
mutex.unlock(); // --------- stop serialize with thread
- if(needsRedraw && !isRunning())
+ if((needsRedraw & maskRedraw) && !isRunning())
{
emit sigStartThread();
start();
diff --git a/src/canvas/IDrawContext.h b/src/canvas/IDrawContext.h
index 878f19b..d7db116 100644
--- a/src/canvas/IDrawContext.h
+++ b/src/canvas/IDrawContext.h
@@ -27,13 +27,13 @@
#include <proj_api.h>
-class CCanvas;
+#include "canvas/CCanvas.h"
class IDrawContext : public QThread
{
Q_OBJECT
public:
- IDrawContext(const QString &name, CCanvas *parent);
+ IDrawContext(const QString &name, CCanvas::redraw_e maskRedraw, CCanvas *parent);
virtual ~IDrawContext();
struct buffer_t
@@ -72,9 +72,11 @@ class IDrawContext : public QThread
@param in set true to zoom in, and false to zoom out
@param needsRedraw if the zoom action makes a redraw nesseccary needsRedraw is set true
*/
- void zoom(bool in, bool& needsRedraw);
+ void zoom(bool in, CCanvas::redraw_e &needsRedraw);
void zoom(int idx);
+ void zoom(const QRectF& rect);
int zoom(){return zoomIndex;}
+
/**
@brief Convert a geo coordinate of format lon/lat WGS84 into the currently used coordinate/projection/datum system.
@note The unit is dependent on the currently used projection and must not nesseccarily be meter
@@ -112,7 +114,7 @@ class IDrawContext : public QThread
@param f the point of focus in [°] that is drawn in the middle of the viewport.
*/
- void draw(QPainter& p, bool needsRedraw, const QPointF &f, const QRectF &r);
+ void draw(QPainter& p, CCanvas::redraw_e needsRedraw, const QPointF &f, const QRectF &r);
/**
@brief Get the projection string of this map object
@@ -135,7 +137,7 @@ class IDrawContext : public QThread
virtual void setProjection(const QString& proj);
signals:
- void sigCanvasUpdate();
+ void sigCanvasUpdate(CCanvas::redraw_e flags);
void sigStartThread();
void sigStopThread();
void sigScaleChanged(const QPointF& scale);
@@ -167,6 +169,8 @@ class IDrawContext : public QThread
/// the canvas this map object is attached to
CCanvas * canvas;
+
+ const CCanvas::redraw_e maskRedraw;
/// map canvas twin buffer
buffer_t buffer[2];
/// the main threads currently used map canvas buffer
diff --git a/src/cursors/COPYRIGHT b/src/cursors/COPYRIGHT
new file mode 100644
index 0000000..cfc0134
--- /dev/null
+++ b/src/cursors/COPYRIGHT
@@ -0,0 +1,14 @@
+All icons in this directory are from http://www.rw-designer.com/cursor-set/proton
+
+files are public domain.
+
+Quote from source web pages:
+--------------------------------------------
+Released to Public Domain
+
+You are free:
+
+ To use this work for any legal purpose.
+--------------------------------------------
+
+http://www.rw-designer.com/licenses
diff --git a/src/cursors/cursorArrow.png b/src/cursors/cursorArrow.png
old mode 100755
new mode 100644
diff --git a/src/cursors/cursorMove.png b/src/cursors/cursorMove.png
old mode 100755
new mode 100644
diff --git a/src/cursors/cursorMoveWpt.png b/src/cursors/cursorMoveWpt.png
new file mode 100644
index 0000000..eb257e5
Binary files /dev/null and b/src/cursors/cursorMoveWpt.png differ
diff --git a/src/cursors/wptHighlight.png b/src/cursors/wptHighlight.png
new file mode 100644
index 0000000..df2c84b
Binary files /dev/null and b/src/cursors/wptHighlight.png differ
diff --git a/src/cursors/wptHighlight.svg b/src/cursors/wptHighlight.svg
new file mode 100644
index 0000000..1476738
--- /dev/null
+++ b/src/cursors/wptHighlight.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Neues Dokument 1">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3815">
+ <stop
+ style="stop-color:#ff2a2a;stop-opacity:1;"
+ offset="0"
+ id="stop3817" />
+ <stop
+ style="stop-color:#ff2a2a;stop-opacity:0;"
+ offset="1"
+ id="stop3819" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3765">
+ <stop
+ style="stop-color:#ffff00;stop-opacity:1;"
+ offset="0"
+ id="stop3767" />
+ <stop
+ style="stop-color:#ffff00;stop-opacity:0;"
+ offset="1"
+ id="stop3769" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3765"
+ id="radialGradient3771"
+ cx="30"
+ cy="34"
+ fx="30"
+ fy="34"
+ r="24"
+ gradientTransform="matrix(1,0,0,0.79166667,0,7.0833333)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3815"
+ id="radialGradient3821"
+ cx="30"
+ cy="29"
+ fx="30"
+ fy="29"
+ r="20.846153"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="32.100954"
+ inkscape:cy="49.055774"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-988.36218)">
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:url(#radialGradient3821);stroke-width:11.11794853;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path3773"
+ sodipodi:cx="30"
+ sodipodi:cy="29"
+ sodipodi:rx="15"
+ sodipodi:ry="15"
+ d="m 45,29 a 15,15 0 1 1 -1.33e-4,-0.06325"
+ transform="matrix(0.97281118,0,0,0.97281118,0.87316707,989.09323)"
+ sodipodi:start="0"
+ sodipodi:end="6.2789689"
+ sodipodi:open="true"
+ inkscape:export-filename="/home/oeichler/Code/cpp/QMapShack/src/cursors/wptHighlight.png"
+ inkscape:export-xdpi="137.22581"
+ inkscape:export-ydpi="137.22581" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#ff2a2a;stroke-width:0.50444174;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path3823"
+ sodipodi:cx="-5"
+ sodipodi:cy="31.5"
+ sodipodi:rx="5"
+ sodipodi:ry="2.5"
+ d="m 0,31.5 a 5,2.5 0 1 1 -4.4445158e-5,-0.01054"
+ transform="matrix(2.0535053,0,0,4.1070106,40.325029,887.93392)"
+ sodipodi:start="0"
+ sodipodi:end="6.2789689"
+ sodipodi:open="true"
+ inkscape:export-filename="/home/oeichler/Code/cpp/QMapShack/src/cursors/wptHighlight.png"
+ inkscape:export-xdpi="137.22581"
+ inkscape:export-ydpi="137.22581" />
+ </g>
+</svg>
diff --git a/src/dem/CDemDraw.cpp b/src/dem/CDemDraw.cpp
index 27f519a..da9a86f 100644
--- a/src/dem/CDemDraw.cpp
+++ b/src/dem/CDemDraw.cpp
@@ -35,7 +35,7 @@ QStringList CDemDraw::supportedFormats = QString("*.vrt").split('|');
CDemDraw::CDemDraw(CCanvas *canvas)
- : IDrawContext("dem",canvas)
+ : IDrawContext("dem", CCanvas::eRedrawDem, canvas)
{
demList = new CDemList(canvas);
@@ -211,7 +211,7 @@ void CDemDraw::restoreActiveMapsList(const QStringList& keys)
}
-qreal CDemDraw::getElevation(const QPointF& pos)
+qreal CDemDraw::getEelevationAt(const QPointF& pos)
{
qreal ele = NOFLOAT;
if(CDemItem::mutexActiveDems.tryLock())
@@ -230,7 +230,7 @@ qreal CDemDraw::getElevation(const QPointF& pos)
break;
}
- ele = item->demfile->getElevation(pos);
+ ele = item->demfile->getEelevationAt(pos);
if(ele != NOFLOAT)
{
break;
diff --git a/src/dem/CDemDraw.h b/src/dem/CDemDraw.h
index 0d6894c..9584c0b 100644
--- a/src/dem/CDemDraw.h
+++ b/src/dem/CDemDraw.h
@@ -48,7 +48,7 @@ class CDemDraw : public IDrawContext
void loadConfigForDemItem(CDemItem * item);
- qreal getElevation(const QPointF& pos);
+ qreal getEelevationAt(const QPointF& pos);
void setProjection(const QString& proj);
diff --git a/src/dem/CDemVRT.cpp b/src/dem/CDemVRT.cpp
index 82723f0..c08e836 100644
--- a/src/dem/CDemVRT.cpp
+++ b/src/dem/CDemVRT.cpp
@@ -132,7 +132,7 @@ CDemVRT::~CDemVRT()
delete dataset;
}
-qreal CDemVRT::getElevation(const QPointF& pos)
+qreal CDemVRT::getEelevationAt(const QPointF& pos)
{
if(pjsrc == 0) return NOFLOAT;
@@ -151,7 +151,9 @@ qreal CDemVRT::getElevation(const QPointF& pos)
qreal x = pt.x() - floor(pt.x());
qreal y = pt.y() - floor(pt.y());
+ mutex.lock();
CPLErr err = dataset->RasterIO(GF_Read, floor(pt.x()), floor(pt.y()), 2, 2, &e, 2, 2, GDT_Int16, 1, 0, 0, 0, 0);
+ mutex.unlock();
if(err == CE_Failure)
{
return NOFLOAT;
@@ -221,8 +223,6 @@ void CDemVRT::draw(IDrawContext::buffer_t& buf)
if(bottom >= ysize_px) bottom = ysize_px - 1;
if(bottom <= 0) bottom = 1;
- qDebug() << left << top << (right - left) << (bottom - top);
-
qreal imgw = TILESIZEX;
qreal imgh = TILESIZEY;
qreal w = imgw;
@@ -261,8 +261,35 @@ void CDemVRT::draw(IDrawContext::buffer_t& buf)
CPLErr err = CE_Failure;
- QVector<qint16> data(wp2 * hp2);
- err = dataset->RasterIO(GF_Read, x, y, wp2, hp2, data.data(), wp2, hp2, GDT_Int16, 1, 0, 0, 0, 0);
+ qreal wp2_used = wp2;
+ qreal hp2_used = hp2;
+ qreal w_used = w;
+ qreal h_used = h;
+
+ if((x + wp2) > xsize_px)
+ {
+ wp2_used = xsize_px - x;
+ w_used = wp2_used - 2;
+ if(w_used < 2)
+ {
+ continue;
+ }
+ }
+
+ if((y + hp2) > ysize_px)
+ {
+ hp2_used = ysize_px - y;
+ h_used = hp2_used - 2;
+ if(h_used < 2)
+ {
+ continue;
+ }
+ }
+
+ QVector<qint16> data(wp2_used * hp2_used);
+ mutex.lock();
+ err = dataset->RasterIO(GF_Read, x, y, wp2_used, hp2_used, data.data(), wp2_used, hp2_used, GDT_Int16, 1, 0, 0, 0, 0);
+ mutex.unlock();
if(err)
{
@@ -272,9 +299,9 @@ void CDemVRT::draw(IDrawContext::buffer_t& buf)
QPolygonF l(4);
l[0] = QPointF(x + 1, y + 1);
- l[1] = QPointF(x + 1 + w, y + 1);
- l[2] = QPointF(x + 1 + w, y + 1 + h);
- l[3] = QPointF(x + 1, y + 1 + h);
+ l[1] = QPointF(x + 1 + w_used, y + 1);
+ l[2] = QPointF(x + 1 + w_used, y + 1 + h_used);
+ l[3] = QPointF(x + 1, y + 1 + h_used);
l = trFwd.map(l);
pj_transform(pjsrc,pjtar, 1, 0, &l[0].rx(), &l[0].ry(), 0);
pj_transform(pjsrc,pjtar, 1, 0, &l[1].rx(), &l[1].ry(), 0);
@@ -283,10 +310,10 @@ void CDemVRT::draw(IDrawContext::buffer_t& buf)
if(doHillshading())
{
- QImage img(imgw,imgh,QImage::Format_Indexed8);
+ QImage img(w_used,h_used,QImage::Format_Indexed8);
img.setColorTable(graytable);
- hillshading(data, w, h, img);
+ hillshading(data, w_used, h_used, img);
drawTile(img, l, p);
}
diff --git a/src/dem/CDemVRT.h b/src/dem/CDemVRT.h
index 19b99ac..14bd200 100644
--- a/src/dem/CDemVRT.h
+++ b/src/dem/CDemVRT.h
@@ -21,6 +21,8 @@
#include "dem/IDem.h"
+#include <QMutex>
+
class CDemDraw;
class GDALDataset;
@@ -32,9 +34,11 @@ class CDemVRT : public IDem
void draw(IDrawContext::buffer_t& buf);
- qreal getElevation(const QPointF& pos);
+ qreal getEelevationAt(const QPointF& pos);
private:
+ QMutex mutex;
+
QString filename;
/// instance of GDAL dataset
GDALDataset * dataset;
diff --git a/src/dem/IDem.h b/src/dem/IDem.h
index bd8316c..bc3119f 100644
--- a/src/dem/IDem.h
+++ b/src/dem/IDem.h
@@ -43,7 +43,7 @@ class IDem : public IDrawObject
virtual void draw(IDrawContext::buffer_t& buf) = 0;
- virtual qreal getElevation(const QPointF& pos) = 0;
+ virtual qreal getEelevationAt(const QPointF& pos) = 0;
bool activated(){return isActivated;}
diff --git a/src/dem/IDemPathSetup.ui b/src/dem/IDemPathSetup.ui
index 8b32fbd..8381ef2 100644
--- a/src/dem/IDemPathSetup.ui
+++ b/src/dem/IDemPathSetup.ui
@@ -130,16 +130,6 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/FolderDEM.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
diff --git a/src/gis/CGisDraw.cpp b/src/gis/CGisDraw.cpp
index 013f84d..d4449d3 100644
--- a/src/gis/CGisDraw.cpp
+++ b/src/gis/CGisDraw.cpp
@@ -23,7 +23,7 @@
#include <QtWidgets>
CGisDraw::CGisDraw(CCanvas *parent)
- : IDrawContext("gis",parent)
+ : IDrawContext("gis", CCanvas::eRedrawGis, parent)
{
connect(&CGisWidget::self(), SIGNAL(sigChanged()), this, SLOT(emitSigCanvasUpdate()));
}
diff --git a/src/gis/CGisListWks.cpp b/src/gis/CGisListWks.cpp
index c24cc25..0ca75e3 100644
--- a/src/gis/CGisListWks.cpp
+++ b/src/gis/CGisListWks.cpp
@@ -19,6 +19,9 @@
#include "gis/CGisListWks.h"
#include "gis/CGisProject.h"
#include "gis/IGisItem.h"
+#include "gis/CGisWidget.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "CMainWindow.h"
#include <QtWidgets>
@@ -27,11 +30,19 @@ CGisListWks::CGisListWks(QWidget *parent)
{
menuProject = new QMenu(this);
- actionSave = menuProject->addAction(QIcon("://icons/32x32/SaveGIS.png"),tr("Save"), this, SLOT(slotSaveProject()));
actionSaveAs = menuProject->addAction(QIcon("://icons/32x32/SaveGIS.png"),tr("Save As..."), this, SLOT(slotSaveAsProject()));
+ actionSave = menuProject->addAction(QIcon("://icons/32x32/SaveGIS.png"),tr("Save"), this, SLOT(slotSaveProject()));
actionClose = menuProject->addAction(QIcon("://icons/32x32/Close.png"),tr("Close"), this, SLOT(slotCloseProject()));
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
+ connect(this, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slotItemDoubleClicked(QTreeWidgetItem*,int)));
+
+ menuItem = new QMenu(this);
+ actionEditDetails = menuItem->addAction(QIcon("://icons/32x32/EditDetails.png"),tr("Edit..."), this, SLOT(slotEditItem()));
+ actionMoveWpt = menuItem->addAction(QIcon("://icons/32x32/WptMove.png"),tr("Move Waypoint..."), this, SLOT(slotMoveWpt()));
+ actionProjWpt = menuItem->addAction(QIcon("://icons/32x32/WptProj.png"),tr("Proj. Waypoint..."), this, SLOT(slotProjWpt()));
+ actionDelete = menuItem->addAction(QIcon("://icons/32x32/DeleteOne.png"),tr("Delete"), this, SLOT(slotDeleteItem()));
+
}
CGisListWks::~CGisListWks()
@@ -55,12 +66,36 @@ bool CGisListWks::hasProject(const QString& key)
void CGisListWks::slotContextMenu(const QPoint& point)
{
- CGisProject * item = dynamic_cast<CGisProject*>(currentItem());
- if(item != 0)
+ CGisProject * project = dynamic_cast<CGisProject*>(currentItem());
+ if(project != 0)
{
QPoint p = mapToGlobal(point);
menuProject->exec(p);
}
+
+ IGisItem * gisItem = dynamic_cast<IGisItem*>(currentItem());
+ if(gisItem != 0)
+ {
+ // try to cast item to special types and hide/show actions on result
+ CGisItemWpt * wpt = dynamic_cast<CGisItemWpt*>(gisItem);
+ if(wpt == 0)
+ {
+ actionProjWpt->setVisible(false);
+ actionMoveWpt->setVisible(false);
+ }
+ else
+ {
+ actionProjWpt->setVisible(true);
+ actionMoveWpt->setVisible(true);
+ actionMoveWpt->setEnabled(!wpt->isReadOnly());
+ actionProjWpt->setEnabled(!wpt->isGeocache());
+ }
+
+ // display menu
+ QPoint p = mapToGlobal(point);
+ menuItem->exec(p);
+ }
+
}
void CGisListWks::slotCloseProject()
@@ -112,3 +147,66 @@ void CGisListWks::slotSaveAsProject()
IGisItem::mutexItems.unlock();
}
+
+void CGisListWks::slotItemDoubleClicked(QTreeWidgetItem * item, int )
+{
+ IGisItem::mutexItems.lock();
+ IGisItem * gisItem = dynamic_cast<IGisItem*>(item);
+ if(gisItem != 0)
+ {
+ CMainWindow::self().zoomCanvasTo(gisItem->getBoundingRect());
+ }
+ IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotEditItem()
+{
+ IGisItem::mutexItems.lock();
+ IGisItem * gisItem = dynamic_cast<IGisItem*>(currentItem());
+ if(gisItem != 0)
+ {
+ QString key = gisItem->getKey();
+ CGisWidget::self().editItemByKey(key);
+ }
+ IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotDeleteItem()
+{
+ IGisItem::mutexItems.lock();
+
+ foreach(QTreeWidgetItem * item, selectedItems())
+ {
+ IGisItem * gisItem = dynamic_cast<IGisItem*>(item);
+ if(gisItem != 0)
+ {
+ QString key = gisItem->getKey();
+ CGisWidget::self().delItemByKey(key);
+ }
+ }
+ IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotProjWpt()
+{
+ IGisItem::mutexItems.lock();
+ CGisItemWpt * gisItem = dynamic_cast<CGisItemWpt*>(currentItem());
+ if(gisItem != 0)
+ {
+ QString key = gisItem->getKey();
+ CGisWidget::self().projWptByKey(key);
+ }
+ IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotMoveWpt()
+{
+ IGisItem::mutexItems.lock();
+ CGisItemWpt * gisItem = dynamic_cast<CGisItemWpt*>(currentItem());
+ if(gisItem != 0)
+ {
+ QString key = gisItem->getKey();
+ CGisWidget::self().moveWptByKey(key);
+ }
+ IGisItem::mutexItems.unlock();
+}
diff --git a/src/gis/CGisListWks.h b/src/gis/CGisListWks.h
index 82061ef..2b51fd3 100644
--- a/src/gis/CGisListWks.h
+++ b/src/gis/CGisListWks.h
@@ -40,6 +40,11 @@ class CGisListWks : public QTreeWidget
void slotSaveProject();
void slotSaveAsProject();
void slotCloseProject();
+ void slotItemDoubleClicked(QTreeWidgetItem * item, int);
+ void slotEditItem();
+ void slotDeleteItem();
+ void slotProjWpt();
+ void slotMoveWpt();
private:
QMenu * menuProject;
@@ -47,6 +52,12 @@ class CGisListWks : public QTreeWidget
QAction * actionSaveAs;
QAction * actionClose;
+ QMenu * menuItem;
+ QAction * actionEditDetails;
+ QAction * actionDelete;
+ QAction * actionProjWpt;
+ QAction * actionMoveWpt;
+
};
#endif //CGISLISTWKS_H
diff --git a/src/gis/CGisProject.cpp b/src/gis/CGisProject.cpp
index a39c0b3..40fb7d7 100644
--- a/src/gis/CGisProject.cpp
+++ b/src/gis/CGisProject.cpp
@@ -73,10 +73,14 @@ CGisProject::CGisProject(const QString &filename, const QString& key, CGisListWk
return;
}
-
- QList<QTreeWidgetItem*> items;
+ const QDomNode& xmlMetadata = xmlGpx.namedItem("metadata");
+ if(xmlMetadata.isElement())
+ {
+ readMetadata(xmlMetadata, metadata);
+ }
+ QList<QTreeWidgetItem*> items;
const QDomNodeList& xmlTrks = xmlGpx.elementsByTagName("trk");
N = xmlTrks.count();
for(int n = 0; n < N; ++n)
@@ -105,6 +109,7 @@ CGisProject::CGisProject(const QString &filename, const QString& key, CGisListWk
}
addChildren(items);
+ setToolTip(0, getInfo());
valid = true;
}
@@ -114,6 +119,253 @@ CGisProject::~CGisProject()
}
+QString CGisProject::getInfo()
+{
+ QString str = metadata.name.isEmpty() ? text(0) : metadata.name;
+
+ if(metadata.time.isValid())
+ {
+ str += "\n";
+ str += IUnit::datetime2string(metadata.time);
+ }
+
+
+ if(!metadata.desc.isEmpty())
+ {
+ str += "\n";
+
+ if(metadata.desc.count() < 200)
+ {
+ str += metadata.desc;
+ }
+ else
+ {
+ str += metadata.desc.left(197) + "...";
+ }
+ }
+
+
+ return str;
+}
+
+void CGisProject::readMetadata(const QDomNode& xml, metadata_t& metadata)
+{
+
+ IGisItem::readXml(xml,"name", metadata.name);
+ IGisItem::readXml(xml,"desc", metadata.desc);
+
+ const QDomNode& xmlAuthor = xml.namedItem("author");
+ if(xmlAuthor.isElement())
+ {
+ IGisItem::readXml(xml,"name", metadata.author.name);
+
+ const QDomNode& xmlEmail = xmlAuthor.namedItem("email");
+ if(xmlEmail.isElement())
+ {
+ const QDomNamedNodeMap& attr = xmlEmail.attributes();
+ metadata.author.id = attr.namedItem("id").nodeValue();
+ metadata.author.domain = attr.namedItem("domain").nodeValue();
+ }
+
+ const QDomNode& xmlLink = xmlAuthor.namedItem("link");
+ if(xmlLink.isElement())
+ {
+ metadata.author.link.uri.setUrl(xmlLink.attributes().namedItem("href").nodeValue());
+ IGisItem::readXml(xmlLink, "text", metadata.author.link.text);
+ IGisItem::readXml(xmlLink, "type", metadata.author.link.type);
+ }
+ }
+
+ const QDomNode& xmlCopyright = xml.namedItem("copyright");
+ if(xmlCopyright.isElement())
+ {
+ metadata.copyright.author = xmlCopyright.attributes().namedItem("author").nodeValue();
+ IGisItem::readXml(xmlCopyright, "year", metadata.copyright.year);
+ IGisItem::readXml(xmlCopyright, "license", metadata.copyright.license);
+ }
+
+ IGisItem::readXml(xml,"link", metadata.links);
+ IGisItem::readXml(xml,"time", metadata.time);
+ IGisItem::readXml(xml,"keywords", metadata.keywords);
+
+ const QDomNode& xmlBounds = xml.namedItem("bounds");
+ if(xmlBounds.isElement())
+ {
+ const QDomNamedNodeMap& attr = xmlBounds.attributes();
+ metadata.bounds.setLeft(attr.namedItem("minlon").nodeValue().toDouble());
+ metadata.bounds.setTop(attr.namedItem("maxlat").nodeValue().toDouble());
+ metadata.bounds.setRight(attr.namedItem("maxlon").nodeValue().toDouble());
+ metadata.bounds.setBottom(attr.namedItem("minlat").nodeValue().toDouble());
+ }
+}
+
+QDomNode CGisProject::writeMetadata(QDomDocument& doc)
+{
+ QDomElement gpx = doc.createElement("gpx");
+ doc.appendChild(gpx);
+
+ gpx.setAttribute("version","1.1");
+ gpx.setAttribute("creator","QMapShack " VER_STR " http://www.qlandkarte.org/");
+ gpx.setAttribute("xmlns",gpx_ns);
+ gpx.setAttribute("xmlns:xsi",xsi_ns);
+ gpx.setAttribute("xmlns:gpxx",gpxx_ns);
+ gpx.setAttribute("xmlns:gpxtpx",gpxtpx_ns);
+ gpx.setAttribute("xmlns:wptx1",wptx1_ns);
+ gpx.setAttribute("xmlns:rmc",rmc_ns);
+ gpx.setAttribute("xmlns:ql",ql_ns);
+
+ QString schemaLocation = QString()
+ + gpx_ns + " http://www.topografix.com/GPX/1/1/gpx.xsd "
+ + gpxx_ns + " http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd "
+ + gpxtpx_ns + " http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd "
+ + wptx1_ns + " http://www.garmin.com/xmlschemas/WaypointExtensionv1.xsd"
+ + ql_ns + " http://www.qlandkarte.org/xmlschemas/v1.1/ql-extensions.xsd";
+
+ gpx.setAttribute("xsi:schemaLocation", schemaLocation);
+
+ QDomElement xmlMetadata = doc.createElement("metadata");
+ gpx.appendChild(xmlMetadata);
+
+ IGisItem::writeXml(xmlMetadata,"name", metadata.name);
+ IGisItem::writeXml(xmlMetadata,"desc", metadata.desc);
+
+ if(!metadata.author.name.isEmpty())
+ {
+ QDomElement xmlAuthor = doc.createElement("author");
+ xmlMetadata.appendChild(xmlAuthor);
+
+ IGisItem::writeXml(xmlAuthor,"name", metadata.author.name);
+
+ if(!metadata.author.id.isEmpty() && !metadata.author.domain.isEmpty())
+ {
+ QDomElement xmlEmail = doc.createElement("email");
+ xmlAuthor.appendChild(xmlEmail);
+ xmlEmail.setAttribute("id", metadata.author.id);
+ xmlEmail.setAttribute("domain", metadata.author.domain);
+ }
+
+ if(metadata.author.link.uri.isValid())
+ {
+ QDomElement xmlLink = doc.createElement("link");
+ xmlAuthor.appendChild(xmlLink);
+
+ xmlLink.setAttribute("href", metadata.author.link.uri.toString());
+ IGisItem::writeXml(xmlLink, "text", metadata.author.link.text);
+ IGisItem::writeXml(xmlLink, "type", metadata.author.link.type);
+
+ }
+ }
+
+ if(!metadata.copyright.author.isEmpty())
+ {
+ QDomElement xmlCopyright = doc.createElement("copyright");
+ xmlMetadata.appendChild(xmlCopyright);
+
+ xmlCopyright.setAttribute("author", metadata.copyright.author);
+ IGisItem::writeXml(xmlCopyright, "year", metadata.copyright.year);
+ IGisItem::writeXml(xmlCopyright, "license", metadata.copyright.license);
+
+ }
+ IGisItem::writeXml(xmlMetadata, "link", metadata.links);
+ IGisItem::writeXml(xmlMetadata, "time", metadata.time);
+ IGisItem::writeXml(xmlMetadata, "keywords", metadata.keywords);
+
+ if(metadata.bounds.isValid())
+ {
+ QDomElement xmlBounds = doc.createElement("bounds");
+ xmlMetadata.appendChild(xmlBounds);
+
+ xmlBounds.setAttribute("minlat", metadata.bounds.bottom());
+ xmlBounds.setAttribute("minlon", metadata.bounds.left());
+ xmlBounds.setAttribute("maxlat", metadata.bounds.top());
+ xmlBounds.setAttribute("maxlon", metadata.bounds.right());
+
+ }
+
+ return gpx;
+}
+
+
+void CGisProject::getItemByPos(const QPointF& pos, QList<IGisItem *> &items)
+{
+ for(int i = 0; i < childCount(); i++)
+ {
+
+ IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+ if(item == 0)
+ {
+ continue;
+ }
+
+ if(item->isCloseTo(pos))
+ {
+ items << item;
+ }
+ }
+}
+
+IGisItem * CGisProject::getItemByKey(const QString& key)
+{
+ for(int i = 0; i < childCount(); i++)
+ {
+
+ IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+ if(item == 0)
+ {
+ continue;
+ }
+
+ if(item->getKey() == key)
+ {
+ return item;
+ }
+ }
+ return 0;
+}
+
+void CGisProject::delItemByKey(const QString& key)
+{
+ QList<QTreeWidgetItem*> items;
+ for(int i = childCount(); i > 0; i--)
+ {
+ IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
+ if(item == 0)
+ {
+ continue;
+ }
+
+ if(item->getKey() == key)
+ {
+ QString msg = QObject::tr("Are you sure you want to delete '%1' from project '%2'?").arg(item->getName()).arg(text(0));
+ QMessageBox::StandardButtons res = QMessageBox::question(0, QObject::tr("Delete..."), msg, QMessageBox::Ok|QMessageBox::No, QMessageBox::Ok);
+ if(res != QMessageBox::Ok)
+ {
+ continue;
+ }
+
+ items << takeChild(i-1);
+ }
+ }
+ qDeleteAll(items);
+}
+
+void CGisProject::editItemByKey(const QString& key)
+{
+ for(int i = childCount(); i > 0; i--)
+ {
+ IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
+ if(item == 0)
+ {
+ continue;
+ }
+
+ if(item->getKey() == key)
+ {
+ item->edit();
+ }
+ }
+}
+
void CGisProject::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, CGisDraw * gis)
{
for(int i = 0; i < childCount(); i++)
@@ -283,7 +535,7 @@ void CGisProject::saveGpx(const QString& fn)
if(!file.open(QIODevice::WriteOnly))
{
- QMessageBox::warning(0, QObject::tr("Save GIS data failed..."), QObject::tr("Failed to create file '%1'").arg(_fn_), QMessageBox::Abort);
+ QMessageBox::warning(0, QObject::tr("Saveing GIS data failed..."), QObject::tr("Failed to create file '%1'").arg(_fn_), QMessageBox::Abort);
return;
}
QTextStream out(&file);
@@ -293,7 +545,7 @@ void CGisProject::saveGpx(const QString& fn)
file.close();
if(file.error() != QFile::NoError)
{
- QMessageBox::warning(0, QObject::tr("Save GIS data failed..."), QObject::tr("Failed to write file '%1'").arg(_fn_), QMessageBox::Abort);
+ QMessageBox::warning(0, QObject::tr("Saveing GIS data failed..."), QObject::tr("Failed to write file '%1'").arg(_fn_), QMessageBox::Abort);
return;
}
@@ -302,37 +554,3 @@ void CGisProject::saveGpx(const QString& fn)
setText(0, QFileInfo(filename).baseName());
}
-QDomNode CGisProject::writeMetadata(QDomDocument& doc)
-{
- QDomElement gpx = doc.createElement("gpx");
- doc.appendChild(gpx);
-
- gpx.setAttribute("version","1.1");
- gpx.setAttribute("creator","QMapShack " VER_STR " http://www.qlandkarte.org/");
- gpx.setAttribute("xmlns",gpx_ns);
- gpx.setAttribute("xmlns:xsi",xsi_ns);
- gpx.setAttribute("xmlns:gpxx",gpxx_ns);
- gpx.setAttribute("xmlns:gpxtpx",gpxtpx_ns);
- gpx.setAttribute("xmlns:wptx1",wptx1_ns);
- gpx.setAttribute("xmlns:rmc",rmc_ns);
- gpx.setAttribute("xmlns:ql",ql_ns);
-
- QString schemaLocation = QString()
- + gpx_ns + " http://www.topografix.com/GPX/1/1/gpx.xsd "
- + gpxx_ns + " http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd "
- + gpxtpx_ns + " http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd "
- + wptx1_ns + " http://www.garmin.com/xmlschemas/WaypointExtensionv1.xsd"
- + ql_ns + " http://www.qlandkarte.org/xmlschemas/v1.1/ql-extensions.xsd";
-
- gpx.setAttribute("xsi:schemaLocation", schemaLocation);
-
- QDomElement metadata = doc.createElement("metadata");
- gpx.appendChild(metadata);
-
- QDomElement time = doc.createElement("time");
- metadata.appendChild(time);
- QDomText _time_ = doc.createTextNode(QDateTime::currentDateTime().toUTC().toString("yyyy-MM-dd'T'hh:mm:ss'Z'"));
- time.appendChild(_time_);
-
- return gpx;
-}
diff --git a/src/gis/CGisProject.h b/src/gis/CGisProject.h
index a66ceaf..201e227 100644
--- a/src/gis/CGisProject.h
+++ b/src/gis/CGisProject.h
@@ -19,27 +19,76 @@
#ifndef CGISPROJECT_H
#define CGISPROJECT_H
+#include "gis/IGisItem.h"
+
#include <QTreeWidgetItem>
#include <QDomElement>
+#include <QDateTime>
+#include <QUrl>
class CGisListWks;
class CGisDraw;
+
class CGisProject : public QTreeWidgetItem
{
public:
CGisProject(const QString& filename, const QString &key, CGisListWks * parent);
virtual ~CGisProject();
+ /**
+ @brief Check if the project was initialized correctly.
+
+ For example a if a GPX file does not load correctly the project is invalid.
+
+ @return True if project is valid
+ */
bool isValid(){return valid;}
+
+ /**
+ @brief Get unique project key.
+ @return A MD5 hash string
+ */
const QString& getKey(){return key;}
+ /**
+ @brief Get a list of items that are close to a given pixel coordinate of the screen
+
+ @note: The returned pointers are just for temporary use. Best you use them to get the item's key.
+
+ @param pos the coordinate on the screen in pixel
+ @param items a list the item's pointer is stored to.
+ */
+ void getItemByPos(const QPointF& pos, QList<IGisItem*>& items);
+
+ /**
+ @brief Get a temporary pointer to the item with matching key
+ @param key
+ @return If no item is found 0 is returned.
+ */
+ IGisItem * getItemByKey(const QString& key);
+
+ /**
+ @brief Delete items with matching key
+ @param key
+ */
+ void delItemByKey(const QString& key);
+
+ /**
+ @brief Call IGisItem::edit() method for items with given key
+
+ @param key a MD5 hash key
+ */
+ void editItemByKey(const QString& key);
+
void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, CGisDraw * gis);
void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, const QFontMetricsF& fm, CGisDraw * gis);
void save();
void saveAs();
+ QString getInfo();
+
// Those are the URIs of the GPX extensions we support
static const QString gpxx_ns;
static const QString gpxtpx_ns;
@@ -49,14 +98,49 @@ class CGisProject : public QTreeWidgetItem
static const QString gs_ns;
private:
+ struct metadata_t;
+
void saveGpx(const QString& fn);
QDomNode writeMetadata(QDomDocument& doc);
+ void readMetadata(const QDomNode& xml, metadata_t& metadata);
// Those are standard GPX/XML namespaces
static const QString gpx_ns;
static const QString xsi_ns;
+ struct person_t
+ {
+ QString name;
+ QString id;
+ QString domain;
+ IGisItem::link_t link;
+ };
+
+ struct copyright_t
+ {
+ QString author;
+ QString year;
+ QString license;
+ };
+
+ struct metadata_t
+ {
+ QString name;
+ QString desc;
+ person_t author;
+ copyright_t copyright;
+ QList<IGisItem::link_t> links;
+ QDateTime time;
+ QString keywords;
+ QRectF bounds;
+ // -- all gpx tags - stop
+ QMap<QString, QVariant> extensions;
+
+ };
+
QString key;
+
+ metadata_t metadata;
QString filename;
QDomElement xmlGpx;
diff --git a/src/gis/CGisWidget.cpp b/src/gis/CGisWidget.cpp
index f677b7c..a1d7a6f 100644
--- a/src/gis/CGisWidget.cpp
+++ b/src/gis/CGisWidget.cpp
@@ -20,7 +20,10 @@
#include "gis/CGisProject.h"
#include "gis/IGisItem.h"
#include "gis/CGisDraw.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "gis/wpt/CProjWpt.h"
#include "CMainWindow.h"
+#include "helpers/CSettings.h"
#include <QtWidgets>
#include <QtXml>
@@ -33,12 +36,16 @@ CGisWidget::CGisWidget(QWidget *parent)
pSelf = this;
setupUi(this);
+ SETTINGS;
+ treeWks->header()->resizeSection(0, cfg.value("Workspace/treeWks/colum0/size", 100).toInt());
+
connect(treeWks, SIGNAL(sigChanged()), SIGNAL(sigChanged()));
}
CGisWidget::~CGisWidget()
{
-
+ SETTINGS;
+ cfg.setValue("Workspace/treeWks/colum0/size", treeWks->header()->sectionSize(0));
}
void CGisWidget::loadGpx(const QString& filename)
@@ -91,6 +98,111 @@ void CGisWidget::slotSaveAll()
}
+void CGisWidget::getItemsByPos(const QPointF& pos, QList<IGisItem*>& items)
+{
+ IGisItem::mutexItems.lock();
+ for(int i = 0; i < treeWks->topLevelItemCount(); i++)
+ {
+ CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+ if(project == 0)
+ {
+ continue;
+ }
+ project->getItemByPos(pos, items);
+ }
+ IGisItem::mutexItems.unlock();
+}
+
+IGisItem * CGisWidget::getItemByKey(const QString& key)
+{
+ IGisItem * item = 0;
+ IGisItem::mutexItems.lock();
+ for(int i = 0; i < treeWks->topLevelItemCount(); i++)
+ {
+ CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+ if(project == 0)
+ {
+ continue;
+ }
+ item = project->getItemByKey(key);
+ if(item != 0)
+ {
+ break;
+ }
+ }
+ IGisItem::mutexItems.unlock();
+ return item;
+}
+
+void CGisWidget::delItemByKey(const QString& key)
+{
+ IGisItem::mutexItems.lock();
+ for(int i = 0; i < treeWks->topLevelItemCount(); i++)
+ {
+ CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+ if(project == 0)
+ {
+ continue;
+ }
+ project->delItemByKey(key);
+ if(project->childCount() == 0)
+ {
+ delete project;
+ }
+ }
+
+ IGisItem::mutexItems.unlock();
+
+ emit sigChanged();
+}
+
+void CGisWidget::editItemByKey(const QString& key)
+{
+ IGisItem::mutexItems.lock();
+ for(int i = 0; i < treeWks->topLevelItemCount(); i++)
+ {
+ CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+ if(project == 0)
+ {
+ continue;
+ }
+ project->editItemByKey(key);
+ }
+
+ IGisItem::mutexItems.unlock();
+ emit sigChanged();
+}
+
+void CGisWidget::projWptByKey(const QString& key)
+{
+ IGisItem::mutexItems.lock();
+
+ CGisItemWpt * wpt = dynamic_cast<CGisItemWpt*>(getItemByKey(key));
+ if(wpt != 0)
+ {
+ CProjWpt dlg(*wpt, 0);
+ dlg.exec();
+ }
+
+ IGisItem::mutexItems.unlock();
+ emit sigChanged();
+}
+
+void CGisWidget::moveWptByKey(const QString& key)
+{
+ IGisItem::mutexItems.lock();
+ CGisItemWpt * wpt = dynamic_cast<CGisItemWpt*>(getItemByKey(key));
+ if(wpt != 0)
+ {
+ CCanvas * canvas = CMainWindow::self().getVisibleCanvas();
+ if(canvas != 0)
+ {
+ canvas->setMouseMoveWpt(*wpt);
+ }
+ }
+ IGisItem::mutexItems.unlock();
+}
+
void CGisWidget::draw(QPainter& p, const QRectF& viewport, CGisDraw * gis)
{
QFontMetricsF fm(CMainWindow::self().getMapFont());
diff --git a/src/gis/CGisWidget.h b/src/gis/CGisWidget.h
index 968be38..978d498 100644
--- a/src/gis/CGisWidget.h
+++ b/src/gis/CGisWidget.h
@@ -23,6 +23,7 @@
#include "ui_IGisWidget.h"
class CGisDraw;
+class IGisItem;
class CGisWidget : public QWidget, private Ui::IGisWidget
{
@@ -32,9 +33,49 @@ class CGisWidget : public QWidget, private Ui::IGisWidget
virtual ~CGisWidget();
void loadGpx(const QString& filename);
+ /**
+ @brief Draw all loaded data in the workspace that is visible
+ @param p the painter to be used
+ @param viewport the viewport in units of rad
+ @param gis the draw context to be used
+ */
void draw(QPainter& p, const QRectF& viewport, CGisDraw *gis);
+ /**
+ @brief Get items close to the given point
+
+ Note: Do not store the pointers of items permanently as they can become invalid
+ once you reach the main event loop again. Store the key instead.
+
+ @param pos the position in pixel
+ @param items an empty item list that will get filled with temporary pointers
+ */
+ void getItemsByPos(const QPointF& pos, QList<IGisItem *> &items);
+
+ /**
+ @brief Find first item with matching key
+ @param key the item's key as it is returned from IGisItem::getKey()
+ @return If no item is found 0 is returned.
+ */
+ IGisItem * getItemByKey(const QString& key);
+
+ /**
+ @brief Delete all items with matching key from workspace
+
+ As an item can be attached to several projects each one of these items is deleted.
+ The method will prompt the user with a message box for each item deleted
+
+ @param key the item's key as it is returned from IGisItem::getKey()
+ */
+ void delItemByKey(const QString& key);
+
+ void editItemByKey(const QString& key);
+
+ void projWptByKey(const QString& key);
+
+ void moveWptByKey(const QString& key);
+
signals:
void sigChanged();
diff --git a/src/gis/IGisItem.cpp b/src/gis/IGisItem.cpp
index 9429e16..091bbd3 100644
--- a/src/gis/IGisItem.cpp
+++ b/src/gis/IGisItem.cpp
@@ -22,11 +22,9 @@
#include "GeoMath.h"
#include <QtXml>
+#include <QtWidgets>
-QMutex IGisItem::mutexItems;
-
-
-
+QMutex IGisItem::mutexItems(QMutex::Recursive);
const IGisItem::color_t IGisItem::colorMap[] =
{
@@ -53,6 +51,7 @@ const IGisItem::color_t IGisItem::colorMap[] =
IGisItem::IGisItem(QTreeWidgetItem *parent)
: QTreeWidgetItem(parent)
+ , flags(0)
{
}
@@ -62,6 +61,58 @@ IGisItem::~IGisItem()
}
+void IGisItem::changed(const QString &what)
+{
+ setText(1,"*");
+ setToolTip(0,getInfo());
+
+ /*
+ If item gets changed but it's origin is not QMapShack
+ then it is assumed to be tainted, as imported data should
+ never be changed without notice.
+ */
+ if(!(flags & eFlagCreatedInQms))
+ {
+ flags |= eFlagTainted;
+ }
+
+ history << QString("%1: %2").arg(QDateTime::currentDateTimeUtc().toString()).arg(what);
+}
+
+bool IGisItem::isReadOnly()
+{
+ return !(flags & eFlagWriteAllowed);
+}
+
+bool IGisItem::isTainted()
+{
+ return (flags & eFlagTainted);
+}
+
+void IGisItem::setReadOnlyMode(bool readOnly)
+{
+ if(!(flags & eFlagCreatedInQms))
+ {
+ if(isReadOnly() && !readOnly)
+ {
+ QString str = QObject::tr("This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.");
+ if(QMessageBox::warning(0, QObject::tr("Read Only Mode..."), str, QMessageBox::Ok|QMessageBox::Abort, QMessageBox::Ok) != QMessageBox::Ok)
+ {
+ return;
+ }
+ }
+ }
+
+ if(readOnly)
+ {
+ flags &= ~eFlagWriteAllowed;
+ }
+ else
+ {
+ flags |= eFlagWriteAllowed;
+ }
+}
+
void IGisItem::readWpt(const QDomNode& xml, wpt_t& wpt)
{
const QDomNamedNodeMap& attr = xml.attributes();
@@ -86,36 +137,49 @@ void IGisItem::readWpt(const QDomNode& xml, wpt_t& wpt)
readXml(xml, "pdop", wpt.pdop);
readXml(xml, "ageofdgpsdata", wpt.ageofdgpsdata);
readXml(xml, "dgpsid", wpt.dgpsid);
+
+ // some GPX 1.0 backward compatibility
+ QString url;
+ readXml(xml, "url", url);
+ if(!url.isEmpty())
+ {
+ link_t link;
+ link.uri.setUrl(url);
+ readXml(xml, "urlname", link.text);
+
+ wpt.links << link;
+ }
+
}
-void IGisItem::writeWpt(QDomElement& xmlWpt, const wpt_t& wpt)
+void IGisItem::writeWpt(QDomElement& xml, const wpt_t& wpt)
{
QString str;
str.sprintf("%1.8f", wpt.lat);
- xmlWpt.setAttribute("lat",str);
+ xml.setAttribute("lat",str);
str.sprintf("%1.8f", wpt.lon);
- xmlWpt.setAttribute("lon",str);
-
- writeXml(xmlWpt, "ele", wpt.ele);
- writeXml(xmlWpt, "time", wpt.time);
- writeXml(xmlWpt, "magvar", wpt.magvar);
- writeXml(xmlWpt, "geoidheight", wpt.geoidheight);
- writeXml(xmlWpt, "name", wpt.name);
- writeXml(xmlWpt, "cmt", wpt.cmt);
- writeXml(xmlWpt, "desc", wpt.desc);
- writeXml(xmlWpt, "src", wpt.src);
- writeXml(xmlWpt, "link", wpt.links);
- writeXml(xmlWpt, "sym", wpt.sym);
- writeXml(xmlWpt, "type", wpt.type);
- writeXml(xmlWpt, "fix", wpt.fix);
- writeXml(xmlWpt, "sat", wpt.sat);
- writeXml(xmlWpt, "hdop", wpt.hdop);
- writeXml(xmlWpt, "vdop", wpt.vdop);
- writeXml(xmlWpt, "pdop", wpt.pdop);
- writeXml(xmlWpt, "ageofdgpsdata", wpt.ageofdgpsdata);
- writeXml(xmlWpt, "dgpsid", wpt.dgpsid);
+ xml.setAttribute("lon",str);
+
+ writeXml(xml, "ele", wpt.ele);
+ writeXml(xml, "time", wpt.time);
+ writeXml(xml, "magvar", wpt.magvar);
+ writeXml(xml, "geoidheight", wpt.geoidheight);
+ writeXml(xml, "name", wpt.name);
+ writeXml(xml, "cmt", wpt.cmt);
+ writeXml(xml, "desc", wpt.desc);
+ writeXml(xml, "src", wpt.src);
+ writeXml(xml, "link", wpt.links);
+ writeXml(xml, "sym", wpt.sym);
+ writeXml(xml, "type", wpt.type);
+ writeXml(xml, "fix", wpt.fix);
+ writeXml(xml, "sat", wpt.sat);
+ writeXml(xml, "hdop", wpt.hdop);
+ writeXml(xml, "vdop", wpt.vdop);
+ writeXml(xml, "pdop", wpt.pdop);
+ writeXml(xml, "ageofdgpsdata", wpt.ageofdgpsdata);
+ writeXml(xml, "dgpsid", wpt.dgpsid);
}
@@ -240,13 +304,13 @@ void IGisItem::drawArrows(const QPolygonF& line, const QRectF& extViewport, QPai
pt1 = pt;
continue;
}
- if((abs(pt.x() - pt1.x()) + abs(pt.y() - pt1.y())) < 7)
+ if((qAbs(pt.x() - pt1.x()) + qAbs(pt.y() - pt1.y())) < 7)
{
pt1 = pt;
continue;
}
// keep distance
- if((abs(pt.x() - ptt.x()) + abs(pt.y() - ptt.y())) > 100)
+ if((qAbs(pt.x() - ptt.x()) + qAbs(pt.y() - ptt.y())) > 100)
{
if(0 != pt.x() - pt1.x() && (pt.y() - pt1.y()))
{
@@ -267,3 +331,9 @@ void IGisItem::drawArrows(const QPolygonF& line, const QRectF& extViewport, QPai
}
}
+QString IGisItem::removeHtml(const QString &str)
+{
+ QTextDocument html;
+ html.setHtml(str);
+ return html.toPlainText();
+}
diff --git a/src/gis/IGisItem.h b/src/gis/IGisItem.h
index 198f21a..fb44518 100644
--- a/src/gis/IGisItem.h
+++ b/src/gis/IGisItem.h
@@ -34,34 +34,142 @@
#include "units/IUnit.h"
class CGisDraw;
-
+class IScrOpt;
+class IMouse;
class IGisItem : public QTreeWidgetItem
{
+
public:
IGisItem(QTreeWidgetItem * parent);
virtual ~IGisItem();
+ /// this mutex has to be locked when ever the item list is accessed.
static QMutex mutexItems;
+ /**
+ @brief Save the item's data into a GPX structure
+ @param gpx the files <gpx> tag to attach the data to
+ */
+ virtual void save(QDomNode& gpx) = 0;
+
+ /**
+ @brief Get key string to identify object
+ @return
+ */
const QString& getKey();
+ /**
+ @brief Get the icon attached to object
+ @return
+ */
+ virtual const QPixmap& getIcon(){return icon;}
+ /**
+ @brief Get name of this item.
+ @return A reference to the internal string object
+ */
+ virtual const QString& getName() = 0;
+
+ /**
+ @brief Get a short string with the items properties to be displayed in tool tips or similar
+ @return A string object.
+ */
+ virtual QString getInfo() = 0;
+
+ /**
+ @brief Edit content of item.
+
+ This is quite dependent on the item. The default implemntation does nothing. It has to be
+ overwritten and the item has to generate what ever is needed to edit/view it's details.
+
+ */
+ virtual void edit(){}
+
+ /**
+ @brief Get the dimension of the item
+
+ All coordinates are in Rad. Items with no
+
+ @return
+ */
+ virtual QRectF getBoundingRect(){return boundingRect;}
+
+ /**
+ @brief Get screen option object to display and handle actions for this item.
+ @param mouse a pointer to the mouse object initiating the action
+ @return A null pointer is returned if no screen option are available
+ */
+ virtual IScrOpt * getScreenOptions(const QPoint& origin, IMouse * mouse){return 0;}
+
+ /**
+ @brief Get a point of the item that is close by the given screen pixel coordinate
+ @param point a point in screen pixels
+ @return If no point is found NOPOINTF is returned.
+ */
+ virtual QPointF getPointCloseBy(const QPoint& point){return NOPOINTF;}
+
+ /**
+ @brief Test if the item is close to a given pixel coordinate of the screen
+
+ @param pos the coordinate on the screen in pixel
+ @return If no point can be found NOPOINTF is returned.
+ */
+ virtual bool isCloseTo(const QPointF& pos) = 0;
+
+ /**
+ @brief Query if this item is read only
+ @return True if it is read only.
+ */
+ bool isReadOnly();
+
+ bool isTainted();
+ /**
+ @brief Set the read only mode.
+
+ This is quite dependent on the item. The default implementation will display a
+ message box with a warning and ask the user to confirm.
+
+ @param readOnly set true to make item read only
+ */
+ virtual void setReadOnlyMode(bool readOnly);
virtual void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, CGisDraw * gis) = 0;
virtual void drawLabel(QPainter& p, const QRectF& viewport,QList<QRectF>& blockedAreas, const QFontMetricsF& fm, CGisDraw * gis) = 0;
+ virtual void drawHighlight(QPainter& p) = 0;
- virtual void save(QDomNode& gpx) = 0;
+ virtual void gainUserFocus() = 0;
+
+ static QString removeHtml(const QString &str);
protected:
+ friend class CGisProject;
struct wpt_t;
+ struct color_t;
+
+ /// read waypoint data from an XML snippet
void readWpt(const QDomNode& xml, wpt_t &wpt);
- void writeWpt(QDomElement &xmlWpt, const wpt_t &wpt);
+ /// write waypoint data to an XML snippet
+ void writeWpt(QDomElement &xml, const wpt_t &wpt);
+ /// gnerate a unique key from item's data
virtual void genKey() = 0;
+ /// convert a color string from GPX to a QT color
QColor str2color(const QString& name);
+ /// convertr a QT color to a string to be used in a GPX file
QString color2str(const QColor &color);
+ /// to optimize drawing of large polylines split the line into sections that are visible
void splitLineToViewport(const QPolygonF& line, const QRectF& extViewport, QList<QPolygonF>& lines);
+ /// ditribute arrows over a polyline
void drawArrows(const QPolygonF &line, const QRectF &extViewport, QPainter& p);
+ /// call when ever you make a change to the item's data
+ void changed(const QString& what);
+ quint32 flags;
+ QString key;
+ QPixmap icon;
+ QRectF boundingRect;
+ static const color_t colorMap[];
+ typedef QStringList history_t;
+ history_t history;
struct color_t
{
@@ -117,12 +225,30 @@ class IGisItem : public QTreeWidgetItem
QMap<QString, QVariant> extensions;
};
+ enum flags_e
+ {
+ eFlagCreatedInQms = 0x00000001
+ ,eFlagWriteAllowed = 0x00000002
+ ,eFlagTainted = 0x00000004
+ };
+
- QString key;
- static const color_t colorMap[];
+ static inline void readXml(const QDomNode& xml, const QString& tag, bool& value)
+ {
+ if(xml.namedItem(tag).isElement())
+ {
+ bool tmp;
+ bool ok = false;
+ tmp = xml.namedItem(tag).toElement().text().toInt(&ok);
+ if(ok)
+ {
+ value = tmp;
+ }
+ }
+ }
- inline void readXml(const QDomNode& xml, const QString& tag, qint32& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, qint32& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -140,7 +266,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, quint32& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, quint32& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -154,7 +280,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, quint64& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, quint64& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -168,7 +294,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, qreal& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, qreal& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -182,7 +308,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, QString& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, QString& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -190,7 +316,28 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, QDateTime& value)
+ static inline void readXml(const QDomNode& xml, const QString& tag, QString& value, bool& isHtml)
+ {
+ if(xml.namedItem(tag).isElement())
+ {
+ const QDomNamedNodeMap& attr = xml.namedItem(tag).toElement().attributes();
+
+ if(attr.namedItem("html").nodeValue().toLocal8Bit().toLower() == "true")
+ {
+ isHtml = true;
+ value = xml.namedItem(tag).toElement().text();
+ }
+ else
+ {
+ isHtml = false;
+ value = "<pre>" + xml.namedItem(tag).toElement().text() + "</pre>";
+ value = xml.namedItem(tag).toElement().text();
+ }
+
+ }
+ }
+
+ static inline void readXml(const QDomNode& xml, const QString& tag, QDateTime& value)
{
if(xml.namedItem(tag).isElement())
{
@@ -200,7 +347,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void readXml(const QDomNode& xml, const QString& tag, QList<link_t>& l)
+ static inline void readXml(const QDomNode& xml, const QString& tag, QList<link_t>& l)
{
if(xml.namedItem(tag).isElement())
{
@@ -220,7 +367,24 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, qint32 val)
+ static inline void readXml(const QDomNode& xml, history_t& history)
+ {
+ if(xml.namedItem("ql:history").isElement())
+ {
+ const QDomElement& xmlHistory = xml.namedItem("ql:history").toElement();
+
+ const QDomNodeList& entries = xmlHistory.elementsByTagName("ql:event");
+ int N = entries.count();
+ for(int n = 0; n < N; ++n)
+ {
+ const QDomNode& entry = entries.item(n);
+ history << entry.toElement().text();
+ }
+ }
+ }
+
+
+ static inline void writeXml(QDomNode& xml, const QString& tag, qint32 val)
{
if(val != NOINT)
{
@@ -231,7 +395,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, quint32 val)
+ static inline void writeXml(QDomNode& xml, const QString& tag, quint32 val)
{
if(val != NOINT)
{
@@ -242,7 +406,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, quint64 val)
+ static inline void writeXml(QDomNode& xml, const QString& tag, quint64 val)
{
if(val != 0)
{
@@ -253,7 +417,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, const QString& val)
+ static inline void writeXml(QDomNode& xml, const QString& tag, const QString& val)
{
if(!val.isEmpty())
{
@@ -264,7 +428,7 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, qreal val)
+ static inline void writeXml(QDomNode& xml, const QString& tag, qreal val)
{
if(val != NOFLOAT)
{
@@ -275,7 +439,20 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline void writeXml(QDomNode& xml, const QString& tag, const QDateTime& time)
+ static inline void writeXml(QDomNode& xml, const QString& tag, const QString& val, bool isHtml)
+ {
+ if(!val.isEmpty())
+ {
+ QDomElement elem = xml.ownerDocument().createElement(tag);
+ xml.appendChild(elem);
+ QDomText text = xml.ownerDocument().createCDATASection(val);
+ elem.appendChild(text);
+ elem.setAttribute("html",isHtml ? "True" : "False");
+
+ }
+ }
+
+ static inline void writeXml(QDomNode& xml, const QString& tag, const QDateTime& time)
{
if(time.isValid())
{
@@ -287,7 +464,7 @@ class IGisItem : public QTreeWidgetItem
}
- inline void writeXml(QDomNode& xml, const QString& tag, const QList<link_t>& links)
+ static inline void writeXml(QDomNode& xml, const QString& tag, const QList<link_t>& links)
{
if(!links.isEmpty())
{
@@ -303,7 +480,20 @@ class IGisItem : public QTreeWidgetItem
}
}
- inline bool isBlocked(const QRectF& rect, const QList<QRectF> &blockedAreas)
+ static inline void writeXml(QDomNode& xml, const history_t& history)
+ {
+ if(!history.isEmpty())
+ {
+ QDomElement xmlHistory = xml.ownerDocument().createElement("ql:history");
+ xml.appendChild(xmlHistory);
+ foreach(const QString& entry, history)
+ {
+ writeXml(xmlHistory, "ql:event", entry);
+ }
+ }
+ }
+
+ static inline bool isBlocked(const QRectF& rect, const QList<QRectF> &blockedAreas)
{
foreach(const QRectF& r, blockedAreas)
{
diff --git a/src/gis/IGisWidget.ui b/src/gis/IGisWidget.ui
index a10ab41..95668ec 100644
--- a/src/gis/IGisWidget.ui
+++ b/src/gis/IGisWidget.ui
@@ -43,12 +43,14 @@
<height>22</height>
</size>
</property>
- <attribute name="headerVisible">
- <bool>false</bool>
- </attribute>
<column>
<property name="text">
- <string notr="true">1</string>
+ <string notr="true">Name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>State</string>
</property>
</column>
</widget>
diff --git a/src/gis/WptIcons.cpp b/src/gis/WptIcons.cpp
index da5cf3f..90296c2 100644
--- a/src/gis/WptIcons.cpp
+++ b/src/gis/WptIcons.cpp
@@ -24,14 +24,6 @@
static const char * wptDefault = "://icons/waypoints/32x32/Default.png";
-struct icon_t
-{
- icon_t(): path(wptDefault), focus(16,16){}
- icon_t(const QString& path, int x, int y) : path(path), focus(x,y) {}
- QString path;
- QPoint focus;
-};
-
static QMap<QString, icon_t> wptIcons;
void initWptIcons()
@@ -57,7 +49,7 @@ void initWptIcons()
wptIcons["Block, Green"] = icon_t("://icons/waypoints/32x32/BoxGreen.png", 16, 16);
wptIcons["Blue Diamond"] = icon_t("://icons/waypoints/32x32/DiamondBlue.png", 16, 16);
wptIcons["Green Diamond"] = icon_t("://icons/waypoints/32x32/DiamondGreen.png", 16, 16);
- wptIcons["Red Diamond"] = icon_t("://icons/waypoints/32x32/DiamaondRed.png", 16, 16);
+ wptIcons["Red Diamond"] = icon_t("://icons/waypoints/32x32/DiamondRed.png", 16, 16);
setWptIconByName("Traditional Cache", "://icons/cache/32x32/traditional.png");
@@ -85,6 +77,12 @@ void initWptIcons()
}
}
+const QMap<QString, icon_t>& getWptIcons()
+{
+ return wptIcons;
+}
+
+
void setWptIconByName(const QString& name, const QString& filename)
{
QPixmap icon(filename);
@@ -128,15 +126,23 @@ QPixmap getWptIconByName(const QString& name, QPointF &focus, QString * src)
{
focus = wptIcons[name].focus;
path = wptIcons[name].path;
- if(src) *src = path;
-
}
else
{
focus = wptIcons["Default"].focus;
path = wptIcons["Default"].path;
- if(src) *src = path;
}
+
+ if(path.isEmpty())
+ {
+ path = wptDefault;
+ }
+
+ if(src)
+ {
+ *src = path;
+ }
+
icon = loadIcon(path);
// Limit icon size to 22 pixel max.
diff --git a/src/gis/WptIcons.h b/src/gis/WptIcons.h
index ca190af..9a5cb09 100644
--- a/src/gis/WptIcons.h
+++ b/src/gis/WptIcons.h
@@ -22,10 +22,21 @@
#include <QString>
#include <QPixmap>
+struct icon_t
+{
+ icon_t(): focus(16,16){}
+ icon_t(const QString& path, int x, int y) : path(path), focus(x,y) {}
+ QString path;
+ QPoint focus;
+};
+
+
extern void initWptIcons();
+extern const QMap<QString, icon_t> &getWptIcons();
extern QPixmap getWptIconByName(const QString& name, QPointF &focus, QString * src = 0);
extern void setWptIconByName(const QString& name, const QString& filename);
extern void setWptIconByName(const QString& name, const QPixmap& icon);
+extern QPixmap loadIcon(const QString& path);
#endif //WPTICONS_H
diff --git a/src/gis/rte/CGisItemRte.cpp b/src/gis/rte/CGisItemRte.cpp
index 223554d..e1f194f 100644
--- a/src/gis/rte/CGisItemRte.cpp
+++ b/src/gis/rte/CGisItemRte.cpp
@@ -17,6 +17,7 @@
**********************************************************************************************/
#include "gis/rte/CGisItemRte.h"
+#include "gis/rte/CScrOptRte.h"
#include "gis/CGisProject.h"
#include "gis/WptIcons.h"
#include "gis/CGisDraw.h"
@@ -27,16 +28,19 @@
#include <proj_api.h>
const QPen CGisItemRte::penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
+QString CGisItemRte::keyUserFocus;
CGisItemRte::CGisItemRte(const QDomNode& xml, CGisProject * parent)
: IGisItem(parent)
- , penForeground(Qt::magenta, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+ , penForeground(Qt::magenta, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
{
// --- start read and process data ----
- readRte(xml, rte);
+ readRte(xml, rte);
+ icon = QPixmap("://icons/32x32/Route.png").scaled(22,22, Qt::KeepAspectRatio, Qt::SmoothTransformation);
// --- stop read and process data ----
setText(0, rte.name);
- setIcon(0, QIcon("://icons/32x32/Route.png"));
+ setIcon(0, icon);
+ setToolTip(0,getInfo());
genKey();
}
@@ -45,6 +49,46 @@ CGisItemRte::~CGisItemRte()
}
+void CGisItemRte::genKey()
+{
+ if(key.isEmpty())
+ {
+ QCryptographicHash md5(QCryptographicHash::Md5);
+ md5.addData((const char*)&rte, sizeof(rte));
+ key = md5.result().toHex();
+ }
+}
+
+QString CGisItemRte::getInfo()
+{
+ QString str = getName();
+
+
+ return str;
+}
+
+IScrOpt * CGisItemRte::getScreenOptions(const QPoint& origin, IMouse * mouse)
+{
+ return new CScrOptRte(this, origin, mouse);
+}
+
+QPointF CGisItemRte::getPointCloseBy(const QPoint& screenPos)
+{
+ qint32 d = NOINT;
+ QPointF pt = NOPOINTF;
+ foreach(const QPointF& point, line)
+ {
+ int tmp = (screenPos - point).manhattanLength();
+ if(tmp < d)
+ {
+ pt = point;
+ d = tmp;
+ }
+ }
+
+ return pt;
+}
+
void CGisItemRte::readRte(const QDomNode& xml, rte_t& rte)
{
qreal north = -90;
@@ -117,25 +161,34 @@ void CGisItemRte::save(QDomNode& gpx)
}
-void CGisItemRte::genKey()
+
+bool CGisItemRte::isCloseTo(const QPointF& pos)
{
- if(key.isEmpty())
+ foreach(const QPointF& pt, line)
{
- QCryptographicHash md5(QCryptographicHash::Md5);
- md5.addData((const char*)&rte, sizeof(rte));
- key = md5.result().toHex();
+ if((pt - pos).manhattanLength() < 10)
+ {
+ return true;
+ }
}
+
+ return false;
+}
+
+void CGisItemRte::gainUserFocus()
+{
+ keyUserFocus = key;
}
+
void CGisItemRte::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, CGisDraw *gis)
{
+ line.clear();
if(!viewport.intersects(boundingRect))
{
return;
}
- QPolygonF line;
-
QPointF p1 = viewport.topLeft();
QPointF p2 = viewport.bottomRight();
gis->convertRad2Px(p1);
@@ -226,3 +279,18 @@ void CGisItemRte::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &
}
}
+void CGisItemRte::drawHighlight(QPainter& p)
+{
+ if(line.isEmpty())
+ {
+ return;
+ }
+
+ p.setPen(QPen(QColor(255,0,0,100),11,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+ p.drawPolyline(line);
+
+ foreach(const QPointF& pt, line)
+ {
+ p.drawImage(pt - QPointF(31,31), QImage("://cursors/wptHighlight.png"));
+ }
+}
diff --git a/src/gis/rte/CGisItemRte.h b/src/gis/rte/CGisItemRte.h
index e8b23ed..84e9eb6 100644
--- a/src/gis/rte/CGisItemRte.h
+++ b/src/gis/rte/CGisItemRte.h
@@ -32,16 +32,24 @@ class CGisItemRte : public IGisItem
CGisItemRte(const QDomNode &xml, CGisProject *parent);
virtual ~CGisItemRte();
+ const QString& getName(){return rte.name;}
+ QString getInfo();
+ IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
+ QPointF getPointCloseBy(const QPoint& screenPos);
void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, CGisDraw * gis);
void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, const QFontMetricsF& fm, CGisDraw * gis);
-
+ void drawHighlight(QPainter& p);
void save(QDomNode& gpx);
+ bool isCloseTo(const QPointF& pos);
+ void gainUserFocus();
private:
struct rte_t;
void genKey();
void readRte(const QDomNode& xml, rte_t& rte);
+ static QString keyUserFocus;
+
struct rtept_t : public wpt_t
{
QPixmap icon;
@@ -68,8 +76,8 @@ class CGisItemRte : public IGisItem
QPen penForeground;
rte_t rte;
+ QPolygonF line;
- QRectF boundingRect;
};
#endif //CGISITEMRTE_H
diff --git a/src/gis/rte/CScrOptRte.cpp b/src/gis/rte/CScrOptRte.cpp
new file mode 100644
index 0000000..a6c46fd
--- /dev/null
+++ b/src/gis/rte/CScrOptRte.cpp
@@ -0,0 +1,82 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/rte/CScrOptRte.h"
+#include "gis/rte/CGisItemRte.h"
+#include "gis/CGisWidget.h"
+#include "mouse/IMouse.h"
+#include "canvas/CCanvas.h"
+#include "CMainWindow.h"
+
+CScrOptRte::CScrOptRte(CGisItemRte *rte, const QPoint& origin, IMouse *parent)
+ : IScrOpt(parent->getCanvas())
+ , key(rte->getKey())
+{
+ setupUi(this);
+ setOrigin(origin);
+ label->setFont(CMainWindow::self().getMapFont());
+ label->setText(rte->getInfo());
+
+
+ anchor = rte->getPointCloseBy(origin);
+ move(anchor.toPoint() + QPoint(30,30));
+ adjustSize();
+ show();
+
+ connect(toolDelete, SIGNAL(clicked()), this, SLOT(slotDelete()));
+}
+
+CScrOptRte::~CScrOptRte()
+{
+
+}
+
+void CScrOptRte::slotDelete()
+{
+ CGisWidget::self().delItemByKey(key);
+}
+
+
+void CScrOptRte::draw(QPainter& p)
+{
+ IGisItem * item = CGisWidget::self().getItemByKey(key);
+ if(item == 0)
+ {
+ QWidget::deleteLater();
+ return;
+ }
+ item->drawHighlight(p);
+
+
+ QRectF r = rect();
+ r.moveTopLeft(QPoint(x(), y()));
+ QPainterPath path1;
+ path1.addRoundedRect(r,5,5);
+
+ QPolygonF poly2;
+ poly2 << anchor << (r.topLeft() + QPointF(10,0)) << (r.topLeft() + QPointF(0,10)) << anchor;
+ QPainterPath path2;
+ path2.addPolygon(poly2);
+
+ path1 = path1.united(path2);
+
+ p.setPen(CCanvas::penBorderGray);
+ p.setBrush(CCanvas::brushBackWhite);
+ p.drawPolygon(path1.toFillPolygon());
+
+}
diff --git a/src/mouse/CMouseNormal.h b/src/gis/rte/CScrOptRte.h
similarity index 65%
copy from src/mouse/CMouseNormal.h
copy to src/gis/rte/CScrOptRte.h
index 400a667..45c9b3d 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/gis/rte/CScrOptRte.h
@@ -16,29 +16,33 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CSCROPTRTE_H
+#define CSCROPTRTE_H
-#include "IMouse.h"
+#include "mouse/IScrOpt.h"
-class CCanvas;
+#include <QWidget>
+#include "ui_IScrOptRte.h"
-class CMouseNormal : public IMouse
+class CGisItemRte;
+class IMouse;
+
+class CScrOptRte : public IScrOpt, private Ui::IScrOptRte
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
-
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ CScrOptRte(CGisItemRte * rte, const QPoint &origin, IMouse *parent);
+ virtual ~CScrOptRte();
+ void draw(QPainter& p);
- protected:
- bool mapMove;
+ private slots:
+ void slotDelete();
- QPoint lastPos;
+ private:
+ QString key;
+ QPointF anchor;
};
-#endif //CMOUSENORMAL_H
+#endif //CSCROPTRTE_H
diff --git a/src/gis/rte/IScrOptRte.ui b/src/gis/rte/IScrOptRte.ui
new file mode 100644
index 0000000..7cd0001
--- /dev/null
+++ b/src/gis/rte/IScrOptRte.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IScrOptRte</class>
+ <widget class="QWidget" name="IScrOptRte">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>68</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolEditDetails">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string><html><head/><body><p>View details & Edit</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/EditDetails.png</normaloff>:/icons/32x32/EditDetails.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolDelete">
+ <property name="toolTip">
+ <string><html><head/><body><p>Delete</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/DeleteOne.png</normaloff>:/icons/32x32/DeleteOne.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/gis/trk/CGisItemTrk.cpp b/src/gis/trk/CGisItemTrk.cpp
index b3b41eb..1dd0ecc 100644
--- a/src/gis/trk/CGisItemTrk.cpp
+++ b/src/gis/trk/CGisItemTrk.cpp
@@ -17,14 +17,17 @@
**********************************************************************************************/
#include "gis/trk/CGisItemTrk.h"
+#include "gis/trk/CScrOptTrk.h"
#include "gis/CGisProject.h"
#include "gis/CGisDraw.h"
+#include "GeoMath.h"
#include <QtXml>
#include <QtWidgets>
#include <proj_api.h>
-#define DEFAULT_COLOR 4
+#define ASCEND_THRESHOLD 5
+#define DEFAULT_COLOR 4
const QColor CGisItemTrk::lineColors[] =
{
@@ -87,6 +90,7 @@ const QString CGisItemTrk::bulletColors[] =
const QPen CGisItemTrk::penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
+QString CGisItemTrk::keyUserFocus;
CGisItemTrk::CGisItemTrk(const QDomNode& xml, CGisProject * parent)
: IGisItem(parent)
@@ -97,6 +101,7 @@ CGisItemTrk::CGisItemTrk(const QDomNode& xml, CGisProject * parent)
readTrk(xml, trk);
// --- stop read and process data ----
setText(0, trk.name);
+ setToolTip(0, getInfo());
genKey();
}
@@ -105,6 +110,99 @@ CGisItemTrk::~CGisItemTrk()
}
+void CGisItemTrk::genKey()
+{
+ if(key.isEmpty())
+ {
+ QCryptographicHash md5(QCryptographicHash::Md5);
+ md5.addData((const char*)&trk, sizeof(trk));
+ key = md5.result().toHex();
+ }
+}
+
+
+QString CGisItemTrk::getInfo()
+{
+ QString val1, unit1, val2, unit2;
+ QString str = getName();
+ if(cntVisiblePoints == 0)
+ {
+ return str;
+ }
+
+ IUnit::self().meter2distance(totalDistance, val1, unit1);
+ str += "\n";
+ str += QObject::tr("Length: %1 %2").arg(val1).arg(unit1);
+
+ if(totalAscend != NOFLOAT && totalDescend != NOFLOAT)
+ {
+ IUnit::self().meter2elevation(totalAscend, val1, unit1);
+ IUnit::self().meter2elevation(totalDescend, val2, unit2);
+
+ str += QObject::tr(", %1%2 %3, %4%5 %6").arg(QChar(0x2197)).arg(val1).arg(unit1).arg(QChar(0x2198)).arg(val2).arg(unit2);
+ }
+
+
+ if(totalElapsedSeconds != NOTIME)
+ {
+ IUnit::self().seconds2time(totalElapsedSeconds, val1, unit1);
+ str += "\n";
+ str += QObject::tr("Time: %1").arg(val1);
+
+ IUnit::self().meter2speed(totalDistance / totalElapsedSeconds, val1, unit1);
+ str += QObject::tr(", Speed: %1 %2").arg(val1).arg(unit1);
+ }
+
+ if(totalElapsedSecondsMoving != NOTIME)
+ {
+ IUnit::self().seconds2time(totalElapsedSecondsMoving, val1, unit1);
+ str += "\n";
+ str += QObject::tr("Moving: %1").arg(val1);
+
+ IUnit::self().meter2speed(totalDistance / totalElapsedSecondsMoving, val1, unit1);
+ str += QObject::tr(", Speed: %1 %2").arg(val1).arg(unit1);
+ }
+
+ if(timeStart.isValid())
+ {
+ str += "\n";
+ str += QObject::tr("Start: %1").arg(IUnit::datetime2string(timeStart, boundingRect.center()));
+ }
+ if(timeEnd.isValid())
+ {
+ str += "\n";
+ str += QObject::tr("End: %1").arg(IUnit::datetime2string(timeEnd, boundingRect.center()));
+ }
+
+ str += "\n";
+ str += QObject::tr("Points: %1 (%2)").arg(cntVisiblePoints).arg(cntTotalPoints);
+
+
+ return str;
+}
+
+IScrOpt * CGisItemTrk::getScreenOptions(const QPoint& origin, IMouse * mouse)
+{
+ return new CScrOptTrk(this, origin, mouse);
+}
+
+QPointF CGisItemTrk::getPointCloseBy(const QPoint& screenPos)
+{
+ qint32 d = NOINT;
+ QPointF pt = NOPOINTF;
+ foreach(const QPointF& point, line)
+ {
+ int tmp = (screenPos - point).manhattanLength();
+ if(tmp < d)
+ {
+ pt = point;
+ d = tmp;
+ }
+ }
+
+ return pt;
+}
+
void CGisItemTrk::readTrk(const QDomNode& xml, trk_t& trk)
{
qreal north = -90;
@@ -165,6 +263,7 @@ void CGisItemTrk::readTrk(const QDomNode& xml, trk_t& trk)
setColor(str2color(str));
}
+ deriveSecondaryData();
}
void CGisItemTrk::save(QDomNode& gpx)
@@ -211,26 +310,250 @@ void CGisItemTrk::save(QDomNode& gpx)
}
}
-void CGisItemTrk::genKey()
+
+void CGisItemTrk::deriveSecondaryData()
{
- if(key.isEmpty())
+ // reset all secondary data
+ cntTotalPoints = 0;
+ cntVisiblePoints = 0;
+ timeStart = QDateTime();
+ timeEnd = QDateTime();
+ totalDistance = NOFLOAT;
+ totalAscend = NOFLOAT;
+ totalDescend = NOFLOAT;
+ totalElapsedSeconds = NOTIME;
+ totalElapsedSecondsMoving = NOTIME;
+
+
+ // remove empty segments
+ QVector<trkseg_t>::iterator i = trk.segs.begin();
+ while(i != trk.segs.end())
{
- QCryptographicHash md5(QCryptographicHash::Md5);
- md5.addData((const char*)&trk, sizeof(trk));
- key = md5.result().toHex();
+ if((*i).pts.isEmpty())
+ {
+ i = trk.segs.erase(i);
+ continue;
+ }
+ i++;
}
+
+ // no segments -> no data -> nothing to do
+ if(trk.segs.isEmpty())
+ {
+ return;
+ }
+
+ trkpt_t * lastTrkpt = 0;
+ qreal timestampStart = NOFLOAT;
+ qreal lastEle = NOFLOAT;
+
+ for(int s = 0; s < trk.segs.size(); s++)
+ {
+ trkseg_t& seg = trk.segs[s];
+
+ for(int p = 0; p < seg.pts.size(); p++)
+ {
+ trkpt_t& trkpt = seg.pts[p];
+
+ cntTotalPoints++;
+ if(trkpt.flags & trkpt_t::eDeleted)
+ {
+ trkpt.reset();
+ continue;
+ }
+ cntVisiblePoints++;
+
+ if(lastTrkpt != 0)
+ {
+ trkpt.deltaDistance = GPS_Math_Distance(lastTrkpt->lon * DEG_TO_RAD, lastTrkpt->lat * DEG_TO_RAD, trkpt.lon * DEG_TO_RAD, trkpt.lat * DEG_TO_RAD);
+ trkpt.distance = lastTrkpt->distance + trkpt.deltaDistance;
+ trkpt.elapsedSeconds = trkpt.time.toMSecsSinceEpoch()/1000.0 - timestampStart;
+
+ // ascend descend
+ if(lastEle != NOFLOAT)
+ {
+
+ qreal delta = trkpt.ele - lastEle;
+ qreal absDelta = qAbs(delta);
+
+ if(absDelta > ASCEND_THRESHOLD)
+ {
+ if(delta > 0)
+ {
+ trkpt.ascend = lastTrkpt->ascend + delta;
+ trkpt.descend = lastTrkpt->descend;
+ }
+ else
+ {
+ trkpt.ascend = lastTrkpt->ascend;
+ trkpt.descend = lastTrkpt->descend - delta;
+ }
+ lastEle = trkpt.ele;
+ }
+ else
+ {
+ trkpt.ascend = lastTrkpt->ascend;
+ trkpt.descend = lastTrkpt->descend;
+ }
+ }
+
+ // time moving
+ qreal dt = (trkpt.time.toMSecsSinceEpoch() - lastTrkpt->time.toMSecsSinceEpoch()) / 1000.0;
+ if(dt > 0 && ((trkpt.deltaDistance / dt) > 0.2))
+ {
+ trkpt.elapsedSecondsMoving = lastTrkpt->elapsedSecondsMoving + dt;
+ }
+ else
+ {
+ trkpt.elapsedSecondsMoving = lastTrkpt->elapsedSecondsMoving;
+ }
+
+ }
+ else
+ {
+ timeStart = trkpt.time;
+ timestampStart = timeStart.toMSecsSinceEpoch()/1000.0;
+ lastEle = trkpt.ele;
+
+ trkpt.deltaDistance = 0;
+ trkpt.distance = 0;
+ trkpt.ascend = 0;
+ trkpt.descend = 0;
+ trkpt.elapsedSeconds = 0;
+ trkpt.elapsedSecondsMoving = 0;
+ }
+
+ lastTrkpt = &trkpt;
+ }
+ }
+
+
+ // speed and slope (short average +-25m)
+ for(int s = 0; s < trk.segs.size(); s++)
+ {
+ trkseg_t& seg = trk.segs[s];
+
+ for(int p = 0; p < seg.pts.size(); p++)
+ {
+ trkpt_t& trkpt = seg.pts[p];
+ if(trkpt.flags & trkpt_t::eDeleted)
+ {
+ continue;
+ }
+
+ qreal d1 = trkpt.distance;
+ qreal e1 = trkpt.ele;
+ qreal t1 = trkpt.time.toMSecsSinceEpoch() / 1000.0;
+ int n = p;
+
+ while(n>0)
+ {
+ trkpt_t & trkpt2 = seg.pts[n];
+ if((trkpt2.flags & trkpt_t::eDeleted) || (trkpt2.ele == NOINT))
+ {
+ n--;
+ continue;
+ }
+
+ if(trkpt.distance - trkpt2.distance >= 25)
+ {
+ d1 = trkpt2.distance;
+ e1 = trkpt2.ele;
+ t1 = trkpt2.time.toMSecsSinceEpoch()/1000.0;
+ break;
+ }
+ n--;
+ }
+
+ qreal d2 = trkpt.distance;
+ qreal e2 = trkpt.ele;
+ qreal t2 = trkpt.time.toMSecsSinceEpoch() / 1000.0;
+ n = p;
+ while(n < seg.pts.size())
+ {
+ trkpt_t & trkpt2 = seg.pts[n];;
+ if((trkpt2.flags & trkpt_t::eDeleted) || (trkpt2.ele == NOINT))
+ {
+ n++;
+ continue;
+ }
+
+ if(trkpt2.distance - trkpt.distance >= 25)
+ {
+ d2 = trkpt2.distance;
+ e2 = trkpt2.ele;
+ t2 = trkpt2.time.toMSecsSinceEpoch() / 1000.0;
+ break;
+ }
+ n++;
+ }
+
+ qreal a = atan((e2 - e1)/(d2 - d1));
+ trkpt.slope = qAbs(a * 360.0/(2 * M_PI));
+
+ if((t2 - t1) > 0)
+ {
+ trkpt.speed = (d2 - d1) / (t2 - t1);
+ }
+ else
+ {
+ trkpt.speed = NOFLOAT;
+ }
+ }
+ }
+
+
+
+ if(lastTrkpt != 0)
+ {
+ timeEnd = lastTrkpt->time;
+ totalDistance = lastTrkpt->distance;
+ totalAscend = lastTrkpt->ascend;
+ totalDescend = lastTrkpt->descend;
+ totalElapsedSeconds = lastTrkpt->elapsedSeconds;
+ totalElapsedSecondsMoving = lastTrkpt->elapsedSecondsMoving;
+ }
+
+// qDebug() << "--------------" << getName() << "------------------";
+// qDebug() << "totalDistance" << totalDistance;
+// qDebug() << "totalAscend" << totalAscend;
+// qDebug() << "totalDescend" << totalDescend;
+// qDebug() << "totalElapsedSeconds" << totalElapsedSeconds;
+// qDebug() << "totalElapsedSecondsMoving" << totalElapsedSecondsMoving;
+
+
+}
+
+
+bool CGisItemTrk::isCloseTo(const QPointF& pos)
+{
+
+ foreach(const QPointF& pt, line)
+ {
+ if((pt - pos).manhattanLength() < 10)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void CGisItemTrk::gainUserFocus()
+{
+ keyUserFocus = key;
}
void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, CGisDraw *gis)
{
+ line.clear();
if(!viewport.intersects(boundingRect))
{
return;
}
QPointF pt1;
- QPolygonF line;
QPointF p1 = viewport.topLeft();
QPointF p2 = viewport.bottomRight();
@@ -259,22 +582,19 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
QList<QPolygonF> lines;
splitLineToViewport(line, extViewport, lines);
+ p.setBrush(color);
p.setPen(penBackground);
- foreach(const QPolygonF& line, lines)
+ foreach(const QPolygonF& l, lines)
{
- p.drawPolyline(line);
+ p.drawPolyline(l);
+ drawArrows(l, extViewport, p);
}
penForeground.setColor(color);
p.setPen(penForeground);
- p.setBrush(color);
- foreach(const QPolygonF& line, lines)
+ foreach(const QPolygonF& l, lines)
{
- p.drawPolyline(line);
- drawArrows(line, extViewport, p);
+ p.drawPolyline(l);
}
-
-
-
}
@@ -285,6 +605,15 @@ void CGisItemTrk::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &
}
+void CGisItemTrk::drawHighlight(QPainter& p)
+{
+ if(line.isEmpty())
+ {
+ return;
+ }
+ p.setPen(QPen(QColor(255,0,0,100),11,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+ p.drawPolyline(line);
+}
@@ -319,12 +648,12 @@ void CGisItemTrk::setColor(const QColor& c)
void CGisItemTrk::setIcon(const QString& c)
{
- QPixmap icon(32,32);
- icon.fill(Qt::transparent);
- QPainter p(&icon);
- p.setBrush(QColor(c));
- p.setPen(Qt::NoPen);
- p.drawRect(3,3,26,26);
-
- QTreeWidgetItem::setIcon(0,QIcon(icon));
+ icon = QPixmap("://icons/48x48/Track.png");
+
+ QPixmap mask( icon.size() );
+ mask.fill( color );
+ mask.setMask( icon.createMaskFromColor( Qt::transparent ) );
+ icon = mask.scaled(22,22, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+
+ QTreeWidgetItem::setIcon(0,icon);
}
diff --git a/src/gis/trk/CGisItemTrk.h b/src/gis/trk/CGisItemTrk.h
index a6cdd5e..a582603 100644
--- a/src/gis/trk/CGisItemTrk.h
+++ b/src/gis/trk/CGisItemTrk.h
@@ -32,34 +32,76 @@ class CGisItemTrk : public IGisItem
CGisItemTrk(const QDomNode &xml, CGisProject *parent);
virtual ~CGisItemTrk();
+ const QString& getName(){return trk.name;}
+ QString getInfo();
+ IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
+ QPointF getPointCloseBy(const QPoint& screenPos);
void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, CGisDraw * gis);
void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, const QFontMetricsF& fm, CGisDraw * gis);
-
+ void drawHighlight(QPainter& p);
void save(QDomNode& gpx);
+ bool isCloseTo(const QPointF& pos);
+ void gainUserFocus();
private:
struct trk_t;
static const QColor lineColors[];
static const QString bulletColors[];
-
void genKey();
void readTrk(const QDomNode& xml, trk_t& trk);
void setColor(const QColor& c);
void setIcon(const QString& c);
+ void deriveSecondaryData();
+
+ static QString keyUserFocus;
struct trkpt_t : public wpt_t
{
- trkpt_t() : flags(0) {}
+ trkpt_t()
+ : flags(0)
+ {reset();}
+
+ void reset()
+ {
+ deltaDistance = NOFLOAT;
+ distance = NOFLOAT;
+ ascend = NOFLOAT;
+ descend = NOFLOAT;
+ elapsedSeconds = NOFLOAT;
+ elapsedSecondsMoving = NOFLOAT;
+ slope = NOFLOAT;
+ speed = NOFLOAT;
+ }
+
enum flag_e
{
- eSelected = 1 ///< selected by track info view
- ,eCursor = 2 ///< selected by cursor
- ,eDeleted = 4 ///< mark point as deleted
- ,eFocus = 8 ///< mark current point of user focus
+ eSelected = 0x00000001 ///< selected by track info view
+// ,eCursor = 0x00000002 ///< selected by cursor
+ ,eDeleted = 0x00000004 ///< mark point as deleted
+// ,eFocus = 0x00000008 ///< mark current point of user focus
+ ,eAllowEdit = 0x80000000
};
quint32 flags;
+
+ /// the distance to the last point
+ qreal deltaDistance;
+ /// the distance from the start of the track
+ qreal distance;
+ /// the ascend from the start of the track
+ qreal ascend;
+ /// the descend from the start of the track
+ qreal descend;
+
+ qreal slope;
+
+ qreal speed;
+
+ /// the seconds since the start of the track
+ qreal elapsedSeconds;
+
+ qreal elapsedSecondsMoving;
};
struct trkseg_t
@@ -89,13 +131,24 @@ class CGisItemTrk : public IGisItem
trk_t trk;
- QRectF boundingRect;
+ quint32 cntTotalPoints;
+ quint32 cntVisiblePoints;
+ QDateTime timeStart;
+ QDateTime timeEnd;
+ qreal totalDistance;
+ qreal totalAscend;
+ qreal totalDescend;
+ qreal totalElapsedSeconds;
+ qreal totalElapsedSecondsMoving;
+
/// the track line color
QColor color;
/// the trakpoint bullet icon
QPixmap bullet;
/// the track line color by index
unsigned colorIdx;
+ ///
+ QPolygonF line;
};
diff --git a/src/gis/trk/CScrOptTrk.cpp b/src/gis/trk/CScrOptTrk.cpp
new file mode 100644
index 0000000..98666a7
--- /dev/null
+++ b/src/gis/trk/CScrOptTrk.cpp
@@ -0,0 +1,82 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/trk/CScrOptTrk.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/CGisWidget.h"
+#include "mouse/IMouse.h"
+#include "canvas/CCanvas.h"
+#include "CMainWindow.h"
+
+CScrOptTrk::CScrOptTrk(CGisItemTrk * trk, const QPoint& origin, IMouse *parent)
+ : IScrOpt(parent->getCanvas())
+ , key(trk->getKey())
+{
+ setupUi(this);
+ setOrigin(origin);
+ label->setFont(CMainWindow::self().getMapFont());
+ label->setText(trk->getInfo());
+
+
+ anchor = trk->getPointCloseBy(origin);
+ move(anchor.toPoint() + QPoint(30,30));
+ adjustSize();
+ show();
+
+ connect(toolDelete, SIGNAL(clicked()), this, SLOT(slotDelete()));
+}
+
+CScrOptTrk::~CScrOptTrk()
+{
+
+}
+
+void CScrOptTrk::slotDelete()
+{
+ CGisWidget::self().delItemByKey(key);
+}
+
+
+void CScrOptTrk::draw(QPainter& p)
+{
+ IGisItem * item = CGisWidget::self().getItemByKey(key);
+ if(item == 0)
+ {
+ QWidget::deleteLater();
+ return;
+ }
+ item->drawHighlight(p);
+
+
+ QRectF r = rect();
+ r.moveTopLeft(QPoint(x(), y()));
+ QPainterPath path1;
+ path1.addRoundedRect(r,5,5);
+
+ QPolygonF poly2;
+ poly2 << anchor << (r.topLeft() + QPointF(10,0)) << (r.topLeft() + QPointF(0,10)) << anchor;
+ QPainterPath path2;
+ path2.addPolygon(poly2);
+
+ path1 = path1.united(path2);
+
+ p.setPen(CCanvas::penBorderGray);
+ p.setBrush(CCanvas::brushBackWhite);
+ p.drawPolygon(path1.toFillPolygon());
+
+}
diff --git a/src/mouse/CMouseNormal.h b/src/gis/trk/CScrOptTrk.h
similarity index 65%
copy from src/mouse/CMouseNormal.h
copy to src/gis/trk/CScrOptTrk.h
index 400a667..7a8d631 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/gis/trk/CScrOptTrk.h
@@ -16,29 +16,33 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CSCROPTTRK_H
+#define CSCROPTTRK_H
-#include "IMouse.h"
+#include "mouse/IScrOpt.h"
-class CCanvas;
+#include <QWidget>
+#include "ui_IScrOptTrk.h"
-class CMouseNormal : public IMouse
+class CGisItemTrk;
+class IMouse;
+
+class CScrOptTrk : public IScrOpt, private Ui::IScrOptTrk
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
-
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ CScrOptTrk(CGisItemTrk * trk, const QPoint &origin, IMouse *parent);
+ virtual ~CScrOptTrk();
+ void draw(QPainter& p);
- protected:
- bool mapMove;
+ private slots:
+ void slotDelete();
- QPoint lastPos;
+ private:
+ QString key;
+ QPointF anchor;
};
-#endif //CMOUSENORMAL_H
+#endif //CSCROPTTRK_H
diff --git a/src/gis/trk/IScrOptTrk.ui b/src/gis/trk/IScrOptTrk.ui
new file mode 100644
index 0000000..8d6ca91
--- /dev/null
+++ b/src/gis/trk/IScrOptTrk.ui
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IScrOptTrk</class>
+ <widget class="QWidget" name="IScrOptTrk">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>300</width>
+ <height>65</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="leftMargin">
+ <number>3</number>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <property name="rightMargin">
+ <number>3</number>
+ </property>
+ <property name="bottomMargin">
+ <number>3</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolEditDetails">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip">
+ <string><html><head/><body><p>View details & Edit</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/EditDetails.png</normaloff>:/icons/32x32/EditDetails.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolDelete">
+ <property name="toolTip">
+ <string><html><head/><body><p>Delete</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/DeleteOne.png</normaloff>:/icons/32x32/DeleteOne.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::AutoText</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/gis/wpt/CDetailsGeoCache.cpp b/src/gis/wpt/CDetailsGeoCache.cpp
new file mode 100644
index 0000000..d333f7e
--- /dev/null
+++ b/src/gis/wpt/CDetailsGeoCache.cpp
@@ -0,0 +1,108 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/wpt/CDetailsGeoCache.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "GeoMath.h"
+
+#include <QtWidgets>
+#include <QtWebKitWidgets>
+
+
+CDetailsGeoCache::CDetailsGeoCache(CGisItemWpt &wpt, QWidget *parent)
+ : QDialog(parent)
+ , wpt(wpt)
+{
+ setupUi(this);
+ setWindowTitle(wpt.getName());
+
+ QString val, unit;
+ QString strPos;
+ QPointF pos = wpt.getPosition();
+ GPS_Math_Deg_To_Str(pos.x(), pos.y(), strPos);
+
+ const CGisItemWpt::geocache_t& geocache = wpt.getGeoCache();
+
+ labelName->setText(geocache.name);
+ labelPositon->setText(strPos);
+
+ qreal d = geocache.difficulty;
+ labelD1->setPixmap(QPixmap(d < 0.5 ? "://icons/cache/32x32/star_empty.png" : d < 1.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelD2->setPixmap(QPixmap(d < 1.5 ? "://icons/cache/32x32/star_empty.png" : d < 2.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelD3->setPixmap(QPixmap(d < 2.5 ? "://icons/cache/32x32/star_empty.png" : d < 3.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelD4->setPixmap(QPixmap(d < 3.5 ? "://icons/cache/32x32/star_empty.png" : d < 4.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelD5->setPixmap(QPixmap(d < 4.5 ? "://icons/cache/32x32/star_empty.png" : d < 5.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ qreal t = geocache.terrain;
+ labelT1->setPixmap(QPixmap(t < 0.5 ? "://icons/cache/32x32/star_empty.png" : t < 1.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelT2->setPixmap(QPixmap(t < 1.5 ? "://icons/cache/32x32/star_empty.png" : t < 2.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelT3->setPixmap(QPixmap(t < 2.5 ? "://icons/cache/32x32/star_empty.png" : t < 3.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelT4->setPixmap(QPixmap(t < 3.5 ? "://icons/cache/32x32/star_empty.png" : t < 4.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+ labelT5->setPixmap(QPixmap(t < 4.5 ? "://icons/cache/32x32/star_empty.png" : t < 5.0 ? "://icons/cache/32x32/halfstar.png" : "://icons/cache/32x32/star.png").scaled(16,16,Qt::KeepAspectRatio, Qt::SmoothTransformation));
+
+ checkHint->setEnabled(!geocache.hint.isEmpty());
+ labelHint->setText(geocache.hint.isEmpty() ? tr("none") : tr("???"));
+ toolIcon->setIcon(wpt.getIcon());
+
+ QString desc;
+ if(geocache.shortDescIsHtml)
+ {
+ desc += geocache.shortDesc;
+ }
+ else
+ {
+ QString str = geocache.shortDesc;
+ desc += "<p>" + str.replace("\n","<br/>") + "</p>";
+ }
+
+ if(geocache.longDescIsHtml)
+ {
+ desc += geocache.longDesc;
+ }
+ else
+ {
+ QString str = geocache.longDesc;
+ desc += "<p>" + str.replace("\n","<br/>") + "</p>";
+ }
+ webDesc->setHtml(desc);
+ webDesc->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+
+ connect(checkHint, SIGNAL(toggled(bool)), this, SLOT(slotHintChanged(bool)));
+ connect(webDesc, SIGNAL(linkClicked(QUrl)), this, SLOT(slotLinkClicked(QUrl)));
+}
+
+CDetailsGeoCache::~CDetailsGeoCache()
+{
+
+}
+
+void CDetailsGeoCache::slotHintChanged(bool on)
+{
+ if(on)
+ {
+ labelHint->setText(wpt.getGeoCache().hint);
+ }
+ else
+ {
+ labelHint->setText(tr("???"));
+ }
+}
+
+void CDetailsGeoCache::slotLinkClicked(const QUrl& url)
+{
+ QDesktopServices::openUrl(url);
+}
diff --git a/src/mouse/CMouseNormal.h b/src/gis/wpt/CDetailsGeoCache.h
similarity index 66%
copy from src/mouse/CMouseNormal.h
copy to src/gis/wpt/CDetailsGeoCache.h
index 400a667..b0fe39e 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/gis/wpt/CDetailsGeoCache.h
@@ -16,29 +16,28 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CDETAILSGEOCACHE_H
+#define CDETAILSGEOCACHE_H
-#include "IMouse.h"
+#include <QDialog>
+#include "ui_IDetailsGeoCache.h"
-class CCanvas;
+class CGisItemWpt;
-class CMouseNormal : public IMouse
+class CDetailsGeoCache : public QDialog, private Ui::IDetailsGeoCache
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ CDetailsGeoCache(CGisItemWpt& wpt, QWidget * parent);
+ virtual ~CDetailsGeoCache();
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ private slots:
+ void slotHintChanged(bool on);
+ void slotLinkClicked(const QUrl& url);
-
- protected:
- bool mapMove;
-
- QPoint lastPos;
+ private:
+ CGisItemWpt& wpt;
};
-#endif //CMOUSENORMAL_H
+#endif //CDETAILSGEOCACHE_H
diff --git a/src/gis/wpt/CDetailsWpt.cpp b/src/gis/wpt/CDetailsWpt.cpp
new file mode 100644
index 0000000..57d14c2
--- /dev/null
+++ b/src/gis/wpt/CDetailsWpt.cpp
@@ -0,0 +1,247 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/wpt/CDetailsWpt.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "GeoMath.h"
+#include "units/IUnit.h"
+#include "helpers/CInputDialog.h"
+#include "helpers/CPositionDialog.h"
+#include "helpers/CWptIconDialog.h"
+#include "helpers/CTextEditWidget.h"
+
+
+#include <QtWidgets>
+#include <proj_api.h>
+
+CDetailsWpt::CDetailsWpt(CGisItemWpt &wpt, QWidget *parent)
+ : QDialog(parent)
+ , wpt(wpt)
+{
+ setupUi(this);
+ setupGui();
+ connect(labelName, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString)));
+ connect(labelPositon, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString)));
+ connect(labelElevation, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString)));
+ connect(labelProximity, SIGNAL(linkActivated(QString)), this, SLOT(slotLinkActivated(QString)));
+ connect(toolIcon, SIGNAL(clicked()), this, SLOT(slotChangeIcon()));
+ connect(toolEditCmt, SIGNAL(clicked()), this, SLOT(slotChangeCmt()));
+ connect(toolEditDesc, SIGNAL(clicked()), this, SLOT(slotChangeDesc()));
+ connect(toolLock, SIGNAL(toggled(bool)), this, SLOT(slotChangeReadOnlyMode(bool)));
+}
+
+CDetailsWpt::~CDetailsWpt()
+{
+
+}
+
+QString toLink(bool isReadOnly, const QString& href, const QString& str)
+{
+ if(isReadOnly)
+ {
+ return QString("%1").arg(str);
+ }
+
+ return QString("<a href='%1'>%2</a>").arg(href).arg(str);
+}
+
+void CDetailsWpt::setupGui()
+{
+ setWindowTitle(wpt.getName());
+
+ QString val, unit;
+ QString strPos;
+ QPointF pos = wpt.getPosition();
+ GPS_Math_Deg_To_Str(pos.x(), pos.y(), strPos);
+
+ bool isReadOnly = wpt.isReadOnly();
+
+ toolIcon->setIcon(wpt.getIcon());
+ toolIcon->setObjectName(wpt.getIconName());
+ labelName->setText(toLink(isReadOnly, "name", wpt.getName()));
+ labelPositon->setText(toLink(isReadOnly, "position", strPos));
+
+ if(wpt.isTainted())
+ {
+ labelTainted->show();
+ }
+ else
+ {
+ labelTainted->hide();
+ }
+
+ if(wpt.getElevation() != NOINT)
+ {
+ IUnit::self().meter2elevation(wpt.getElevation(), val, unit);
+ labelElevation->setText(toLink(isReadOnly, "elevation", QString("%1 %2").arg(val).arg(unit)));
+ }
+ else
+ {
+ labelElevation->setText(toLink(isReadOnly, "elevation", "--"));
+ }
+
+ if(wpt.getProximity() != NOFLOAT)
+ {
+ IUnit::self().meter2elevation(wpt.getProximity(), val, unit);
+ labelProximity->setText(toLink(isReadOnly, "proximity", QString("%1 %2").arg(val).arg(unit)));
+ }
+ else
+ {
+ labelProximity->setText(toLink(isReadOnly, "proximity", "--"));
+ }
+
+ if(wpt.getTime().isValid())
+ {
+ labelTime->setText(IUnit::datetime2string(wpt.getTime(), QPointF(pos.x()*DEG_TO_RAD, pos.y()*DEG_TO_RAD)));
+ }
+
+ if(IGisItem::removeHtml(wpt.getComment()).simplified().isEmpty())
+ {
+ textCmt->setText(tr("no comment"));
+ textCmt->hide();
+ }
+ else
+ {
+ textCmt->setText(wpt.getComment());
+ textCmt->show();
+ }
+
+ if(IGisItem::removeHtml(wpt.getDescription()).simplified().isEmpty())
+ {
+ textDesc->setText(tr("no description"));
+ textDesc->hide();
+ }
+ else
+ {
+ textDesc->setText(wpt.getDescription());
+ textDesc->show();
+ }
+
+ if(!wpt.getHistory().isEmpty())
+ {
+ textHistory->clear();
+ foreach(const QString& entry, wpt.getHistory())
+ {
+ textHistory->append(entry);
+ }
+ textHistory->show();
+ }
+ else
+ {
+ textHistory->hide();
+ }
+
+ if(isReadOnly)
+ {
+ toolEditCmt->hide();
+ toolEditDesc->hide();
+ }
+ else
+ {
+ toolEditCmt->show();
+ toolEditDesc->show();
+ }
+
+ toolLock->setChecked(isReadOnly);
+}
+
+void CDetailsWpt::slotLinkActivated(const QString& link)
+{
+ if(link == "name")
+ {
+ QString name = QInputDialog::getText(0, tr("Edit name..."), tr("Enter new waypoint name."), QLineEdit::Normal, wpt.getName());
+ if(name.isEmpty())
+ {
+ return;
+ }
+ wpt.setName(name);
+ }
+ else if(link == "elevation")
+ {
+ QVariant var(wpt.getElevation());
+ CInputDialog dlg(0, tr("Enter new elevation."), var, QVariant(NOINT));
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setElevation(var.toInt());
+ }
+ }
+ else if(link == "proximity")
+ {
+ QVariant var(wpt.getProximity());
+ CInputDialog dlg(0, tr("Enter new proximity range."), var, QVariant(NOFLOAT));
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setProximity(var.toDouble());
+ }
+ }
+ else if(link == "position")
+ {
+ QPointF pos = wpt.getPosition();
+ CPositionDialog dlg(0, pos);
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setPosition(pos);
+ }
+ }
+
+ setupGui();
+}
+
+void CDetailsWpt::slotChangeIcon()
+{
+
+ if(wpt.isReadOnly())
+ {
+ return;
+ }
+
+ CWptIconDialog dlg(toolIcon);
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setIcon(toolIcon->objectName());
+ setupGui();
+ }
+}
+
+void CDetailsWpt::slotChangeCmt()
+{
+ CTextEditWidget dlg(0);
+ dlg.setHtml(wpt.getComment());
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setComment(dlg.getHtml());
+ setupGui();
+ }
+}
+
+void CDetailsWpt::slotChangeDesc()
+{
+ CTextEditWidget dlg(0);
+ dlg.setHtml(wpt.getDescription());
+ if(dlg.exec() == QDialog::Accepted)
+ {
+ wpt.setDescription(dlg.getHtml());
+ setupGui();
+ }
+}
+
+void CDetailsWpt::slotChangeReadOnlyMode(bool on)
+{
+ wpt.setReadOnlyMode(on);
+ setupGui();
+}
diff --git a/src/gis/CGisListWks.h b/src/gis/wpt/CDetailsWpt.h
similarity index 62%
copy from src/gis/CGisListWks.h
copy to src/gis/wpt/CDetailsWpt.h
index 82061ef..b160919 100644
--- a/src/gis/CGisListWks.h
+++ b/src/gis/wpt/CDetailsWpt.h
@@ -16,38 +16,32 @@
**********************************************************************************************/
-#ifndef CGISLISTWKS_H
-#define CGISLISTWKS_H
+#ifndef CDETAILSWPT_H
+#define CDETAILSWPT_H
-#include <QTreeWidget>
+#include <QDialog>
+#include "ui_IDetailsWpt.h"
-class QAction;
+class CGisItemWpt;
-class CGisListWks : public QTreeWidget
-{
+class CDetailsWpt : public QDialog, private Ui::IDetailsWpt
+{
Q_OBJECT
public:
- CGisListWks(QWidget * parent);
- virtual ~CGisListWks();
-
- bool hasProject(const QString& key);
-
- signals:
- void sigChanged();
+ CDetailsWpt(CGisItemWpt& wpt, QWidget * parent);
+ virtual ~CDetailsWpt();
private slots:
- void slotContextMenu(const QPoint& point);
- void slotSaveProject();
- void slotSaveAsProject();
- void slotCloseProject();
+ void slotLinkActivated(const QString& link);
+ void slotChangeIcon();
+ void slotChangeCmt();
+ void slotChangeDesc();
+ void slotChangeReadOnlyMode(bool on);
private:
- QMenu * menuProject;
- QAction * actionSave;
- QAction * actionSaveAs;
- QAction * actionClose;
-
+ void setupGui();
+ CGisItemWpt& wpt;
};
-#endif //CGISLISTWKS_H
+#endif //CDETAILSWPT_H
diff --git a/src/gis/wpt/CGisItemWpt.cpp b/src/gis/wpt/CGisItemWpt.cpp
index de3293e..3a6877d 100644
--- a/src/gis/wpt/CGisItemWpt.cpp
+++ b/src/gis/wpt/CGisItemWpt.cpp
@@ -17,21 +17,49 @@
**********************************************************************************************/
#include "gis/wpt/CGisItemWpt.h"
+#include "gis/wpt/CDetailsWpt.h"
+#include "gis/wpt/CDetailsGeoCache.h"
+#include "gis/wpt/CScrOptWpt.h"
#include "gis/CGisProject.h"
#include "gis/CGisDraw.h"
#include "gis/WptIcons.h"
+#include "gis/CGisListWks.h"
#include "canvas/CCanvas.h"
+#include "mouse/IMouse.h"
+#include "units/IUnit.h"
#include "GeoMath.h"
#include <QtWidgets>
#include <QtXml>
+QString CGisItemWpt::keyUserFocus;
+CGisItemWpt::CGisItemWpt(const QPointF& pos, const CGisItemWpt& parentWpt, CGisProject * project)
+ : IGisItem(project)
+ , proximity(NOFLOAT)
+ , posScreen(NOPOINTF)
+{
+ *this = parentWpt;
+ wpt.lon = pos.x();
+ wpt.lat = pos.y();
+ wpt.time = QDateTime::currentDateTimeUtc();
+
+ key.clear();
+ flags = eFlagCreatedInQms|eFlagWriteAllowed;
-CGisItemWpt::CGisItemWpt(const QDomNode &xml, CGisProject *parent)
- : IGisItem(parent)
+ boundingRect = QRectF(QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD,QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD);
+ setText(1, "*");
+ setText(0, wpt.name);
+ setIcon();
+ setToolTip(0, getInfo());
+ genKey();
+}
+
+CGisItemWpt::CGisItemWpt(const QDomNode &xml, CGisProject *project)
+ : IGisItem(project)
, proximity(NOFLOAT)
+ , posScreen(NOPOINTF)
{
// --- start read and process data ----
readWpt(xml, wpt);
@@ -40,17 +68,30 @@ CGisItemWpt::CGisItemWpt(const QDomNode &xml, CGisProject *parent)
{
const QDomNode& ext = xml.namedItem("extensions");
readXml(ext, "ql:key", key);
+ readXml(ext, "ql:flags", flags);
+ readXml(ext, history);
const QDomNode& wptx1 = ext.namedItem("wptx1:WaypointExtension");
readXml(wptx1, "wptx1:Proximity", proximity);
+
+ const QDomNode& xmlCache = ext.namedItem("cache");
+ if(!xmlCache.isNull())
+ {
+ // read OC cache extensions
+ }
}
- // translate icon from kind of well known string to pixmap object
- icon = getWptIconByName(wpt.sym, focus);
+ const QDomNode& xmlCache = xml.namedItem("groundspeak:cache");
+ if(!xmlCache.isNull() && !geocache.hasData)
+ {
+ readGcExt(xmlCache);
+ }
// --- stop read and process data ----
+ boundingRect = QRectF(QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD,QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD);
setText(0, wpt.name);
- setIcon(0, icon);
+ setIcon();
+ setToolTip(0, getInfo());
genKey();
}
@@ -59,6 +100,163 @@ CGisItemWpt::~CGisItemWpt()
}
+CGisItemWpt& CGisItemWpt::operator=(const CGisItemWpt& w)
+{
+ wpt = w.wpt;
+ proximity = w.proximity;
+ geocache = w.geocache;
+ focus = w.focus;
+ posScreen = w.posScreen;
+
+
+ flags = w.flags;
+ key = w.key;
+ icon = w.icon;
+ boundingRect = w.boundingRect;
+
+ return *this;
+}
+
+void CGisItemWpt::genKey()
+{
+ if(key.isEmpty())
+ {
+ QCryptographicHash md5(QCryptographicHash::Md5);
+ md5.addData((const char*)&wpt, sizeof(wpt));
+ key = md5.result().toHex();
+ }
+}
+
+QString CGisItemWpt::getInfo()
+{
+ QString str = "<div>" + getName() + "</div>";
+
+ if(geocache.hasData)
+ {
+ str += QString(" %4 (%1, D %2, T %3)").arg(geocache.container).arg(geocache.difficulty, 0,'f',1).arg(geocache.terrain, 0,'f',1).arg(geocache.name);
+ }
+
+ if(wpt.time.isValid())
+ {
+ if(!str.isEmpty()) str += "<br/>\n";
+
+ str += IUnit::datetime2string(wpt.time, QPointF(wpt.lon*DEG_TO_RAD, wpt.lat*DEG_TO_RAD));
+ }
+
+ if(wpt.ele != NOINT)
+ {
+ if(!str.isEmpty()) str += "<br/>\n";
+ QString val, unit;
+ IUnit::self().meter2elevation(wpt.ele, val, unit);
+ str += QObject::tr("Elevation: %1 %2").arg(val).arg(unit);
+ }
+
+ if(proximity != NOFLOAT)
+ {
+ if(!str.isEmpty()) str += "<br/>\n";
+ QString val, unit;
+ IUnit::self().meter2distance(proximity, val, unit);
+ str += QObject::tr("Proximity: %1 %2").arg(val).arg(unit);
+ }
+
+ QString desc = removeHtml(wpt.desc);
+ if(desc.count())
+ {
+ if(!str.isEmpty()) str += "<br/>\n";
+
+ if(desc.count() < 200)
+ {
+ str += desc;
+ }
+ else
+ {
+ str += desc.left(197) + "...";
+ }
+ }
+ else
+ {
+ QString cmt = removeHtml(wpt.cmt);
+ if(cmt.count())
+ {
+ if(!str.isEmpty()) str += "<br/>\n";
+
+ if(cmt.count() < 200)
+ {
+ str += cmt;
+ }
+ else
+ {
+ str += cmt.left(197) + "...";
+ }
+ }
+ }
+ return str;
+}
+
+IScrOpt * CGisItemWpt::getScreenOptions(const QPoint& origin, IMouse * mouse)
+{
+ return new CScrOptWpt(this, origin, mouse);
+}
+
+void CGisItemWpt::setIcon()
+{
+ if(geocache.hasData)
+ {
+ icon = getWptIconByName(geocache.type, focus);
+ }
+ else
+ {
+ icon = getWptIconByName(wpt.sym, focus);
+ }
+
+ QTreeWidgetItem::setIcon(0,icon);
+}
+
+void CGisItemWpt::setName(const QString& str)
+{
+ setText(0, str);
+ wpt.name = str;
+ changed(QObject::tr("Changed name"));
+}
+
+void CGisItemWpt::setPosition(const QPointF& pos)
+{
+ wpt.lon = pos.x();
+ wpt.lat = pos.y();
+ changed(QObject::tr("Changed position"));
+}
+
+void CGisItemWpt::setElevation(qint32 val)
+{
+ wpt.ele = val;
+ changed(QObject::tr("Changed elevation"));
+}
+
+void CGisItemWpt::setProximity(qreal val)
+{
+ proximity = val;
+ changed(QObject::tr("Changed proximity"));
+}
+
+void CGisItemWpt::setIcon(const QString& name)
+{
+ wpt.sym = name;
+ setIcon();
+ changed(QObject::tr("Changed icon"));
+}
+
+void CGisItemWpt::setComment(const QString& str)
+{
+ wpt.cmt = str;
+ changed(QObject::tr("Changed comment"));
+}
+
+void CGisItemWpt::setDescription(const QString& str)
+{
+ wpt.desc = str;
+ changed(QObject::tr("Changed description"));
+}
+
void CGisItemWpt::save(QDomNode& gpx)
{
QDomDocument doc = gpx.ownerDocument();
@@ -71,32 +269,185 @@ void CGisItemWpt::save(QDomNode& gpx)
QDomElement xmlExt = doc.createElement("extensions");
xmlWpt.appendChild(xmlExt);
writeXml(xmlExt, "ql:key", key);
+ writeXml(xmlExt, "ql:flags", flags);
+ writeXml(xmlExt, history);
// write other well known extensions
QDomElement wptx1 = doc.createElement("wptx1:WaypointExtension");
xmlExt.appendChild(wptx1);
writeXml(wptx1, "wptx1:Proximity", proximity);
+
+ if(geocache.hasData && geocache.service == eGC)
+ {
+ QDomElement xmlCache = doc.createElement("groundspeak:cache");
+ writeGcExt(xmlCache);
+ xmlWpt.appendChild(xmlCache);
+ }
+
+ setText(1,"");
}
-void CGisItemWpt::genKey()
+void CGisItemWpt::readGcExt(const QDomNode& xmlCache)
{
- if(key.isEmpty())
+ geocache.service = eGC;
+ const QDomNamedNodeMap& attr = xmlCache.attributes();
+ geocache.id = attr.namedItem("id").nodeValue().toInt();
+
+ geocache.archived = attr.namedItem("archived").nodeValue().toLocal8Bit() == "True";
+ geocache.available = attr.namedItem("available").nodeValue().toLocal8Bit() == "True";
+ if(geocache.archived)
{
- QCryptographicHash md5(QCryptographicHash::Md5);
- md5.addData((const char*)&wpt, sizeof(wpt));
- key = md5.result().toHex();
+ geocache.status = QObject::tr("Archived");
+ }
+ else if(geocache.available)
+ {
+ geocache.status = QObject::tr("Available");
+ }
+ else
+ {
+ geocache.status = QObject::tr("Not Available");
+ }
+
+ readXml(xmlCache, "groundspeak:name", geocache.name);
+ readXml(xmlCache, "groundspeak:placed_by", geocache.owner);
+ readXml(xmlCache, "groundspeak:type", geocache.type);
+ readXml(xmlCache, "groundspeak:container", geocache.container);
+ readXml(xmlCache, "groundspeak:difficulty", geocache.difficulty);
+ readXml(xmlCache, "groundspeak:terrain", geocache.terrain);
+ readXml(xmlCache, "groundspeak:short_description", geocache.shortDesc, geocache.shortDescIsHtml);
+ readXml(xmlCache, "groundspeak:long_description", geocache.longDesc, geocache.longDescIsHtml);
+ readXml(xmlCache, "groundspeak:encoded_hints", geocache.hint);
+ readXml(xmlCache, "groundspeak:country", geocache.country);
+ readXml(xmlCache, "groundspeak:state", geocache.state);
+
+ const QDomNodeList& logs = xmlCache.toElement().elementsByTagName("groundspeak:log");
+ uint N = logs.count();
+
+ for(uint n = 0; n < N; ++n)
+ {
+ const QDomNode& xmlLog = logs.item(n);
+ const QDomNamedNodeMap& attr = xmlLog.attributes();
+
+ geocachelog_t log;
+ log.id = attr.namedItem("id").nodeValue().toUInt();
+ readXml(xmlLog, "groundspeak:date", log.date);
+ readXml(xmlLog, "groundspeak:type", log.type);
+ if(xmlLog.namedItem("groundspeak:finder").isElement())
+ {
+ const QDomNamedNodeMap& attr = xmlLog.namedItem("groundspeak:finder").attributes();
+ log.finderId = attr.namedItem("id").nodeValue();
+ }
+
+ readXml(xmlLog, "groundspeak:finder", log.finder);
+ readXml(xmlLog, "groundspeak:text", log.text, log.textIsHtml);
+
+ geocache.logs << log;
+
+ }
+ geocache.hasData = true;
+}
+
+void CGisItemWpt::writeGcExt(QDomNode& xmlCache)
+{
+ QString str;
+ xmlCache.toElement().setAttribute("xmlns:groundspeak", "http://www.groundspeak.com/cache/1/0");
+ xmlCache.toElement().setAttribute("id", geocache.id);
+ xmlCache.toElement().setAttribute("archived", geocache.archived ? "True" : "False");
+ xmlCache.toElement().setAttribute("available", geocache.available ? "True" : "False");
+
+ writeXml(xmlCache, "groundspeak:name", geocache.name);
+ writeXml(xmlCache, "groundspeak:placed_by", geocache.owner);
+ writeXml(xmlCache, "groundspeak:type", geocache.type);
+ writeXml(xmlCache, "groundspeak:container", geocache.container);
+
+ if(geocache.difficulty == int(geocache.difficulty))
+ {
+ str.sprintf("%1.0f", geocache.difficulty);
+ }
+ else
+ {
+ str.sprintf("%1.1f", geocache.difficulty);
+ }
+ writeXml(xmlCache, "groundspeak:difficulty", str);
+
+ if(geocache.terrain == int(geocache.terrain))
+ {
+ str.sprintf("%1.0f", geocache.terrain);
+ }
+ else
+ {
+ str.sprintf("%1.1f", geocache.terrain);
+ }
+ writeXml(xmlCache, "groundspeak:terrain", str);
+ writeXml(xmlCache, "groundspeak:short_description", geocache.shortDesc, geocache.shortDescIsHtml);
+ writeXml(xmlCache, "groundspeak:long_description", geocache.longDesc, geocache.longDescIsHtml);
+ writeXml(xmlCache, "groundspeak:encoded_hints", geocache.hint);
+
+ if(!geocache.logs.isEmpty())
+ {
+ QDomElement xmlLogs = xmlCache.ownerDocument().createElement("groundspeak:logs");
+ xmlCache.appendChild(xmlLogs);
+
+ foreach(const geocachelog_t& log, geocache.logs)
+ {
+ QDomElement xmlLog = xmlCache.ownerDocument().createElement("groundspeak:log");
+ xmlLogs.appendChild(xmlLog);
+
+ xmlLog.setAttribute("id", log.id);
+ writeXml(xmlLog, "groundspeak:date", log.date);
+ writeXml(xmlLog, "groundspeak:type", log.type);
+
+ QDomElement xmlFinder = xmlCache.ownerDocument().createElement("groundspeak:finder");
+ xmlLog.appendChild(xmlFinder);
+
+ QDomText _finder_ = xmlCache.ownerDocument().createCDATASection(log.finder);
+ xmlFinder.appendChild(_finder_);
+ xmlFinder.setAttribute("id", log.finderId);
+
+ writeXml(xmlLog, "groundspeak:text", log.text, log.textIsHtml);
+ }
+ }
+}
+
+bool CGisItemWpt::isCloseTo(const QPointF& pos)
+{
+ if(posScreen == NOPOINTF)
+ {
+ return false;
+ }
+
+ return ((pos - posScreen).manhattanLength() < 22);
+}
+
+void CGisItemWpt::gainUserFocus()
+{
+ keyUserFocus = key;
+}
+
+void CGisItemWpt::edit()
+{
+ if(geocache.hasData)
+ {
+ CDetailsGeoCache dlg(*this, 0);
+ dlg.exec();
+ }
+ else
+ {
+ CDetailsWpt dlg(*this, 0);
+ dlg.exec();
}
}
void CGisItemWpt::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, CGisDraw *gis)
{
- QPointF pt(wpt.lon * DEG_TO_RAD, wpt.lat * DEG_TO_RAD);
- if(!viewport.contains(pt))
+ posScreen = QPointF(wpt.lon * DEG_TO_RAD, wpt.lat * DEG_TO_RAD);
+ if(!viewport.contains(posScreen))
{
+ posScreen = NOPOINTF;
return;
}
- gis->convertRad2Px(pt);
- p.drawPixmap(pt - focus, icon);
+ gis->convertRad2Px(posScreen);
+ p.drawPixmap(posScreen - focus, icon);
if(proximity != NOFLOAT)
{
@@ -104,30 +455,28 @@ void CGisItemWpt::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
pt1 = GPS_Math_Wpt_Projection(pt1, proximity, 90 * DEG_TO_RAD);
gis->convertRad2Px(pt1);
- double r = pt1.x() - pt.x();
+ double r = pt1.x() - posScreen.x();
p.save();
p.setBrush(Qt::NoBrush);
p.setPen(QPen(Qt::white,3));
- p.drawEllipse(QRect(pt.x() - r - 1, pt.y() - r - 1, 2*r + 1, 2*r + 1));
+ p.drawEllipse(QRect(posScreen.x() - r - 1, posScreen.y() - r - 1, 2*r + 1, 2*r + 1));
p.setPen(QPen(Qt::red,1));
- p.drawEllipse(QRect(pt.x() - r - 1, pt.y() - r - 1, 2*r + 1, 2*r + 1));
+ p.drawEllipse(QRect(posScreen.x() - r - 1, posScreen.y() - r - 1, 2*r + 1, 2*r + 1));
p.restore();
}
- blockedAreas << QRectF(pt - focus, icon.size());
+ blockedAreas << QRectF(posScreen - focus, icon.size());
}
void CGisItemWpt::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, const QFontMetricsF &fm, CGisDraw *gis)
{
- QPointF pt(wpt.lon * DEG_TO_RAD, wpt.lat * DEG_TO_RAD);
- if(!viewport.contains(pt))
+ if(posScreen == NOPOINTF)
{
return;
}
- gis->convertRad2Px(pt);
- pt = pt - focus;
+ QPointF pt = posScreen - focus;
QRectF rect = fm.boundingRect(wpt.name);
rect.adjust(-2,-2,2,2);
@@ -159,3 +508,13 @@ void CGisItemWpt::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &
blockedAreas << rect;
}
+void CGisItemWpt::drawHighlight(QPainter& p)
+{
+ if(posScreen == NOPOINTF)
+ {
+ return;
+ }
+
+ p.drawImage(posScreen - QPointF(31,31), QImage("://cursors/wptHighlight.png"));
+
+}
diff --git a/src/gis/wpt/CGisItemWpt.h b/src/gis/wpt/CGisItemWpt.h
index 494f5c5..2b08069 100644
--- a/src/gis/wpt/CGisItemWpt.h
+++ b/src/gis/wpt/CGisItemWpt.h
@@ -27,22 +27,105 @@ class QDomNode;
class CGisItemWpt : public IGisItem
{
public:
- CGisItemWpt(const QDomNode& xml, CGisProject * parent);
+ enum geocacheservice_e {eGC, eOC, eTC};
+
+ struct geocachelog_t
+ {
+ geocachelog_t() : id(0){}
+ quint32 id;
+ QDateTime date;
+ QString type;
+ QString finderId;
+ QString finder;
+ bool textIsHtml;
+ QString text;
+ };
+
+ struct geocache_t
+ {
+ geocache_t() : service(eOC), hasData(false), id(0), available(true), archived(false), difficulty(0), terrain(0), shortDescIsHtml(false), longDescIsHtml(false){}
+ geocacheservice_e service;
+ bool hasData;
+ quint32 id;
+ bool available;
+ bool archived;
+ qreal difficulty;
+ qreal terrain;
+ QString status;
+ QString name;
+ QString owner;
+ QString ownerId;
+ QString type;
+ QString container;
+ bool shortDescIsHtml;
+ QString shortDesc;
+ bool longDescIsHtml;
+ QString longDesc;
+ QString hint;
+ QString country;
+ QString state;
+ QString locale;
+ QList<geocachelog_t> logs;
+ };
+
+ CGisItemWpt(const QPointF& pos, const CGisItemWpt &parentWpt, CGisProject *project);
+ CGisItemWpt(const QDomNode& xml, CGisProject * project);
virtual ~CGisItemWpt();
+ CGisItemWpt& operator=(const CGisItemWpt& w);
+
+ void setName(const QString& str);
+ void setPosition(const QPointF& pos);
+ void setElevation(qint32 val);
+ void setProximity(qreal val);
+ void setIcon(const QString& name);
+ void setComment(const QString& str);
+ void setDescription(const QString& str);
+
+ const QString& getName(){return wpt.name;}
+ QString getInfo();
+ QPointF getPosition(){return QPointF(wpt.lon, wpt.lat);}
+ qint32 getElevation(){return wpt.ele;}
+ qreal getProximity(){return proximity;}
+ const QDateTime& getTime(){return wpt.time;}
+ const QString& getIconName(){return wpt.sym;}
+ const QString& getComment(){return wpt.cmt;}
+ const QString& getDescription(){return wpt.desc;}
+ const geocache_t& getGeoCache(){return geocache;}
+ const history_t& getHistory(){return history;}
+
+ IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
+ QPointF getPointCloseBy(const QPoint& ){return posScreen;}
+
void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, CGisDraw * gis);
void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, const QFontMetricsF& fm, CGisDraw * gis);
-
+ void drawHighlight(QPainter& p);
void save(QDomNode& gpx);
+ bool isCloseTo(const QPointF& pos);
+ bool isGeocache(){return geocache.hasData;}
+ void gainUserFocus();
+
+ void edit();
private:
void genKey();
+ void setIcon();
+ void readGcExt(const QDomNode& xmlCache);
+ void writeGcExt(QDomNode& xmlCache);
+ static QString keyUserFocus;
+
+ // --- start all waypoint data ----
wpt_t wpt;
qreal proximity;
+ geocache_t geocache;
- QPixmap icon;
QPointF focus;
+ QPointF posScreen;
+
+ // additonal data, common to all IGisItems, is found in IItem //
+
+ // --- stop all waypoint data ----
};
diff --git a/src/gis/wpt/CProjWpt.cpp b/src/gis/wpt/CProjWpt.cpp
new file mode 100644
index 0000000..4a1f8d5
--- /dev/null
+++ b/src/gis/wpt/CProjWpt.cpp
@@ -0,0 +1,121 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/wpt/CProjWpt.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "helpers/CWptIconDialog.h"
+#include "gis/CGisProject.h"
+#include "units/IUnit.h"
+#include "GeoMath.h"
+#include "CMainWindow.h"
+
+#include <QtWidgets>
+#include <proj_api.h>
+
+CProjWpt::CProjWpt(CGisItemWpt& wpt, QWidget *parent)
+ : QDialog(parent)
+ , wpt(wpt)
+{
+ setupUi(this);
+
+ name = wpt.getName();
+
+ toolIcon->setIcon(wpt.getIcon());
+ toolIcon->setObjectName(wpt.getIconName());
+ labelName->setText(QString("<a href='name'>%2</a>").arg(name));
+
+ QString val, unit;
+ IUnit::self().meter2distance(0,val,unit);
+ labelDistUnit->setText(unit);
+
+ connect(labelName, SIGNAL(linkActivated(QString)), this, SLOT(slotChangeName()));
+ connect(toolIcon, SIGNAL(clicked()), this, SLOT(slotChangeIcon()));
+}
+
+CProjWpt::~CProjWpt()
+{
+
+}
+
+void CProjWpt::slotChangeIcon()
+{
+ CWptIconDialog dlg(toolIcon);
+ dlg.exec();
+}
+
+void CProjWpt::slotChangeName()
+{
+ QString n = QInputDialog::getText(0, tr("Edit name..."), tr("Enter new waypoint name."), QLineEdit::Normal, wpt.getName());
+ if(n.isEmpty())
+ {
+ return;
+ }
+ name = n;
+ labelName->setText(QString("<a href='name'>%2</a>").arg(name));
+}
+
+
+void CProjWpt::accept()
+{
+ qreal dist = lineDist->text().toDouble();
+ qreal bearing = lineBearing->text().toDouble();
+
+ if((dist <= 0) || (bearing > 180) || (bearing < -180))
+ {
+ return;
+ }
+
+ CGisProject * project = dynamic_cast<CGisProject*>(wpt.parent());
+ if(project == 0)
+ {
+ return;
+ }
+
+ QPointF pos = wpt.getPosition() * DEG_TO_RAD;
+ pos = GPS_Math_Wpt_Projection(pos, dist, bearing * DEG_TO_RAD) * RAD_TO_DEG;
+
+ CGisItemWpt * newWpt = new CGisItemWpt(pos, wpt, project);
+
+ if(name != newWpt->getName())
+ {
+ newWpt->setName(name);
+ }
+
+ if(toolIcon->objectName() != newWpt->getIconName())
+ {
+ newWpt->setIcon(toolIcon->objectName());
+ }
+
+ qreal ele = CMainWindow::self().getEelevationAt(pos * DEG_TO_RAD);
+ if(ele == NOFLOAT)
+ {
+ if(newWpt->getElevation() != NOINT)
+ {
+ newWpt->setElevation(NOINT);
+ }
+ }
+ else
+ {
+ if(newWpt->getElevation() != qRound(ele))
+ {
+ newWpt->setElevation(qRound(ele));
+ }
+ }
+
+ QDialog::accept();
+}
diff --git a/src/mouse/CMouseNormal.h b/src/gis/wpt/CProjWpt.h
similarity index 67%
copy from src/mouse/CMouseNormal.h
copy to src/gis/wpt/CProjWpt.h
index 400a667..cf0546e 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/gis/wpt/CProjWpt.h
@@ -16,29 +16,32 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CPROJWPT_H
+#define CPROJWPT_H
-#include "IMouse.h"
+#include <QDialog>
+#include "ui_IProjWpt.h"
-class CCanvas;
+class CGisItemWpt;
-class CMouseNormal : public IMouse
+class CProjWpt : public QDialog, private Ui::IProjWpt
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ CProjWpt(CGisItemWpt &wpt, QWidget * parent);
+ virtual ~CProjWpt();
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ public slots:
+ void accept();
+ private slots:
+ void slotChangeIcon();
+ void slotChangeName();
- protected:
- bool mapMove;
-
- QPoint lastPos;
+ private:
+ CGisItemWpt& wpt;
+ QString name;
};
-#endif //CMOUSENORMAL_H
+#endif //CPROJWPT_H
diff --git a/src/gis/wpt/CScrOptWpt.cpp b/src/gis/wpt/CScrOptWpt.cpp
new file mode 100644
index 0000000..31d73e3
--- /dev/null
+++ b/src/gis/wpt/CScrOptWpt.cpp
@@ -0,0 +1,108 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+
+#include "gis/wpt/CScrOptWpt.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "gis/wpt/CProjWpt.h"
+#include "gis/CGisWidget.h"
+#include "mouse/IMouse.h"
+#include "canvas/CCanvas.h"
+#include "CMainWindow.h"
+
+#include <QtWidgets>
+
+CScrOptWpt::CScrOptWpt(CGisItemWpt *wpt, const QPoint& origin, IMouse *parent)
+ : IScrOpt(parent->getCanvas())
+ , key(wpt->getKey())
+{
+ setupUi(this);
+ setOrigin(origin);
+ label->setFont(CMainWindow::self().getMapFont());
+ label->setText(IGisItem::removeHtml(wpt->getInfo()));
+
+ toolMove->setEnabled(!wpt->isReadOnly());
+ toolProj->setEnabled(!wpt->isGeocache());
+
+ anchor = wpt->getPointCloseBy(origin);
+ move(anchor.toPoint() + QPoint(30,30));
+ adjustSize();
+ show();
+
+ connect(toolDelete, SIGNAL(clicked()), this, SLOT(slotDelete()));
+ connect(toolEdit, SIGNAL(clicked()), this, SLOT(slotEdit()));
+ connect(toolMove, SIGNAL(clicked()), this, SLOT(slotMove()));
+ connect(toolProj, SIGNAL(clicked()), this, SLOT(slotProj()));
+}
+
+CScrOptWpt::~CScrOptWpt()
+{
+
+}
+
+void CScrOptWpt::slotDelete()
+{
+ CGisWidget::self().delItemByKey(key);
+}
+
+void CScrOptWpt::slotEdit()
+{
+ CGisWidget::self().editItemByKey(key);
+ deleteLater();
+}
+
+void CScrOptWpt::slotMove()
+{
+ CGisWidget::self().moveWptByKey(key);
+ deleteLater();
+}
+
+void CScrOptWpt::slotProj()
+{
+ CGisWidget::self().projWptByKey(key);
+ deleteLater();
+}
+
+
+void CScrOptWpt::draw(QPainter& p)
+{
+ IGisItem * item = CGisWidget::self().getItemByKey(key);
+ if(item == 0)
+ {
+ deleteLater();
+ return;
+ }
+ item->drawHighlight(p);
+
+ QRectF r = rect();
+ r.moveTopLeft(QPoint(x(), y()));
+ QPainterPath path1;
+ path1.addRoundedRect(r,5,5);
+
+ QPolygonF poly2;
+ poly2 << anchor << (r.topLeft() + QPointF(10,0)) << (r.topLeft() + QPointF(0,10)) << anchor;
+ QPainterPath path2;
+ path2.addPolygon(poly2);
+
+ path1 = path1.united(path2);
+
+ p.setPen(CCanvas::penBorderGray);
+ p.setBrush(CCanvas::brushBackWhite);
+ p.drawPolygon(path1.toFillPolygon());
+
+}
diff --git a/src/gis/CGisWidget.h b/src/gis/wpt/CScrOptWpt.h
similarity index 63%
copy from src/gis/CGisWidget.h
copy to src/gis/wpt/CScrOptWpt.h
index 968be38..227364d 100644
--- a/src/gis/CGisWidget.h
+++ b/src/gis/wpt/CScrOptWpt.h
@@ -16,38 +16,36 @@
**********************************************************************************************/
-#ifndef CGISWIDGET_H
-#define CGISWIDGET_H
+#ifndef CSCROPTWPT_H
+#define CSCROPTWPT_H
+
+#include "mouse/IScrOpt.h"
#include <QWidget>
-#include "ui_IGisWidget.h"
+#include "ui_IScrOptWpt.h"
-class CGisDraw;
+class CGisItemWpt;
+class IMouse;
-class CGisWidget : public QWidget, private Ui::IGisWidget
+class CScrOptWpt : public IScrOpt , private Ui::IScrOptWpt
{
Q_OBJECT
public:
- static CGisWidget& self(){return *pSelf;}
- virtual ~CGisWidget();
-
- void loadGpx(const QString& filename);
-
- void draw(QPainter& p, const QRectF& viewport, CGisDraw *gis);
+ CScrOptWpt(CGisItemWpt * wpt, const QPoint &origin, IMouse *parent);
+ virtual ~CScrOptWpt();
- signals:
- void sigChanged();
-
- public slots:
- void slotSaveAll();
+ void draw(QPainter& p);
+ private slots:
+ void slotDelete();
+ void slotEdit();
+ void slotMove();
+ void slotProj();
private:
- friend class CMainWindow;
- CGisWidget(QWidget * parent);
-
- static CGisWidget * pSelf;
+ QString key;
+ QPointF anchor;
};
-#endif //CGISWIDGET_H
+#endif //CSCROPTWPT_H
diff --git a/src/gis/wpt/IDetailsGeoCache.ui b/src/gis/wpt/IDetailsGeoCache.ui
new file mode 100644
index 0000000..13abbb3
--- /dev/null
+++ b/src/gis/wpt/IDetailsGeoCache.ui
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IDetailsGeoCache</class>
+ <widget class="QDialog" name="IDetailsGeoCache">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>667</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>600</width>
+ <height>400</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/Map.png</normaloff>:/icons/32x32/Map.png</iconset>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255);</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="1">
+ <widget class="QLabel" name="labelName">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QWebView" name="webDesc">
+ <property name="url">
+ <url>
+ <string>about:blank</string>
+ </url>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Position:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelPositon">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Difficulty</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelD1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelD2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelD3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelD4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelD5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Terrain</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelT1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelT2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelT3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelT4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelT5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0">
+ <widget class="QToolButton" name="toolIcon">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QCheckBox" name="checkHint">
+ <property name="text">
+ <string>Hint:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelHint">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QWebView</class>
+ <extends>QWidget</extends>
+ <header>QtWebKitWidgets/QWebView</header>
+ </customwidget>
+ </customwidgets>
+ <resources>
+ <include location="../../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/gis/wpt/IDetailsWpt.ui b/src/gis/wpt/IDetailsWpt.ui
new file mode 100644
index 0000000..db0e1fa
--- /dev/null
+++ b/src/gis/wpt/IDetailsWpt.ui
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IDetailsWpt</class>
+ <widget class="QDialog" name="IDetailsWpt">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>550</width>
+ <height>567</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Dialog</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/Map.png</normaloff>:/icons/32x32/Map.png</iconset>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255);
+color: rgb(0, 0, 0);</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="leftMargin">
+ <number>3</number>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <property name="rightMargin">
+ <number>3</number>
+ </property>
+ <property name="bottomMargin">
+ <number>3</number>
+ </property>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="4" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QToolButton" name="toolEditDesc">
+ <property name="toolTip">
+ <string><html><head/><body><p>Edit description.</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/EditText.png</normaloff>:/icons/32x32/EditText.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Position:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelPositon">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Ele.</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelElevation">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Proximity:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelProximity">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="1">
+ <widget class="QTextBrowser" name="textCmt">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QTextBrowser" name="textDesc">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QToolButton" name="toolEditCmt">
+ <property name="toolTip">
+ <string><html><head/><body><p>Edit comment.</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/EditText.png</normaloff>:/icons/32x32/EditText.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="labelName">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelTainted">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="toolTip">
+ <string><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../resources.qrc">:/icons/32x32/Tainted.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolLock">
+ <property name="toolTip">
+ <string><html><head/><body><p>Read Only Mode</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/UnLock.png</normaloff>
+ <normalon>:/icons/32x32/Lock.png</normalon>:/icons/32x32/UnLock.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="0">
+ <widget class="QToolButton" name="toolIcon">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QTextBrowser" name="textHistory">
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Date/Time:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelTime">
+ <property name="text">
+ <string>-</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="6" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/canvas/ICanvasSetup.ui b/src/gis/wpt/IProjWpt.ui
similarity index 54%
copy from src/canvas/ICanvasSetup.ui
copy to src/gis/wpt/IProjWpt.ui
index f3c57e7..0d4c659 100644
--- a/src/canvas/ICanvasSetup.ui
+++ b/src/gis/wpt/IProjWpt.ui
@@ -1,97 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
- <class>ICanvasSetup</class>
- <widget class="QDialog" name="ICanvasSetup">
+ <class>IProjWpt</class>
+ <widget class="QDialog" name="IProjWpt">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>446</width>
- <height>109</height>
+ <width>240</width>
+ <height>354</height>
</rect>
</property>
<property name="windowTitle">
- <string>Setup Map Workspace...</string>
+ <string>Waypoint Projection</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Projection & Datum</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="lineProjection"/>
- </item>
- <item>
- <widget class="QToolButton" name="toolWizard">
+ <widget class="QToolButton" name="toolIcon">
<property name="text">
<string>...</string>
</property>
- <property name="icon">
- <iconset resource="../resources.qrc">
- <normaloff>:/icons/32x32/GridWizzard.png</normaloff>:/icons/32x32/GridWizzard.png</iconset>
- </property>
<property name="iconSize">
<size>
<width>22</width>
<height>22</height>
</size>
</property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelName">
+ <property name="text">
+ <string>-</string>
+ </property>
</widget>
</item>
</layout>
</item>
<item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Clone waypoint and move by:</string>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>9</height>
- </size>
- </property>
- </spacer>
+ </widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ <widget class="QLineEdit" name="lineDist"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelDistUnit">
+ <property name="text">
+ <string>m</string>
</property>
</widget>
</item>
<item>
- <widget class="QLabel" name="label">
+ <widget class="QLineEdit" name="lineBearing"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_3">
<property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/SetupMapWorkspace.png</pixmap>
+ <string>°</string>
</property>
</widget>
</item>
</layout>
</item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../../resources.qrc">:/pics/compass.png</pixmap>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<resources>
- <include location="../resources.qrc"/>
+ <include location="../../resources.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
- <receiver>ICanvasSetup</receiver>
+ <receiver>IProjWpt</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
@@ -107,7 +133,7 @@
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
- <receiver>ICanvasSetup</receiver>
+ <receiver>IProjWpt</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
diff --git a/src/gis/wpt/IScrOptWpt.ui b/src/gis/wpt/IScrOptWpt.ui
new file mode 100644
index 0000000..925d014
--- /dev/null
+++ b/src/gis/wpt/IScrOptWpt.ui
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IScrOptWpt</class>
+ <widget class="QWidget" name="IScrOptWpt">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>72</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <property name="leftMargin">
+ <number>3</number>
+ </property>
+ <property name="topMargin">
+ <number>3</number>
+ </property>
+ <property name="rightMargin">
+ <number>3</number>
+ </property>
+ <property name="bottomMargin">
+ <number>3</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip">
+ <string><html><head/><body><p>View details & Edit</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/EditDetails.png</normaloff>:/icons/32x32/EditDetails.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolDelete">
+ <property name="toolTip">
+ <string><html><head/><body><p>Delete</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/DeleteOne.png</normaloff>:/icons/32x32/DeleteOne.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolMove">
+ <property name="toolTip">
+ <string><html><head/><body><p>Move waypoint to a new location.</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/WptMove.png</normaloff>:/icons/32x32/WptMove.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolProj">
+ <property name="toolTip">
+ <string><html><head/><body><p>Clone waypoint and move clone a given distance and angle.</p></body></html></string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../../resources.qrc">
+ <normaloff>:/icons/32x32/WptProj.png</normaloff>:/icons/32x32/WptProj.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>500</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/grid/CGrid.cpp b/src/grid/CGrid.cpp
index a0f8ff9..8c16f37 100644
--- a/src/grid/CGrid.cpp
+++ b/src/grid/CGrid.cpp
@@ -92,7 +92,7 @@ void CGrid::setProjAndColor(const QString& proj, const QColor& c)
void CGrid::findGridSpace(double min, double max, double& xSpace, double& ySpace)
{
- double dX = fabs(min - max) / 10;
+ double dX = qAbs(min - max) / 10;
if(dX < M_PI/180000)
{
xSpace = 5*M_PI/1800000;
@@ -256,11 +256,11 @@ void CGrid::draw(QPainter& p, const QRect& rect)
if(x > rightMax)
{
- if(fabs(x) > fabs(rightMax))
+ if(qAbs(x) > qAbs(rightMax))
{
xStart = x = -180 * DEG_TO_RAD;
}
- if(fabs(x) < fabs(rightMax))
+ if(qAbs(x) < qAbs(rightMax))
{
rightMax = 180 * DEG_TO_RAD;
}
@@ -347,22 +347,22 @@ void CGrid::draw(QPainter& p, const QRect& rect)
foreach(const val_t& val, horzTopTicks)
{
- CCanvas::drawText(fabs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(val.pos, yoff), textColor);
+ CCanvas::drawText(qAbs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(val.pos, yoff), textColor);
}
foreach(const val_t& val, horzBtmTicks)
{
- CCanvas::drawText(fabs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(val.pos, h), textColor);
+ CCanvas::drawText(qAbs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(val.pos, h), textColor);
}
foreach(const val_t& val, vertLftTicks)
{
- CCanvas::drawText(fabs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(xoff, val.pos), textColor);
+ CCanvas::drawText(qAbs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(xoff, val.pos), textColor);
}
foreach(const val_t& val, vertRgtTicks)
{
- CCanvas::drawText(fabs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(w - xoff, val.pos), textColor);
+ CCanvas::drawText(qAbs(val.val)<1.e-5?"0":QString("%1%2").arg(val.val * RAD_TO_DEG).arg(QChar(0260)), p, QPoint(w - xoff, val.pos), textColor);
}
}
else
diff --git a/src/grid/CProjWizard.cpp b/src/grid/CProjWizard.cpp
index 6419ac7..c07bc06 100644
--- a/src/grid/CProjWizard.cpp
+++ b/src/grid/CProjWizard.cpp
@@ -55,7 +55,6 @@ CProjWizard::CProjWizard(QLineEdit &line)
comboHemisphere->addItem(tr("north"), "");
comboHemisphere->addItem(tr("south"), "+south");
- connect(radioLonLat, SIGNAL(clicked()), this, SLOT(slotChange()));
connect(radioMercator, SIGNAL(clicked()), this, SLOT(slotChange()));
connect(radioWorldMercator, SIGNAL(clicked()), this, SLOT(slotChange()));
connect(radioUPSNorth, SIGNAL(clicked()), this, SLOT(slotChange()));
@@ -68,17 +67,11 @@ CProjWizard::CProjWizard(QLineEdit &line)
connect(spinUTMZone, SIGNAL(valueChanged(int)), this, SLOT(slotChange()));
QString projstr = line.text();
- QRegExp re1("\\s*\\+proj=longlat\\s(.*)");
QRegExp re2("\\s*\\+proj=merc \\+a=6378137 \\+b=6378137 \\+lat_ts=0.0 \\+lon_0=0.0 \\+x_0=0.0 \\+y_0=0 \\+k=1.0 \\+units=m \\+nadgrids=@null \\+no_defs");
QRegExp re3("\\s*\\+proj=merc\\s(.*)");
QRegExp re4("\\s*\\+proj=utm \\+zone=([0-9]+)\\s(.*)");
- if(re1.exactMatch(projstr))
- {
- radioLonLat->setChecked(true);
- findDatum(re1.cap(1));
- }
- else if(re2.exactMatch(projstr))
+ if(re2.exactMatch(projstr))
{
radioWorldMercator->setChecked(true);
}
@@ -150,11 +143,7 @@ void CProjWizard::findDatum(const QString& str)
void CProjWizard::slotChange()
{
QString str;
- if(radioLonLat->isChecked())
- {
- str += "+proj=longlat ";
- }
- else if(radioMercator->isChecked())
+ if(radioMercator->isChecked())
{
str += "+proj=merc ";
}
diff --git a/src/grid/IGridSetup.ui b/src/grid/IGridSetup.ui
index d5a929a..f87a9be 100644
--- a/src/grid/IGridSetup.ui
+++ b/src/grid/IGridSetup.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>446</width>
- <height>157</height>
+ <height>140</height>
</rect>
</property>
<property name="windowTitle">
@@ -187,16 +187,6 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/GridSetup.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
diff --git a/src/grid/IProjWizard.ui b/src/grid/IProjWizard.ui
index daef0f0..e90896b 100644
--- a/src/grid/IProjWizard.ui
+++ b/src/grid/IProjWizard.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>580</width>
- <height>369</height>
+ <height>348</height>
</rect>
</property>
<property name="windowTitle">
@@ -30,13 +30,6 @@
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QRadioButton" name="radioLonLat">
- <property name="text">
- <string>Lon/Lat</string>
- </property>
- </widget>
- </item>
<item row="5" column="1">
<layout class="QHBoxLayout">
<item>
@@ -139,13 +132,6 @@
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Projection</string>
- </property>
- </widget>
- </item>
<item row="3" column="1">
<widget class="QRadioButton" name="radioUPSNorth">
<property name="text">
@@ -160,6 +146,13 @@
</property>
</widget>
</item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Projection</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -175,23 +168,11 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/GridWizzard.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
</widget>
- <resources>
- <include location="../resources.qrc"/>
- </resources>
+ <resources/>
<connections>
<connection>
<sender>buttonBox</sender>
diff --git a/src/canvas/CCanvasSetup.cpp b/src/helpers/CInputDialog.cpp
similarity index 59%
copy from src/canvas/CCanvasSetup.cpp
copy to src/helpers/CInputDialog.cpp
index 772b17a..a645589 100644
--- a/src/canvas/CCanvasSetup.cpp
+++ b/src/helpers/CInputDialog.cpp
@@ -16,41 +16,47 @@
**********************************************************************************************/
-#include "canvas/CCanvasSetup.h"
-#include "canvas/CCanvas.h"
-#include "grid/CProjWizard.h"
+#include "CInputDialog.h"
-CCanvasSetup::CCanvasSetup(CCanvas * canvas)
- : QDialog(canvas)
- , canvas(canvas)
+#include <QtWidgets>
+
+CInputDialog::CInputDialog(QWidget *parent, const QString& text, QVariant& val, const QVariant& reset)
+ : QDialog(parent)
+ , val(val)
+ , reset(reset)
{
setupUi(this);
+ QPushButton * pushReset = buttonBox->addButton(QDialogButtonBox::Reset);
+ connect(pushReset, SIGNAL(clicked()), this, SLOT(slotReset()));
- lineProjection->setText(canvas->getProjection());
- lineProjection->setCursorPosition(0);
+ label->setText(text);
+ if(val != reset)
+ {
+ lineEdit->setText(val.toString());
+ }
- connect(toolWizard, SIGNAL(clicked()), this, SLOT(slotProjWizard()));
}
-CCanvasSetup::~CCanvasSetup()
+CInputDialog::~CInputDialog()
{
}
-void CCanvasSetup::slotProjWizard()
-{
- CProjWizard dlg(*lineProjection);
- dlg.exec();
-}
-
-
-void CCanvasSetup::accept()
+void CInputDialog::accept()
{
- if(!CProjWizard::validProjStr(lineProjection->text()))
+ if(lineEdit->text().isEmpty())
{
- return;
+ val = reset;
}
- canvas->setProjection(lineProjection->text());
- canvas->slotTriggerCompleteUpdate();
+ else
+ {
+ val.setValue(lineEdit->text());
+ }
+
QDialog::accept();
}
+
+void CInputDialog::slotReset()
+{
+ lineEdit->clear();
+}
diff --git a/src/mouse/CMouseNormal.h b/src/helpers/CInputDialog.h
similarity index 66%
copy from src/mouse/CMouseNormal.h
copy to src/helpers/CInputDialog.h
index 400a667..6181479 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/helpers/CInputDialog.h
@@ -16,29 +16,28 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CINPUTDIALOG_H
+#define CINPUTDIALOG_H
-#include "IMouse.h"
+#include <QDialog>
+#include "ui_IInputDialog.h"
-class CCanvas;
-
-class CMouseNormal : public IMouse
+class CInputDialog : public QDialog, private Ui::IInputDialog
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
-
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
-
+ CInputDialog(QWidget * parent, const QString &text, QVariant &val, const QVariant &reset);
+ virtual ~CInputDialog();
- protected:
- bool mapMove;
+ public slots:
+ void accept();
- QPoint lastPos;
+ private slots:
+ void slotReset();
+ private:
+ QVariant& val;
+ QVariant reset;
};
-#endif //CMOUSENORMAL_H
+#endif //CINPUTDIALOG_H
diff --git a/src/helpers/CPositionDialog.cpp b/src/helpers/CPositionDialog.cpp
new file mode 100644
index 0000000..bd6482b
--- /dev/null
+++ b/src/helpers/CPositionDialog.cpp
@@ -0,0 +1,154 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "CPositionDialog.h"
+#include "GeoMath.h"
+
+#include <QtWidgets>
+
+QRegExp reCoord1("^\\s*([N|S]){1}\\W*([0-9]+)\\W*([0-9]+\\.[0-9]+)\\s+([E|W|O]){1}\\W*([0-9]+)\\W*([0-9]+\\.[0-9]+)\\s*$");
+
+QRegExp reCoord2("^\\s*([N|S]){1}\\s*([0-9]+\\.[0-9]+)\\W*\\s+([E|W|O]){1}\\s*([0-9]+\\.[0-9]+)\\W*\\s*$");
+
+QRegExp reCoord3("^\\s*([-0-9]+\\.[0-9]+)\\s+([-0-9]+\\.[0-9]+)\\s*$");
+
+QRegExp reCoord4("^\\s*([N|S]){1}\\s*([0-9]+)\\W+([0-9]+)\\W+([0-9]+)\\W*([E|W|O]){1}\\W*([0-9]+)\\W+([0-9]+)\\W+([0-9]+)\\W*\\s*$");
+
+QRegExp reCoord5("^\\s*([-0-9]+\\.[0-9]+)([N|S])\\s+([-0-9]+\\.[0-9]+)([W|E])\\s*$");
+
+
+CPositionDialog::CPositionDialog(QWidget * parent, QPointF &pos)
+ : QDialog(parent)
+ , pos(pos)
+{
+ setupUi(this);
+ QString str;
+ GPS_Math_Deg_To_Str(pos.x(), pos.y(), str);
+ lineEdit->setText(str);
+
+ labelWarning->hide();
+
+ connect(lineEdit, SIGNAL(textEdited(QString)), this, SLOT(slotEdit(QString)));
+}
+
+CPositionDialog::~CPositionDialog()
+{
+
+}
+
+void CPositionDialog::accept()
+{
+ qreal lon, lat;
+ QString str = lineEdit->text();
+
+ if(reCoord2.exactMatch(str))
+ {
+ bool signLat = reCoord2.cap(1) == "S";
+ qreal absLat = reCoord2.cap(2).toDouble();
+ lat = signLat ? -absLat : absLat;
+
+ bool signLon = reCoord2.cap(3) == "W";
+ qreal absLon = reCoord2.cap(4).toDouble();
+ lon = signLon ? -absLon : absLon;
+ }
+ else if(reCoord1.exactMatch(str))
+ {
+
+ bool signLat = reCoord1.cap(1) == "S";
+ int degLat = reCoord1.cap(2).toInt();
+ qreal minLat = reCoord1.cap(3).toDouble();
+
+ GPS_Math_DegMin_To_Deg(signLat, degLat, minLat, lat);
+
+ bool signLon = reCoord1.cap(4) == "W";
+ int degLon = reCoord1.cap(5).toInt();
+ qreal minLon = reCoord1.cap(6).toDouble();
+
+ GPS_Math_DegMin_To_Deg(signLon, degLon, minLon, lon);
+ }
+ else if(reCoord3.exactMatch(str))
+ {
+ lat = reCoord3.cap(1).toDouble();
+ lon = reCoord3.cap(2).toDouble();
+ }
+ else if(reCoord4.exactMatch(str))
+ {
+ bool signLat = reCoord4.cap(1) == "S";
+ int degLat = reCoord4.cap(2).toInt();
+ int minLat = reCoord4.cap(3).toInt();
+ int secLat = reCoord4.cap(4).toInt();
+
+ GPS_Math_DegMinSec_To_Deg(signLat, degLat, minLat, secLat, lat);
+
+ bool signLon = reCoord4.cap(5) == "W";
+ int degLon = reCoord4.cap(6).toInt();
+ int minLon = reCoord4.cap(7).toInt();
+ int secLon = reCoord4.cap(8).toInt();
+
+ GPS_Math_DegMinSec_To_Deg(signLon, degLon, minLon, secLon, lon);
+
+ }
+ else if(reCoord5.exactMatch(str))
+ {
+ bool signLon = reCoord4.cap(4) == "W";
+ bool signLat = reCoord4.cap(2) == "S";
+ lat = reCoord5.cap(1).toDouble();
+ lon = reCoord5.cap(3).toDouble();
+
+ if(signLon) lon = -lon;
+ if(signLat) lat = -lat;
+ }
+ else
+ {
+ return;
+ }
+
+ pos.rx() = lon;
+ pos.ry() = lat;
+
+ QDialog::accept();
+
+}
+
+void CPositionDialog::slotEdit(const QString& str)
+{
+ if(reCoord1.exactMatch(str))
+ {
+ labelWarning->hide();
+ }
+ else if(reCoord2.exactMatch(str))
+ {
+ labelWarning->hide();
+ }
+ else if(reCoord3.exactMatch(str))
+ {
+ labelWarning->hide();
+ }
+ else if(reCoord4.exactMatch(str))
+ {
+ labelWarning->hide();
+ }
+ else if(reCoord5.exactMatch(str))
+ {
+ labelWarning->hide();
+ }
+ else
+ {
+ labelWarning->show();
+ }
+}
diff --git a/src/mouse/CMouseNormal.h b/src/helpers/CPositionDialog.h
similarity index 67%
copy from src/mouse/CMouseNormal.h
copy to src/helpers/CPositionDialog.h
index 400a667..e0bf3a3 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/helpers/CPositionDialog.h
@@ -16,29 +16,30 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CPOSITIONDIALOG_H
+#define CPOSITIONDIALOG_H
-#include "IMouse.h"
+#include <QDialog>
+#include "ui_IPositionDialog.h"
-class CCanvas;
+class QPointF;
-class CMouseNormal : public IMouse
+class CPositionDialog : public QDialog, private Ui::IPositionDialog
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ CPositionDialog(QWidget * parent, QPointF &pos);
+ virtual ~CPositionDialog();
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ public slots:
+ void accept();
+ private slots:
+ void slotEdit(const QString& str);
- protected:
- bool mapMove;
-
- QPoint lastPos;
+ private:
+ QPointF& pos;
};
-#endif //CMOUSENORMAL_H
+#endif //CPOSITIONDIALOG_H
diff --git a/src/helpers/CTextEditWidget.cpp b/src/helpers/CTextEditWidget.cpp
new file mode 100644
index 0000000..208a8fb
--- /dev/null
+++ b/src/helpers/CTextEditWidget.cpp
@@ -0,0 +1,351 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the demonstration applications of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:LGPL$
+ ** Commercial License Usage
+ ** Licensees holding valid commercial Qt licenses may use this file in
+ ** accordance with the commercial license agreement provided with the
+ ** Software or, alternatively, in accordance with the terms contained in
+ ** a written agreement between you and Digia. For licensing terms and
+ ** conditions see http://qt.digia.com/licensing. For further information
+ ** use the contact form at http://qt.digia.com/contact-us.
+ **
+ ** GNU Lesser General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
+ ** General Public License version 2.1 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
+ ** packaging of this file. Please review the following information to
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Digia gives you certain additional
+ ** rights. These rights are described in the Digia Qt LGPL Exception
+ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU
+ ** General Public License version 3.0 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file. Please review the following information to
+ ** ensure the GNU General Public License version 3.0 requirements will be
+ ** met: http://www.gnu.org/copyleft/gpl.html.
+ **
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
+
+#include "CTextEditWidget.h"
+
+#include <QtWidgets>
+
+CTextEditWidget::CTextEditWidget(QWidget * parent)
+: QDialog(parent)
+{
+ setupUi(this);
+
+ connect(actionTextBold, SIGNAL(triggered()), this, SLOT(textBold()));
+ toolBold->setDefaultAction(actionTextBold);
+ connect(actionTextItalic, SIGNAL(triggered()), this, SLOT(textItalic()));
+ toolItalic->setDefaultAction(actionTextItalic);
+ connect(actionTextUnderline, SIGNAL(triggered()), this, SLOT(textUnderline()));
+ toolUnder->setDefaultAction(actionTextUnderline);
+
+ QActionGroup *grp = new QActionGroup(this);
+ grp->addAction(actionAlignLeft);
+ grp->addAction(actionAlignRight);
+ grp->addAction(actionAlignCenter);
+ grp->addAction(actionAlignJustify);
+ connect(grp, SIGNAL(triggered(QAction *)), this, SLOT(textAlign(QAction *)));
+
+ toolLeft->setDefaultAction(actionAlignLeft);
+ toolCenter->setDefaultAction(actionAlignCenter);
+ toolRight->setDefaultAction(actionAlignRight);
+ toolBlock->setDefaultAction(actionAlignJustify);
+
+
+ QPixmap pix(24, 24);
+ pix.fill(Qt::black);
+ actionTextColor = new QAction(pix, tr("&Color..."), this);
+ connect(actionTextColor, SIGNAL(triggered()), this, SLOT(textColor()));
+ toolColor->setDefaultAction(actionTextColor);
+
+ comboStyle->addItem("standard");
+ comboStyle->addItem("Bullet List (Disc)");
+ comboStyle->addItem("Bullet List (Circle)");
+ comboStyle->addItem("Bullet List (Square)");
+ comboStyle->addItem("Ordered List (Decimal)");
+ comboStyle->addItem("Ordered List (Alpha lower)");
+ comboStyle->addItem("Ordered List (Alpha upper)");
+ connect(comboStyle, SIGNAL(activated(int)), this, SLOT(textStyle(int)));
+
+ connect(comboFont, SIGNAL(activated(const QString &)), this, SLOT(textFamily(const QString &)));
+
+ comboSize->setObjectName("comboSize");
+ comboSize->setEditable(true);
+
+ QFontDatabase db;
+ foreach(int size, db.standardSizes())
+ {
+ comboSize->addItem(QString::number(size));
+ }
+
+ connect(comboSize, SIGNAL(activated(const QString &)), this, SLOT(textSize(const QString &)));
+ comboSize->setCurrentIndex(comboSize->findText(QString::number(QApplication::font().pointSize())));
+
+ connect(textEdit, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)), this, SLOT(currentCharFormatChanged(const QTextCharFormat &)));
+ connect(textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged()));
+
+ textEdit->setFocus();
+
+ fontChanged(textEdit->font());
+ colorChanged(textEdit->textColor());
+ alignmentChanged(textEdit->alignment());
+
+ toolUndo->setDefaultAction(actionUndo);
+ toolRedo->setDefaultAction(actionRedo);
+ toolCut->setDefaultAction(actionCut);
+ toolCopy->setDefaultAction(actionCopy);
+ toolPaste->setDefaultAction(actionPaste);
+
+ actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty());
+ actionUndo->setEnabled(textEdit->document()->isUndoAvailable());
+ actionRedo->setEnabled(textEdit->document()->isRedoAvailable());
+
+ connect(textEdit->document(), SIGNAL(undoAvailable(bool)), actionUndo, SLOT(setEnabled(bool)));
+ connect(textEdit->document(), SIGNAL(redoAvailable(bool)), actionRedo, SLOT(setEnabled(bool)));
+
+ connect(actionUndo, SIGNAL(triggered()), textEdit, SLOT(undo()));
+ connect(actionRedo, SIGNAL(triggered()), textEdit, SLOT(redo()));
+
+ actionCut->setEnabled(false);
+ actionCopy->setEnabled(false);
+
+ connect(actionCut, SIGNAL(triggered()), textEdit, SLOT(cut()));
+ connect(actionCopy, SIGNAL(triggered()), textEdit, SLOT(copy()));
+ connect(actionPaste, SIGNAL(triggered()), textEdit, SLOT(paste()));
+
+ connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool)));
+ connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool)));
+
+ connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged()));
+
+}
+
+
+CTextEditWidget::~CTextEditWidget()
+{
+}
+
+QString CTextEditWidget::getHtml()
+{
+ QString str = textEdit->toHtml();
+ QRegExp re(".*(\\<body.*body\\>).*");
+ if(re.exactMatch(str))
+ {
+ str = re.cap(1);
+ str = str.replace("body>","div>").replace("<body","<div");
+ }
+
+ return str;
+}
+
+void CTextEditWidget::textBold()
+{
+ QTextCharFormat fmt;
+ fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal);
+ mergeFormatOnWordOrSelection(fmt);
+}
+
+
+void CTextEditWidget::textUnderline()
+{
+ QTextCharFormat fmt;
+ fmt.setFontUnderline(actionTextUnderline->isChecked());
+ mergeFormatOnWordOrSelection(fmt);
+}
+
+
+void CTextEditWidget::textItalic()
+{
+ QTextCharFormat fmt;
+ fmt.setFontItalic(actionTextItalic->isChecked());
+ mergeFormatOnWordOrSelection(fmt);
+}
+
+
+void CTextEditWidget::textAlign(QAction *a)
+{
+ if (a == actionAlignLeft)
+ textEdit->setAlignment(Qt::AlignLeft);
+ else if (a == actionAlignCenter)
+ textEdit->setAlignment(Qt::AlignHCenter);
+ else if (a == actionAlignRight)
+ textEdit->setAlignment(Qt::AlignRight);
+ else if (a == actionAlignJustify)
+ textEdit->setAlignment(Qt::AlignJustify);
+}
+
+
+void CTextEditWidget::textFamily(const QString &f)
+{
+ QTextCharFormat fmt;
+ fmt.setFontFamily(f);
+ mergeFormatOnWordOrSelection(fmt);
+}
+
+
+void CTextEditWidget::textSize(const QString &p)
+{
+ QTextCharFormat fmt;
+ fmt.setFontPointSize(p.toFloat());
+ mergeFormatOnWordOrSelection(fmt);
+}
+
+
+void CTextEditWidget::textStyle(int styleIndex)
+{
+ QTextCursor cursor = textEdit->textCursor();
+
+ if (styleIndex != 0)
+ {
+ QTextListFormat::Style style = QTextListFormat::ListDisc;
+
+ switch (styleIndex)
+ {
+ default:
+ case 1:
+ style = QTextListFormat::ListDisc;
+ break;
+ case 2:
+ style = QTextListFormat::ListCircle;
+ break;
+ case 3:
+ style = QTextListFormat::ListSquare;
+ break;
+ case 4:
+ style = QTextListFormat::ListDecimal;
+ break;
+ case 5:
+ style = QTextListFormat::ListLowerAlpha;
+ break;
+ case 6:
+ style = QTextListFormat::ListUpperAlpha;
+ break;
+ }
+
+ cursor.beginEditBlock();
+
+ QTextBlockFormat blockFmt = cursor.blockFormat();
+
+ QTextListFormat listFmt;
+
+ if (cursor.currentList())
+ {
+ listFmt = cursor.currentList()->format();
+ }
+ else
+ {
+ listFmt.setIndent(blockFmt.indent() + 1);
+ blockFmt.setIndent(0);
+ cursor.setBlockFormat(blockFmt);
+ }
+
+ listFmt.setStyle(style);
+
+ cursor.createList(listFmt);
+
+ cursor.endEditBlock();
+ }
+ else
+ {
+ // ####
+ QTextBlockFormat bfmt;
+ bfmt.setObjectIndex(-1);
+ cursor.mergeBlockFormat(bfmt);
+ }
+}
+
+
+void CTextEditWidget::textColor()
+{
+ QColor col = QColorDialog::getColor(textEdit->textColor(), this);
+ if (!col.isValid())
+ return;
+ QTextCharFormat fmt;
+ fmt.setForeground(col);
+ mergeFormatOnWordOrSelection(fmt);
+ colorChanged(col);
+}
+
+
+void CTextEditWidget::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
+{
+ QTextCursor cursor = textEdit->textCursor();
+ if (!cursor.hasSelection())
+ cursor.select(QTextCursor::WordUnderCursor);
+ cursor.mergeCharFormat(format);
+ textEdit->mergeCurrentCharFormat(format);
+}
+
+
+void CTextEditWidget::fontChanged(const QFont &f)
+{
+ comboFont->setCurrentIndex(comboFont->findText(QFontInfo(f).family()));
+ comboSize->setCurrentIndex(comboSize->findText(QString::number(f.pointSize())));
+ actionTextBold->setChecked(f.bold());
+ actionTextItalic->setChecked(f.italic());
+ actionTextUnderline->setChecked(f.underline());
+}
+
+
+void CTextEditWidget::colorChanged(const QColor &c)
+{
+ QPixmap pix(16, 16);
+ pix.fill(c);
+ actionTextColor->setIcon(pix);
+}
+
+
+void CTextEditWidget::alignmentChanged(Qt::Alignment a)
+{
+ if (a & Qt::AlignLeft)
+ {
+ actionAlignLeft->setChecked(true);
+ }
+ else if (a & Qt::AlignHCenter)
+ {
+ actionAlignCenter->setChecked(true);
+ }
+ else if (a & Qt::AlignRight)
+ {
+ actionAlignRight->setChecked(true);
+ }
+ else if (a & Qt::AlignJustify)
+ {
+ actionAlignJustify->setChecked(true);
+ }
+}
+
+
+void CTextEditWidget::currentCharFormatChanged(const QTextCharFormat &format)
+{
+ fontChanged(format.font());
+ colorChanged(format.foreground().color());
+}
+
+
+void CTextEditWidget::cursorPositionChanged()
+{
+ alignmentChanged(textEdit->alignment());
+}
+
+
+void CTextEditWidget::clipboardDataChanged()
+{
+ actionPaste->setEnabled(!QApplication::clipboard()->text().isEmpty());
+}
diff --git a/src/helpers/CTextEditWidget.h b/src/helpers/CTextEditWidget.h
new file mode 100644
index 0000000..dc12bf0
--- /dev/null
+++ b/src/helpers/CTextEditWidget.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+ **
+ ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
+ ** This file is part of the demonstration applications of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:LGPL$
+ ** Commercial License Usage
+ ** Licensees holding valid commercial Qt licenses may use this file in
+ ** accordance with the commercial license agreement provided with the
+ ** Software or, alternatively, in accordance with the terms contained in
+ ** a written agreement between you and Digia. For licensing terms and
+ ** conditions see http://qt.digia.com/licensing. For further information
+ ** use the contact form at http://qt.digia.com/contact-us.
+ **
+ ** GNU Lesser General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU Lesser
+ ** General Public License version 2.1 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.LGPL included in the
+ ** packaging of this file. Please review the following information to
+ ** ensure the GNU Lesser General Public License version 2.1 requirements
+ ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Digia gives you certain additional
+ ** rights. These rights are described in the Digia Qt LGPL Exception
+ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU
+ ** General Public License version 3.0 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file. Please review the following information to
+ ** ensure the GNU General Public License version 3.0 requirements will be
+ ** met: http://www.gnu.org/copyleft/gpl.html.
+ **
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
+
+#ifndef CTEXTEDITWIDGET_H
+#define CTEXTEDITWIDGET_H
+
+#include <QDialog>
+#include <QTextCharFormat>
+#include <QTextBlockFormat>
+#include <QPointer>
+#include "ui_ITextEditWidget.h"
+
+
+class CTextEditWidget : public QDialog, private Ui::ITextEditWidget
+{
+ Q_OBJECT
+ public:
+ CTextEditWidget(QWidget * parent);
+ virtual ~CTextEditWidget();
+
+ QString getHtml();
+ void setHtml(const QString& text){textEdit->clear(); textEdit->insertHtml(text);}
+
+ private slots:
+ void textBold();
+ void textUnderline();
+ void textItalic();
+ void textFamily(const QString &f);
+ void textSize(const QString &p);
+ void textStyle(int styleIndex);
+ void textColor();
+ void textAlign(QAction *a);
+
+ void currentCharFormatChanged(const QTextCharFormat &format);
+ void cursorPositionChanged();
+ void clipboardDataChanged();
+
+ private:
+ void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
+ void fontChanged(const QFont &f);
+ void colorChanged(const QColor &c);
+ void alignmentChanged(Qt::Alignment a);
+
+ QAction * actionTextColor;
+
+};
+#endif //CTEXTEDITWIDGET_H
diff --git a/src/helpers/CWptIconDialog.cpp b/src/helpers/CWptIconDialog.cpp
new file mode 100644
index 0000000..6ac826c
--- /dev/null
+++ b/src/helpers/CWptIconDialog.cpp
@@ -0,0 +1,110 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "helpers/CWptIconDialog.h"
+#include "gis/WptIcons.h"
+
+#include <QtWidgets>
+
+static bool keyLessThanAlpha(const QString& s1, const QString& s2)
+{
+ QRegExp re("[0-9]*");
+
+ QString _s1 = s1;
+ QString _s2 = s2;
+
+ _s1.remove(re);
+ _s2.remove(re);
+
+ if(_s1 == _s2)
+ {
+ QRegExp re(".*([0-9]*).*");
+
+ if(re.exactMatch(s1))
+ {
+ _s1 = re.cap(1);
+ }
+ else
+ {
+ _s1 = "0";
+ }
+
+ if(re.exactMatch(s2))
+ {
+ _s2 = re.cap(1);
+ }
+ else
+ {
+ _s2 = "0";
+ }
+
+ return _s1.toInt() < _s2.toInt();
+ }
+ return s1 < s2;
+}
+
+
+CWptIconDialog::CWptIconDialog(QToolButton *parent)
+ : button(*parent)
+{
+ setupUi(this);
+
+ QString currentIcon = button.objectName();
+ QListWidgetItem * currentItem = 0;
+
+ const QMap<QString, icon_t>& wptIcons = getWptIcons();
+ QStringList keys = wptIcons.keys();
+ QString key;
+
+ qSort(keys.begin(), keys.end(), keyLessThanAlpha);
+
+ foreach(key, keys)
+ {
+ const QString& icon = wptIcons[key].path;
+ QPixmap pixmap = loadIcon(icon);
+
+ QListWidgetItem * item = new QListWidgetItem(pixmap, key, listWidget);
+ if(currentIcon == key)
+ {
+ currentItem = item;
+ }
+
+ }
+
+ if(currentItem)
+ {
+ listWidget->setCurrentItem(currentItem);
+ listWidget->scrollToItem(currentItem);
+ }
+
+ connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(slotItemClicked(QListWidgetItem*)));
+
+}
+
+CWptIconDialog::~CWptIconDialog()
+{
+
+}
+
+void CWptIconDialog::slotItemClicked(QListWidgetItem * item)
+{
+ button.setIcon(item->icon());
+ button.setObjectName(item->text());
+ button.setToolTip(item->text());
+ accept();
+}
diff --git a/src/mouse/CMouseNormal.h b/src/helpers/CWptIconDialog.h
similarity index 67%
copy from src/mouse/CMouseNormal.h
copy to src/helpers/CWptIconDialog.h
index 400a667..7b069c9 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/helpers/CWptIconDialog.h
@@ -16,29 +16,29 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CWPTICONDIALOG_H
+#define CWPTICONDIALOG_H
-#include "IMouse.h"
+#include <QDialog>
+#include "ui_IWptIconDialog.h"
-class CCanvas;
+class QToolButton;
+class QListWidgetItem;
-class CMouseNormal : public IMouse
+class CWptIconDialog : public QDialog, private Ui::IWptIconDialog
{
+ Q_OBJECT
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ CWptIconDialog(QToolButton * parent);
+ virtual ~CWptIconDialog();
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ private slots:
+ void slotItemClicked(QListWidgetItem * item);
+ private:
+ QToolButton& button;
- protected:
- bool mapMove;
-
- QPoint lastPos;
};
-#endif //CMOUSENORMAL_H
+#endif //CWPTICONDIALOG_H
diff --git a/src/helpers/IInputDialog.ui b/src/helpers/IInputDialog.ui
new file mode 100644
index 0000000..0c460d7
--- /dev/null
+++ b/src/helpers/IInputDialog.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IInputDialog</class>
+ <widget class="QDialog" name="IInputDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>294</width>
+ <height>100</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Edit...</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEdit">
+ <property name="inputMask">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>IInputDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>IInputDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/helpers/IPositionDialog.ui b/src/helpers/IPositionDialog.ui
new file mode 100644
index 0000000..6cdf09a
--- /dev/null
+++ b/src/helpers/IPositionDialog.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IPositionDialog</class>
+ <widget class="QDialog" name="IPositionDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>189</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Position ...</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Enter new position</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="lineEdit"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelWarning">
+ <property name="text">
+ <string>Bad position format. Must be:
+"[N|S] ddd mm.sss [W|E] ddd mm.sss"
+or
+"[N|S] ddd.ddd [W|E] ddd.ddd"</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>IPositionDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>IPositionDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/helpers/ITextEditWidget.ui b/src/helpers/ITextEditWidget.ui
new file mode 100644
index 0000000..7a3b091
--- /dev/null
+++ b/src/helpers/ITextEditWidget.ui
@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ITextEditWidget</class>
+ <widget class="QDialog" name="ITextEditWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>686</width>
+ <height>341</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QVBoxLayout">
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolUndo">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolRedo">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolCut">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolCopy">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolPaste">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout">
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QToolButton" name="toolBold">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolItalic">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolUnder">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolLeft">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolCenter">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolRight">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolBlock">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="toolColor">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboStyle"/>
+ </item>
+ <item>
+ <widget class="QFontComboBox" name="comboFont"/>
+ </item>
+ <item>
+ <widget class="QComboBox" name="comboSize"/>
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QTextEdit" name="textEdit"/>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ <action name="actionUndo">
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/Undo.png</normaloff>:/icons/32x32/Undo.png</iconset>
+ </property>
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Z</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/Redo.png</normaloff>:/icons/32x32/Redo.png</iconset>
+ </property>
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Shift+Z</string>
+ </property>
+ </action>
+ <action name="actionCut">
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/Cut.png</normaloff>:/icons/32x32/Cut.png</iconset>
+ </property>
+ <property name="text">
+ <string>Cut</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+X</string>
+ </property>
+ </action>
+ <action name="actionCopy">
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/Copy.png</normaloff>:/icons/32x32/Copy.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+C</string>
+ </property>
+ </action>
+ <action name="actionPaste">
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/Paste.png</normaloff>:/icons/32x32/Paste.png</iconset>
+ </property>
+ <property name="text">
+ <string>Paste</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+V</string>
+ </property>
+ </action>
+ <action name="actionAlignLeft">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextLeft.png</normaloff>:/icons/32x32/TextLeft.png</iconset>
+ </property>
+ <property name="text">
+ <string>Align Left</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+L</string>
+ </property>
+ </action>
+ <action name="actionAlignRight">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextRight.png</normaloff>:/icons/32x32/TextRight.png</iconset>
+ </property>
+ <property name="text">
+ <string>Align Right</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+R</string>
+ </property>
+ </action>
+ <action name="actionAlignCenter">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextCenter.png</normaloff>:/icons/32x32/TextCenter.png</iconset>
+ </property>
+ <property name="text">
+ <string>Align Center</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+E</string>
+ </property>
+ </action>
+ <action name="actionAlignJustify">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextJustified.png</normaloff>:/icons/32x32/TextJustified.png</iconset>
+ </property>
+ <property name="text">
+ <string>Align Block</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+J</string>
+ </property>
+ </action>
+ <action name="actionTextUnderline">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextUnderlined.png</normaloff>:/icons/32x32/TextUnderlined.png</iconset>
+ </property>
+ <property name="text">
+ <string>Underline</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+U</string>
+ </property>
+ </action>
+ <action name="actionTextBold">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextBold.png</normaloff>:/icons/32x32/TextBold.png</iconset>
+ </property>
+ <property name="text">
+ <string>Bold</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+B</string>
+ </property>
+ </action>
+ <action name="actionTextItalic">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../resources.qrc">
+ <normaloff>:/icons/32x32/TextItalic.png</normaloff>:/icons/32x32/TextItalic.png</iconset>
+ </property>
+ <property name="text">
+ <string>Italic</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+I</string>
+ </property>
+ </action>
+ </widget>
+ <resources>
+ <include location="../resources.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ITextEditWidget</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>454</x>
+ <y>479</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>454</x>
+ <y>250</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ITextEditWidget</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>454</x>
+ <y>479</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>454</x>
+ <y>250</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/helpers/IWptIconDialog.ui b/src/helpers/IWptIconDialog.ui
new file mode 100644
index 0000000..fdbe0fe
--- /dev/null
+++ b/src/helpers/IWptIconDialog.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IWptIconDialog</class>
+ <widget class="QDialog" name="IWptIconDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Icons...</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListWidget" name="listWidget">
+ <property name="iconSize">
+ <size>
+ <width>22</width>
+ <height>22</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/icons/16x16/Copy.png b/src/icons/16x16/Copy.png
new file mode 100644
index 0000000..37e8b15
Binary files /dev/null and b/src/icons/16x16/Copy.png differ
diff --git a/src/icons/16x16/Cut.png b/src/icons/16x16/Cut.png
new file mode 100644
index 0000000..4038594
Binary files /dev/null and b/src/icons/16x16/Cut.png differ
diff --git a/src/icons/16x16/EditDetails.png b/src/icons/16x16/EditDetails.png
new file mode 100644
index 0000000..8ba6c6a
Binary files /dev/null and b/src/icons/16x16/EditDetails.png differ
diff --git a/src/icons/16x16/EditText.png b/src/icons/16x16/EditText.png
new file mode 100644
index 0000000..020eb1f
Binary files /dev/null and b/src/icons/16x16/EditText.png differ
diff --git a/src/icons/16x16/Lock.png b/src/icons/16x16/Lock.png
new file mode 100644
index 0000000..341d99b
Binary files /dev/null and b/src/icons/16x16/Lock.png differ
diff --git a/src/icons/16x16/Paste.png b/src/icons/16x16/Paste.png
new file mode 100644
index 0000000..9299483
Binary files /dev/null and b/src/icons/16x16/Paste.png differ
diff --git a/src/icons/16x16/Redo.png b/src/icons/16x16/Redo.png
new file mode 100644
index 0000000..152d108
Binary files /dev/null and b/src/icons/16x16/Redo.png differ
diff --git a/src/icons/16x16/Tainted.png b/src/icons/16x16/Tainted.png
new file mode 100644
index 0000000..0aa8787
Binary files /dev/null and b/src/icons/16x16/Tainted.png differ
diff --git a/src/icons/16x16/TextBold.png b/src/icons/16x16/TextBold.png
new file mode 100644
index 0000000..03511aa
Binary files /dev/null and b/src/icons/16x16/TextBold.png differ
diff --git a/src/icons/16x16/TextCenter.png b/src/icons/16x16/TextCenter.png
new file mode 100644
index 0000000..1f6ff0a
Binary files /dev/null and b/src/icons/16x16/TextCenter.png differ
diff --git a/src/icons/16x16/TextItalic.png b/src/icons/16x16/TextItalic.png
new file mode 100644
index 0000000..f835405
Binary files /dev/null and b/src/icons/16x16/TextItalic.png differ
diff --git a/src/icons/16x16/TextJustified.png b/src/icons/16x16/TextJustified.png
new file mode 100644
index 0000000..d690e97
Binary files /dev/null and b/src/icons/16x16/TextJustified.png differ
diff --git a/src/icons/16x16/TextLeft.png b/src/icons/16x16/TextLeft.png
new file mode 100644
index 0000000..706ee38
Binary files /dev/null and b/src/icons/16x16/TextLeft.png differ
diff --git a/src/icons/16x16/TextRight.png b/src/icons/16x16/TextRight.png
new file mode 100644
index 0000000..1fdb13c
Binary files /dev/null and b/src/icons/16x16/TextRight.png differ
diff --git a/src/icons/16x16/TextUnderlined.png b/src/icons/16x16/TextUnderlined.png
new file mode 100644
index 0000000..dde7945
Binary files /dev/null and b/src/icons/16x16/TextUnderlined.png differ
diff --git a/src/icons/16x16/TimeZoneSetup.png b/src/icons/16x16/TimeZoneSetup.png
new file mode 100644
index 0000000..dad688c
Binary files /dev/null and b/src/icons/16x16/TimeZoneSetup.png differ
diff --git a/src/icons/16x16/Track.png b/src/icons/16x16/Track.png
new file mode 100644
index 0000000..005fdd0
Binary files /dev/null and b/src/icons/16x16/Track.png differ
diff --git a/src/icons/16x16/UnLock.png b/src/icons/16x16/UnLock.png
new file mode 100644
index 0000000..7b91225
Binary files /dev/null and b/src/icons/16x16/UnLock.png differ
diff --git a/src/icons/16x16/Undo.png b/src/icons/16x16/Undo.png
new file mode 100644
index 0000000..e1d8d2d
Binary files /dev/null and b/src/icons/16x16/Undo.png differ
diff --git a/src/icons/16x16/WptMove.png b/src/icons/16x16/WptMove.png
new file mode 100644
index 0000000..637d557
Binary files /dev/null and b/src/icons/16x16/WptMove.png differ
diff --git a/src/icons/16x16/WptProj.png b/src/icons/16x16/WptProj.png
new file mode 100644
index 0000000..ae26822
Binary files /dev/null and b/src/icons/16x16/WptProj.png differ
diff --git a/src/icons/32x32/Copy.png b/src/icons/32x32/Copy.png
new file mode 100644
index 0000000..3142509
Binary files /dev/null and b/src/icons/32x32/Copy.png differ
diff --git a/src/icons/32x32/Cut.png b/src/icons/32x32/Cut.png
new file mode 100644
index 0000000..f11af8c
Binary files /dev/null and b/src/icons/32x32/Cut.png differ
diff --git a/src/icons/32x32/EditDetails.png b/src/icons/32x32/EditDetails.png
new file mode 100644
index 0000000..27b79da
Binary files /dev/null and b/src/icons/32x32/EditDetails.png differ
diff --git a/src/icons/32x32/EditText.png b/src/icons/32x32/EditText.png
new file mode 100644
index 0000000..dba416d
Binary files /dev/null and b/src/icons/32x32/EditText.png differ
diff --git a/src/icons/32x32/Lock.png b/src/icons/32x32/Lock.png
new file mode 100644
index 0000000..b3dfa83
Binary files /dev/null and b/src/icons/32x32/Lock.png differ
diff --git a/src/icons/32x32/Paste.png b/src/icons/32x32/Paste.png
new file mode 100644
index 0000000..92f6a8f
Binary files /dev/null and b/src/icons/32x32/Paste.png differ
diff --git a/src/icons/32x32/Redo.png b/src/icons/32x32/Redo.png
new file mode 100644
index 0000000..2bf3eaf
Binary files /dev/null and b/src/icons/32x32/Redo.png differ
diff --git a/src/icons/32x32/Tainted.png b/src/icons/32x32/Tainted.png
new file mode 100644
index 0000000..0fdf791
Binary files /dev/null and b/src/icons/32x32/Tainted.png differ
diff --git a/src/icons/32x32/TextBold.png b/src/icons/32x32/TextBold.png
new file mode 100644
index 0000000..341b50f
Binary files /dev/null and b/src/icons/32x32/TextBold.png differ
diff --git a/src/icons/32x32/TextCenter.png b/src/icons/32x32/TextCenter.png
new file mode 100644
index 0000000..a5300dc
Binary files /dev/null and b/src/icons/32x32/TextCenter.png differ
diff --git a/src/icons/32x32/TextItalic.png b/src/icons/32x32/TextItalic.png
new file mode 100644
index 0000000..c7692ea
Binary files /dev/null and b/src/icons/32x32/TextItalic.png differ
diff --git a/src/icons/32x32/TextJustified.png b/src/icons/32x32/TextJustified.png
new file mode 100644
index 0000000..21a1d96
Binary files /dev/null and b/src/icons/32x32/TextJustified.png differ
diff --git a/src/icons/32x32/TextLeft.png b/src/icons/32x32/TextLeft.png
new file mode 100644
index 0000000..fa1129a
Binary files /dev/null and b/src/icons/32x32/TextLeft.png differ
diff --git a/src/icons/32x32/TextRight.png b/src/icons/32x32/TextRight.png
new file mode 100644
index 0000000..3f13727
Binary files /dev/null and b/src/icons/32x32/TextRight.png differ
diff --git a/src/icons/32x32/TextUnderlined.png b/src/icons/32x32/TextUnderlined.png
new file mode 100644
index 0000000..d36cc54
Binary files /dev/null and b/src/icons/32x32/TextUnderlined.png differ
diff --git a/src/icons/32x32/TimeZoneSetup.png b/src/icons/32x32/TimeZoneSetup.png
new file mode 100644
index 0000000..aeef989
Binary files /dev/null and b/src/icons/32x32/TimeZoneSetup.png differ
diff --git a/src/icons/32x32/Track.png b/src/icons/32x32/Track.png
new file mode 100644
index 0000000..722cb10
Binary files /dev/null and b/src/icons/32x32/Track.png differ
diff --git a/src/icons/32x32/UnLock.png b/src/icons/32x32/UnLock.png
new file mode 100644
index 0000000..9b05708
Binary files /dev/null and b/src/icons/32x32/UnLock.png differ
diff --git a/src/icons/32x32/Undo.png b/src/icons/32x32/Undo.png
new file mode 100644
index 0000000..83da60e
Binary files /dev/null and b/src/icons/32x32/Undo.png differ
diff --git a/src/icons/32x32/WptMove.png b/src/icons/32x32/WptMove.png
new file mode 100644
index 0000000..9e1a4d8
Binary files /dev/null and b/src/icons/32x32/WptMove.png differ
diff --git a/src/icons/32x32/WptProj.png b/src/icons/32x32/WptProj.png
new file mode 100644
index 0000000..da1a705
Binary files /dev/null and b/src/icons/32x32/WptProj.png differ
diff --git a/src/icons/48x48/Copy.png b/src/icons/48x48/Copy.png
new file mode 100644
index 0000000..f7cbf25
Binary files /dev/null and b/src/icons/48x48/Copy.png differ
diff --git a/src/icons/48x48/Cut.png b/src/icons/48x48/Cut.png
new file mode 100644
index 0000000..bd84fb4
Binary files /dev/null and b/src/icons/48x48/Cut.png differ
diff --git a/src/icons/48x48/EditDetails.png b/src/icons/48x48/EditDetails.png
new file mode 100644
index 0000000..96f926f
Binary files /dev/null and b/src/icons/48x48/EditDetails.png differ
diff --git a/src/icons/48x48/EditText.png b/src/icons/48x48/EditText.png
new file mode 100644
index 0000000..98bb018
Binary files /dev/null and b/src/icons/48x48/EditText.png differ
diff --git a/src/icons/48x48/Lock.png b/src/icons/48x48/Lock.png
new file mode 100644
index 0000000..7f46dd8
Binary files /dev/null and b/src/icons/48x48/Lock.png differ
diff --git a/src/icons/48x48/Paste.png b/src/icons/48x48/Paste.png
new file mode 100644
index 0000000..ef15ebe
Binary files /dev/null and b/src/icons/48x48/Paste.png differ
diff --git a/src/icons/48x48/Redo.png b/src/icons/48x48/Redo.png
new file mode 100644
index 0000000..48f1d77
Binary files /dev/null and b/src/icons/48x48/Redo.png differ
diff --git a/src/icons/48x48/Tainted.png b/src/icons/48x48/Tainted.png
new file mode 100644
index 0000000..f00af4d
Binary files /dev/null and b/src/icons/48x48/Tainted.png differ
diff --git a/src/icons/48x48/TextBold.png b/src/icons/48x48/TextBold.png
new file mode 100644
index 0000000..491d97b
Binary files /dev/null and b/src/icons/48x48/TextBold.png differ
diff --git a/src/icons/48x48/TextCenter.png b/src/icons/48x48/TextCenter.png
new file mode 100644
index 0000000..13152e9
Binary files /dev/null and b/src/icons/48x48/TextCenter.png differ
diff --git a/src/icons/48x48/TextItalic.png b/src/icons/48x48/TextItalic.png
new file mode 100644
index 0000000..cf76e08
Binary files /dev/null and b/src/icons/48x48/TextItalic.png differ
diff --git a/src/icons/48x48/TextJustified.png b/src/icons/48x48/TextJustified.png
new file mode 100644
index 0000000..c1a6828
Binary files /dev/null and b/src/icons/48x48/TextJustified.png differ
diff --git a/src/icons/48x48/TextLeft.png b/src/icons/48x48/TextLeft.png
new file mode 100644
index 0000000..3bbc01a
Binary files /dev/null and b/src/icons/48x48/TextLeft.png differ
diff --git a/src/icons/48x48/TextRight.png b/src/icons/48x48/TextRight.png
new file mode 100644
index 0000000..983c748
Binary files /dev/null and b/src/icons/48x48/TextRight.png differ
diff --git a/src/icons/48x48/TextUnderlined.png b/src/icons/48x48/TextUnderlined.png
new file mode 100644
index 0000000..8f321f1
Binary files /dev/null and b/src/icons/48x48/TextUnderlined.png differ
diff --git a/src/icons/48x48/TimeZoneSetup.png b/src/icons/48x48/TimeZoneSetup.png
new file mode 100644
index 0000000..fefcf7c
Binary files /dev/null and b/src/icons/48x48/TimeZoneSetup.png differ
diff --git a/src/icons/48x48/Track.png b/src/icons/48x48/Track.png
new file mode 100644
index 0000000..e1adc49
Binary files /dev/null and b/src/icons/48x48/Track.png differ
diff --git a/src/icons/48x48/UnLock.png b/src/icons/48x48/UnLock.png
new file mode 100644
index 0000000..2f42de7
Binary files /dev/null and b/src/icons/48x48/UnLock.png differ
diff --git a/src/icons/48x48/Undo.png b/src/icons/48x48/Undo.png
new file mode 100644
index 0000000..539adb0
Binary files /dev/null and b/src/icons/48x48/Undo.png differ
diff --git a/src/icons/48x48/WptMove.png b/src/icons/48x48/WptMove.png
new file mode 100644
index 0000000..d1e33ae
Binary files /dev/null and b/src/icons/48x48/WptMove.png differ
diff --git a/src/icons/48x48/WptProj.png b/src/icons/48x48/WptProj.png
new file mode 100644
index 0000000..ebf08ca
Binary files /dev/null and b/src/icons/48x48/WptProj.png differ
diff --git a/src/icons/Copy.svg b/src/icons/Copy.svg
new file mode 100644
index 0000000..3cfab55
--- /dev/null
+++ b/src/icons/Copy.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Copy.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-16.101692"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#80b3ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.76969867999999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3828"
+ width="24.230301"
+ height="34.230301"
+ x="30.521212"
+ y="9.4303045" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3828-0-5"
+ width="24.230301"
+ height="34.230301"
+ x="15.066664"
+ y="14.430304" />
+ <rect
+ style="fill:#80b3ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.76969867999999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3828-0"
+ width="24.230301"
+ height="34.230301"
+ x="15.430301"
+ y="14.430304" />
+ </g>
+</svg>
diff --git a/src/icons/Cut.svg b/src/icons/Cut.svg
new file mode 100644
index 0000000..7358ed5
--- /dev/null
+++ b/src/icons/Cut.svg
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Reset.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="10.807399"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3802"
+ transform="matrix(0.5008634,0.5008634,-0.5901085,0.5901085,26.198928,-1.0442194)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2985"
+ d="M 47.450321,2.8460541 25.71827,36.48707 l 0.113261,0.678826 c -1.109489,-0.860424 -2.476507,-1.405207 -3.985856,-1.471294 -3.878786,-0.169833 -7.178242,2.848455 -7.348076,6.727241 -0.169834,3.878787 2.848455,7.178243 6.727241,7.348077 3.261057,0.142786 6.095959,-1.990567 7.018529,-4.968949 C 33.994625,33.922742 53.422885,17.314064 47.450321,2.8460541 z"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2985-4"
+ d="m 15.618132,2.846054 21.73205,33.641016 -0.113261,0.678826 c 1.109489,-0.860424 2.476508,-1.405207 3.985857,-1.471294 3.878786,-0.169833 7.178242,2.848455 7.348076,6.727241 0.169835,3.878787 -2.848455,7.178243 -6.727241,7.348077 -3.261057,0.142786 -6.095959,-1.990567 -7.018529,-4.968949 C 29.073828,33.922742 9.6455677,17.314064 15.618132,2.846054 z"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ transform="translate(-0.27272727,-0.45454545)"
+ sodipodi:open="true"
+ sodipodi:end="12.08609"
+ sodipodi:start="5.8033439"
+ d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+ sodipodi:ry="4"
+ sodipodi:rx="4"
+ sodipodi:cy="43"
+ sodipodi:cx="22"
+ id="path3780"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <path
+ transform="translate(19.636364,-0.27272769)"
+ sodipodi:open="true"
+ sodipodi:end="12.08609"
+ sodipodi:start="5.8033439"
+ d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+ sodipodi:ry="4"
+ sodipodi:rx="4"
+ sodipodi:cy="43"
+ sodipodi:cx="22"
+ id="path3780-5"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <path
+ transform="translate(0.18181818,0.9090909)"
+ sodipodi:open="true"
+ sodipodi:end="12.08609"
+ sodipodi:start="5.8033439"
+ d="m 31.887068,31.538362 c 0.254956,0.489914 0.06449,1.09375 -0.42543,1.348706 -0.489914,0.254956 -1.09375,0.06448 -1.348706,-0.42543 -0.254956,-0.489914 -0.06449,-1.09375 0.42543,-1.348706 0.489762,-0.254877 1.093411,-0.06461 1.348503,0.42504"
+ sodipodi:ry="1"
+ sodipodi:rx="1"
+ sodipodi:cy="32"
+ sodipodi:cx="31"
+ id="path3800"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/EditDetails.svg b/src/icons/EditDetails.svg
new file mode 100644
index 0000000..925a821
--- /dev/null
+++ b/src/icons/EditDetails.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3020"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="EditDetails.svg">
+ <defs
+ id="defs3022" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="-39.440679"
+ inkscape:cy="46.105385"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3017" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3025">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3019"
+ transform="translate(0.69365709,2.7272728)">
+ <rect
+ style="fill:none;stroke:#000080;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4156-1"
+ width="37.47588"
+ height="40"
+ x="11.625697"
+ y="11.454543" />
+ <g
+ id="g3012">
+ <path
+ id="path4129-7-3-9"
+ style="fill:#ffffff;stroke:#ffffff;stroke-width:4.43720007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 12.578659,31.869715 c 5.995718,9.867863 18.720945,12.923577 28.422579,6.82512 2.822568,-1.774263 5.18323,-4.214229 6.882092,-7.113257 M 12.843943,31.039361 c 5.995719,-9.867863 18.720945,-12.923577 28.422579,-6.82512 2.822568,1.774263 5.18323,4.214228 6.882092,7.113257"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4129-7-3"
+ style="fill:#ffffff;stroke:#000080;stroke-width:2.03560519;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="m 12.578658,31.869715 c 5.995718,9.867863 18.720946,12.923577 28.42258,6.82512 2.822568,-1.774263 5.18323,-4.214229 6.882092,-7.113257 M 12.843942,31.039361 c 5.995719,-9.867863 18.720946,-12.923577 28.42258,-6.82512 2.822568,1.774263 5.18323,4.214228 6.882092,7.113257"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:open="true"
+ sodipodi:end="12.02886"
+ sodipodi:start="5.8033439"
+ d="m 379.43534,30.05399 c 1.27478,2.449571 0.32242,5.468754 -2.12715,6.743533 -2.44957,1.27478 -5.46875,0.322423 -6.74353,-2.127148 -1.27478,-2.449571 -0.32242,-5.468754 2.12715,-6.743533 2.35027,-1.223101 5.24659,-0.40052 6.60312,1.875344"
+ sodipodi:ry="5"
+ sodipodi:rx="5"
+ sodipodi:cy="32.362183"
+ sodipodi:cx="375"
+ id="path4149-5"
+ style="fill:#000080;stroke:#000080;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc"
+ transform="matrix(0.89711754,0,0,0.95224119,-306.05544,0.63780763)" />
+ </g>
+ </g>
+ <g
+ id="g3856"
+ transform="translate(62.545455,0)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3828"
+ d="m -23.809459,52.661657 -0.134742,-7.426612 5.927764,-16.286397 3.098624,-0.716586 1.91307,2.540693 -5.927764,16.286397 z"
+ style="fill:none;stroke:#ffffff;stroke-width:3.04031777;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3026"
+ d="m -18.016437,28.948648 5.011694,1.824107 -5.927764,16.286397 -4.876952,5.602505 -0.134742,-7.426612 z"
+ style="fill:#00ff00;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3032"
+ d="m -23.809459,52.661657 -0.134742,-7.426612 3.098624,-0.716586 1.91307,2.540693 z"
+ style="fill:none;stroke:#000000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3034"
+ d="m -15.51059,29.860701 -5.334987,14.657758"
+ style="fill:none;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3036"
+ d="m -18.016437,28.948648 3.098624,-0.716586 1.91307,2.540693 z"
+ style="fill:none;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/EditText.svg b/src/icons/EditText.svg
new file mode 100644
index 0000000..477b5cd
--- /dev/null
+++ b/src/icons/EditText.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3020"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="EditText.svg">
+ <defs
+ id="defs3022" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="-39.440679"
+ inkscape:cy="46.105385"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3017" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3025">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect3061"
+ width="40"
+ height="40"
+ x="10.545455"
+ y="17.181818" />
+ <g
+ id="g3940"
+ inkscape:export-filename="/home/oeichler/dateien/android/QLandkarteM/QLandkarteM/icons/32x32/details.png"
+ inkscape:export-xdpi="82.103737"
+ inkscape:export-ydpi="82.103737"
+ transform="translate(-447.10042,-62.24326)">
+ <g
+ style="stroke-width:0.64298916;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(1.8825477,0,0,2.2404831,-187.12891,-135.897)"
+ id="g4051-4">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.64298916;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4006-9"
+ width="13"
+ height="15"
+ x="345"
+ y="97.362183" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:0.64298916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 346.99537,99.362183 9.00925,0"
+ id="path4010-7"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:0.64298916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 346.99537,101.86239 9.00925,0"
+ id="path4010-0-6"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-2.567705"
+ inkscape:transform-center-y="-1.9999976" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:0.64298916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 346.99538,104.36255 9.00925,0"
+ id="path4010-6-2"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="0.432295"
+ inkscape:transform-center-y="-2.9999926" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:0.64298916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 346.99537,106.86271 9.00925,0"
+ id="path4010-9-1"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:0.64298916;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 346.99538,109.36291 9.00925,0"
+ id="path4010-2-9"
+ inkscape:connector-curvature="0" />
+ </g>
+ <rect
+ y="81.544945"
+ x="457.08661"
+ height="35"
+ width="35"
+ id="rect3170"
+ style="fill:none;stroke:none" />
+ </g>
+ <g
+ id="g3856"
+ transform="translate(58.727276,-3.4545455)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3828"
+ d="m -23.809459,52.661657 -0.134742,-7.426612 5.927764,-16.286397 3.098624,-0.716586 1.91307,2.540693 -5.927764,16.286397 z"
+ style="fill:none;stroke:#ffffff;stroke-width:3.04031777;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3026"
+ d="m -18.016437,28.948648 5.011694,1.824107 -5.927764,16.286397 -4.876952,5.602505 -0.134742,-7.426612 z"
+ style="fill:#00ff00;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3032"
+ d="m -23.809459,52.661657 -0.134742,-7.426612 3.098624,-0.716586 1.91307,2.540693 z"
+ style="fill:none;stroke:#000000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3034"
+ d="m -15.51059,29.860701 -5.334987,14.657758"
+ style="fill:none;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3036"
+ d="m -18.016437,28.948648 3.098624,-0.716586 1.91307,2.540693 z"
+ style="fill:none;stroke:#008000;stroke-width:1.52015889px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/Lock.svg b/src/icons/Lock.svg
new file mode 100644
index 0000000..f0368d9
--- /dev/null
+++ b/src/icons/Lock.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Lock.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.3666667"
+ inkscape:cx="-11.088894"
+ inkscape:cy="26.053634"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect3833"
+ width="40"
+ height="40"
+ x="13.302095"
+ y="14.255609" />
+ <g
+ id="g3809"
+ transform="matrix(1,0,0,0.99201287,7.771143,-5.0510161)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2985-1"
+ d="m 25.542643,20.087077 c -5.619045,0.0082 -10.178973,4.506194 -10.196525,10.081437 l -0.02339,0 0,6.689985 3.414432,0 0,-6.109257 0,-0.534269 0.02339,0 c 0.276807,-3.474753 3.188298,-6.220567 6.758706,-6.225404 3.594667,-0.0049 6.530081,2.764158 6.782092,6.271861 l 0.07016,0 0,6.643528 3.367659,0 0,-6.643528 0,-0.04645 c 8e-6,-0.008 1.2e-5,-0.01519 0,-0.02323 -0.0083,-5.597096 -4.561505,-10.112893 -10.196524,-10.104668 z"
+ style="fill:#000080;stroke:#000000;stroke-width:1.25;stroke-miterlimit:4;stroke-dasharray:none" />
+ <rect
+ y="36.85783"
+ x="10.994746"
+ height="22.301298"
+ width="29.072412"
+ id="rect3800"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3804"
+ d="m 25.530953,40.342867 c -2.066561,0.0028 -3.744663,1.664006 -3.741844,3.716659 l 0,0.02322 c 0.0068,1.53612 0.950234,2.85445 2.29188,3.414679 l -2.666064,7.944359 8.232055,0 -2.666064,-7.967588 c 1.342229,-0.566038 2.293994,-1.87519 2.29188,-3.414679 -0.0028,-2.052653 -1.675282,-3.71946 -3.741843,-3.716659 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-miterlimit:4;stroke-dasharray:none" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/Paste.svg b/src/icons/Paste.svg
new file mode 100644
index 0000000..5c39a99
--- /dev/null
+++ b/src/icons/Paste.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Paste.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.7380554"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none"
+ id="rect3795"
+ width="40"
+ height="40"
+ x="7"
+ y="15" />
+ <rect
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8538155;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3005"
+ width="24.146185"
+ height="34.146187"
+ x="14.926908"
+ y="19.154181" />
+ <rect
+ style="fill:#80b3ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.70689117999999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3005-2"
+ width="19.293108"
+ height="29.293108"
+ x="17.353447"
+ y="19.717089" />
+ <rect
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3775"
+ width="9"
+ height="4"
+ x="22.5"
+ y="16.772724" />
+ </g>
+</svg>
diff --git a/src/icons/Redo.svg b/src/icons/Redo.svg
new file mode 100644
index 0000000..3c09275
--- /dev/null
+++ b/src/icons/Redo.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Redo.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.7781746"
+ inkscape:cx="45.867218"
+ inkscape:cy="31.764741"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3012" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3792"
+ style="fill:none;stroke:#000000;stroke-linecap:round" />
+ <path
+ style="fill:#000080;stroke:#000000;stroke-width:1.48139596px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 33.471939,11.594224 15.863518,13.833842 -15.863518,13.833842 0,-7.089844 C 19.695061,31.963488 11.27245,37.044976 10.816853,50.112828 10.987741,29.717788 19.115966,19.943888 33.471939,18.467914 l 0,-6.87369 z"
+ id="path3790"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/Tainted.svg b/src/icons/Tainted.svg
new file mode 100644
index 0000000..5dc6fc7
--- /dev/null
+++ b/src/icons/Tainted.svg
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Tainted.svg">
+ <defs
+ id="defs3515">
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3901"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path3895"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3880"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3874"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.2788078"
+ inkscape:cy="39.970484"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3090" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3118"
+ transform="translate(20,-0.81818182)"
+ style="fill:#000080">
+ <path
+ sodipodi:nodetypes="cssscssscssscssscssscssscssscsssc"
+ inkscape:connector-curvature="0"
+ id="path3021"
+ d="m 24.642907,39.416541 c 0,0 -2.951553,-3.345513 -4.326996,-1.508852 -1.375444,1.83666 5.930895,5.15156 3.057934,8.83938 -1.903592,2.443509 -4.80372,-7.551782 -6.664504,-6.560116 -1.860783,0.991665 -1.709246,3.83161 -2.218928,4.93111 -0.124849,-1.0995 1.08508,-3.878416 -0.93208,-3.937855 -2.01716,-0.05943 -0.918631,9.36436 -2.875105,8.824873 C 8.7267534,49.465594 11.431156,41.323185 9.5699149,40.432374 7.708674,39.541563 8.1451044,40.231044 7.0552703,41.107446 7.5105735,39.416 [...]
+ inkscape:transform-center-y="-0.18557266"
+ inkscape:transform-center-x="-0.00065841208"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025"
+ d="m -7.2266095,34.590805 c 0.069447,-1.033769 1.5994024,-1.718717 3.9110815,-1.80745 2.37142221,-0.09103 4.7804672,-0.717297 4.7804672,-0.717297 0,0 -2.40904486,0.626269 -4.8933345,2.323024 -2.3796957,1.130956 -3.8605196,1.237082 -3.7985811,0.207484"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025-3"
+ d="m -4.6031957,16.003649 c -0.00253,-1.199473 1.1620602,-0.69507 2.9739605,1.220551 1.8587273,1.965129 3.7174544,3.310679 3.7174544,3.310679 0,0 -1.8587271,-1.34555 -3.7174544,-1.451942 -1.8077806,-0.704591 -2.9657315,-1.871623 -2.9739304,-3.072581"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025-3-7"
+ d="m 24.333298,10.23551 c 0.0046,-0.6133697 -0.720612,0.187573 -1.85191,2.010874 -1.160536,1.870422 -2.31948,3.424622 -2.31948,3.424622 0,0 1.158944,-1.5542 2.314701,-2.475955 1.125623,-1.203289 1.848468,-2.339329 1.856652,-2.956104"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025-3-4"
+ d="m 32.727565,23.070954 c 0.243282,1.375323 -0.546442,2.125617 -2.003075,1.993576 -1.494278,-0.135454 -2.863661,0.440996 -2.863661,0.440996 0,0 1.369383,-0.57645 2.488979,-2.576708 1.21008,-1.254745 2.129455,-1.236088 2.376387,0.134465"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025-3-4-7"
+ d="m 30.08885,44.754443 c -0.12044,0.973363 -1.100825,0.322662 -2.510475,-1.606908 -1.44608,-1.97944 -2.95553,-3.456364 -2.95553,-3.456364 0,0 1.50945,1.476924 3.145638,1.948824 1.529861,0.946503 2.436592,2.133258 2.321026,3.109003"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ sodipodi:nodetypes="csccc"
+ inkscape:connector-curvature="0"
+ id="path3025-9"
+ d="M 3.040944,48.781008 C 2.4711174,48.1677 3.00625,46.733647 4.3754485,45.084192 c 1.4045848,-1.692083 2.5151617,-3.702865 2.5151617,-3.702865 0,0 -1.1105769,2.010782 -1.6331372,4.658959 -0.793484,2.266392 -1.6413677,3.349952 -2.213339,2.744127"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/TextBold.svg b/src/icons/TextBold.svg
new file mode 100644
index 0000000..23a9c97
--- /dev/null
+++ b/src/icons/TextBold.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextBold.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="21.625581"
+ inkscape:cy="29.265272"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+ x="18"
+ y="49"
+ id="text3010"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3012"
+ x="18"
+ y="49">B</tspan></text>
+ <rect
+ style="fill:none;stroke:none"
+ id="rect3054"
+ width="40"
+ height="40"
+ x="13.673828"
+ y="14.419922" />
+ </g>
+</svg>
diff --git a/src/icons/TextCenter.svg b/src/icons/TextCenter.svg
new file mode 100644
index 0000000..7db0178
--- /dev/null
+++ b/src/icons/TextCenter.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextCenter.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.1926013"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#80b3ff;stroke:#000000;stroke-width:1.51746165999999993;stroke-linejoin:round;stroke-linecap:round"
+ id="rect3005"
+ width="28.482538"
+ height="38.48254"
+ x="15.713276"
+ y="9.8041849" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,14 20,0"
+ id="path3007"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 22.5,19 15,0"
+ id="path3009"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,24 20,0"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 22.5,29 15,0"
+ id="path3013"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,34 20,0"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 22.5,39 15,0"
+ id="path3017"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,44 20,0"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/TextItalic.svg b/src/icons/TextItalic.svg
new file mode 100644
index 0000000..850b9d1
--- /dev/null
+++ b/src/icons/TextItalic.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextItalic.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="21.625581"
+ inkscape:cy="29.265272"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3054"
+ width="40"
+ height="40"
+ x="8"
+ y="11" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+ x="22.101562"
+ y="45.580078"
+ id="text3010"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3012"
+ x="22.101562"
+ y="45.580078"
+ style="font-style:italic;font-weight:normal;-inkscape-font-specification:Sans Italic">I</tspan></text>
+ </g>
+</svg>
diff --git a/src/icons/TextJustified.svg b/src/icons/TextJustified.svg
new file mode 100644
index 0000000..8dada17
--- /dev/null
+++ b/src/icons/TextJustified.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextJustified.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.1926013"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#80b3ff;stroke:#000000;stroke-width:1.51746165999999993;stroke-linejoin:round;stroke-linecap:round"
+ id="rect3005"
+ width="28.482538"
+ height="38.48254"
+ x="15.713276"
+ y="9.8041849" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,14 20,0"
+ id="path3007"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,24 20,0"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,34 20,0"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,44 20,0"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,19 20,0"
+ id="path3846"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,29 20,0"
+ id="path3848"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,39 20,0"
+ id="path3850"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/TextLeft.svg b/src/icons/TextLeft.svg
new file mode 100644
index 0000000..82c8d6c
--- /dev/null
+++ b/src/icons/TextLeft.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextLeft.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.1926013"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#80b3ff;stroke:#000000;stroke-width:1.51746165999999993;stroke-linejoin:round;stroke-linecap:round"
+ id="rect3005"
+ width="28.482538"
+ height="38.48254"
+ x="15.713276"
+ y="9.8041849" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,14 20,0"
+ id="path3007"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,19 15,0"
+ id="path3009"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,24 20,0"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,29 15,0"
+ id="path3013"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,34 20,0"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,39 15,0"
+ id="path3017"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,44 20,0"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/TextRight.svg b/src/icons/TextRight.svg
new file mode 100644
index 0000000..1641759
--- /dev/null
+++ b/src/icons/TextRight.svg
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextRight.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="-5.1926013"
+ inkscape:cy="28.929652"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:#80b3ff;stroke:#000000;stroke-width:1.51746165999999993;stroke-linejoin:round;stroke-linecap:round"
+ id="rect3005"
+ width="28.482538"
+ height="38.48254"
+ x="15.713276"
+ y="9.8041849" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,14 20,0"
+ id="path3007"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 25,19 15,0"
+ id="path3009"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,24 20,0"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 25,29 15,0"
+ id="path3013"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,34 20,0"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 25,39 15,0"
+ id="path3017"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 20,44 20,0"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/TextUnderlined.svg b/src/icons/TextUnderlined.svg
new file mode 100644
index 0000000..dfb7a45
--- /dev/null
+++ b/src/icons/TextUnderlined.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="TextUnderlined.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11"
+ inkscape:cx="21.625581"
+ inkscape:cy="29.265272"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3209"
+ transform="translate(-1.5454559,-1.1818161)">
+ <text
+ sodipodi:linespacing="125%"
+ id="text3010"
+ y="45.181816"
+ x="16.545456"
+ style="font-size:40px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;-inkscape-font-specification:Sans"
+ y="45.181816"
+ x="16.545456"
+ id="tspan3012"
+ sodipodi:role="line">U</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path3033"
+ d="m 20,47 23,0"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <rect
+ style="fill:none;stroke:none"
+ id="rect3054"
+ width="40"
+ height="40"
+ x="9.9545441"
+ y="10.579014" />
+ </g>
+</svg>
diff --git a/src/icons/TimeZoneSetup.svg b/src/icons/TimeZoneSetup.svg
new file mode 100644
index 0000000..6a618fd
--- /dev/null
+++ b/src/icons/TimeZoneSetup.svg
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3376"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Neues Dokument 2">
+ <defs
+ id="defs3378" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="-12.727273"
+ inkscape:cy="32"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3381">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g6456"
+ transform="translate(-400.67421,-84.079419)"
+ inkscape:export-filename="/home/oeichler/Code/android/QLandkarteM/QLandkarteM/icons/32x32/tripcomputer.png"
+ inkscape:export-xdpi="82.285713"
+ inkscape:export-ydpi="82.285713">
+ <rect
+ y="95.48851"
+ x="412.62875"
+ height="35"
+ width="35"
+ id="rect6452"
+ style="fill:none;stroke:none" />
+ <g
+ transform="matrix(0.75505834,0,0,0.74601516,60.127617,30.809648)"
+ id="g6441">
+ <g
+ id="g6433">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6381"
+ d="m 490.01085,93.291991 c -2.96115,0.0029 -5.95261,0.700424 -8.75,2.15625 -9.32986,4.855459 -12.98035,16.357359 -8.125,25.687479 4.85535,9.33012 16.35764,12.94923 25.6875,8.09375 9.32986,-4.85548 12.9491,-16.35738 8.09375,-25.6875 l -0.53125,-0.9375 c -3.55212,-5.959566 -9.86047,-9.318767 -16.375,-9.312479 z m 0,4.78125 c 4.8859,-0.0047 9.61716,2.499039 12.28125,6.968729 l 0.40625,0.71875 c 3.64151,6.99759 0.9349,15.60839 -6.0625,19.25 -6.9974,3.64161 -15.63974,0.93509 -19. [...]
+ style="fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:1.90441298;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <g
+ id="g6427">
+ <g
+ id="g6418"
+ transform="translate(-1.0205058,-1.0615171)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6404"
+ d="m 490.93972,103.02317 0,11.1925"
+ style="fill:#000080;stroke:#000080;stroke-width:2.96420193;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6406"
+ d="m 498.55553,106.75401 -7.61581,7.46166"
+ style="fill:#000080;stroke:#000080;stroke-width:2.96420193;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ transform="matrix(0.57111003,0,0,0.55956543,198.69517,29.405716)"
+ sodipodi:open="true"
+ sodipodi:end="12.02886"
+ sodipodi:start="5.8033439"
+ d="m 514.71767,148.70809 c 0.63739,1.22478 0.16121,2.73437 -1.06357,3.37176 -1.22479,0.63739 -2.73438,0.16121 -3.37177,-1.06357 -0.63739,-1.22479 -0.16121,-2.73438 1.06357,-3.37177 1.17514,-0.61155 2.6233,-0.20026 3.30156,0.93767"
+ sodipodi:ry="2.5"
+ sodipodi:rx="2.5"
+ sodipodi:cy="149.86218"
+ sodipodi:cx="512.5"
+ id="path6408"
+ style="fill:#000080;fill-opacity:1;stroke:#000080;stroke-width:5.24351454;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ </g>
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.43510604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6423"
+ sodipodi:cx="440"
+ sodipodi:cy="127.36218"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 444.43534,125.05399 c 1.27478,2.44957 0.32242,5.46875 -2.12715,6.74353 -2.44957,1.27478 -5.46875,0.32243 -6.74353,-2.12714 -1.27478,-2.44958 -0.32242,-5.46876 2.12715,-6.74354 2.35027,-1.2231 5.24659,-0.40052 6.60312,1.87535"
+ sodipodi:start="5.8033439"
+ sodipodi:end="12.02886"
+ sodipodi:open="true"
+ transform="matrix(0.93012713,0,0,0.5220231,80.773929,23.326855)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:2.49030304;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 476.24851,132.36218 27.56271,0"
+ id="path6425"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ <g
+ id="g4237"
+ transform="translate(-3.9434828,-6.5909089)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6034-2-1"
+ d="m 43.630149,33.353354 -1.3484,0.0443 -0.3979,1.47966 0,0.17668 0.19895,1.25882 -1.87892,0.46378 -0.41998,-1.21464 -0.0662,-0.1325 -1.06103,-1.12632 -1.19366,0.5742 0.22103,1.54592 0.0885,0.1325 0.66313,1.08215 -1.52523,1.19258 -0.86209,-0.92755 -0.13266,-0.11049 -1.43681,-0.59626 -0.86211,1.01589 0.86211,1.32507 0.11046,0.0882 1.06104,0.70671 -0.90629,1.67844 -1.17158,-0.46378 -0.15468,-0.0442 -1.52524,0.0442 -0.39789,1.2809 1.3042,0.83924 0.15469,0.0442 1.25998,0.22085 -0.15 [...]
+ style="fill:#808080;stroke:#000000;stroke-width:0.70703268;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ y="18"
+ x="15.898026"
+ height="40"
+ width="40"
+ id="rect3467"
+ style="fill:none;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/Track.svg b/src/icons/Track.svg
new file mode 100644
index 0000000..d1b1cea
--- /dev/null
+++ b/src/icons/Track.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3377"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Neues Dokument 2">
+ <defs
+ id="defs3379" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="32"
+ inkscape:cy="32"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3416" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3382">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3937"
+ transform="matrix(0.46114505,0,0,0.60404216,-167.21055,-32.539512)"
+ inkscape:export-filename="/home/oeichler/Code/android/QLandkarteM/QLandkarteM/icons/48x48/record.png"
+ inkscape:export-xdpi="123.42857"
+ inkscape:export-ydpi="123.42857">
+ <g
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,70.373026,321.22792)"
+ id="g3863">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3091"
+ sodipodi:cx="417"
+ sodipodi:cy="94.362183"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ d="m 416.9824,87.362205 c 3.86598,-0.0097 7.00786,3.116398 7.01758,6.982379 0.01,3.865981 -3.1164,7.007856 -6.98238,7.017576 -0.0135,3e-5 -0.027,3e-5 -0.0405,-1e-5 L 417,94.362183 z"
+ sodipodi:start="4.7098749"
+ sodipodi:end="7.8572596"
+ transform="matrix(2.8638155,0,0,0.95340127,-777.28343,4.421604)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3093"
+ sodipodi:cx="407"
+ sodipodi:cy="91.862183"
+ sodipodi:rx="4"
+ sodipodi:ry="6.5"
+ d="m 407.02766,98.362027 c -2.20909,0.02482 -4.01229,-2.865133 -4.02756,-6.454898 -0.0153,-3.589765 1.76315,-6.519968 3.97224,-6.544791 0.0143,-1.6e-4 0.0285,-1.97e-4 0.0428,-1.09e-4 L 407,91.862183 z"
+ sodipodi:start="1.5638814"
+ sodipodi:end="4.7161735"
+ transform="matrix(2.1833386,0,0,1.0380416,-476.38942,-0.97014023)" />
+ </g>
+ <g
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,94.62502,319.68557)"
+ id="g3863-7">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3091-3"
+ sodipodi:cx="417"
+ sodipodi:cy="94.362183"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ d="m 416.9824,87.362205 c 3.86598,-0.0097 7.00786,3.116398 7.01758,6.982379 0.01,3.865981 -3.1164,7.007856 -6.98238,7.017576 -0.0135,3e-5 -0.027,3e-5 -0.0405,-1e-5 L 417,94.362183 z"
+ sodipodi:start="4.7098749"
+ sodipodi:end="7.8572596"
+ transform="matrix(2.8638155,0,0,0.95340127,-777.28343,4.421604)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3093-5"
+ sodipodi:cx="407"
+ sodipodi:cy="91.862183"
+ sodipodi:rx="4"
+ sodipodi:ry="6.5"
+ d="m 407.02766,98.362027 c -2.20909,0.02482 -4.01229,-2.865133 -4.02756,-6.454898 -0.0153,-3.589765 1.76315,-6.519968 3.97224,-6.544791 0.0143,-1.6e-4 0.0285,-1.97e-4 0.0428,-1.09e-4 L 407,91.862183 z"
+ sodipodi:start="1.5638814"
+ sodipodi:end="4.7161735"
+ transform="matrix(2.1833386,0,0,1.0380416,-476.38942,-0.97014023)" />
+ </g>
+ <g
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,69.311474,351.55812)"
+ id="g3863-8">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3091-7"
+ sodipodi:cx="417"
+ sodipodi:cy="94.362183"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ d="m 416.9824,87.362205 c 3.86598,-0.0097 7.00786,3.116398 7.01758,6.982379 0.01,3.865981 -3.1164,7.007856 -6.98238,7.017576 -0.0135,3e-5 -0.027,3e-5 -0.0405,-1e-5 L 417,94.362183 z"
+ sodipodi:start="4.7098749"
+ sodipodi:end="7.8572596"
+ transform="matrix(2.8638155,0,0,0.95340127,-777.28343,4.421604)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3093-6"
+ sodipodi:cx="407"
+ sodipodi:cy="91.862183"
+ sodipodi:rx="4"
+ sodipodi:ry="6.5"
+ d="m 407.02766,98.362027 c -2.20909,0.02482 -4.01229,-2.865133 -4.02756,-6.454898 -0.0153,-3.589765 1.76315,-6.519968 3.97224,-6.544791 0.0143,-1.6e-4 0.0285,-1.97e-4 0.0428,-1.09e-4 L 407,91.862183 z"
+ sodipodi:start="1.5638814"
+ sodipodi:end="4.7161735"
+ transform="matrix(2.1833386,0,0,1.0380416,-476.38942,-0.97014023)" />
+ </g>
+ <g
+ transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,44.797353,350.17434)"
+ id="g3863-1">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3091-0"
+ sodipodi:cx="417"
+ sodipodi:cy="94.362183"
+ sodipodi:rx="7"
+ sodipodi:ry="7"
+ d="m 416.9824,87.362205 c 3.86598,-0.0097 7.00786,3.116398 7.01758,6.982379 0.01,3.865981 -3.1164,7.007856 -6.98238,7.017576 -0.0135,3e-5 -0.027,3e-5 -0.0405,-1e-5 L 417,94.362183 z"
+ sodipodi:start="4.7098749"
+ sodipodi:end="7.8572596"
+ transform="matrix(2.8638155,0,0,0.95340127,-777.28343,4.421604)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:1;stroke:none"
+ id="path3093-61"
+ sodipodi:cx="407"
+ sodipodi:cy="91.862183"
+ sodipodi:rx="4"
+ sodipodi:ry="6.5"
+ d="m 407.02766,98.362027 c -2.20909,0.02482 -4.01229,-2.865133 -4.02756,-6.454898 -0.0153,-3.589765 1.76315,-6.519968 3.97224,-6.544791 0.0143,-1.6e-4 0.0285,-1.97e-4 0.0428,-1.09e-4 L 407,91.862183 z"
+ sodipodi:start="1.5638814"
+ sodipodi:end="4.7161735"
+ transform="matrix(2.1833386,0,0,1.0380416,-476.38942,-0.97014023)" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/UnLock.svg b/src/icons/UnLock.svg
new file mode 100644
index 0000000..8fe89b4
--- /dev/null
+++ b/src/icons/UnLock.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="UnLock.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.3666667"
+ inkscape:cx="-36.473509"
+ inkscape:cy="26.053634"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1012"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2983" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3020">
+ <rect
+ y="14.255609"
+ x="13.302095"
+ height="40"
+ width="40"
+ id="rect3833"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2985-1"
+ d="M 42.098506,16.198139 C 37.22822,13.395631 31.048155,14.979961 28.267598,19.760923 l -0.02026,-0.01169 -3.318275,5.747422 2.956984,1.707216 3.030231,-5.248514 0.265001,-0.458995 0.02026,0.01169 c 1.963222,-2.846786 5.846589,-3.749992 8.941052,-1.968943 3.115523,1.79309 4.284176,5.639751 2.76258,8.779254 l 0.06076,0.03508 -3.295233,5.70751 2.916478,1.68383 3.295233,-5.707511 0.02304,-0.03991 c 0.004,-0.0068 0.0075,-0.01305 0.01152,-0.01995 C 48.685976,25.16475 46.98265,19.0085 [...]
+ style="fill:#000080;stroke:#000000;stroke-width:1.24499798;stroke-miterlimit:4;stroke-dasharray:none" />
+ <rect
+ y="31.512426"
+ x="18.76589"
+ height="22.123175"
+ width="29.072412"
+ id="rect3800"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.24499798;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3804"
+ d="m 33.302096,34.969627 c -2.066561,0.0028 -3.744663,1.650716 -3.741844,3.686974 l 0,0.02303 c 0.0068,1.523851 0.950234,2.831651 2.29188,3.387406 l -2.666064,7.880906 8.232055,0 -2.666064,-7.90395 c 1.342229,-0.561517 2.293994,-1.860212 2.29188,-3.387405 -0.0028,-2.036258 -1.675282,-3.689752 -3.741843,-3.686974 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.24499798;stroke-miterlimit:4;stroke-dasharray:none" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/Undo.svg b/src/icons/Undo.svg
new file mode 100644
index 0000000..cfb808f
--- /dev/null
+++ b/src/icons/Undo.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="Undo.svg">
+ <defs
+ id="defs3515" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.7781746"
+ inkscape:cx="45.867218"
+ inkscape:cy="31.764741"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3012" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <g
+ id="g3792"
+ style="fill:none;stroke:#000000;stroke-linecap:round" />
+ <path
+ style="fill:#000080;stroke:#000000;stroke-width:1.48139596px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+ d="m 26.680371,11.594224 -15.863518,13.833842 15.863518,13.833842 0,-7.089844 C 40.457249,31.963488 48.87986,37.044976 49.335457,50.112828 49.164569,29.717788 41.036344,19.943888 26.680371,18.467914 l 0,-6.87369 z"
+ id="path3790"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/src/icons/WptMove.svg b/src/icons/WptMove.svg
new file mode 100644
index 0000000..cd0dbc4
--- /dev/null
+++ b/src/icons/WptMove.svg
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="WptMove.svg">
+ <defs
+ id="defs3515">
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3901"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path3895"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3880"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3874"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="-35.636364"
+ inkscape:cy="32"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3090" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ style="fill:none;stroke:#000080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="M 28.26551,37.508268 37.660845,22.508267"
+ id="path3094"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="matrix(0.46976672,0,0,0.5,23.499487,-481.32655)"
+ id="g3058">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3763"
+ d="m 16.875788,998.65233 25.339695,10.78737 -28.507157,10.7873 3.167462,-21.57467"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:1.34993112;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3761"
+ d="m 10.325373,1037.1836 3.609174,-39.39145 3.609174,0 z"
+ style="fill:#000000;stroke:#000000;stroke-width:0.71901649px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="997.48792"
+ x="9.9636908"
+ height="40"
+ width="40"
+ id="rect3769"
+ style="fill:none;stroke:none" />
+ </g>
+ <path
+ style="fill:none;stroke:#000080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 28.26551,37.508268 -18.7906686,-5"
+ id="path3096"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 28.26551,37.508268 18.790669,5"
+ id="path3098"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000080;stroke:#000080;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 18.870176,52.508268 9.395334,-15"
+ id="path3100"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:none;stroke:none"
+ id="rect5814"
+ width="40"
+ height="40"
+ x="8.2655106"
+ y="15.488965" />
+ </g>
+</svg>
diff --git a/src/icons/WptProj.svg b/src/icons/WptProj.svg
new file mode 100644
index 0000000..5f5056e
--- /dev/null
+++ b/src/icons/WptProj.svg
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64px"
+ height="64px"
+ id="svg3513"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="WptProj.svg">
+ <defs
+ id="defs3515">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path3883"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path3938"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3901"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path3895"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3880"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3874"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.5"
+ inkscape:cx="11.313497"
+ inkscape:cy="14.318863"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:document-units="px"
+ inkscape:grid-bbox="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1012"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3090" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3518">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <rect
+ style="fill:none;stroke:none"
+ id="rect5814"
+ width="40"
+ height="40"
+ x="11.385592"
+ y="9.5183182" />
+ <path
+ style="fill:none;stroke:#000080;stroke-width:1.48546112;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:url(#Arrow1Mend)"
+ d="M 15,44 35,39"
+ id="path5870"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="matrix(0.46976672,0,0,0.5,10.079101,-475.32828)"
+ id="g3058">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3763"
+ d="m 16.875788,998.65233 25.339695,10.78737 -28.507157,10.7873 3.167462,-21.57467"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:1.34993112;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3761"
+ d="m 10.325373,1037.1836 3.609174,-39.39145 3.609174,0 z"
+ style="fill:#000000;stroke:#000000;stroke-width:0.71901649px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="997.48792"
+ x="9.9636908"
+ height="40"
+ width="40"
+ id="rect3769"
+ style="fill:none;stroke:none" />
+ </g>
+ <g
+ transform="matrix(0.46976672,0,0,0.5,30.53365,-479.96465)"
+ id="g3058-2">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3763-9"
+ d="m 16.875788,998.65233 25.339695,10.78737 -28.507157,10.7873 3.167462,-21.57467"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:1.34993112;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3761-7"
+ d="m 10.325373,1037.1836 3.609174,-39.39145 3.609174,0 z"
+ style="fill:#000000;stroke:#000000;stroke-width:0.71901649px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+ <rect
+ y="997.48792"
+ x="9.9636908"
+ height="40"
+ width="40"
+ id="rect3769-5"
+ style="fill:none;stroke:none" />
+ </g>
+ </g>
+</svg>
diff --git a/src/icons/cache/Apache-2.0 b/src/icons/cache/Apache-2.0
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/src/icons/cache/Apache-2.0
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/icons/cache/COPYRIGHT b/src/icons/cache/COPYRIGHT
index 5375084..d923a68 100644
--- a/src/icons/cache/COPYRIGHT
+++ b/src/icons/cache/COPYRIGHT
@@ -2,3 +2,4 @@ All icons in this directory are from the Open Cache Manager project
http://opencachemanage.sourceforge.net/
+project has released files under Apache 2.0 lincense.
diff --git a/src/icons/waypoints/32x32/Default.png b/src/icons/waypoints/32x32/Default.png
index 9518632..d5bb175 100644
Binary files a/src/icons/waypoints/32x32/Default.png and b/src/icons/waypoints/32x32/Default.png differ
diff --git a/src/icons/waypoints/Default.svg b/src/icons/waypoints/Default.svg
index 477d793..6799480 100644
--- a/src/icons/waypoints/Default.svg
+++ b/src/icons/waypoints/Default.svg
@@ -25,15 +25,15 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
- inkscape:cx="-2.8306356"
+ inkscape:cx="72.3515"
inkscape:cy="30.518763"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
- inkscape:window-height="1014"
- inkscape:window-x="-1"
- inkscape:window-y="-15"
+ inkscape:window-height="996"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
@@ -61,28 +61,27 @@
id="layer1"
transform="translate(0,-988.36215)">
<g
- id="g2987"
- transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-708.78087,322.94443)">
+ id="g3760">
<path
inkscape:connector-curvature="0"
id="path2992"
- d="m 35.922519,1017.0465 23.958303,-7.0949 3.422615,7.0949 -3.422615,7.0948 z"
- style="fill:#ff7f2a;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m 35.780662,1016.7038 11.924227,-21.95788 7.437006,2.5967 2.596627,7.43698 z"
+ style="fill:#ff7f2a;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path2992-9"
- d="m 34.953486,1017.0463 -23.9583,7.0949 -3.42266,-7.0949 3.42266,-7.0947 z"
- style="fill:#ff7f2a;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m 35.095311,1017.3889 -11.924224,21.9579 -7.437038,-2.5966 -2.596525,-7.4369 z"
+ style="fill:#ff7f2a;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path2992-7"
- d="m 35.437881,1017.463 7.0949,23.9583 -7.0949,3.4227 -7.0947,-3.4227 z"
- style="fill:#ff7f2a;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m 35.732482,1017.341 21.957928,11.9243 -2.596638,7.437 -7.436924,2.5965 z"
+ style="fill:#ff7f2a;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path2992-84"
- d="m 35.438081,1016.6297 -7.0949,-23.95823 7.0949,-3.42266 7.0947,3.42266 z"
- style="fill:#ff7f2a;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m 35.143391,1016.7517 -21.957879,-11.9242 2.596666,-7.43704 7.436897,-2.59652 z"
+ style="fill:#ff7f2a;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</svg>
diff --git a/src/locale/qmapshack_cs.ts b/src/locale/qmapshack_cs.ts
new file mode 100644
index 0000000..c4b8d1e
--- /dev/null
+++ b/src/locale/qmapshack_cs.ts
@@ -0,0 +1,2127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="cs_CZ">
+<context>
+ <name>CCanvas</name>
+ <message>
+ <location filename="../canvas/CCanvas.cpp" line="51"/>
+ <source>Workspace %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemList</name>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Deactivate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemPathSetup</name>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing DEM data. There can be multiple files in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="55"/>
+ <source>Select DEM file path...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemVRT</name>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <source>Failed to load file: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <source>DEM must have one band with 16bit or 32bit data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>No georeference information found.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <source>none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="101"/>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="115"/>
+ <source>no comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="126"/>
+ <source>no description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Edit name...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Enter new waypoint name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="177"/>
+ <source>Enter new elevation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="186"/>
+ <source>Enter new proximity range.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CGisListWks</name>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="33"/>
+ <source>Save As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="34"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="35"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="41"/>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="42"/>
+ <source>Move Waypoint...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="43"/>
+ <source>Proj. Waypoint...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="44"/>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CGrid</name>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="61"/>
+ <source>[Grid: %1] </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="65"/>
+ <source>[Grid: N %1m, E %2m] </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMainWindow</name>
+ <message>
+ <location filename="../CMainWindow.cpp" line="389"/>
+ <source>Ele: %1%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../CMainWindow.cpp" line="490"/>
+ <source>Load GIS Data...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapIMG</name>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="140"/>
+ <source>Failed ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="156"/>
+ <source>Unspecified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="157"/>
+ <source>French</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="158"/>
+ <source>German</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="159"/>
+ <source>Dutch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="160"/>
+ <source>English</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="161"/>
+ <source>Italian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="162"/>
+ <source>Finnish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="163"/>
+ <source>Swedish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="164"/>
+ <source>Spanish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="165"/>
+ <source>Basque</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="166"/>
+ <source>Catalan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="167"/>
+ <source>Galician</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="168"/>
+ <source>Welsh</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="169"/>
+ <source>Gaelic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="170"/>
+ <source>Danish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="171"/>
+ <source>Norwegian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="172"/>
+ <source>Portuguese</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="173"/>
+ <source>Slovak</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="174"/>
+ <source>Czech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="175"/>
+ <source>Croatian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="176"/>
+ <source>Hungarian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="177"/>
+ <source>Polish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="178"/>
+ <source>Turkish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="179"/>
+ <source>Greek</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="180"/>
+ <source>Slovenian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="181"/>
+ <source>Russian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="182"/>
+ <source>Estonian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="183"/>
+ <source>Latvian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="184"/>
+ <source>Romanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="185"/>
+ <source>Albanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="186"/>
+ <source>Bosnian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="187"/>
+ <source>Lithuanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="188"/>
+ <source>Serbian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="189"/>
+ <source>Macedonian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="190"/>
+ <source>Bulgarian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="247"/>
+ <source>Major highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="248"/>
+ <source>Principal highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="249"/>
+ <source>Other highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="250"/>
+ <source>Arterial road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="251"/>
+ <source>Collector road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="252"/>
+ <source>Residential street</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="253"/>
+ <source>Alley/Private road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="254"/>
+ <source>Highway ramp, low speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="255"/>
+ <source>Highway ramp, high speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="256"/>
+ <source>Unpaved road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="257"/>
+ <source>Major highway connector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="258"/>
+ <source>Roundabout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="259"/>
+ <source>Railroad</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="260"/>
+ <source>Shoreline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="261"/>
+ <source>Trail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="262"/>
+ <source>Stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="263"/>
+ <source>Time zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="264"/>
+ <location filename="../map/CMapIMG.cpp" line="265"/>
+ <source>Ferry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="266"/>
+ <source>State/province border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="267"/>
+ <source>County/parish border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="268"/>
+ <source>International border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="269"/>
+ <source>River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="270"/>
+ <source>Minor land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="271"/>
+ <source>Intermediate land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="272"/>
+ <source>Major land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="273"/>
+ <source>Minor depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="274"/>
+ <source>Intermediate depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="275"/>
+ <source>Major depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="276"/>
+ <source>Intermittent stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="277"/>
+ <location filename="../map/CMapIMG.cpp" line="359"/>
+ <source>Airport runway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="278"/>
+ <source>Pipeline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="279"/>
+ <source>Powerline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="280"/>
+ <source>Marine boundary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="281"/>
+ <source>Hazard boundary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="346"/>
+ <source>Large urban area (>200K)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="347"/>
+ <source>Small urban area (<200K)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="348"/>
+ <source>Rural housing area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="349"/>
+ <source>Military base</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="350"/>
+ <source>Parking lot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="351"/>
+ <source>Parking garage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="352"/>
+ <source>Airport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="353"/>
+ <source>Shopping center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="354"/>
+ <source>Marina</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="355"/>
+ <source>University/College</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="356"/>
+ <source>Hospital</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="357"/>
+ <source>Industrial complex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="358"/>
+ <source>Reservation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="360"/>
+ <source>Man-made area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="361"/>
+ <source>Sports complex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="362"/>
+ <source>Golf course</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="363"/>
+ <source>Cemetery</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="364"/>
+ <location filename="../map/CMapIMG.cpp" line="365"/>
+ <location filename="../map/CMapIMG.cpp" line="366"/>
+ <source>National park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="367"/>
+ <source>City park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="368"/>
+ <location filename="../map/CMapIMG.cpp" line="369"/>
+ <location filename="../map/CMapIMG.cpp" line="370"/>
+ <source>State park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="371"/>
+ <source>Forest</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="372"/>
+ <source>Ocean</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="373"/>
+ <location filename="../map/CMapIMG.cpp" line="375"/>
+ <location filename="../map/CMapIMG.cpp" line="385"/>
+ <source>Blue (unknown)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="374"/>
+ <source>Sea</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="376"/>
+ <location filename="../map/CMapIMG.cpp" line="377"/>
+ <location filename="../map/CMapIMG.cpp" line="384"/>
+ <source>Large lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="378"/>
+ <location filename="../map/CMapIMG.cpp" line="379"/>
+ <source>Medium lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="380"/>
+ <location filename="../map/CMapIMG.cpp" line="381"/>
+ <source>Small lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="382"/>
+ <location filename="../map/CMapIMG.cpp" line="383"/>
+ <source>Major lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="386"/>
+ <source>Major River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="387"/>
+ <source>Large River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="388"/>
+ <source>Medium River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="389"/>
+ <source>Small River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="392"/>
+ <source>Intermittent water</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="393"/>
+ <source>Wetland/Swamp</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="394"/>
+ <source>Glacier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="395"/>
+ <source>Orchard/Plantation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="396"/>
+ <source>Scrub</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="397"/>
+ <source>Tundra</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="398"/>
+ <source>Flat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="399"/>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="437"/>
+ <source>Failed to read: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="481"/>
+ <source>Failed to open: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="505"/>
+ <location filename="../map/CMapIMG.cpp" line="509"/>
+ <source>Bad file format: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="600"/>
+ <source>Failed to read file structure: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="633"/>
+ <source>Loading %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="638"/>
+ <source>User abort: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="639"/>
+ <source>File is NT format. QMapShack is unable to read map files with NT format: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="713"/>
+ <source>File contains locked / encypted data. Garmin does not want you to use this file with any other software than the one supplied by Garmin.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2363"/>
+ <location filename="../map/CMapIMG.cpp" line="2371"/>
+ <location filename="../map/CMapIMG.cpp" line="2375"/>
+ <location filename="../map/CMapIMG.cpp" line="2380"/>
+ <location filename="../map/CMapIMG.cpp" line="2427"/>
+ <location filename="../map/CMapIMG.cpp" line="2435"/>
+ <location filename="../map/CMapIMG.cpp" line="2439"/>
+ <location filename="../map/CMapIMG.cpp" line="2444"/>
+ <source>Point of Interest</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2569"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2616"/>
+ <location filename="../map/CMapIMG.cpp" line="2625"/>
+ <location filename="../map/CMapIMG.cpp" line="2632"/>
+ <source>Area</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapList</name>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Deactivate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapPathSetup</name>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing maps. There can be multiple maps in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="54"/>
+ <source>Select map path...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapRMAP</name>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <source>This is not a TwoNav RMAP file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <source>Unknown sub-format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <source>Unknown version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <source>Failed to read reference point.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Unknown projection and datum (%1%2).</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapVRT</name>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <source>Failed to load file: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <source>File must be 8 bit palette or gray indexed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>No georeference information found.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CProjWizard</name>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="55"/>
+ <source>north</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="56"/>
+ <source>south</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>The value
+'%1'
+is not a valid coordinate system definition:
+%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Edit name...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Enter new waypoint name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CTextEditWidget</name>
+ <message>
+ <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
+ <source>&Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IAbout</name>
+ <message>
+ <location filename="../IAbout.ui" line="14"/>
+ <source>About....</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="38"/>
+ <source><b>QMapShack</b>, Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="45"/>
+ <location filename="../IAbout.ui" line="73"/>
+ <location filename="../IAbout.ui" line="87"/>
+ <location filename="../IAbout.ui" line="101"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="66"/>
+ <source>Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="80"/>
+ <source>GDAL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="94"/>
+ <source>Proj4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="117"/>
+ <source>This software is licensed under GPL3 or any later version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message utf8="true">
+ <location filename="../IAbout.ui" line="124"/>
+ <source>© 2014 Oliver Eichler (oliver.eichler at gmx.de)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICanvasSetup</name>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="14"/>
+ <source>Setup Map Workspace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="22"/>
+ <source>Projection & Datum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="32"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPathSetup</name>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="14"/>
+ <source>Setup DEM file pathss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="38"/>
+ <location filename="../dem/IDemPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPropSetup</name>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="50"/>
+ <location filename="../dem/IDemPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="110"/>
+ <source>Hillshading</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemsList</name>
+ <message>
+ <location filename="../dem/IDemList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="118"/>
+ <source>To add files with elevation data use File->Setup DEM Paths. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="131"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a file. Use drag-n-drop to move the activated file in the process order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="156"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="20"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="35"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="66"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="92"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="105"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="118"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="131"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="144"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="170"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="183"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="196"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="209"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="222"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="43"/>
+ <source>about:blank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="59"/>
+ <source>Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="79"/>
+ <source>Difficulty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="157"/>
+ <source>Terrain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="231"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="249"/>
+ <source>Hint:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="14"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="47"/>
+ <source><html><head/><body><p>Edit description.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="50"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="179"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="247"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="273"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="80"/>
+ <source>Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="113"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="139"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="203"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="311"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="100"/>
+ <source>Ele.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="126"/>
+ <source>Proximity:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="176"/>
+ <source><html><head/><body><p>Edit comment.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="228"/>
+ <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="244"/>
+ <source><html><head/><body><p>Read Only Mode</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="304"/>
+ <source>Date/Time:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IGisWidget</name>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="53"/>
+ <source>State</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IGridSetup</name>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="14"/>
+ <source>Setup Grid...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="22"/>
+ <source>Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="37"/>
+ <source>restore default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="40"/>
+ <location filename="../grid/IGridSetup.ui" line="66"/>
+ <location filename="../grid/IGridSetup.ui" line="92"/>
+ <location filename="../grid/IGridSetup.ui" line="146"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="63"/>
+ <source>Get projection from current map.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="89"/>
+ <source>projection wizzard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="130"/>
+ <source>Grid color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="143"/>
+ <source>setup grid color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IInputDialog</name>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="14"/>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="20"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMainWindow</name>
+ <message>
+ <location filename="../IMainWindow.ui" line="14"/>
+ <source>QMapShack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="60"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="70"/>
+ <source>View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="88"/>
+ <source>Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="93"/>
+ <source>?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="109"/>
+ <source>Maps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="146"/>
+ <source>Dig. Elev. Model (DEM)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="179"/>
+ <source>Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="192"/>
+ <source>Add Map Workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="195"/>
+ <source>Ctrl+T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="207"/>
+ <source>Show Scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="216"/>
+ <source>Setup Map Font</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="228"/>
+ <source>Show Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="231"/>
+ <source>Ctrl+G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="240"/>
+ <source>Setup Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="243"/>
+ <source>Ctrl+Alt+G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="255"/>
+ <source>Flip Mouse Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="264"/>
+ <location filename="../IMainWindow.ui" line="267"/>
+ <source>Setup Map Paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="279"/>
+ <source>POI Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="291"/>
+ <source>Night / Day</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="303"/>
+ <source>Map Tool Tip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="312"/>
+ <source>Setup DEM Paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="321"/>
+ <source>About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="330"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="339"/>
+ <source>Setup Map Workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="348"/>
+ <source>Load GIS Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="351"/>
+ <source>Load projects from file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="354"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="363"/>
+ <source>Save All GIS Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="366"/>
+ <source>Save all projects in the workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="369"/>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="378"/>
+ <source>Setup Time Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapList</name>
+ <message>
+ <location filename="../map/IMapList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="100"/>
+ <source>To add maps use File->Setup Map Pathss. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="113"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a map. Use drag-n-drop to move the activated map in the draw order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="138"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapPathSetup</name>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="14"/>
+ <source>Setup map paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="38"/>
+ <location filename="../map/IMapPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapPropSetup</name>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="50"/>
+ <location filename="../map/IMapPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="134"/>
+ <source>Areas</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="141"/>
+ <source>Lines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="148"/>
+ <source>Points</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IPositionDialog</name>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="14"/>
+ <source>Position ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="20"/>
+ <source>Enter new position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="30"/>
+ <source>Bad position format. Must be:
+"[N|S] ddd mm.sss [W|E] ddd mm.sss"
+or
+"[N|S] ddd.ddd [W|E] ddd.ddd"</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IProjWizard</name>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="14"/>
+ <source>Proj4 Wizzard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="29"/>
+ <source>Mercator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="38"/>
+ <source>UTM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="45"/>
+ <source>zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="82"/>
+ <source>user defined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="94"/>
+ <source>Datum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="104"/>
+ <source>World Mercator (OSM)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="124"/>
+ <source>Result:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="138"/>
+ <source>UPS North (North Pole)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="145"/>
+ <source>UPS South (South Pole)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="152"/>
+ <source>Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="14"/>
+ <source>Waypoint Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="22"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="38"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="47"/>
+ <source>Clone waypoint and move by:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="59"/>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message utf8="true">
+ <location filename="../gis/wpt/IProjWpt.ui" line="69"/>
+ <source>°</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptRte</name>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="28"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="31"/>
+ <location filename="../gis/rte/IScrOptRte.ui" line="45"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="42"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="71"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptTrk</name>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="46"/>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="60"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="86"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptWpt</name>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="49"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="52"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="66"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="101"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="63"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="84"/>
+ <source><html><head/><body><p>Move waypoint to a new location.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="98"/>
+ <source><html><head/><body><p>Clone waypoint and move clone a given distance and angle.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="145"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITextEditWidget</name>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="25"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="38"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="51"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="64"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="77"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="117"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="130"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="143"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="156"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="169"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="182"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="195"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="208"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="259"/>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="262"/>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="271"/>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="274"/>
+ <source>Ctrl+Shift+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="283"/>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="286"/>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="295"/>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="298"/>
+ <source>Ctrl+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="307"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="310"/>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="322"/>
+ <source>Align Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="325"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="337"/>
+ <source>Align Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="340"/>
+ <source>Ctrl+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="352"/>
+ <source>Align Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="355"/>
+ <source>Ctrl+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="367"/>
+ <source>Align Block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="370"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="382"/>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="385"/>
+ <source>Ctrl+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="397"/>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="400"/>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="412"/>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="415"/>
+ <source>Ctrl+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITimeZoneSetup</name>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="14"/>
+ <source>Setup Time Zone ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="22"/>
+ <source>UTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="29"/>
+ <source>Local</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="36"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IWptIconDialog</name>
+ <message>
+ <location filename="../helpers/IWptIconDialog.ui" line="14"/>
+ <source>Icons...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Failed to read...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Not a GPX file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="339"/>
+ <source>Are you sure you want to delete '%1' from project '%2'?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="340"/>
+ <source>Delete...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="432"/>
+ <source>Save GIS data to...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="484"/>
+ <source>File exists ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="485"/>
+ <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file. Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Saveing GIS data failed...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <source>Failed to create file '%1'</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Failed to write file '%1'</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="98"/>
+ <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="99"/>
+ <source>Read Only Mode...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="135"/>
+ <source>Length: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="142"/>
+ <source>, %1%2 %3, %4%5 %6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="150"/>
+ <source>Time: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="153"/>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="163"/>
+ <source>, Speed: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="160"/>
+ <source>Moving: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="169"/>
+ <source>Start: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="174"/>
+ <source>End: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="178"/>
+ <source>Points: %1 (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="151"/>
+ <source>Elevation: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="159"/>
+ <source>Proximity: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
+ <source>Changed name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="226"/>
+ <source>Changed position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="232"/>
+ <source>Changed elevation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="238"/>
+ <source>Changed proximity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+ <source>Changed icon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="251"/>
+ <source>Changed comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="257"/>
+ <source>Changed description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="300"/>
+ <source>Archived</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="304"/>
+ <source>Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="308"/>
+ <source>Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>Warning...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <source>This is a typ file with unknown polygon encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>This is a typ file with unknown polyline encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src/locale/qmapshack_de.ts b/src/locale/qmapshack_de.ts
new file mode 100644
index 0000000..540479e
--- /dev/null
+++ b/src/locale/qmapshack_de.ts
@@ -0,0 +1,2143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de_DE">
+<context>
+ <name>CCanvas</name>
+ <message>
+ <location filename="../canvas/CCanvas.cpp" line="51"/>
+ <source>Workspace %1</source>
+ <translation>Ansicht %1</translation>
+ </message>
+</context>
+<context>
+ <name>CDemList</name>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Deactivate</source>
+ <translation>Deaktivieren</translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Activate</source>
+ <translation>Aktivieren</translation>
+ </message>
+</context>
+<context>
+ <name>CDemPathSetup</name>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing DEM data. There can be multiple files in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation>Hinzufügen oder entfernen von Verzeichnissen mit DEM Daten. Im Verzeichnis können mehrere Dateien vorliegen. Allerdings wird kein Unterverzeichnis durchsucht. Unterstützte Formate sind: %1</translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="55"/>
+ <source>Select DEM file path...</source>
+ <translation>Pfad für DEM Dateien auswählen...</translation>
+ </message>
+</context>
+<context>
+ <name>CDemVRT</name>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>Error...</source>
+ <translation>Fehler...</translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <source>Failed to load file: %1</source>
+ <translation>Die Datei konnte nicht geladen werden: %1</translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <source>DEM must have one band with 16bit or 32bit data.</source>
+ <translation>Das DEM muss aus einem Satz mit 16 oder 32Bit Daten bestehen.</translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>No georeference information found.</source>
+ <translation>Keine Georeferenzierung gefunden.</translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <source>none</source>
+ <translation>keiner</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="101"/>
+ <source>???</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="115"/>
+ <source>no comment</source>
+ <translation>kein Kommentar vorhanden</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="126"/>
+ <source>no description</source>
+ <translation>keine Beschreibung vorhanden</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Edit name...</source>
+ <translation>Namen ändern...</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Enter new waypoint name.</source>
+ <translation>Geben Sie einen neuen Namen ein.</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="177"/>
+ <source>Enter new elevation.</source>
+ <translation>Geben Sie eine Höhe ein.</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="186"/>
+ <source>Enter new proximity range.</source>
+ <translation>Geben Sie einen Abstandsalarm ein.</translation>
+ </message>
+</context>
+<context>
+ <name>CGisListWks</name>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="34"/>
+ <source>Save</source>
+ <translation>Speichern</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="33"/>
+ <source>Save As...</source>
+ <translation>Speichern als...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="35"/>
+ <source>Close</source>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="41"/>
+ <source>Edit...</source>
+ <translation>Ändern...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="42"/>
+ <source>Move Waypoint...</source>
+ <translation>Wegpunkt verschieben...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="43"/>
+ <source>Proj. Waypoint...</source>
+ <translation>Wegpunktprojektion...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="44"/>
+ <source>Delete</source>
+ <translation>Löschen</translation>
+ </message>
+</context>
+<context>
+ <name>CGrid</name>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="61"/>
+ <source>[Grid: %1] </source>
+ <translation>[Gitter: %1]</translation>
+ </message>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="65"/>
+ <source>[Grid: N %1m, E %2m] </source>
+ <translation>[Gitter: N %1m, E %2m]</translation>
+ </message>
+</context>
+<context>
+ <name>CMainWindow</name>
+ <message>
+ <location filename="../CMainWindow.cpp" line="389"/>
+ <source>Ele: %1%2</source>
+ <translation>Höhe: %1%2</translation>
+ </message>
+ <message>
+ <location filename="../CMainWindow.cpp" line="490"/>
+ <source>Load GIS Data...</source>
+ <translation>Lade GIS Daten...</translation>
+ </message>
+</context>
+<context>
+ <name>CMapIMG</name>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="140"/>
+ <source>Failed ...</source>
+ <translation>Fehlgeschlagen...</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="156"/>
+ <source>Unspecified</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="157"/>
+ <source>French</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="158"/>
+ <source>German</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="159"/>
+ <source>Dutch</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="160"/>
+ <source>English</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="161"/>
+ <source>Italian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="162"/>
+ <source>Finnish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="163"/>
+ <source>Swedish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="164"/>
+ <source>Spanish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="165"/>
+ <source>Basque</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="166"/>
+ <source>Catalan</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="167"/>
+ <source>Galician</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="168"/>
+ <source>Welsh</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="169"/>
+ <source>Gaelic</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="170"/>
+ <source>Danish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="171"/>
+ <source>Norwegian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="172"/>
+ <source>Portuguese</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="173"/>
+ <source>Slovak</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="174"/>
+ <source>Czech</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="175"/>
+ <source>Croatian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="176"/>
+ <source>Hungarian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="177"/>
+ <source>Polish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="178"/>
+ <source>Turkish</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="179"/>
+ <source>Greek</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="180"/>
+ <source>Slovenian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="181"/>
+ <source>Russian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="182"/>
+ <source>Estonian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="183"/>
+ <source>Latvian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="184"/>
+ <source>Romanian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="185"/>
+ <source>Albanian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="186"/>
+ <source>Bosnian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="187"/>
+ <source>Lithuanian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="188"/>
+ <source>Serbian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="189"/>
+ <source>Macedonian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="190"/>
+ <source>Bulgarian</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="247"/>
+ <source>Major highway</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="248"/>
+ <source>Principal highway</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="249"/>
+ <source>Other highway</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="250"/>
+ <source>Arterial road</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="251"/>
+ <source>Collector road</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="252"/>
+ <source>Residential street</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="253"/>
+ <source>Alley/Private road</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="254"/>
+ <source>Highway ramp, low speed</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="255"/>
+ <source>Highway ramp, high speed</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="256"/>
+ <source>Unpaved road</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="257"/>
+ <source>Major highway connector</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="258"/>
+ <source>Roundabout</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="259"/>
+ <source>Railroad</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="260"/>
+ <source>Shoreline</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="261"/>
+ <source>Trail</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="262"/>
+ <source>Stream</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="263"/>
+ <source>Time zone</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="264"/>
+ <location filename="../map/CMapIMG.cpp" line="265"/>
+ <source>Ferry</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="266"/>
+ <source>State/province border</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="267"/>
+ <source>County/parish border</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="268"/>
+ <source>International border</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="269"/>
+ <source>River</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="270"/>
+ <source>Minor land contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="271"/>
+ <source>Intermediate land contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="272"/>
+ <source>Major land contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="273"/>
+ <source>Minor depth contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="274"/>
+ <source>Intermediate depth contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="275"/>
+ <source>Major depth contour</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="276"/>
+ <source>Intermittent stream</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="277"/>
+ <location filename="../map/CMapIMG.cpp" line="359"/>
+ <source>Airport runway</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="278"/>
+ <source>Pipeline</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="279"/>
+ <source>Powerline</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="280"/>
+ <source>Marine boundary</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="281"/>
+ <source>Hazard boundary</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="346"/>
+ <source>Large urban area (>200K)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="347"/>
+ <source>Small urban area (<200K)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="348"/>
+ <source>Rural housing area</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="349"/>
+ <source>Military base</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="350"/>
+ <source>Parking lot</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="351"/>
+ <source>Parking garage</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="352"/>
+ <source>Airport</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="353"/>
+ <source>Shopping center</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="354"/>
+ <source>Marina</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="355"/>
+ <source>University/College</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="356"/>
+ <source>Hospital</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="357"/>
+ <source>Industrial complex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="358"/>
+ <source>Reservation</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="360"/>
+ <source>Man-made area</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="361"/>
+ <source>Sports complex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="362"/>
+ <source>Golf course</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="363"/>
+ <source>Cemetery</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="364"/>
+ <location filename="../map/CMapIMG.cpp" line="365"/>
+ <location filename="../map/CMapIMG.cpp" line="366"/>
+ <source>National park</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="367"/>
+ <source>City park</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="368"/>
+ <location filename="../map/CMapIMG.cpp" line="369"/>
+ <location filename="../map/CMapIMG.cpp" line="370"/>
+ <source>State park</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="371"/>
+ <source>Forest</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="372"/>
+ <source>Ocean</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="373"/>
+ <location filename="../map/CMapIMG.cpp" line="375"/>
+ <location filename="../map/CMapIMG.cpp" line="385"/>
+ <source>Blue (unknown)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="374"/>
+ <source>Sea</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="376"/>
+ <location filename="../map/CMapIMG.cpp" line="377"/>
+ <location filename="../map/CMapIMG.cpp" line="384"/>
+ <source>Large lake</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="378"/>
+ <location filename="../map/CMapIMG.cpp" line="379"/>
+ <source>Medium lake</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="380"/>
+ <location filename="../map/CMapIMG.cpp" line="381"/>
+ <source>Small lake</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="382"/>
+ <location filename="../map/CMapIMG.cpp" line="383"/>
+ <source>Major lake</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="386"/>
+ <source>Major River</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="387"/>
+ <source>Large River</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="388"/>
+ <source>Medium River</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="389"/>
+ <source>Small River</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="392"/>
+ <source>Intermittent water</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="393"/>
+ <source>Wetland/Swamp</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="394"/>
+ <source>Glacier</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="395"/>
+ <source>Orchard/Plantation</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="396"/>
+ <source>Scrub</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="397"/>
+ <source>Tundra</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="398"/>
+ <source>Flat</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="399"/>
+ <source>???</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="437"/>
+ <source>Failed to read: </source>
+ <translation>Lesen fehlgeschlagen:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="481"/>
+ <source>Failed to open: </source>
+ <translation>Öffnen fehlgeschlagen:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="505"/>
+ <location filename="../map/CMapIMG.cpp" line="509"/>
+ <source>Bad file format: </source>
+ <translation>Falsches Format:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="600"/>
+ <source>Failed to read file structure: </source>
+ <translation>Lesen der Dateistruktur fehlgeschlagen:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="633"/>
+ <source>Loading %1</source>
+ <translation>Lädt %1</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="638"/>
+ <source>User abort: </source>
+ <translation>Benutzerabbruch:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="639"/>
+ <source>File is NT format. QMapShack is unable to read map files with NT format: </source>
+ <translation>Die Datei ist in einem neueren Format. QMapShack kann dieses Format nciht lesen:</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="713"/>
+ <source>File contains locked / encypted data. Garmin does not want you to use this file with any other software than the one supplied by Garmin.</source>
+ <translation>Die Datei enthält verschlüsselte Daten. Garmin möchte nicht dass diese Datei mit einer anderen Softare, als der von Garmin bereitgestellten, benützt wird.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2363"/>
+ <location filename="../map/CMapIMG.cpp" line="2371"/>
+ <location filename="../map/CMapIMG.cpp" line="2375"/>
+ <location filename="../map/CMapIMG.cpp" line="2380"/>
+ <location filename="../map/CMapIMG.cpp" line="2427"/>
+ <location filename="../map/CMapIMG.cpp" line="2435"/>
+ <location filename="../map/CMapIMG.cpp" line="2439"/>
+ <location filename="../map/CMapIMG.cpp" line="2444"/>
+ <source>Point of Interest</source>
+ <translation>Orte von Interesse</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2569"/>
+ <source>Unknown</source>
+ <translation>Unbekannt</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2616"/>
+ <location filename="../map/CMapIMG.cpp" line="2625"/>
+ <location filename="../map/CMapIMG.cpp" line="2632"/>
+ <source>Area</source>
+ <translation>Gebiet</translation>
+ </message>
+</context>
+<context>
+ <name>CMapList</name>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Deactivate</source>
+ <translation>Deaktivieren</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Activate</source>
+ <translation>Aktivieren</translation>
+ </message>
+</context>
+<context>
+ <name>CMapPathSetup</name>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing maps. There can be multiple maps in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation>Hinzufügen oder entfernen von Karten. In einem Verzeichnis können mehrere Karten liegen. Unterverzeichnisse werden jedoch nicht durchsucht. Unterstützte Formate sind: %1 </translation>
+ </message>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="54"/>
+ <source>Select map path...</source>
+ <translation>Kartenpfad auswählen...</translation>
+ </message>
+</context>
+<context>
+ <name>CMapRMAP</name>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Error...</source>
+ <translation>Fehler...</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <source>This is not a TwoNav RMAP file.</source>
+ <translation>Das ist keine bekannte TwoNav RMAP Datei.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <source>Unknown sub-format.</source>
+ <translation>Unbekanntes Unterformat.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <source>Unknown version.</source>
+ <translation>Unbekannte Version.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <source>Failed to read reference point.</source>
+ <translation>Referenzpunkte konnten nicht gelesen werden.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Unknown projection and datum (%1%2).</source>
+ <translation>Unbekannte Projektion und Datum (%1%2).</translation>
+ </message>
+</context>
+<context>
+ <name>CMapVRT</name>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>Error...</source>
+ <translation>Fehler...</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <source>Failed to load file: %1</source>
+ <translation>Die Datei konnte nicht geladen werden: %1</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <source>File must be 8 bit palette or gray indexed.</source>
+ <translation>Die Datei muss eine 8Bit Palette haben, oder Graustufen.</translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>No georeference information found.</source>
+ <translation>Keine Georeferenzierung gefunden.</translation>
+ </message>
+</context>
+<context>
+ <name>CProjWizard</name>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="55"/>
+ <source>north</source>
+ <translation>Norden</translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="56"/>
+ <source>south</source>
+ <translation>Süden</translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>Error...</source>
+ <translation>Fehler...</translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>The value
+'%1'
+is not a valid coordinate system definition:
+%2</source>
+ <translation>Die Eingabe:
+'%1'
+ist keine gültige Koordinatensystemdefinition:
+%2</translation>
+ </message>
+</context>
+<context>
+ <name>CProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Edit name...</source>
+ <translation>Namen ändern...</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Enter new waypoint name.</source>
+ <translation>Geben Sie einen neuen Namen ein.</translation>
+ </message>
+</context>
+<context>
+ <name>CTextEditWidget</name>
+ <message>
+ <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
+ <source>&Color...</source>
+ <translation>Farbe</translation>
+ </message>
+</context>
+<context>
+ <name>IAbout</name>
+ <message>
+ <location filename="../IAbout.ui" line="14"/>
+ <source>About....</source>
+ <translation>Über...</translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="38"/>
+ <source><b>QMapShack</b>, Version</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="45"/>
+ <location filename="../IAbout.ui" line="73"/>
+ <location filename="../IAbout.ui" line="87"/>
+ <location filename="../IAbout.ui" line="101"/>
+ <source>TextLabel</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="66"/>
+ <source>Qt</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="80"/>
+ <source>GDAL</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="94"/>
+ <source>Proj4</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="117"/>
+ <source>This software is licensed under GPL3 or any later version</source>
+ <translation>Diese Software steht unter der GPL3 Lizenz (oder spätere Versionen)</translation>
+ </message>
+ <message utf8="true">
+ <location filename="../IAbout.ui" line="124"/>
+ <source>© 2014 Oliver Eichler (oliver.eichler at gmx.de)</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>ICanvasSetup</name>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="14"/>
+ <source>Setup Map Workspace...</source>
+ <translation>Kartenansicht einstellen...</translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="22"/>
+ <source>Projection & Datum</source>
+ <translation>Projektion & Datum</translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="32"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPathSetup</name>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="14"/>
+ <source>Setup DEM file pathss</source>
+ <translation>Pfad für die DEM Dateien setzen</translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="38"/>
+ <location filename="../dem/IDemPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPropSetup</name>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation><html><head/><body><p>Ändern Sie die transparenz der Karte</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation><html><head/><body><p>Klicken um die aktuelle Skalierung als minimale Skalierung zu benutzen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="50"/>
+ <location filename="../dem/IDemPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation><html><head/><body><p>Stellen sie den Skalierungsbereich ein, in dem die Karte sichtbar ist. Benutzen Si die beiden Knöpfe links und rechts um die minimale und maximale Skalierung einzustellen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation><html><head/><body><p>Klicken um die aktuelle Skalierung als maximale Skalierung zu benutzen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="110"/>
+ <source>Hillshading</source>
+ <translation>Schummerung</translation>
+ </message>
+</context>
+<context>
+ <name>IDemsList</name>
+ <message>
+ <location filename="../dem/IDemList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="118"/>
+ <source>To add files with elevation data use File->Setup DEM Paths. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="131"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a file. Use drag-n-drop to move the activated file in the process order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="156"/>
+ <source>Activate</source>
+ <translation type="unfinished">Aktivieren</translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="20"/>
+ <source>Dialog</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="35"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="66"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="92"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="105"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="118"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="131"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="144"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="170"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="183"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="196"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="209"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="222"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="43"/>
+ <source>about:blank</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="59"/>
+ <source>Position:</source>
+ <translation>Position:</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="79"/>
+ <source>Difficulty</source>
+ <translation>Schwierigkeit</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="157"/>
+ <source>Terrain</source>
+ <translation>Gelände</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="231"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="249"/>
+ <source>Hint:</source>
+ <translation>Hilfe:</translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="14"/>
+ <source>Dialog</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="47"/>
+ <source><html><head/><body><p>Edit description.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="50"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="179"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="247"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="273"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="80"/>
+ <source>Position:</source>
+ <translation>Position:</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="113"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="139"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="203"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="311"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="100"/>
+ <source>Ele.</source>
+ <translation>Höhe</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="126"/>
+ <source>Proximity:</source>
+ <translation>Abstand</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="176"/>
+ <source><html><head/><body><p>Edit comment.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="228"/>
+ <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="244"/>
+ <source><html><head/><body><p>Read Only Mode</p></body></html></source>
+ <translation><html><head/><body><p>Schreibshutz</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="304"/>
+ <source>Date/Time:</source>
+ <translation>Datum/Zeit:</translation>
+ </message>
+</context>
+<context>
+ <name>IGisItem</name>
+ <message>
+ <source>Read Only Mode...</source>
+ <translation type="obsolete">Schreibgeschützt...</translation>
+ </message>
+</context>
+<context>
+ <name>IGisWidget</name>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="53"/>
+ <source>State</source>
+ <translation>Status</translation>
+ </message>
+</context>
+<context>
+ <name>IGridSetup</name>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="14"/>
+ <source>Setup Grid...</source>
+ <translation>Gitter einstellen...</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="22"/>
+ <source>Projection</source>
+ <translation>Projektion</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="37"/>
+ <source>restore default</source>
+ <translation>Grundeinstellung wiederherstellen</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="40"/>
+ <location filename="../grid/IGridSetup.ui" line="66"/>
+ <location filename="../grid/IGridSetup.ui" line="92"/>
+ <location filename="../grid/IGridSetup.ui" line="146"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="63"/>
+ <source>Get projection from current map.</source>
+ <translation>Projektion aus der aktuellen Karte nehmen.</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="89"/>
+ <source>projection wizzard</source>
+ <translation>Projektionshilfe</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="130"/>
+ <source>Grid color</source>
+ <translation>Gitterfarbe</translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="143"/>
+ <source>setup grid color</source>
+ <translation>Gitterfarbe einstellen</translation>
+ </message>
+</context>
+<context>
+ <name>IInputDialog</name>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="14"/>
+ <source>Edit...</source>
+ <translation>Ändern...</translation>
+ </message>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="20"/>
+ <source>TextLabel</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>IMainWindow</name>
+ <message>
+ <location filename="../IMainWindow.ui" line="14"/>
+ <source>QMapShack</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="60"/>
+ <source>File</source>
+ <translation>Datei</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="70"/>
+ <source>View</source>
+ <translation>Ansicht</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="88"/>
+ <source>Window</source>
+ <translation>Fenster</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="93"/>
+ <source>?</source>
+ <translation>?</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="109"/>
+ <source>Maps</source>
+ <translation>Karten</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="146"/>
+ <source>Dig. Elev. Model (DEM)</source>
+ <translation>Höhenmodell (DEM)</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="179"/>
+ <source>Data</source>
+ <translation>Daten</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="192"/>
+ <source>Add Map Workspace</source>
+ <translation>Ansicht hinzufügen</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="195"/>
+ <source>Ctrl+T</source>
+ <translation>Crtl+T</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="207"/>
+ <source>Show Scale</source>
+ <translation>Maßstab</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="216"/>
+ <source>Setup Map Font</source>
+ <translation>Kartenfont einstellen</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="228"/>
+ <source>Show Grid</source>
+ <translation>Gitter</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="231"/>
+ <source>Ctrl+G</source>
+ <translation>Crtl+G</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="240"/>
+ <source>Setup Grid</source>
+ <translation>Gitter einstellen</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="243"/>
+ <source>Ctrl+Alt+G</source>
+ <translation>Ctrl+Alt+G</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="255"/>
+ <source>Flip Mouse Wheel</source>
+ <translation>Mausrad umdrehen</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="264"/>
+ <location filename="../IMainWindow.ui" line="267"/>
+ <source>Setup Map Paths</source>
+ <translation>Kartenverzeichnisse angeben</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="279"/>
+ <source>POI Text</source>
+ <translation>POI Text</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="291"/>
+ <source>Night / Day</source>
+ <translation>Nacht / Tag</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="303"/>
+ <source>Map Tool Tip</source>
+ <translation>Kartentooltip</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="312"/>
+ <source>Setup DEM Paths</source>
+ <translation>DEM Verzeichnisse angeben</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="321"/>
+ <source>About</source>
+ <translation>Über</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="330"/>
+ <source>Help</source>
+ <translation>Hilfe</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="339"/>
+ <source>Setup Map Workspace</source>
+ <translation>Ansicht einstellen</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="348"/>
+ <source>Load GIS Data</source>
+ <translation>GIS Daten laden</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="351"/>
+ <source>Load projects from file</source>
+ <translation>Lade Datei als Projekt</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="354"/>
+ <source>Ctrl+L</source>
+ <translation>Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="363"/>
+ <source>Save All GIS Data</source>
+ <translation>Alle GIS Daten speichern</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="366"/>
+ <source>Save all projects in the workspace</source>
+ <translation>Alle Projekte im Arbeitsplatz speichern</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="369"/>
+ <source>Ctrl+S</source>
+ <translation>Ctrl+S</translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="378"/>
+ <source>Setup Time Zone</source>
+ <translation>Zeitzone einstellen</translation>
+ </message>
+</context>
+<context>
+ <name>IMapList</name>
+ <message>
+ <location filename="../map/IMapList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="100"/>
+ <source>To add maps use File->Setup Map Pathss. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="113"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a map. Use drag-n-drop to move the activated map in the draw order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="138"/>
+ <source>Activate</source>
+ <translation type="unfinished">Aktivieren</translation>
+ </message>
+</context>
+<context>
+ <name>IMapPathSetup</name>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="14"/>
+ <source>Setup map paths</source>
+ <translation>Kartenpfad einstellen</translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="38"/>
+ <location filename="../map/IMapPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>IMapPropSetup</name>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation type="unfinished"><html><head/><body><p>Ändern Sie die transparenz der Karte</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"><html><head/><body><p>Klicken um die aktuelle Skalierung als minimale Skalierung zu benutzen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="50"/>
+ <location filename="../map/IMapPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation type="unfinished"><html><head/><body><p>Stellen sie den Skalierungsbereich ein, in dem die Karte sichtbar ist. Benutzen Si die beiden Knöpfe links und rechts um die minimale und maximale Skalierung einzustellen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"><html><head/><body><p>Klicken um die aktuelle Skalierung als maximale Skalierung zu benutzen.</p></body></html></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="134"/>
+ <source>Areas</source>
+ <translation>Flächen</translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="141"/>
+ <source>Lines</source>
+ <translation>Linien</translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="148"/>
+ <source>Points</source>
+ <translation>Punkte</translation>
+ </message>
+</context>
+<context>
+ <name>IPositionDialog</name>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="14"/>
+ <source>Position ...</source>
+ <translation>Position...</translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="20"/>
+ <source>Enter new position</source>
+ <translation>Neue Position eingeben</translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="30"/>
+ <source>Bad position format. Must be:
+"[N|S] ddd mm.sss [W|E] ddd mm.sss"
+or
+"[N|S] ddd.ddd [W|E] ddd.ddd"</source>
+ <translation>Falsches Positionsformat. Das muss entweder
+"[N|S] ddd mm.sss [W|E] ddd mm.sss"
+oder
+"[N|S] ddd.ddd [W|E] ddd.ddd"
+sein</translation>
+ </message>
+</context>
+<context>
+ <name>IProjWizard</name>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="14"/>
+ <source>Proj4 Wizzard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="29"/>
+ <source>Mercator</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="38"/>
+ <source>UTM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="45"/>
+ <source>zone</source>
+ <translation>Zone</translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="82"/>
+ <source>user defined</source>
+ <translation>Benutzer definiert</translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="94"/>
+ <source>Datum</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="104"/>
+ <source>World Mercator (OSM)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="124"/>
+ <source>Result:</source>
+ <translation>Ergebnis:</translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="138"/>
+ <source>UPS North (North Pole)</source>
+ <translation>UPS Nord (Nordpol)</translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="145"/>
+ <source>UPS South (South Pole)</source>
+ <translation>UPS Süd (Südpol)</translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="152"/>
+ <source>Projection</source>
+ <translation>Projektion</translation>
+ </message>
+</context>
+<context>
+ <name>IProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="14"/>
+ <source>Waypoint Projection</source>
+ <translation>Wegpunktprojektion</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="22"/>
+ <source>...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="38"/>
+ <source>-</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="47"/>
+ <source>Clone waypoint and move by:</source>
+ <translation>Den Wegpunk klonen und verschieben um:</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="59"/>
+ <source>m</source>
+ <translation></translation>
+ </message>
+ <message utf8="true">
+ <location filename="../gis/wpt/IProjWpt.ui" line="69"/>
+ <source>°</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptRte</name>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="28"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="31"/>
+ <location filename="../gis/rte/IScrOptRte.ui" line="45"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="42"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="71"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptTrk</name>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="46"/>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="60"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="86"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptWpt</name>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="49"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="52"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="66"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="101"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="63"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="84"/>
+ <source><html><head/><body><p>Move waypoint to a new location.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="98"/>
+ <source><html><head/><body><p>Clone waypoint and move clone a given distance and angle.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="145"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITextEditWidget</name>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="25"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="38"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="51"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="64"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="77"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="117"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="130"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="143"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="156"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="169"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="182"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="195"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="208"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="259"/>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="262"/>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="271"/>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="274"/>
+ <source>Ctrl+Shift+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="283"/>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="286"/>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="295"/>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="298"/>
+ <source>Ctrl+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="307"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="310"/>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="322"/>
+ <source>Align Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="325"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished">Ctrl+L</translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="337"/>
+ <source>Align Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="340"/>
+ <source>Ctrl+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="352"/>
+ <source>Align Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="355"/>
+ <source>Ctrl+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="367"/>
+ <source>Align Block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="370"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="382"/>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="385"/>
+ <source>Ctrl+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="397"/>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="400"/>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="412"/>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="415"/>
+ <source>Ctrl+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITimeZoneSetup</name>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="14"/>
+ <source>Setup Time Zone ...</source>
+ <translation>Zeitzone einstellen...</translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="22"/>
+ <source>UTC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="29"/>
+ <source>Local</source>
+ <translation>Lokal</translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="36"/>
+ <source>Automatic</source>
+ <translation>Automatisch</translation>
+ </message>
+</context>
+<context>
+ <name>IWptIconDialog</name>
+ <message>
+ <location filename="../helpers/IWptIconDialog.ui" line="14"/>
+ <source>Icons...</source>
+ <translation>Symbole...</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
+ <translation>Falsches Positionsformat. Richtig: [N|S] ddd mm.sss [W|E] ddd mm.sss </translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Failed to read...</source>
+ <translation>Lesen fehlgeschlagen...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+ <translation>Lesen fehlgeschlagen: %1
+Zeile %2, Spalte %3:
+%4</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Not a GPX file: </source>
+ <translation>Keien GPX Datei:</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="339"/>
+ <source>Are you sure you want to delete '%1' from project '%2'?</source>
+ <translation>Sind Sie sicher, dass Sie '%1' aus dem Projekt '%2' löschen wollen? </translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="340"/>
+ <source>Delete...</source>
+ <translation>Löschen...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="432"/>
+ <source>Save GIS data to...</source>
+ <translation>GIS Daten speichern in...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="484"/>
+ <source>File exists ...</source>
+ <translation>Datei existiert...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="485"/>
+ <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file. Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <source>Failed to create file '%1'</source>
+ <translation>Die Datei konnte nicht erstellt werden: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Saveing GIS data failed...</source>
+ <translation>Das Speichern der GIS Daten schlug fehl...</translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Failed to write file '%1'</source>
+ <translation>Die Datei konnte nicht geladen werden: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="135"/>
+ <source>Length: %1 %2</source>
+ <translation>Länge: %1 %2</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="142"/>
+ <source>, %1%2 %3, %4%5 %6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="150"/>
+ <source>Time: %1</source>
+ <translation>Zeit: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="153"/>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="163"/>
+ <source>, Speed: %1 %2</source>
+ <translation>, Geschw.: %1 %2</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="160"/>
+ <source>Moving: %1</source>
+ <translation>Bewegung: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="169"/>
+ <source>Start: %1</source>
+ <translation>Beginn: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="174"/>
+ <source>End: %1</source>
+ <translation>Ende: %1</translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="178"/>
+ <source>Points: %1 (%2)</source>
+ <translation>Punkte: %1 (%2)</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="151"/>
+ <source>Elevation: %1 %2</source>
+ <translation>Höhe: %1 %2</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="159"/>
+ <source>Proximity: %1 %2</source>
+ <translation>Abstand: %1 %2</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
+ <source>Changed name</source>
+ <translation>Name geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="226"/>
+ <source>Changed position</source>
+ <translation>Position geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="232"/>
+ <source>Changed elevation</source>
+ <translation>Höhe geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="238"/>
+ <source>Changed proximity</source>
+ <translation>Abstandsalarm geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+ <source>Changed icon</source>
+ <translation>Symbol geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="251"/>
+ <source>Changed comment</source>
+ <translation>Kommentar geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="257"/>
+ <source>Changed description</source>
+ <translation>Beschreibung geändert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="300"/>
+ <source>Archived</source>
+ <translation>Archiviert</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="304"/>
+ <source>Available</source>
+ <translation>Verfügbar:</translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="308"/>
+ <source>Not Available</source>
+ <translation>Nicht verfügbar</translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>Warning...</source>
+ <translation>Warnung...</translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <source>This is a typ file with unknown polygon encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>This is a typ file with unknown polyline encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="98"/>
+ <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
+ <translation type="unfinished">Dieses Element ist schreibgeschützt, weil es wahrscheinlich nicht in QMapShack erstellt wurde. Normalerweise sollte man importierte Daten nicht ändern wollen. Aber wenn Sie der Meinung sind, dass doch, dann drücken Sie 'Ok'.</translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="99"/>
+ <source>Read Only Mode...</source>
+ <translation>Schreibgeschützt...</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/locale/qmapshack_es.ts b/src/locale/qmapshack_es.ts
new file mode 100644
index 0000000..6069598
--- /dev/null
+++ b/src/locale/qmapshack_es.ts
@@ -0,0 +1,2127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es_ES">
+<context>
+ <name>CCanvas</name>
+ <message>
+ <location filename="../canvas/CCanvas.cpp" line="51"/>
+ <source>Workspace %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemList</name>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Deactivate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemList.cpp" line="143"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemPathSetup</name>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing DEM data. There can be multiple files in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemPathSetup.cpp" line="55"/>
+ <source>Select DEM file path...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDemVRT</name>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="44"/>
+ <source>Failed to load file: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="51"/>
+ <location filename="../dem/CDemVRT.cpp" line="60"/>
+ <source>DEM must have one band with 16bit or 32bit data.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/CDemVRT.cpp" line="84"/>
+ <source>No georeference information found.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <source>none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="58"/>
+ <location filename="../gis/wpt/CDetailsGeoCache.cpp" line="101"/>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="115"/>
+ <source>no comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="126"/>
+ <source>no description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Edit name...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="167"/>
+ <source>Enter new waypoint name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="177"/>
+ <source>Enter new elevation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CDetailsWpt.cpp" line="186"/>
+ <source>Enter new proximity range.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CGisListWks</name>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="34"/>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="33"/>
+ <source>Save As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="35"/>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="41"/>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="42"/>
+ <source>Move Waypoint...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="43"/>
+ <source>Proj. Waypoint...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisListWks.cpp" line="44"/>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CGrid</name>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="61"/>
+ <source>[Grid: %1] </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CGrid.cpp" line="65"/>
+ <source>[Grid: N %1m, E %2m] </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMainWindow</name>
+ <message>
+ <location filename="../CMainWindow.cpp" line="389"/>
+ <source>Ele: %1%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../CMainWindow.cpp" line="490"/>
+ <source>Load GIS Data...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapIMG</name>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="140"/>
+ <source>Failed ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="156"/>
+ <source>Unspecified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="157"/>
+ <source>French</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="158"/>
+ <source>German</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="159"/>
+ <source>Dutch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="160"/>
+ <source>English</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="161"/>
+ <source>Italian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="162"/>
+ <source>Finnish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="163"/>
+ <source>Swedish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="164"/>
+ <source>Spanish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="165"/>
+ <source>Basque</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="166"/>
+ <source>Catalan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="167"/>
+ <source>Galician</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="168"/>
+ <source>Welsh</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="169"/>
+ <source>Gaelic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="170"/>
+ <source>Danish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="171"/>
+ <source>Norwegian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="172"/>
+ <source>Portuguese</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="173"/>
+ <source>Slovak</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="174"/>
+ <source>Czech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="175"/>
+ <source>Croatian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="176"/>
+ <source>Hungarian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="177"/>
+ <source>Polish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="178"/>
+ <source>Turkish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="179"/>
+ <source>Greek</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="180"/>
+ <source>Slovenian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="181"/>
+ <source>Russian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="182"/>
+ <source>Estonian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="183"/>
+ <source>Latvian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="184"/>
+ <source>Romanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="185"/>
+ <source>Albanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="186"/>
+ <source>Bosnian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="187"/>
+ <source>Lithuanian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="188"/>
+ <source>Serbian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="189"/>
+ <source>Macedonian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="190"/>
+ <source>Bulgarian</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="247"/>
+ <source>Major highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="248"/>
+ <source>Principal highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="249"/>
+ <source>Other highway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="250"/>
+ <source>Arterial road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="251"/>
+ <source>Collector road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="252"/>
+ <source>Residential street</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="253"/>
+ <source>Alley/Private road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="254"/>
+ <source>Highway ramp, low speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="255"/>
+ <source>Highway ramp, high speed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="256"/>
+ <source>Unpaved road</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="257"/>
+ <source>Major highway connector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="258"/>
+ <source>Roundabout</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="259"/>
+ <source>Railroad</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="260"/>
+ <source>Shoreline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="261"/>
+ <source>Trail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="262"/>
+ <source>Stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="263"/>
+ <source>Time zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="264"/>
+ <location filename="../map/CMapIMG.cpp" line="265"/>
+ <source>Ferry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="266"/>
+ <source>State/province border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="267"/>
+ <source>County/parish border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="268"/>
+ <source>International border</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="269"/>
+ <source>River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="270"/>
+ <source>Minor land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="271"/>
+ <source>Intermediate land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="272"/>
+ <source>Major land contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="273"/>
+ <source>Minor depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="274"/>
+ <source>Intermediate depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="275"/>
+ <source>Major depth contour</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="276"/>
+ <source>Intermittent stream</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="277"/>
+ <location filename="../map/CMapIMG.cpp" line="359"/>
+ <source>Airport runway</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="278"/>
+ <source>Pipeline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="279"/>
+ <source>Powerline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="280"/>
+ <source>Marine boundary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="281"/>
+ <source>Hazard boundary</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="346"/>
+ <source>Large urban area (>200K)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="347"/>
+ <source>Small urban area (<200K)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="348"/>
+ <source>Rural housing area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="349"/>
+ <source>Military base</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="350"/>
+ <source>Parking lot</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="351"/>
+ <source>Parking garage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="352"/>
+ <source>Airport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="353"/>
+ <source>Shopping center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="354"/>
+ <source>Marina</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="355"/>
+ <source>University/College</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="356"/>
+ <source>Hospital</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="357"/>
+ <source>Industrial complex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="358"/>
+ <source>Reservation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="360"/>
+ <source>Man-made area</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="361"/>
+ <source>Sports complex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="362"/>
+ <source>Golf course</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="363"/>
+ <source>Cemetery</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="364"/>
+ <location filename="../map/CMapIMG.cpp" line="365"/>
+ <location filename="../map/CMapIMG.cpp" line="366"/>
+ <source>National park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="367"/>
+ <source>City park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="368"/>
+ <location filename="../map/CMapIMG.cpp" line="369"/>
+ <location filename="../map/CMapIMG.cpp" line="370"/>
+ <source>State park</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="371"/>
+ <source>Forest</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="372"/>
+ <source>Ocean</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="373"/>
+ <location filename="../map/CMapIMG.cpp" line="375"/>
+ <location filename="../map/CMapIMG.cpp" line="385"/>
+ <source>Blue (unknown)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="374"/>
+ <source>Sea</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="376"/>
+ <location filename="../map/CMapIMG.cpp" line="377"/>
+ <location filename="../map/CMapIMG.cpp" line="384"/>
+ <source>Large lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="378"/>
+ <location filename="../map/CMapIMG.cpp" line="379"/>
+ <source>Medium lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="380"/>
+ <location filename="../map/CMapIMG.cpp" line="381"/>
+ <source>Small lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="382"/>
+ <location filename="../map/CMapIMG.cpp" line="383"/>
+ <source>Major lake</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="386"/>
+ <source>Major River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="387"/>
+ <source>Large River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="388"/>
+ <source>Medium River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="389"/>
+ <source>Small River</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="392"/>
+ <source>Intermittent water</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="393"/>
+ <source>Wetland/Swamp</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="394"/>
+ <source>Glacier</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="395"/>
+ <source>Orchard/Plantation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="396"/>
+ <source>Scrub</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="397"/>
+ <source>Tundra</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="398"/>
+ <source>Flat</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="399"/>
+ <source>???</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="437"/>
+ <source>Failed to read: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="481"/>
+ <source>Failed to open: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="505"/>
+ <location filename="../map/CMapIMG.cpp" line="509"/>
+ <source>Bad file format: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="600"/>
+ <source>Failed to read file structure: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="633"/>
+ <source>Loading %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="638"/>
+ <source>User abort: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="639"/>
+ <source>File is NT format. QMapShack is unable to read map files with NT format: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="713"/>
+ <source>File contains locked / encypted data. Garmin does not want you to use this file with any other software than the one supplied by Garmin.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2363"/>
+ <location filename="../map/CMapIMG.cpp" line="2371"/>
+ <location filename="../map/CMapIMG.cpp" line="2375"/>
+ <location filename="../map/CMapIMG.cpp" line="2380"/>
+ <location filename="../map/CMapIMG.cpp" line="2427"/>
+ <location filename="../map/CMapIMG.cpp" line="2435"/>
+ <location filename="../map/CMapIMG.cpp" line="2439"/>
+ <location filename="../map/CMapIMG.cpp" line="2444"/>
+ <source>Point of Interest</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2569"/>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapIMG.cpp" line="2616"/>
+ <location filename="../map/CMapIMG.cpp" line="2625"/>
+ <location filename="../map/CMapIMG.cpp" line="2632"/>
+ <source>Area</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapList</name>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Deactivate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapList.cpp" line="148"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapPathSetup</name>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="39"/>
+ <source>Add or remove paths containing maps. There can be multiple maps in a path but no sub-path is parsed. Supported formats are: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapPathSetup.cpp" line="54"/>
+ <source>Select map path...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapRMAP</name>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="47"/>
+ <source>This is not a TwoNav RMAP file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="56"/>
+ <source>Unknown sub-format.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="126"/>
+ <source>Unknown version.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="143"/>
+ <location filename="../map/CMapRMAP.cpp" line="164"/>
+ <location filename="../map/CMapRMAP.cpp" line="186"/>
+ <location filename="../map/CMapRMAP.cpp" line="208"/>
+ <source>Failed to read reference point.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapRMAP.cpp" line="236"/>
+ <source>Unknown projection and datum (%1%2).</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CMapVRT</name>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="46"/>
+ <location filename="../map/CMapVRT.cpp" line="60"/>
+ <source>Failed to load file: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="88"/>
+ <source>File must be 8 bit palette or gray indexed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/CMapVRT.cpp" line="123"/>
+ <source>No georeference information found.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CProjWizard</name>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="55"/>
+ <source>north</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="56"/>
+ <source>south</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>Error...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/CProjWizard.cpp" line="211"/>
+ <source>The value
+'%1'
+is not a valid coordinate system definition:
+%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Edit name...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
+ <source>Enter new waypoint name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CTextEditWidget</name>
+ <message>
+ <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
+ <source>&Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IAbout</name>
+ <message>
+ <location filename="../IAbout.ui" line="14"/>
+ <source>About....</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="38"/>
+ <source><b>QMapShack</b>, Version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="45"/>
+ <location filename="../IAbout.ui" line="73"/>
+ <location filename="../IAbout.ui" line="87"/>
+ <location filename="../IAbout.ui" line="101"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="66"/>
+ <source>Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="80"/>
+ <source>GDAL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="94"/>
+ <source>Proj4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IAbout.ui" line="117"/>
+ <source>This software is licensed under GPL3 or any later version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message utf8="true">
+ <location filename="../IAbout.ui" line="124"/>
+ <source>© 2014 Oliver Eichler (oliver.eichler at gmx.de)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ICanvasSetup</name>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="14"/>
+ <source>Setup Map Workspace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="22"/>
+ <source>Projection & Datum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../canvas/ICanvasSetup.ui" line="32"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPathSetup</name>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="14"/>
+ <source>Setup DEM file pathss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="38"/>
+ <location filename="../dem/IDemPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemPropSetup</name>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="50"/>
+ <location filename="../dem/IDemPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemPropSetup.ui" line="110"/>
+ <source>Hillshading</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDemsList</name>
+ <message>
+ <location filename="../dem/IDemList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="118"/>
+ <source>To add files with elevation data use File->Setup DEM Paths. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="131"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a file. Use drag-n-drop to move the activated file in the process order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../dem/IDemList.ui" line="156"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsGeoCache</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="20"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="35"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="66"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="92"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="105"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="118"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="131"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="144"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="170"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="183"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="196"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="209"/>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="222"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="43"/>
+ <source>about:blank</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="59"/>
+ <source>Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="79"/>
+ <source>Difficulty</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="157"/>
+ <source>Terrain</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="231"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsGeoCache.ui" line="249"/>
+ <source>Hint:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IDetailsWpt</name>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="14"/>
+ <source>Dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="47"/>
+ <source><html><head/><body><p>Edit description.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="50"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="179"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="247"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="273"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="80"/>
+ <source>Position:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="113"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="139"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="203"/>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="311"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="100"/>
+ <source>Ele.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="126"/>
+ <source>Proximity:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="176"/>
+ <source><html><head/><body><p>Edit comment.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="228"/>
+ <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="244"/>
+ <source><html><head/><body><p>Read Only Mode</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IDetailsWpt.ui" line="304"/>
+ <source>Date/Time:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IGisWidget</name>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisWidget.ui" line="53"/>
+ <source>State</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IGridSetup</name>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="14"/>
+ <source>Setup Grid...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="22"/>
+ <source>Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="37"/>
+ <source>restore default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="40"/>
+ <location filename="../grid/IGridSetup.ui" line="66"/>
+ <location filename="../grid/IGridSetup.ui" line="92"/>
+ <location filename="../grid/IGridSetup.ui" line="146"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="63"/>
+ <source>Get projection from current map.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="89"/>
+ <source>projection wizzard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="130"/>
+ <source>Grid color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IGridSetup.ui" line="143"/>
+ <source>setup grid color</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IInputDialog</name>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="14"/>
+ <source>Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IInputDialog.ui" line="20"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMainWindow</name>
+ <message>
+ <location filename="../IMainWindow.ui" line="14"/>
+ <source>QMapShack</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="60"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="70"/>
+ <source>View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="88"/>
+ <source>Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="93"/>
+ <source>?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="109"/>
+ <source>Maps</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="146"/>
+ <source>Dig. Elev. Model (DEM)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="179"/>
+ <source>Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="192"/>
+ <source>Add Map Workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="195"/>
+ <source>Ctrl+T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="207"/>
+ <source>Show Scale</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="216"/>
+ <source>Setup Map Font</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="228"/>
+ <source>Show Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="231"/>
+ <source>Ctrl+G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="240"/>
+ <source>Setup Grid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="243"/>
+ <source>Ctrl+Alt+G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="255"/>
+ <source>Flip Mouse Wheel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="264"/>
+ <location filename="../IMainWindow.ui" line="267"/>
+ <source>Setup Map Paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="279"/>
+ <source>POI Text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="291"/>
+ <source>Night / Day</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="303"/>
+ <source>Map Tool Tip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="312"/>
+ <source>Setup DEM Paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="321"/>
+ <source>About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="330"/>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="339"/>
+ <source>Setup Map Workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="348"/>
+ <source>Load GIS Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="351"/>
+ <source>Load projects from file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="354"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="363"/>
+ <source>Save All GIS Data</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="366"/>
+ <source>Save all projects in the workspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="369"/>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../IMainWindow.ui" line="378"/>
+ <source>Setup Time Zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapList</name>
+ <message>
+ <location filename="../map/IMapList.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="100"/>
+ <source>To add maps use File->Setup Map Pathss. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="113"/>
+ <source>Use the context menu (right mouse button click on entry) to activate a map. Use drag-n-drop to move the activated map in the draw order. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapList.ui" line="138"/>
+ <source>Activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapPathSetup</name>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="14"/>
+ <source>Setup map paths</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="38"/>
+ <location filename="../map/IMapPathSetup.ui" line="58"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPathSetup.ui" line="107"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IMapPropSetup</name>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="35"/>
+ <source><html><head/><body><p>Change opacity of map</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="47"/>
+ <source><html><head/><body><p>Click to use current scale as minimum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="50"/>
+ <location filename="../map/IMapPropSetup.ui" line="87"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="71"/>
+ <source><html><head/><body><p>Control the range of scale the map is displayed. Use the two buttons left and right to define the actual scale as either minimum or maximum scale.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="84"/>
+ <source><html><head/><body><p>Click to use current scale as maximum scale to display the map.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="134"/>
+ <source>Areas</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="141"/>
+ <source>Lines</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/IMapPropSetup.ui" line="148"/>
+ <source>Points</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IPositionDialog</name>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="14"/>
+ <source>Position ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="20"/>
+ <source>Enter new position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/IPositionDialog.ui" line="30"/>
+ <source>Bad position format. Must be:
+"[N|S] ddd mm.sss [W|E] ddd mm.sss"
+or
+"[N|S] ddd.ddd [W|E] ddd.ddd"</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IProjWizard</name>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="14"/>
+ <source>Proj4 Wizzard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="29"/>
+ <source>Mercator</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="38"/>
+ <source>UTM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="45"/>
+ <source>zone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="82"/>
+ <source>user defined</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="94"/>
+ <source>Datum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="104"/>
+ <source>World Mercator (OSM)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="124"/>
+ <source>Result:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="138"/>
+ <source>UPS North (North Pole)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="145"/>
+ <source>UPS South (South Pole)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../grid/IProjWizard.ui" line="152"/>
+ <source>Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IProjWpt</name>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="14"/>
+ <source>Waypoint Projection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="22"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="38"/>
+ <source>-</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="47"/>
+ <source>Clone waypoint and move by:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IProjWpt.ui" line="59"/>
+ <source>m</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message utf8="true">
+ <location filename="../gis/wpt/IProjWpt.ui" line="69"/>
+ <source>°</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptRte</name>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="28"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="31"/>
+ <location filename="../gis/rte/IScrOptRte.ui" line="45"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="42"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/rte/IScrOptRte.ui" line="71"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptTrk</name>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="46"/>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="60"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/IScrOptTrk.ui" line="86"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IScrOptWpt</name>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="20"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="49"/>
+ <source><html><head/><body><p>View details & Edit</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="52"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="66"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="87"/>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="101"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="63"/>
+ <source><html><head/><body><p>Delete</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="84"/>
+ <source><html><head/><body><p>Move waypoint to a new location.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="98"/>
+ <source><html><head/><body><p>Clone waypoint and move clone a given distance and angle.</p></body></html></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/IScrOptWpt.ui" line="145"/>
+ <source>TextLabel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITextEditWidget</name>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="14"/>
+ <source>Form</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="25"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="38"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="51"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="64"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="77"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="117"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="130"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="143"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="156"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="169"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="182"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="195"/>
+ <location filename="../helpers/ITextEditWidget.ui" line="208"/>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="259"/>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="262"/>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="271"/>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="274"/>
+ <source>Ctrl+Shift+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="283"/>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="286"/>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="295"/>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="298"/>
+ <source>Ctrl+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="307"/>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="310"/>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="322"/>
+ <source>Align Left</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="325"/>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="337"/>
+ <source>Align Right</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="340"/>
+ <source>Ctrl+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="352"/>
+ <source>Align Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="355"/>
+ <source>Ctrl+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="367"/>
+ <source>Align Block</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="370"/>
+ <source>Ctrl+J</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="382"/>
+ <source>Underline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="385"/>
+ <source>Ctrl+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="397"/>
+ <source>Bold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="400"/>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="412"/>
+ <source>Italic</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../helpers/ITextEditWidget.ui" line="415"/>
+ <source>Ctrl+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ITimeZoneSetup</name>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="14"/>
+ <source>Setup Time Zone ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="22"/>
+ <source>UTC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="29"/>
+ <source>Local</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../units/ITimeZoneSetup.ui" line="36"/>
+ <source>Automatic</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>IWptIconDialog</name>
+ <message>
+ <location filename="../helpers/IWptIconDialog.ui" line="14"/>
+ <source>Icons...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../GeoMath.cpp" line="88"/>
+ <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Failed to read...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="63"/>
+ <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="72"/>
+ <source>Not a GPX file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="339"/>
+ <source>Are you sure you want to delete '%1' from project '%2'?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="340"/>
+ <source>Delete...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="432"/>
+ <source>Save GIS data to...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="484"/>
+ <source>File exists ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="485"/>
+ <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file. Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <source>Failed to create file '%1'</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="538"/>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Saveing GIS data failed...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/CGisProject.cpp" line="548"/>
+ <source>Failed to write file '%1'</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="135"/>
+ <source>Length: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="142"/>
+ <source>, %1%2 %3, %4%5 %6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="150"/>
+ <source>Time: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="153"/>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="163"/>
+ <source>, Speed: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="160"/>
+ <source>Moving: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="169"/>
+ <source>Start: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="174"/>
+ <source>End: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/trk/CGisItemTrk.cpp" line="178"/>
+ <source>Points: %1 (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="151"/>
+ <source>Elevation: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="159"/>
+ <source>Proximity: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
+ <source>Changed name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="226"/>
+ <source>Changed position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="232"/>
+ <source>Changed elevation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="238"/>
+ <source>Changed proximity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+ <source>Changed icon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="251"/>
+ <source>Changed comment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="257"/>
+ <source>Changed description</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="300"/>
+ <source>Archived</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="304"/>
+ <source>Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/wpt/CGisItemWpt.cpp" line="308"/>
+ <source>Not Available</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>Warning...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
+ <source>This is a typ file with unknown polygon encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
+ <source>This is a typ file with unknown polyline encoding. Please report!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="98"/>
+ <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../gis/IGisItem.cpp" line="99"/>
+ <source>Read Only Mode...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src/main.cpp b/src/main.cpp
index ea328c9..8a160c3 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -18,8 +18,10 @@
#include "CMainWindow.h"
#include "helpers/CAppOpts.h"
+#include "version.h"
-#include <QApplication>
+#include <QtCore>
+#include <QtWidgets>
#include <CGetOpt.h>
#include <iostream>
#include <gdal.h>
@@ -107,14 +109,66 @@ int main(int argc, char ** argv)
qInstallMessageHandler(myMessageOutput);
#endif
+ // find Qt's transaltions first
+ QString locale = QLocale::system().name();
+ QString resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
+ QTranslator *qtTranslator = new QTranslator(&a);
+ if (qtTranslator->load(QLatin1String("qt_") + locale,resourceDir))
+ {
+ a.installTranslator(qtTranslator);
+ }
+ else if (qtTranslator->load(QLatin1String("qt_") + locale,QCoreApplication::applicationDirPath()))
+ {
+ a.installTranslator(qtTranslator);
+ }
+
+ // find MapShack's translations
+ QStringList dirList;
+ dirList << QCoreApplication::applicationDirPath().replace(QRegExp("bin$"), "share/qmapshack/translations");
+// dirList << "./src";
+ foreach(QString dir, dirList)
+ {
+ QString transName = QLatin1String("qmapshack_") + locale;
+ if (qtTranslator->load( transName, dir))
+ {
+ a.installTranslator(qtTranslator);
+ qDebug() << "using file '"+ QDir(dir).canonicalPath() + "/" + transName + ".qm' for translations.";
+ break;
+ }
+ }
+
+
+
GDALAllRegister();
QCoreApplication::setApplicationName("QMapShack");
QCoreApplication::setOrganizationName("QLandkarte");
QCoreApplication::setOrganizationDomain("qlandkarte.org");
+ QSplashScreen *splash = 0;
+ if (!qlOpts->nosplash)
+ {
+ QPixmap pic(":/pics/splash.png");
+ QPainter p(&pic);
+ QFont f = p.font();
+ f.setBold(true);
+
+ p.setPen(Qt::black);
+ p.setFont(f);
+ p.drawText(400,395,"V " VER_STR);
+
+ splash = new QSplashScreen(pic);
+ splash->show();
+ }
+
CMainWindow w;
w.show();
+ if (splash != 0)
+ {
+ splash->finish(&w);
+ delete splash;
+ }
+
return a.exec();
}
diff --git a/src/map/CMapDraw.cpp b/src/map/CMapDraw.cpp
index 13fb93d..cfb82b4 100644
--- a/src/map/CMapDraw.cpp
+++ b/src/map/CMapDraw.cpp
@@ -35,7 +35,7 @@ QStringList CMapDraw::supportedFormats = QString("*.vrt|*.jnx|*.img|*.rmap").spl
CMapDraw::CMapDraw(CCanvas *parent)
- : IDrawContext("map",parent)
+ : IDrawContext("map", CCanvas::eRedrawMap, parent)
{
mapList = new CMapList(canvas);
CMainWindow::self().addMapList(mapList, canvas->objectName());
diff --git a/src/map/CMapIMG.cpp b/src/map/CMapIMG.cpp
index e5cbb6c..3a3434d 100644
--- a/src/map/CMapIMG.cpp
+++ b/src/map/CMapIMG.cpp
@@ -33,7 +33,7 @@
#undef DEBUG_SHOW_SECT_DESC
#undef DEBUG_SHOW_TRE_DATA
#undef DEBUG_SHOW_SUBDIV_DATA
-#define DEBUG_SHOW_MAPLEVELS
+#undef DEBUG_SHOW_MAPLEVELS
#undef DEBUG_SHOW_SECTION_BORDERS
#undef DEBUG_SHOW_SUBDIV_BORDERS
@@ -470,7 +470,7 @@ void CMapIMG::readFile(CFileExt& file, quint32 offset, quint32 size, QByteArray&
}
-bool CMapIMG::readBasics()
+void CMapIMG::readBasics()
{
char tmpstr[64];
qint64 fsize = QFileInfo(filename).size();
@@ -675,7 +675,7 @@ void CMapIMG::readSubfileBasics(subfile_desc_t& subfile, CFileExt &file)
subfile.east = GARMIN_RAD(i32);
i32 = gar_ptr_load(int24_t, &pTreHdr->southbound);
subfile.south = GARMIN_RAD(i32);
- i32 = gar_ptr_load(int24_t, &pTreHdr->westbound);
+ i32 = gar_ptr_load(int24_t, &pTreHdr->westbound);
subfile.west = GARMIN_RAD(i32);
if(subfile.east == subfile.west)
@@ -683,6 +683,11 @@ void CMapIMG::readSubfileBasics(subfile_desc_t& subfile, CFileExt &file)
subfile.east = -subfile.east;
}
+ if(subfile.west > 0 && subfile.east < 0)
+ {
+ subfile.east = -subfile.east;
+ }
+
subfile.area = QRectF(QPointF(subfile.west, subfile.north), QPointF(subfile.east, subfile.south));
if(maparea.isNull())
@@ -1236,12 +1241,16 @@ void CMapIMG::loadVisibleData(bool fast, polytype_t& polygons, polytype_t& polyl
QMap<QString,subfile_desc_t>::const_iterator subfile = subfiles.constBegin();
while(subfile != subfiles.constEnd())
{
- // qDebug() << "subfile:" << subfile->area << viewport << subfile->area.intersects(viewport);
+// qDebug() << "-------";
+// qDebug() << (viewport.topLeft() * RAD_TO_DEG) << (viewport.bottomRight() * RAD_TO_DEG);
+// qDebug() << (subfile->area.topLeft() * RAD_TO_DEG) << (subfile->area.bottomRight() * RAD_TO_DEG);
+// qDebug() << subfile->area.intersects(viewport);
if(!subfile->area.intersects(viewport))
{
++subfile;
continue;
}
+
if(map->needsRedraw())
{
break;
@@ -2006,7 +2015,6 @@ void CMapIMG::drawPoints(QPainter& p, pointtype_t& pts, QVector<QRectF>& rectPoi
void CMapIMG::drawPois(QPainter& p, pointtype_t& pts, QVector<QRectF> &rectPois)
{
CGarminTyp::label_type_e labelType = CGarminTyp::eStandard;
- bool showLabel = true;
QPixmap blueBullet(":/icons/8x8/bullet_blue.png");
QPixmap redBullet(":/icons/8x8/bullet_red.png");
@@ -2034,19 +2042,17 @@ void CMapIMG::drawPois(QPainter& p, pointtype_t& pts, QVector<QRectF> &rectPois)
}
labelType = CGarminTyp::eStandard;
- showLabel = true;
if(pointProperties.contains(pt->type))
{
p.drawImage(pt->pos.x() - (size.width()/2), pt->pos.y() - (size.height()/2), icon);
labelType = pointProperties[pt->type].labelType;
- showLabel = labelType != CGarminTyp::eNone;
}
else
{
p.drawPixmap(pt->pos.x() - 4, pt->pos.y() - 4, redBullet);
}
- if(CMainWindow::self().isPOIText() /*&& showLabel*/)
+ if(CMainWindow::self().isPOIText())
{
// calculate bounding rectangle with a border of 2 px
@@ -2141,7 +2147,7 @@ void CMapIMG::drawText(QPainter& p)
path.addPolygon(textpath->polyline);
// get path length and string length
- qreal length = fabs(path.length());
+ qreal length = qAbs(path.length());
qreal width = fm.width(textpath->text);
// adjust font size until string fits into polyline
diff --git a/src/map/CMapIMG.h b/src/map/CMapIMG.h
index 8fca1e6..0cf48eb 100644
--- a/src/map/CMapIMG.h
+++ b/src/map/CMapIMG.h
@@ -168,7 +168,7 @@ class CMapIMG : public IMap
quint8 scale2bits(const QPointF &scale);
void setupTyp();
- bool readBasics();
+ void readBasics();
void readSubfileBasics(subfile_desc_t& subfile, CFileExt &file);
void processPrimaryMapData();
void readFile(CFileExt& file, quint32 offset, quint32 size, QByteArray& data);
diff --git a/src/map/CMapRMAP.cpp b/src/map/CMapRMAP.cpp
index b1c8352..2399a56 100644
--- a/src/map/CMapRMAP.cpp
+++ b/src/map/CMapRMAP.cpp
@@ -368,10 +368,10 @@ CMapRMAP::level_t& CMapRMAP::findBestLevel(const QPointF& s)
for(;j < levels.size(); j++)
{
level_t& level = levels[j];
- if(fabs(level.xscale - s.x()) < dsx)
+ if(qAbs(level.xscale - s.x()) < dsx)
{
i = j;
- dsx = fabs(level.xscale - s.x());
+ dsx = qAbs(level.xscale - s.x());
}
}
diff --git a/src/map/CMapVRT.cpp b/src/map/CMapVRT.cpp
index 612eeb1..cda24e4 100644
--- a/src/map/CMapVRT.cpp
+++ b/src/map/CMapVRT.cpp
@@ -99,12 +99,6 @@ CMapVRT::CMapVRT(const QString &filename, CMapDraw *parent)
colortable[idx] = tmp.rgba();
}
}
- else
- {
- delete dataset; dataset = 0;
- QMessageBox::warning(0, tr("Error..."), tr("File must be 8 bit palette or gray indexed."));
- return;
- }
qDebug() << "has overviews" << hasOverviews;
@@ -301,7 +295,6 @@ void CMapVRT::draw(IDrawContext::buffer_t& buf)
{
dx_used = xsize_px - x;
imgw_used = qRound(imgw * dx_used / dx) & 0xFFFFFFFC;
- dx_used = dx * imgw_used / imgw;
}
if((y + dy) > ysize_px)
{
@@ -309,6 +302,18 @@ void CMapVRT::draw(IDrawContext::buffer_t& buf)
imgh_used = imgh * dy_used / dy;
}
+ x = qRound(x);
+ y = qRound(y);
+ dx_used = qFloor(dx_used);
+ dy_used = qFloor(dy_used);
+ imgw_used = qRound(imgw_used);
+ imgh_used = qRound(imgh_used);
+
+ if(imgw_used < 1 || imgh_used < 1)
+ {
+ continue;
+ }
+
QImage img;
if(rasterBandCount == 1)
{
@@ -319,12 +324,55 @@ void CMapVRT::draw(IDrawContext::buffer_t& buf)
img.setColorTable(colortable);
err = pBand->RasterIO(GF_Read
- ,qRound(x),qRound(y)
- ,qRound(dx_used),qRound(dy_used)
+ ,x,y
+ ,dx_used,dy_used
,img.bits()
- ,qRound(imgw_used),qRound(imgh_used)
+ ,imgw_used,imgh_used
,GDT_Byte,0,0);
}
+ else
+ {
+ img = QImage(imgw_used,imgh_used, QImage::Format_ARGB32);
+ img.fill(qRgba(255,255,255,255));
+
+ QVector<quint8> buffer(imgw_used * imgh_used);
+
+ QRgb testPix = qRgba(GCI_RedBand, GCI_GreenBand, GCI_BlueBand, GCI_AlphaBand);
+
+ for(int b = 1; b <= rasterBandCount; ++b)
+ {
+ GDALRasterBand * pBand;
+ pBand = dataset->GetRasterBand(b);
+
+ err = pBand->RasterIO(GF_Read
+ , x, y
+ , dx_used, dy_used
+ , buffer.data()
+ , imgw_used, imgh_used
+ , GDT_Byte, 0, 0);
+
+ if(!err)
+ {
+ int pbandColour = pBand->GetColorInterpretation();
+ unsigned int offset;
+
+ for (offset = 0; offset < sizeof(testPix) && *(((quint8 *)&testPix) + offset) != pbandColour; offset++);
+ if(offset < sizeof(testPix))
+ {
+ quint8 * pTar = img.bits() + offset;
+ quint8 * pSrc = buffer.data();
+ const int size = buffer.size();
+
+ for(int i = 0; i < size; ++i)
+ {
+ *pTar = *pSrc;
+ pTar += sizeof(testPix);
+ pSrc += 1;
+ }
+ }
+ }
+ }
+ }
if(err)
{
diff --git a/src/map/IMapPathSetup.ui b/src/map/IMapPathSetup.ui
index 281fb20..13557c6 100644
--- a/src/map/IMapPathSetup.ui
+++ b/src/map/IMapPathSetup.ui
@@ -130,16 +130,6 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/FolderMap.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
diff --git a/src/map/garmin/CGarminPolygon.cpp b/src/map/garmin/CGarminPolygon.cpp
index cb6b621..fb83c3c 100644
--- a/src/map/garmin/CGarminPolygon.cpp
+++ b/src/map/garmin/CGarminPolygon.cpp
@@ -186,7 +186,6 @@ quint32 CGarminPolygon::decode(qint32 iCenterLon, qint32 iCenterLat, quint32 shi
CShiftReg sr(pData,bs_len,bx,by,extra_bit,signinfo);
qint32 x1,y1,x = 0,y = 0;
- projXY xy;
bool isNegative = (iCenterLon >= 0x800000);
// first point
@@ -292,7 +291,6 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
CShiftReg sr(pData,bs_len,bx,by,false,signinfo);
qint32 x1,y1,x = 0,y = 0;
- projXY xy;
bool isNegative = (iCenterLon >= 0x800000);
// first point
@@ -314,7 +312,7 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
// xy.u = GARMIN_RAD(x1);
// xy.v = GARMIN_RAD(y1);
-// if(fabs(xy.v) > 2*M_PI || fabs(xy.u) > 2*M_PI)
+// if(qAbs(xy.v) > 2*M_PI || qAbs(xy.u) > 2*M_PI)
// {
// qDebug() << "bam";
// qDebug() << xy.u << xy.v << pStart << pEnd << (pEnd - pStart) << (cnt + 1) << line;
diff --git a/src/mouse/CMouseMoveWpt.cpp b/src/mouse/CMouseMoveWpt.cpp
new file mode 100644
index 0000000..b4a8d1a
--- /dev/null
+++ b/src/mouse/CMouseMoveWpt.cpp
@@ -0,0 +1,138 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "mouse/CMouseMoveWpt.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "gis/CGisDraw.h"
+#include "gis/CGisWidget.h"
+#include "gis/WptIcons.h"
+#include "canvas/CCanvas.h"
+#include "units/IUnit.h"
+#include "GeoMath.h"
+
+#include <QtWidgets>
+#include <proj_api.h>
+
+CMouseMoveWpt::CMouseMoveWpt(CGisItemWpt &wpt, CGisDraw * gis, CCanvas *parent)
+ : IMouse(gis, parent)
+{
+ cursor = QCursor(QPixmap(":/cursors/cursorMoveWpt.png"),0,0);
+ key = wpt.getKey();
+ icon = getWptIconByName(wpt.getIconName(), focus);
+ origPos = wpt.getPosition() * DEG_TO_RAD;
+}
+
+CMouseMoveWpt::~CMouseMoveWpt()
+{
+
+}
+
+void CMouseMoveWpt::draw(QPainter& p, const QRect &rect)
+{
+ QString val, unit, str;
+ qreal d, a1 = 0, a2 = 0;
+ QPointF p1 = origPos;
+ QPointF p2 = newPos;
+
+ d = GPS_Math_Distance(p1.x(), p1.y(), p2.x(), p2.y(), a1, a2);
+ IUnit::self().meter2distance(d, val, unit);
+ str = QString("%1 %2, %3").arg(val).arg(unit).arg(a2, 0, 'f', 1);
+
+ gis->convertRad2Px(p1);
+ gis->convertRad2Px(p2);
+
+
+ QPointF p11 = p1 + QPoint(17 * cos((a1 - 90) * DEG_TO_RAD), 17 * sin((a1 - 90) * DEG_TO_RAD));
+ QPointF p22 = p2 + QPoint(21 * cos((a2 + 90) * DEG_TO_RAD), 21 * sin((a2 + 90) * DEG_TO_RAD));
+
+
+ QPen pen(Qt::darkBlue, 3);
+ pen.setCapStyle(Qt::RoundCap);
+ pen.setJoinStyle(Qt::MiterJoin);
+ p.setPen(pen);
+
+ p.setBrush(Qt::NoBrush);
+ p.drawEllipse(p1, 16, 16);
+ p.drawEllipse(p2, 16, 16);
+ p.drawLine(p11,p22);
+
+ p.save();
+ p.translate(p22);
+ p.rotate(a2 + 180);
+ QPolygonF arrow;
+ arrow << QPointF(0,0) << QPointF(5, -20) << QPointF(0, -10) << QPointF(-5, -20);
+ p.setBrush(Qt::NoBrush);
+ p.drawPolygon(arrow);
+ p.restore();
+
+ CCanvas::drawText(str, p, (p2 + QPoint(0, -30)).toPoint(), Qt::darkBlue);
+
+ p.drawPixmap(p1 - focus, icon);
+ p.drawPixmap(p2 - focus, icon);
+
+}
+
+void CMouseMoveWpt::slotPanCanvas()
+{
+ IMouse::slotPanCanvas();
+
+ newPos = point;
+ gis->convertPx2Rad(newPos);
+}
+
+void CMouseMoveWpt::mousePressEvent(QMouseEvent * e)
+{
+ point = e->pos();
+ if(e->button() == Qt::RightButton)
+ {
+ canvas->resetMouse();
+ canvas->update();
+ }
+ else if(e->button() == Qt::LeftButton)
+ {
+ QPointF pos = e->pos();
+ gis->convertPx2Rad(pos);
+ CGisItemWpt * wpt = dynamic_cast<CGisItemWpt*>(CGisWidget::self().getItemByKey(key));
+ if(wpt != 0)
+ {
+ wpt->setPosition(pos * RAD_TO_DEG);
+ }
+ canvas->resetMouse();
+ canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+ }
+}
+
+void CMouseMoveWpt::mouseMoveEvent(QMouseEvent * e)
+{
+ point = e->pos();
+ newPos = point;
+ gis->convertPx2Rad(newPos);
+
+ panCanvas(point);
+}
+
+void CMouseMoveWpt::mouseReleaseEvent(QMouseEvent *e)
+{
+ point = e->pos();
+}
+
+void CMouseMoveWpt::wheelEvent(QWheelEvent * e)
+{
+
+}
+
diff --git a/src/mouse/CMouseNormal.h b/src/mouse/CMouseMoveWpt.h
similarity index 65%
copy from src/mouse/CMouseNormal.h
copy to src/mouse/CMouseMoveWpt.h
index 400a667..630242d 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/mouse/CMouseMoveWpt.h
@@ -16,29 +16,40 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CMOUSEMOVEWPT_H
+#define CMOUSEMOVEWPT_H
-#include "IMouse.h"
+#include "mouse/IMouse.h"
+
+#include <QPixmap>
class CCanvas;
+class CGisItemWpt;
+class CGisDraw;
-class CMouseNormal : public IMouse
+class CMouseMoveWpt : public IMouse
{
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ CMouseMoveWpt(CGisItemWpt& wpt, CGisDraw * gis, CCanvas * parent);
+ virtual ~CMouseMoveWpt();
+ void draw(QPainter& p, const QRect &rect);
void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent *e);
+ void wheelEvent(QWheelEvent * e);
+ protected slots:
+ virtual void slotPanCanvas();
- protected:
- bool mapMove;
+ private:
+ QString key;
+ QPointF origPos;
+ QPointF newPos;
+ QPointF focus;
+ QPixmap icon;
- QPoint lastPos;
};
-#endif //CMOUSENORMAL_H
+#endif //CMOUSEMOVEWPT_H
diff --git a/src/mouse/CMouseNormal.cpp b/src/mouse/CMouseNormal.cpp
index d53d3b0..38ae4a9 100644
--- a/src/mouse/CMouseNormal.cpp
+++ b/src/mouse/CMouseNormal.cpp
@@ -17,15 +17,24 @@
**********************************************************************************************/
#include "mouse/CMouseNormal.h"
+#include "mouse/CScrOptUnclutter.h"
#include "canvas/CCanvas.h"
+#include "gis/CGisWidget.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/rte/CGisItemRte.h"
+#include "gis/CGisWidget.h"
+#include "gis/CGisDraw.h"
#include <QtGui>
-CMouseNormal::CMouseNormal(CCanvas *canvas)
- : IMouse(canvas)
+CMouseNormal::CMouseNormal(CGisDraw *gis, CCanvas *canvas)
+ : IMouse(gis, canvas)
, mapMove(false)
+ , stateItemSel(eStateIdle)
{
cursor = QCursor(QPixmap(":/cursors/cursorMoveMap.png"),0,0);
+ screenUnclutter = new CScrOptUnclutter(canvas);
}
CMouseNormal::~CMouseNormal()
@@ -35,36 +44,183 @@ CMouseNormal::~CMouseNormal()
void CMouseNormal::mousePressEvent(QMouseEvent * e)
{
+ point = e->pos();
if(e->button() == Qt::LeftButton)
{
- lastPos = e->pos();
- mapMove = true;
+ lastPos = e->pos();
+ // start to block map moving when a previous click
+ // has triggered a selection of any kind
+ mapMove = (stateItemSel < eStateNoMapMovePossible);
+ mapDidMove = false;
}
}
void CMouseNormal::mouseMoveEvent(QMouseEvent * e)
{
- const QPoint pos = e->pos();
+ screenUnclutter->mouseMoveEvent(e);
+ if(!screenItemOption.isNull())
+ {
+ screenItemOption->mouseMoveEvent(e);
+ }
+
+ point = e->pos();
if(mapMove)
{
- if(pos != lastPos)
+ if(point != lastPos)
{
- QPoint delta = pos - lastPos;
+ QPoint delta = point - lastPos;
canvas->moveMap(delta);
- lastPos = pos;
+ lastPos = point;
+ mapDidMove = true;
}
}
else
{
- canvas->displayInfo(pos);
+ canvas->displayInfo(point);
+ canvas->update();
}
}
void CMouseNormal::mouseReleaseEvent(QMouseEvent *e)
{
+ point = e->pos();
if(e->button() == Qt::LeftButton)
+ {
+ if(!mapDidMove)
+ {
+ switch(stateItemSel)
+ {
+ case eStateHooverSingle:
+ {
+ stateItemSel = eStateIdle;
+
+ IGisItem * item = CGisWidget::self().getItemByKey(screenUnclutter->getItemKey());
+ if(item)
+ {
+ item->treeWidget()->collapseAll();
+ item->treeWidget()->setCurrentItem(item);
+ item->treeWidget()->scrollToItem(item, QAbstractItemView::PositionAtCenter);
+
+ delete screenItemOption;
+ screenItemOption = item->getScreenOptions(point, this);
+
+ if(!screenItemOption.isNull())
+ {
+ stateItemSel = eStateShowItemOptions;
+
+ }
+ }
+ break;
+ }
+ case eStateHooverMultiple:
+ {
+ screenUnclutter->setOrigin(e->pos());
+ stateItemSel = eStateUnclutterMultiple;
+ break;
+ }
+ case eStateUnclutterMultiple:
+ {
+ const CScrOptUnclutter::item_t * scrOpt = screenUnclutter->selectItem(point);
+ if(scrOpt != 0)
+ {
+ QString key = scrOpt->key;
+ screenUnclutter->clear();
+
+ IGisItem * item = CGisWidget::self().getItemByKey(key);
+ if(item)
+ {
+ item->treeWidget()->collapseAll();
+ item->treeWidget()->setCurrentItem(item);
+ item->treeWidget()->scrollToItem(item, QAbstractItemView::PositionAtCenter);
+
+ delete screenItemOption;
+ screenItemOption = item->getScreenOptions(screenUnclutter->getOrigin(), this);
+
+ if(!screenItemOption.isNull())
+ {
+ stateItemSel = eStateShowItemOptions;
+ break;
+ }
+ }
+ }
+ screenUnclutter->clear();
+ stateItemSel = eStateIdle;
+ break;
+ }
+ case eStateShowItemOptions:
+ {
+ delete screenItemOption;
+ stateItemSel = eStateIdle;
+ break;
+ }
+ default:;
+ }
+ canvas->update();
+ }
+ mapMove = false;
+ mapDidMove = false;
+ }
+}
+
+void CMouseNormal::wheelEvent(QWheelEvent * e)
+{
+ screenUnclutter->clear();
+ delete screenItemOption;
+ stateItemSel = eStateIdle;
+}
+
+
+void CMouseNormal::draw(QPainter& p, const QRect &rect)
+{
+ // no mouse interaction while gis thread is running
+ if(gis->isRunning())
{
- mapMove = false;
+ return;
+ }
+
+ switch(stateItemSel)
+ {
+ case eStateIdle:
+ case eStateHooverSingle:
+ case eStateHooverMultiple:
+ {
+ screenUnclutter->clear();
+
+ QList<IGisItem*> items;
+ CGisWidget::self().getItemsByPos(point, items);
+
+ if(items.empty() || items.size() > 8)
+ {
+ stateItemSel = eStateIdle;
+ break;
+ }
+
+ foreach(IGisItem * item, items)
+ {
+ item->drawHighlight(p);
+ screenUnclutter->addItem(item);
+ }
+
+ stateItemSel = (screenUnclutter->size() == 1) ? eStateHooverSingle : eStateHooverMultiple;
+ break;
+ }
+ case eStateUnclutterMultiple:
+ {
+ screenUnclutter->draw(p);
+ break;
+ }
+ case eStateShowItemOptions:
+ {
+ if(screenItemOption.isNull())
+ {
+ stateItemSel = eStateIdle;
+ break;
+ }
+
+ screenItemOption->draw(p);
+ break;
+ }
+ default:;
}
}
diff --git a/src/mouse/CMouseNormal.h b/src/mouse/CMouseNormal.h
index 400a667..fa37ecd 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/mouse/CMouseNormal.h
@@ -21,23 +21,55 @@
#include "IMouse.h"
+#include <QStringList>
+#include <QPixmap>
+#include <QRect>
+#include <QPointer>
+
class CCanvas;
+class IScrOpt;
+class CScrOptUnclutter;
class CMouseNormal : public IMouse
{
public:
- CMouseNormal(CCanvas *canvas);
+ CMouseNormal(CGisDraw * gis, CCanvas *canvas);
virtual ~CMouseNormal();
+ void draw(QPainter& p, const QRect &rect);
void mousePressEvent(QMouseEvent * e);
void mouseMoveEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent *e);
-
+ void wheelEvent(QWheelEvent * e);
protected:
+ /// the flag is true if the map moving is in progress
bool mapMove;
-
+ /// the flag is true if the map has been moved actually
+ bool mapDidMove;
+ /// always the last seen mouse cursor position
QPoint lastPos;
+
+ enum item_selection_states_e
+ {
+ eStateIdle = 0
+ /// there is only a single item close to the cursor
+ , eStateHooverSingle = 1
+ /// there are multiple items close to the cursor
+ , eStateHooverMultiple = 2
+ /// not a real state, but at this value and above no map move is allowed to take place
+ , eStateNoMapMovePossible = 3
+ /// the user clicked on multiple cluttered items and gets now an uncluttered representation
+ , eStateUnclutterMultiple = 3
+ /// the user has selected a single item, show options how to proceed
+ , eStateShowItemOptions = 4
+ };
+
+ item_selection_states_e stateItemSel;
+
+ CScrOptUnclutter * screenUnclutter;
+ QPointer<IScrOpt> screenItemOption;
+
};
#endif //CMOUSENORMAL_H
diff --git a/src/mouse/CScrOptUnclutter.cpp b/src/mouse/CScrOptUnclutter.cpp
new file mode 100644
index 0000000..e7092d8
--- /dev/null
+++ b/src/mouse/CScrOptUnclutter.cpp
@@ -0,0 +1,161 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "mouse/CScrOptUnclutter.h"
+#include "gis/IGisItem.h"
+#include "CMainWindow.h"
+#include "canvas/CCanvas.h"
+
+#include <QtWidgets>
+
+const QPoint CScrOptUnclutter::positions[] =
+{
+ QPoint(-50,-23)
+ , QPoint( 50,-23)
+ , QPoint(-50, 23)
+ , QPoint( 50, 23)
+ , QPoint(-22,-55)
+ , QPoint( 22,-55)
+ , QPoint(-22, 55)
+ , QPoint( 22, 55)
+
+};
+
+
+CScrOptUnclutter::CScrOptUnclutter(QWidget *parent)
+ : IScrOpt(parent)
+ , doSpecialCursor(false)
+{
+
+}
+
+CScrOptUnclutter::~CScrOptUnclutter()
+{
+
+}
+
+void CScrOptUnclutter::clear()
+{
+ if(doSpecialCursor)
+ {
+ QApplication::restoreOverrideCursor();
+ doSpecialCursor = false;
+ }
+ items.clear();
+}
+
+void CScrOptUnclutter::mouseMoveEvent(QMouseEvent * e)
+{
+ IScrOpt::mouseMoveEvent(e);
+
+ foreach(const item_t& item, items)
+ {
+ if(item.active.contains(mousePos))
+ {
+ if(!doSpecialCursor)
+ {
+ QApplication::setOverrideCursor(Qt::PointingHandCursor);
+ doSpecialCursor = true;
+ }
+ return;
+ }
+ }
+
+ if(doSpecialCursor)
+ {
+ QApplication::restoreOverrideCursor();
+ doSpecialCursor = false;
+ return;
+ }
+}
+
+void CScrOptUnclutter::addItem(IGisItem * gisItem)
+{
+ items << item_t();
+ item_t& item = items.last();
+ item.name = gisItem->getName();
+ item.key = gisItem->getKey();
+ item.icon = gisItem->getIcon();
+ item.area = item.icon.rect();
+ item.active = item.area.adjusted(-10,-10,10,10);
+}
+
+QString CScrOptUnclutter::getItemKey(int index)
+{
+ if(index < items.size())
+ {
+ return items[index].key;
+ }
+ return QString::Null();
+}
+
+const CScrOptUnclutter::item_t * CScrOptUnclutter::selectItem(const QPoint& point)
+{
+ foreach(const item_t& item, items)
+ {
+ if(item.active.contains(point))
+ {
+ return &item;
+ }
+ }
+ return 0;
+}
+
+void CScrOptUnclutter::draw(QPainter& p)
+{
+ QFontMetrics fm(CMainWindow::self().getMapFont());
+ for(int cnt = 0; cnt < items.size(); cnt++)
+ {
+ item_t& item = items[cnt];
+
+ if(item.text.isNull())
+ {
+
+ item.area.moveCenter(origin + positions[cnt]);
+ item.active.moveCenter(item.area.center());
+ item.text = fm.boundingRect(item.name);
+ if(cnt & 0x01)
+ {
+ item.text.moveTopLeft(item.area.topRight() + QPoint( 17, fm.height()/2));
+ }
+ else
+ {
+ item.text.moveTopRight(item.area.topLeft() + QPoint(-17, fm.height()/2));
+ }
+ item.text.adjust(-4, -3, 4, 3);
+ }
+ }
+
+ foreach(const item_t& item, items)
+ {
+
+
+ p.setPen(Qt::NoPen);
+ p.setBrush(QColor(255,255,255,255));
+ p.drawEllipse(item.area.center(), 20,20);
+ p.drawRoundedRect(item.text, 3, 3);
+
+ p.setPen(QPen(Qt::lightGray,2));
+ p.setBrush(Qt::NoBrush);
+ p.drawRoundedRect(item.text, 3, 3);
+ p.drawEllipse(item.area.center(), 18,18);
+
+ p.drawPixmap(item.area, item.icon);
+ CCanvas::drawText(item.name, p, item.text, Qt::darkBlue);
+ }
+}
diff --git a/src/mouse/CMouseNormal.h b/src/mouse/CScrOptUnclutter.h
similarity index 54%
copy from src/mouse/CMouseNormal.h
copy to src/mouse/CScrOptUnclutter.h
index 400a667..f5d8fd9 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/mouse/CScrOptUnclutter.h
@@ -16,29 +16,47 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef CSCROPTUNCLUTTER_H
+#define CSCROPTUNCLUTTER_H
-#include "IMouse.h"
+#include "mouse/IScrOpt.h"
-class CCanvas;
+class IGisItem;
-class CMouseNormal : public IMouse
+
+class CScrOptUnclutter : public IScrOpt
{
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
-
- void mousePressEvent(QMouseEvent * e);
+ CScrOptUnclutter(QWidget *parent);
+ virtual ~CScrOptUnclutter();
+
+ struct item_t
+ {
+ QString name;
+ QString key;
+ QPixmap icon;
+ QRect area;
+ QRect text;
+ QRect active;
+ };
+
+ virtual void clear();
+ virtual int size(){return items.size();}
+
+ void addItem(IGisItem * gisItem);
+ QString getItemKey(int index = 0);
+ const item_t *selectItem(const QPoint& point);
+
+ void draw(QPainter& p);
void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ private:
+ static const QPoint positions[];
+ QList<item_t> items;
+ bool doSpecialCursor;
- protected:
- bool mapMove;
- QPoint lastPos;
};
-#endif //CMOUSENORMAL_H
+#endif //CSCROPTUNCLUTTER_H
diff --git a/src/mouse/IMouse.cpp b/src/mouse/IMouse.cpp
index 480fa93..4018191 100644
--- a/src/mouse/IMouse.cpp
+++ b/src/mouse/IMouse.cpp
@@ -19,12 +19,18 @@
#include "mouse/IMouse.h"
#include "canvas/CCanvas.h"
+#include <QtWidgets>
-IMouse::IMouse(CCanvas *canvas)
+IMouse::IMouse(CGisDraw *gis, CCanvas *canvas)
: QObject(canvas)
+ , gis(gis)
, canvas(canvas)
{
+ timer = new QTimer(this);
+ timer->setSingleShot(true);
+ timer->setInterval(50);
+ connect(timer, SIGNAL(timeout()), this, SLOT(slotPanCanvas()));
}
IMouse::~IMouse()
@@ -32,3 +38,43 @@ IMouse::~IMouse()
}
+void IMouse::slotPanCanvas()
+{
+ panCanvas(point);
+}
+
+#define SENSITIVE_FRAME 100
+void IMouse::panCanvas(const QPoint& pos)
+{
+ if(pos.x() < SENSITIVE_FRAME)
+ {
+ int d = SENSITIVE_FRAME - pos.x();
+ canvas->moveMap(QPointF(d , 0));
+ timer->start();
+ }
+ else if(pos.x() > canvas->width() - SENSITIVE_FRAME)
+ {
+ int d = canvas->width() - SENSITIVE_FRAME - pos.x();
+ canvas->moveMap(QPointF(d, 0));
+ timer->start();
+ }
+ else if(pos.y() < SENSITIVE_FRAME)
+ {
+ int d = SENSITIVE_FRAME - pos.y();
+ canvas->moveMap(QPointF(0, d));
+ timer->start();
+ }
+ else if(pos.y() > canvas->height() - SENSITIVE_FRAME)
+ {
+ int d = canvas->height() - SENSITIVE_FRAME - pos.y();
+ canvas->moveMap(QPointF(0, d));
+ timer->start();
+ }
+ else
+ {
+ timer->stop();
+ }
+
+ canvas->update();
+
+}
diff --git a/src/mouse/IMouse.h b/src/mouse/IMouse.h
index 42ec3bb..6fe46df 100644
--- a/src/mouse/IMouse.h
+++ b/src/mouse/IMouse.h
@@ -23,13 +23,16 @@
#include <QCursor>
class QMouseEvent;
+class QWheelEvent;
class CCanvas;
+class QTimer;
+class CGisDraw;
class IMouse : public QObject
{
Q_OBJECT
public:
- IMouse(CCanvas * canvas);
+ IMouse(CGisDraw * gis, CCanvas * canvas);
virtual ~IMouse();
enum type_e
@@ -37,22 +40,34 @@ class IMouse : public QObject
eNormal
};
+ virtual void draw(QPainter& p, const QRect &rect) = 0;
virtual void mousePressEvent(QMouseEvent * e) = 0;
virtual void mouseMoveEvent(QMouseEvent * e) = 0;
virtual void mouseReleaseEvent(QMouseEvent *e) = 0;
+ virtual void wheelEvent(QWheelEvent * e) = 0;
/// the current mouse cursor
/**
Each mouse function is represented by a special cursor. The main
widget uses this method to query the current cursor.
*/
operator const QCursor&(){return cursor;}
+ CCanvas * getCanvas(){return canvas;}
+ protected slots:
+ virtual void slotPanCanvas();
protected:
+ void panCanvas(const QPoint& pos);
/// the functions mouse icon
QCursor cursor;
+ CGisDraw * gis;
+
CCanvas * canvas;
+ // the current point reported by the mouse events
+ QPoint point;
+
+ QTimer * timer;
};
diff --git a/src/mouse/IMouse.cpp b/src/mouse/IScrOpt.cpp
similarity index 80%
copy from src/mouse/IMouse.cpp
copy to src/mouse/IScrOpt.cpp
index 480fa93..735b533 100644
--- a/src/mouse/IMouse.cpp
+++ b/src/mouse/IScrOpt.cpp
@@ -16,19 +16,24 @@
**********************************************************************************************/
-#include "mouse/IMouse.h"
-#include "canvas/CCanvas.h"
+#include "IScrOpt.h"
+#include "units/IUnit.h"
+#include <QtWidgets>
-IMouse::IMouse(CCanvas *canvas)
- : QObject(canvas)
- , canvas(canvas)
+IScrOpt::IScrOpt(QWidget *parent)
+ : QWidget(parent)
{
}
-IMouse::~IMouse()
+IScrOpt::~IScrOpt()
{
}
+
+void IScrOpt::mouseMoveEvent(QMouseEvent * e)
+{
+ mousePos = e->pos();
+}
diff --git a/src/mouse/CMouseNormal.h b/src/mouse/IScrOpt.h
similarity index 66%
copy from src/mouse/CMouseNormal.h
copy to src/mouse/IScrOpt.h
index 400a667..d0c8e52 100644
--- a/src/mouse/CMouseNormal.h
+++ b/src/mouse/IScrOpt.h
@@ -16,29 +16,36 @@
**********************************************************************************************/
-#ifndef CMOUSENORMAL_H
-#define CMOUSENORMAL_H
+#ifndef ISCROPT_H
+#define ISCROPT_H
-#include "IMouse.h"
+#include <QWidget>
+#include <QPixmap>
+#include <QRect>
-class CCanvas;
+class QMouseEvent;
-class CMouseNormal : public IMouse
+class IScrOpt : public QWidget
{
public:
- CMouseNormal(CCanvas *canvas);
- virtual ~CMouseNormal();
+ IScrOpt(QWidget * parent);
+ virtual ~IScrOpt();
- void mousePressEvent(QMouseEvent * e);
- void mouseMoveEvent(QMouseEvent * e);
- void mouseReleaseEvent(QMouseEvent *e);
+ void setOrigin(const QPoint& pos){origin = pos;}
+ const QPoint& getOrigin(){return origin;}
+
+ virtual void draw(QPainter& p) = 0;
+ virtual void mouseMoveEvent(QMouseEvent *);
protected:
- bool mapMove;
- QPoint lastPos;
+ QPoint origin;
+
+ QPoint mousePos;
+
+
};
-#endif //CMOUSENORMAL_H
+#endif //ISCROPT_H
diff --git a/src/pics/compass.png b/src/pics/compass.png
new file mode 100644
index 0000000..e7b54ad
Binary files /dev/null and b/src/pics/compass.png differ
diff --git a/src/pics/compass.svg b/src/pics/compass.svg
new file mode 100644
index 0000000..c3c6caf
--- /dev/null
+++ b/src/pics/compass.svg
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="compass.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path4063"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend-5"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4063-4"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="308.76491"
+ inkscape:cy="901.0938"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1012"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g4878"
+ inkscape:export-filename="/home/oeichler/Code/cpp/QMapShack/src/pics/compass.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(104.22175,4.1901097)"
+ id="g3230">
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3153">
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3037-9-4"
+ transform="matrix(0.70710678,0.70710678,-0.50507628,0.50507628,111.02554,-106.21675)">
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3009-0-8"
+ transform="matrix(1,0,0,-1,0,314.72436)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-0-1"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-21-1"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(-1,0,0,1,500,-69.999997)"
+ id="g3009-8-8-5">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-7-1-2"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-2-9-1"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ </g>
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3037-9-4-3"
+ transform="matrix(-0.70710678,0.70710678,-0.50507628,-0.50507628,464.57893,17.387723)">
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3009-0-8-0"
+ transform="matrix(1,0,0,-1,0,314.72436)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-0-1-2"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-21-1-9"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ <g
+ style="stroke-width:1.13707054;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(-1,0,0,1,500,-69.999997)"
+ id="g3009-8-8-5-2">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-7-1-2-0"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-2-9-1-5"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ </g>
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="translate(-24.000001,10.000001)"
+ id="g3037">
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3009"
+ transform="matrix(1,0,0,-1,0,314.72436)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(-1,0,0,1,500,-69.999997)"
+ id="g3009-8">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-7"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-2"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ </g>
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3037-9"
+ transform="matrix(0,1,-1,0,348.36218,-117.63782)">
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ id="g3009-0"
+ transform="matrix(1,0,0,-1,0,314.72436)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-0"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-21"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ <g
+ style="stroke-width:0.96100003;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(-1,0,0,1,500,-69.999997)"
+ id="g3009-8-8">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-7-1"
+ d="m 240,192.36218 10,-70 0,70 z"
+ style="fill:#666666;stroke:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2989-8-2-9"
+ d="m 260,192.36218 -10,-70 0,70 z"
+ style="fill:#000000;stroke:none" />
+ </g>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="221.51172"
+ y="60.644909"
+ id="text3183"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3185"
+ x="221.51172"
+ y="60.644909"
+ style="font-size:12px">N</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="222.12988"
+ y="213.57419"
+ id="text3183-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3185-9"
+ x="222.12988"
+ y="213.57419"
+ style="font-size:12px">S</tspan><tspan
+ sodipodi:role="line"
+ x="222.12988"
+ y="228.57419"
+ style="font-size:12px"
+ id="tspan3208" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="297.97974"
+ y="136.73035"
+ id="text3183-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3185-3"
+ x="297.97974"
+ y="136.73035"
+ style="font-size:12px">O</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="142.77786"
+ y="136.73621"
+ id="text3183-11"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3185-39"
+ x="142.77786"
+ y="136.73621"
+ style="font-size:12px">W</tspan></text>
+ </g>
+ <path
+ sodipodi:open="true"
+ sodipodi:end="7.7143556"
+ sodipodi:start="4.7789571"
+ transform="matrix(0.92307692,0,0,1,114.21299,3.7141204)"
+ d="m 238.9856,42.561518 a 97.5,90 0 0 1 7.08375,178.924792"
+ sodipodi:ry="90"
+ sodipodi:rx="97.5"
+ sodipodi:cy="132.36218"
+ sodipodi:cx="232.5"
+ id="path3228"
+ style="fill:none;stroke:#000000;stroke-width:1.00024056;stroke-miterlimit:4;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend)"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:open="true"
+ sodipodi:end="7.7143556"
+ sodipodi:start="4.7789571"
+ transform="matrix(-0.92307692,0,0,1,544.79101,3.7141204)"
+ d="m 238.9856,42.561518 a 97.5,90 0 0 1 7.08375,178.924792"
+ sodipodi:ry="90"
+ sodipodi:rx="97.5"
+ sodipodi:cy="132.36218"
+ sodipodi:cx="232.5"
+ id="path3228-1"
+ style="fill:none;stroke:#000000;stroke-width:1.00024056;stroke-miterlimit:4;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend)"
+ sodipodi:type="arc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4870"
+ y="82.362183"
+ x="340"
+ style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ xml:space="preserve"><tspan
+ y="82.362183"
+ x="340"
+ id="tspan4872"
+ sodipodi:role="line">0..180°</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4874"
+ y="82.362183"
+ x="270"
+ style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ xml:space="preserve"><tspan
+ y="82.362183"
+ x="270"
+ id="tspan4876"
+ sodipodi:role="line">0..-180°</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/src/pics/splash.png b/src/pics/splash.png
new file mode 100644
index 0000000..d1e8c84
Binary files /dev/null and b/src/pics/splash.png differ
diff --git a/src/pics/timezones.png b/src/pics/timezones.png
new file mode 100644
index 0000000..acba36e
Binary files /dev/null and b/src/pics/timezones.png differ
diff --git a/src/resources.qrc b/src/resources.qrc
index 19fe358..7af5816 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -18,7 +18,6 @@
<file>icons/8x8/bullet_red.png</file>
<file>icons/8x8/bullet_white.png</file>
<file>icons/8x8/bullet_yellow.png</file>
-
<file>icons/16x16/2DFix.png</file>
<file>icons/16x16/3DFix.png</file>
<file>icons/16x16/Add.png</file>
@@ -65,6 +64,27 @@
<file>icons/16x16/GisProject.png</file>
<file>icons/16x16/Route.png</file>
<file>icons/16x16/Close.png</file>
+ <file>icons/16x16/Track.png</file>
+ <file>icons/16x16/EditDetails.png</file>
+ <file>icons/16x16/EditText.png</file>
+ <file>icons/16x16/TimeZoneSetup.png</file>
+ <file>icons/16x16/Undo.png</file>
+ <file>icons/16x16/Redo.png</file>
+ <file>icons/16x16/Cut.png</file>
+ <file>icons/16x16/Copy.png</file>
+ <file>icons/16x16/Paste.png</file>
+ <file>icons/16x16/TextLeft.png</file>
+ <file>icons/16x16/TextRight.png</file>
+ <file>icons/16x16/TextCenter.png</file>
+ <file>icons/16x16/TextJustified.png</file>
+ <file>icons/16x16/TextBold.png</file>
+ <file>icons/16x16/TextUnderlined.png</file>
+ <file>icons/16x16/TextItalic.png</file>
+ <file>icons/16x16/Lock.png</file>
+ <file>icons/16x16/UnLock.png</file>
+ <file>icons/16x16/WptMove.png</file>
+ <file>icons/16x16/WptProj.png</file>
+ <file>icons/16x16/Tainted.png</file>
<file>icons/32x32/2DFix.png</file>
<file>icons/32x32/3DFix.png</file>
@@ -112,6 +132,29 @@
<file>icons/32x32/GisProject.png</file>
<file>icons/32x32/Route.png</file>
<file>icons/32x32/Close.png</file>
+ <file>icons/32x32/Track.png</file>
+ <file>icons/32x32/EditDetails.png</file>
+ <file>icons/32x32/EditText.png</file>
+ <file>icons/32x32/TimeZoneSetup.png</file>
+ <file>icons/32x32/Undo.png</file>
+ <file>icons/32x32/Redo.png</file>
+ <file>icons/32x32/Cut.png</file>
+ <file>icons/32x32/Copy.png</file>
+ <file>icons/32x32/Paste.png</file>
+ <file>icons/32x32/TextLeft.png</file>
+ <file>icons/32x32/TextRight.png</file>
+ <file>icons/32x32/TextCenter.png</file>
+ <file>icons/32x32/TextJustified.png</file>
+ <file>icons/32x32/TextBold.png</file>
+ <file>icons/32x32/TextUnderlined.png</file>
+ <file>icons/32x32/TextItalic.png</file>
+ <file>icons/32x32/Lock.png</file>
+ <file>icons/32x32/UnLock.png</file>
+ <file>icons/32x32/WptMove.png</file>
+ <file>icons/32x32/WptProj.png</file>
+ <file>icons/32x32/Tainted.png</file>
+
+
<file>icons/48x48/2DFix.png</file>
<file>icons/48x48/3DFix.png</file>
@@ -159,6 +202,28 @@
<file>icons/48x48/GisProject.png</file>
<file>icons/48x48/Route.png</file>
<file>icons/48x48/Close.png</file>
+ <file>icons/48x48/Track.png</file>
+ <file>icons/48x48/EditDetails.png</file>
+ <file>icons/48x48/EditText.png</file>
+ <file>icons/48x48/TimeZoneSetup.png</file>
+ <file>icons/48x48/Undo.png</file>
+ <file>icons/48x48/Redo.png</file>
+ <file>icons/48x48/Cut.png</file>
+ <file>icons/48x48/Copy.png</file>
+ <file>icons/48x48/Paste.png</file>
+ <file>icons/48x48/TextLeft.png</file>
+ <file>icons/48x48/TextRight.png</file>
+ <file>icons/48x48/TextCenter.png</file>
+ <file>icons/48x48/TextJustified.png</file>
+ <file>icons/48x48/TextBold.png</file>
+ <file>icons/48x48/TextUnderlined.png</file>
+ <file>icons/48x48/TextItalic.png</file>
+ <file>icons/48x48/Lock.png</file>
+ <file>icons/48x48/UnLock.png</file>
+ <file>icons/48x48/WptMove.png</file>
+ <file>icons/48x48/WptProj.png</file>
+ <file>icons/48x48/Tainted.png</file>
+
<file>icons/cache/32x32/bluepin.png</file>
<file>icons/cache/32x32/cito.png</file>
@@ -198,7 +263,6 @@
<file>icons/cache/32x32/webcam.png</file>
<file>icons/cache/32x32/wherigo.png</file>
<file>icons/cache/32x32/write_note.png</file>
-
<file>icons/waypoints/32x32/Default.png</file>
<file>icons/waypoints/32x32/PinRed.png</file>
<file>icons/waypoints/32x32/PinGreen.png</file>
@@ -213,12 +277,15 @@
<file>icons/waypoints/32x32/DiamondGreen.png</file>
<file>icons/waypoints/32x32/DiamondBlue.png</file>
<file>icons/waypoints/32x32/Residence.png</file>
-
-
<file>cursors/cursorArrow.png</file>
<file>cursors/cursorMove.png</file>
<file>cursors/cursorMoveMap.png</file>
+ <file>cursors/cursorMoveWpt.png</file>
+ <file>cursors/wptHighlight.png</file>
<file>animation/loader.gif</file>
<file>animation/loader2.gif</file>
+ <file>pics/timezones.png</file>
+ <file>pics/splash.png</file>
+ <file>pics/compass.png</file>
</qresource>
</RCC>
diff --git a/src/units/CTimeZoneSetup.cpp b/src/units/CTimeZoneSetup.cpp
new file mode 100644
index 0000000..cd6ef2c
--- /dev/null
+++ b/src/units/CTimeZoneSetup.cpp
@@ -0,0 +1,88 @@
+/**********************************************************************************************
+ Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "CTimeZoneSetup.h"
+#include "units/IUnit.h"
+
+CTimeZoneSetup::CTimeZoneSetup(QWidget *parent)
+ : QDialog(parent)
+{
+ setupUi(this);
+
+ QByteArray zone;
+ IUnit::tz_mode_e mode;
+ IUnit::getTimeZoneSetup(mode, zone);
+
+ switch(mode)
+ {
+ case IUnit::eTZUtc:
+ radioUtc->setChecked(true);
+ break;
+ case IUnit::eTZLocal:
+ radioLocal->setChecked(true);
+ break;
+ case IUnit::eTZAuto:
+ radioAutomatic->setChecked(true);
+ break;
+ case IUnit::eTZSelected:
+ radioSelected->setChecked(true);
+ break;
+ }
+
+ const char ** tz = IUnit::tblTimezone;
+ while(*tz)
+ {
+ comboTimeZone->addItem(*tz);
+ tz++;
+ }
+
+ comboTimeZone->setCurrentIndex(comboTimeZone->findText(QString(zone)));
+
+}
+
+CTimeZoneSetup::~CTimeZoneSetup()
+{
+
+}
+
+void CTimeZoneSetup::accept()
+{
+ QByteArray zone = comboTimeZone->currentText().toLatin1();
+ IUnit::tz_mode_e mode = IUnit::eTZUtc;
+
+ if(radioUtc->isChecked())
+ {
+ mode = IUnit::eTZUtc;
+ }
+ else if(radioLocal->isChecked())
+ {
+ mode = IUnit::eTZLocal;
+ }
+ else if(radioAutomatic->isChecked())
+ {
+ mode = IUnit::eTZAuto;
+ }
+ else if(radioSelected->isChecked())
+ {
+ mode = IUnit::eTZSelected;
+ }
+
+
+ IUnit::setTimeZoneSetup(mode, zone);
+ QDialog::accept();
+}
diff --git a/src/mouse/IMouse.cpp b/src/units/CTimeZoneSetup.h
similarity index 73%
copy from src/mouse/IMouse.cpp
copy to src/units/CTimeZoneSetup.h
index 480fa93..0a24c20 100644
--- a/src/mouse/IMouse.cpp
+++ b/src/units/CTimeZoneSetup.h
@@ -16,19 +16,21 @@
**********************************************************************************************/
-#include "mouse/IMouse.h"
-#include "canvas/CCanvas.h"
+#ifndef CTIMEZONESETUP_H
+#define CTIMEZONESETUP_H
+#include <QDialog>
+#include "ui_ITimeZoneSetup.h"
-IMouse::IMouse(CCanvas *canvas)
- : QObject(canvas)
- , canvas(canvas)
+class CTimeZoneSetup :public QDialog, private Ui::ITimeZoneSetup
{
+ public:
+ CTimeZoneSetup(QWidget * parent);
+ virtual ~CTimeZoneSetup();
-}
+ public slots:
+ void accept();
+};
-IMouse::~IMouse()
-{
-
-}
+#endif //CTIMEZONESETUP_H
diff --git a/src/canvas/ICanvasSetup.ui b/src/units/ITimeZoneSetup.ui
similarity index 65%
copy from src/canvas/ICanvasSetup.ui
copy to src/units/ITimeZoneSetup.ui
index f3c57e7..1833750 100644
--- a/src/canvas/ICanvasSetup.ui
+++ b/src/units/ITimeZoneSetup.ui
@@ -1,48 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
- <class>ICanvasSetup</class>
- <widget class="QDialog" name="ICanvasSetup">
+ <class>ITimeZoneSetup</class>
+ <widget class="QDialog" name="ITimeZoneSetup">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>446</width>
- <height>109</height>
+ <width>398</width>
+ <height>96</height>
</rect>
</property>
<property name="windowTitle">
- <string>Setup Map Workspace...</string>
+ <string>Setup Time Zone ...</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
- <widget class="QLabel" name="label_2">
+ <widget class="QRadioButton" name="radioUtc">
<property name="text">
- <string>Projection & Datum</string>
+ <string>UTC</string>
</property>
</widget>
</item>
<item>
- <widget class="QLineEdit" name="lineProjection"/>
+ <widget class="QRadioButton" name="radioLocal">
+ <property name="text">
+ <string>Local</string>
+ </property>
+ </widget>
</item>
<item>
- <widget class="QToolButton" name="toolWizard">
+ <widget class="QRadioButton" name="radioAutomatic">
<property name="text">
- <string>...</string>
+ <string>Automatic</string>
</property>
- <property name="icon">
- <iconset resource="../resources.qrc">
- <normaloff>:/icons/32x32/GridWizzard.png</normaloff>:/icons/32x32/GridWizzard.png</iconset>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="radioSelected">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
</property>
- <property name="iconSize">
- <size>
- <width>22</width>
- <height>22</height>
- </size>
+ <property name="text">
+ <string/>
</property>
</widget>
</item>
+ <item>
+ <widget class="QComboBox" name="comboTimeZone"/>
+ </item>
</layout>
</item>
<item>
@@ -53,7 +63,7 @@
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
- <height>9</height>
+ <height>40</height>
</size>
</property>
</spacer>
@@ -70,28 +80,16 @@
</property>
</widget>
</item>
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="../resources.qrc">:/icons/48x48/SetupMapWorkspace.png</pixmap>
- </property>
- </widget>
- </item>
</layout>
</item>
</layout>
</widget>
- <resources>
- <include location="../resources.qrc"/>
- </resources>
+ <resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
- <receiver>ICanvasSetup</receiver>
+ <receiver>ITimeZoneSetup</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
@@ -107,7 +105,7 @@
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
- <receiver>ICanvasSetup</receiver>
+ <receiver>ITimeZoneSetup</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
diff --git a/src/units/IUnit.cpp b/src/units/IUnit.cpp
index b421fd6..2a233b5 100644
--- a/src/units/IUnit.cpp
+++ b/src/units/IUnit.cpp
@@ -20,9 +20,404 @@
#include "CUnitImperial.h"
#include "CUnitNautic.h"
-#include <QtCore>
+#include <QtWidgets>
+#include <proj_api.h>
IUnit * IUnit::m_self = 0;
+const QPointF NOPOINTF(NOFLOAT, NOFLOAT);
+const QPoint NOPOINT (NOINT, NOINT);
+
+IUnit::tz_mode_e IUnit::timeZoneMode = IUnit::eTZUtc;
+QByteArray IUnit::timeZone = "UTC";
+
+const char * IUnit::tblTimezone[] =
+{
+ "Africa/Abidjan",
+ "Africa/Accra",
+ "Africa/Addis_Ababa",
+ "Africa/Algiers",
+ "Africa/Asmara",
+ "Africa/Bamako",
+ "Africa/Bangui",
+ "Africa/Banjul",
+ "Africa/Bissau",
+ "Africa/Blantyre",
+ "Africa/Brazzaville",
+ "Africa/Bujumbura",
+ "Africa/Cairo",
+ "Africa/Casablanca",
+ "Africa/Conakry",
+ "Africa/Dakar",
+ "Africa/Dar_es_Salaam",
+ "Africa/Djibouti",
+ "Africa/Douala",
+ "Africa/El_Aaiun",
+ "Africa/Freetown",
+ "Africa/Gaborone",
+ "Africa/Harare",
+ "Africa/Johannesburg",
+ "Africa/Kampala",
+ "Africa/Khartoum",
+ "Africa/Kigali",
+ "Africa/Kinshasa",
+ "Africa/Lagos",
+ "Africa/Libreville",
+ "Africa/Lome",
+ "Africa/Luanda",
+ "Africa/Lubumbashi",
+ "Africa/Lusaka",
+ "Africa/Malabo",
+ "Africa/Maputo",
+ "Africa/Maseru",
+ "Africa/Mbabane",
+ "Africa/Mogadishu",
+ "Africa/Monrovia",
+ "Africa/Nairobi",
+ "Africa/Ndjamena",
+ "Africa/Niamey",
+ "Africa/Nouakchott",
+ "Africa/Ouagadougou",
+ "Africa/Porto-Novo",
+ "Africa/Sao_Tome",
+ "Africa/Tripoli",
+ "Africa/Tunis",
+ "Africa/Windhoek",
+ "America/Adak",
+ "America/Anguilla",
+ "America/Antigua",
+ "America/Araguaina",
+ "America/Argentina/Buenos_Aires",
+ "America/Argentina/Catamarca",
+ "America/Argentina/Cordoba",
+ "America/Argentina/Jujuy",
+ "America/Argentina/La_Rioja",
+ "America/Argentina/Mendoza",
+ "America/Argentina/Rio_Gallegos",
+ "America/Argentina/San_Juan",
+ "America/Argentina/San_Luis",
+ "America/Argentina/Tucuman",
+ "America/Argentina/Ushuaia",
+ "America/Aruba",
+ "America/Asuncion",
+ "America/Atikokan",
+ "America/Bahia",
+ "America/Barbados",
+ "America/Belem",
+ "America/Belize",
+ "America/Blanc-Sablon",
+ "America/Boa_Vista",
+ "America/Bogota",
+ "America/Boise",
+ "America/Cambridge_Bay",
+ "America/Campo_Grande",
+ "America/Cancun",
+ "America/Caracas",
+ "America/Cayenne",
+ "America/Cayman",
+ "America/Chicago",
+ "America/Chihuahua",
+ "America/Coral_Harbour",
+ "America/Costa_Rica",
+ "America/Cuiaba",
+ "America/Curacao",
+ "America/Dawson",
+ "America/Dawson_Creek",
+ "America/Denver",
+ "America/Dominica",
+ "America/Edmonton",
+ "America/Eirunepe",
+ "America/El_Salvador",
+ "America/Fortaleza",
+ "America/Glace_Bay",
+ "America/Goose_Bay",
+ "America/Grand_Turk",
+ "America/Grenada",
+ "America/Guadeloupe",
+ "America/Guatemala",
+ "America/Guayaquil",
+ "America/Guyana",
+ "America/Halifax",
+ "America/Havana",
+ "America/Hermosillo",
+ "America/Indiana/Indianapolis",
+ "America/Indiana/Knox",
+ "America/Indiana/Marengo",
+ "America/Indiana/Petersburg",
+ "America/Indiana/Vevay",
+ "America/Indiana/Vincennes",
+ "America/Indiana/Winamac",
+ "America/Inuvik",
+ "America/Iqaluit",
+ "America/Jamaica",
+ "America/Juneau",
+ "America/Kentucky/Louisville",
+ "America/Kentucky/Monticello",
+ "America/La_Paz",
+ "America/Lima",
+ "America/Los_Angeles",
+ "America/Maceio",
+ "America/Managua",
+ "America/Manaus",
+ "America/Marigot",
+ "America/Martinique",
+ "America/Mazatlan",
+ "America/Menominee",
+ "America/Merida",
+ "America/Mexico_City",
+ "America/Miquelon",
+ "America/Moncton",
+ "America/Monterrey",
+ "America/Montevideo",
+ "America/Montreal",
+ "America/Montserrat",
+ "America/Nassau",
+ "America/New_York",
+ "America/Nipigon",
+ "America/Noronha",
+ "America/North_Dakota/Center",
+ "America/North_Dakota/Salem",
+ "America/Panama",
+ "America/Pangnirtung",
+ "America/Paramaribo",
+ "America/Phoenix",
+ "America/Port-au-Prince",
+ "America/Port_of_Spain",
+ "America/Porto_Velho",
+ "America/Puerto_Rico",
+ "America/Rainy_River",
+ "America/Rankin_Inlet",
+ "America/Recife",
+ "America/Regina",
+ "America/Resolute",
+ "America/Rio_Branco",
+ "America/Santarem",
+ "America/Santiago",
+ "America/Santo_Domingo",
+ "America/Sao_Paulo",
+ "America/St_Barthelemy",
+ "America/St_Johns",
+ "America/St_Kitts",
+ "America/St_Lucia",
+ "America/St_Thomas",
+ "America/St_Vincent",
+ "America/Tegucigalpa",
+ "America/Thunder_Bay",
+ "America/Tijuana",
+ "America/Toronto",
+ "America/Tortola",
+ "America/Vancouver",
+ "America/Whitehorse",
+ "America/Winnipeg",
+ "America/Yellowknife",
+ "Ameriica/Swift_Current",
+ "Arctic/Longyearbyen",
+ "Asia/Aden",
+ "Asia/Almaty",
+ "Asia/Amman",
+ "Asia/Anadyr",
+ "Asia/Aqtau",
+ "Asia/Aqtobe",
+ "Asia/Ashgabat",
+ "Asia/Baghdad",
+ "Asia/Bahrain",
+ "Asia/Baku",
+ "Asia/Bangkok",
+ "Asia/Beirut",
+ "Asia/Bishkek",
+ "Asia/Brunei",
+ "Asia/Choibalsan",
+ "Asia/Chongqing",
+ "Asia/Colombo",
+ "Asia/Damascus",
+ "Asia/Dhaka",
+ "Asia/Dili",
+ "Asia/Dubai",
+ "Asia/Dushanbe",
+ "Asia/Gaza",
+ "Asia/Harbin",
+ "Asia/Ho_Chi_Minh",
+ "Asia/Hong_Kong",
+ "Asia/Hovd",
+ "Asia/Irkutsk",
+ "Asia/Jakarta",
+ "Asia/Jayapura",
+ "Asia/Jerusalem",
+ "Asia/Kabul",
+ "Asia/Kamchatka",
+ "Asia/Karachi",
+ "Asia/Kashgar",
+ "Asia/Katmandu",
+ "Asia/Kolkata",
+ "Asia/Krasnoyarsk",
+ "Asia/Kuala_Lumpur",
+ "Asia/Kuching",
+ "Asia/Kuwait",
+ "Asia/Macau",
+ "Asia/Magadan",
+ "Asia/Makassar",
+ "Asia/Manila",
+ "Asia/Muscat",
+ "Asia/Nicosia",
+ "Asia/Novosibirsk",
+ "Asia/Omsk",
+ "Asia/Oral",
+ "Asia/Phnom_Penh",
+ "Asia/Pontianak",
+ "Asia/Pyongyang",
+ "Asia/Qatar",
+ "Asia/Qyzylorda",
+ "Asia/Rangoon",
+ "Asia/Riyadh",
+ "Asia/Sakhalin",
+ "Asia/Samarkand",
+ "Asia/Seoul",
+ "Asia/Shanghai",
+ "Asia/Singapore",
+ "Asia/Taipei",
+ "Asia/Tashkent",
+ "Asia/Tbilisi",
+ "Asia/Tehran",
+ "Asia/Thimphu",
+ "Asia/Tokyo",
+ "Asia/Ulaanbaatar",
+ "Asia/Urumqi",
+ "Asia/Vientiane",
+ "Asia/Vladivostok",
+ "Asia/Yakutsk",
+ "Asia/Yekaterinburg",
+ "Asia/Yerevan",
+ "Atlantic/Azores",
+ "Atlantic/Bermuda",
+ "Atlantic/Canary",
+ "Atlantic/Cape_Verde",
+ "Atlantic/Faroe",
+ "Atlantic/Madeira",
+ "Atlantic/Reykjavik",
+ "Atlantic/South_Georgia",
+ "Atlantic/St_Helena",
+ "Atlantic/Stanley",
+ "Australia/Adelaide",
+ "Australia/Brisbane",
+ "Australia/Broken_Hill",
+ "Australia/Currie",
+ "Australia/Darwin",
+ "Australia/Eucla",
+ "Australia/Hobart",
+ "Australia/Lindeman",
+ "Australia/Lord_Howe",
+ "Australia/Melbourne",
+ "Australia/Perth",
+ "Australia/Sydney",
+ "Europe/Amsterdam",
+ "Europe/Andorra",
+ "Europe/Athens",
+ "Europe/Belgrade",
+ "Europe/Berlin",
+ "Europe/Bratislava",
+ "Europe/Brussels",
+ "Europe/Bucharest",
+ "Europe/Budapest",
+ "Europe/Chisinau",
+ "Europe/Copenhagen",
+ "Europe/Dublin",
+ "Europe/Gibraltar",
+ "Europe/Guernsey",
+ "Europe/Helsinki",
+ "Europe/Isle_of_Man",
+ "Europe/Istanbul",
+ "Europe/Jersey",
+ "Europe/Kaliningrad",
+ "Europe/Kiev",
+ "Europe/Lisbon",
+ "Europe/Ljubljana",
+ "Europe/London",
+ "Europe/Luxembourg",
+ "Europe/Madrid",
+ "Europe/Malta",
+ "Europe/Marienhamn",
+ "Europe/Minsk",
+ "Europe/Monaco",
+ "Europe/Moscow",
+ "Europe/Oslo",
+ "Europe/Paris",
+ "Europe/Podgorica",
+ "Europe/Prague",
+ "Europe/Riga",
+ "Europe/Rome",
+ "Europe/Samara",
+ "Europe/San_Marino",
+ "Europe/Sarajevo",
+ "Europe/Simferopol",
+ "Europe/Skopje",
+ "Europe/Sofia",
+ "Europe/Stockholm",
+ "Europe/Tallinn",
+ "Europe/Tirane",
+ "Europe/Uzhgorod",
+ "Europe/Vaduz",
+ "Europe/Vatican",
+ "Europe/Vienna",
+ "Europe/Vilnius",
+ "Europe/Volgograd",
+ "Europe/Warsaw",
+ "Europe/Zagreb",
+ "Europe/Zaporozhye",
+ "Europe/Zurich",
+ "Indian/Antananarivo",
+ "Indian/Chagos",
+ "Indian/Christmas",
+ "Indian/Cocos",
+ "Indian/Comoro",
+ "Indian/Kerguelen",
+ "Indian/Mahe",
+ "Indian/Maldives",
+ "Indian/Mauritius",
+ "Indian/Mayotte",
+ "Indian/Reunion",
+ "Pacific/Apia",
+ "Pacific/Auckland",
+ "Pacific/Chatham",
+ "Pacific/Easter",
+ "Pacific/Efate",
+ "Pacific/Enderbury",
+ "Pacific/Fakaofo",
+ "Pacific/Fiji",
+ "Pacific/Funafuti",
+ "Pacific/Galapagos",
+ "Pacific/Gambier",
+ "Pacific/Guadalcanal",
+ "Pacific/Guam",
+ "Pacific/Honolulu",
+ "Pacific/Johnston",
+ "Pacific/Kiritimati",
+ "Pacific/Kosrae",
+ "Pacific/Kwajalein",
+ "Pacific/Majuro",
+ "Pacific/Marquesas",
+ "Pacific/Midway",
+ "Pacific/Nauru",
+ "Pacific/Niue",
+ "Pacific/Norfolk",
+ "Pacific/Noumea",
+ "Pacific/Pago_Pago",
+ "Pacific/Palau",
+ "Pacific/Pitcairn",
+ "Pacific/Ponape",
+ "Pacific/Port_Moresby",
+ "Pacific/Rarotonga",
+ "Pacific/Saipan",
+ "Pacific/Tahiti",
+ "Pacific/Tarawa",
+ "Pacific/Tongatapu",
+ "Pacific/Truk",
+ "Pacific/Wake",
+ "Pacific/Wallis",
+ 0
+};
+
+const int N_TIMEZONES = sizeof(IUnit::tblTimezone)/sizeof(const char*);
+
+
IUnit::IUnit(const type_e &type, const QString& baseunit, const qreal basefactor, const QString& speedunit, const qreal speedfactor, QObject * parent)
: QObject(parent)
, type(type)
@@ -58,7 +453,7 @@ void IUnit::setUnitType(type_e t, QObject * parent)
}
QSettings cfg;
- cfg.setValue("main/units/type",t);
+ cfg.setValue("Units/type",t);
}
void IUnit::meter2speed(qreal meter, QString& val, QString& unit)
@@ -156,7 +551,57 @@ QDateTime IUnit::parseTimestamp(const QString &timetext, int& tzoffset)
}
QDateTime datetime = QDateTime::fromString(timetext, format);
+ datetime.setOffsetFromUtc(tzoffset);
+
return datetime;
}
+QString IUnit::datetime2string(const QDateTime& time, const QPointF& pos)
+{
+ QTimeZone tz;
+
+ tz_mode_e tmpMode = (pos != NOPOINTF) ? timeZoneMode : eTZLocal;
+
+ switch(tmpMode)
+ {
+ case eTZUtc:
+ tz = QTimeZone("UTC");
+ break;
+ case eTZLocal:
+ tz = QTimeZone(QTimeZone::systemTimeZoneId());
+ break;
+ case eTZAuto:
+ tz = QTimeZone(pos2timezone(pos));
+ break;
+ case eTZSelected:
+ tz = QTimeZone(timeZone);
+ break;
+ }
+
+ QDateTime tmp = time.toTimeZone(tz);
+ return tmp.toString(Qt::SystemLocaleLongDate);
+}
+
+QByteArray IUnit::pos2timezone(const QPointF& pos)
+{
+ static QImage imgTimezone = QPixmap(":/pics/timezones.png").toImage();
+
+ int x = qRound(2048.0 / 360.0 * (180.0 + pos.x() * RAD_TO_DEG));
+ int y = qRound(1024.0 / 180.0 * (90.0 - pos.y() * RAD_TO_DEG));
+
+ QRgb rgb = imgTimezone.pixel(x,y);
+
+ if(qRed(rgb) == 0 && qGreen(rgb) == 0)
+ {
+ return "UTC";
+ }
+
+ int tz = ((qRed(rgb) & 248) << 1) + ((qGreen(rgb) >> 4) & 15);
+ if(tz >= N_TIMEZONES)
+ {
+ return 0;
+ }
+
+ return tblTimezone[tz];
+}
diff --git a/src/units/IUnit.h b/src/units/IUnit.h
index 46e16f3..c69e002 100644
--- a/src/units/IUnit.h
+++ b/src/units/IUnit.h
@@ -19,10 +19,15 @@
#ifndef IUNIT_H
#define IUNIT_H
#include <QObject>
+#include <QTimeZone>
#define NOFLOAT 1000000000000.0
#define NOINT 0x7FFFFFFF
+#define NOTIME 0xFFFFFFFF
+
+extern const QPointF NOPOINTF;
+extern const QPoint NOPOINT;
class IUnit : public QObject
{
@@ -45,17 +50,37 @@ class IUnit : public QObject
static bool parseTimestamp(const QString &time, QDateTime &datetime);
+ static QString datetime2string(const QDateTime& time, const QPointF& pos = NOPOINTF);
+
+ static QByteArray pos2timezone(const QPointF& pos);
+
const type_e type;
const QString baseunit;
const qreal basefactor;
const QString speedunit;
const qreal speedfactor;
+ static const char * tblTimezone[];
+
+ enum tz_mode_e
+ {
+ eTZUtc
+ ,eTZLocal
+ ,eTZAuto
+ ,eTZSelected
+ };
+
+ static void getTimeZoneSetup(tz_mode_e& mode, QByteArray& zone){mode = timeZoneMode; zone = timeZone;}
+ static void setTimeZoneSetup(tz_mode_e mode, const QByteArray& zone){timeZoneMode = mode; timeZone = zone;}
protected:
- friend class CResources;
IUnit(const type_e& type, const QString& baseunit, const qreal basefactor, const QString& speedunit, const qreal speedfactor, QObject * parent);
static QDateTime parseTimestamp(const QString &timetext, int& tzoffset);
+
+ static tz_mode_e timeZoneMode;
+ static QByteArray timeZone;
+
+
private:
static IUnit * m_self;
};
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/qmapshack.git
More information about the Pkg-grass-devel
mailing list