Commit graph

506 commits

Author SHA1 Message Date
Lubomir I. Ivanov
12ea31ef78 mapwidgethelper: use system_default_directory() for cache
The default location which is used when the
PluginParemeter "googlemaps.cachefolder" is not specified
should be ~/.cache/googlemaps on Linux or
/user/<name>/appdata/local/cache/googlemaps on Windows.

This patch moves the cache to the default system location
where we store the printing templates, cloudstorage and the
default user XML file.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-24 13:11:39 -07:00
Lubomir I. Ivanov
1da4f91cc8 mapwidgethelper: use dynamic creation of the Plugin object
The googlemaps plugin is about to support tile language
via the PluginParameter 'googlemaps.maps.language'.
To be able to pass the subsurface UI language (obtained
from the uiLanguage() helper) the Plugin has to be created
dynamically, only *after* the MapWidgetHelper is created.

MapWidgetHelper::pluginObject() now provides a QString which
contains the Plugin object and also include the uiLanguage
ISO value.

This string is used in mapwidget.qml as:
map.plugin = Qt.createQmlObject(pluginObject, rootItem)

This creates the Plugin object dynamically with the proper
UI language string, but also requires a couple of small changes:
- move the declaration of map.mapType after the
Qt.createQmlObject() call
- assign map.activeMapType after map.mapType has a value

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-24 13:11:39 -07:00
Lubomir I. Ivanov
98e869d4f1 mapwidgethelper: fix wrong logic in selectVisibleLocations()
Looking for already existing locations with
m_mapLocationModel->getMapLocationForUuid() will not cover dive
sites which are too close to each other and are skipped when
creating MapLocations. See reloadMapLocations() and the usage of
MIN_DISTANCE_BETWEEN_DIVE_SITES_M.

Constructing a new QGeoCoordinate for the already retrieved
dive site (ds) coordinates ensures that we are traversing
*all* dive sites at the backend and not only those visible on the map.

Fixes the issue where not all dives in the DiveList are selected,
even if a dive clearly happened on a location currently visible in
the map viewport (map -> context menu -> select visible dive
locations).

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-10 09:08:28 -07:00
Lubomir I. Ivanov
f21ae69f7b mapwidget.qml: more improvements for the dynamic zoom-in/out
The QML Map has a couple of methods - toCoordinate(someQPointF) and
fromCoordinate(someQGeoCoordinate). Ideally, if one passes a point to
toCoordinate() and then attempts to convert the resulted coordinates
back to the point, the same point in the Map view port with minimal error
should be retrieved. That's not always the case - e.g. near
47.400200 -123.142066, which means that the methods are not exactly
*reliable* and there might be Map class bugs at hand.

The new zoom-in and zoom-out improvements try to work around the above:
- for both centerOnRectangle() and centerOnCoordinate(), if no good
zoom-out level is found (newZoomOut), the zoom-out is set to the default
value of defaultZoomOut. In practice, this prevents the case where the map
does not zoom-out at all when going from one place to another
- centerOnRectangle() now uses rectangle diagonals to estimate a fit,
instead of checking if 2 points (top-left and bottom-right) are visible
in the viewport. The usage of fromCoordinate() was giving bad results
in this case and comparing distances (diagonals) is more reliable
but more expensive on the CPU.

Due to the inconsistencies of toCoordinate() and fromCoordinate()
the dynamic zoom-in and zoom-out are still not ideal, but the current
implementation is somewhat usable with decent accuracy.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-10 09:08:28 -07:00
Rick Walsh
1409521eb2 DiveList.qml: set detailsWindow index before deleting dive from list
This appears to fix the mystery crashes that can occur when deleting a dive
from the dive list.

Fixes: #497

Signed-off-by: Rick Walsh <rickmwalsh@gmail.com>
2017-08-10 09:06:44 -07:00
Joakim Bygdell
3f1a20cbaa QML UI: GPS: remove header
Being the only page that still has an on page header
it makes sens to remove it.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-07 00:52:32 -07:00
Joakim Bygdell
e4d4718bae QML UI: GPS: remove margins
Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-07 00:52:32 -07:00
Rick Walsh
7e4ba965d1 DiveDetailsEdit: make sure model data exists
This gets rid of TypeError messages, but does not appear to affect behaviour
qrc:///qml/DiveDetailsEdit.qml:254: TypeError: Cannot read property 'dive' of null
qrc:///qml/DiveDetailsEdit.qml:228: TypeError: Cannot read property 'dive' of null
qrc:///qml/DiveDetailsEdit.qml:216: TypeError: Cannot read property 'dive' of null
qrc:///qml/DiveDetailsEdit.qml:204: TypeError: Cannot read property 'dive' of null

Signed-off-by: Rick Walsh <rickmwalsh@gmail.com>
2017-08-07 00:51:51 -07:00
Lubomir I. Ivanov
00e401b61f mapwidget.qml: add menu action for selecting visible locations
MapWidgetContextMenu now has a new action (SELECT_VISIBLE_LOCATIONS),
that will invoke the MapWidgetHelper method selectVisibleLocations().

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
93896e54db mapwidgethelper: add the selectVisibleLocations() method
The new method selectVisibleLocations() contains a routine
to find all visible MapLocation objects in the Map viewport and
select the dives associated to said MapLocation objects.

This method is to be invoked from the QML context menu.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
5db2460168 mapwidget.qml: implement centerOnRectangle()
First, this function calculates the zoom out effect until both the
current Map center and the target rectangle are visible - see the
"calculate zoom out" part.

Then it calculates a zoom level, so that the target rectangle
fits the viewport, but also so that the zoom is not too much (clamped).
see the "calculate zoom in" part.

NOTE: "centerStored" (the variable used to store the current map center)
is created using QtPositioning.coordinate(), because the code needs a new
object and not a reference of the map.center QGeoCoordinate object.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
0fc9a3bf4a mapwidget.qml: add a couple of helpers
Add stopZoomAnimations(), which is really just a precaution
function to make sure we have stopped all animation of the
map before doing calculations! Since the animation *should*
be running in a separate thread, this would make sure the Map "center"
and "zoomLevel" properties do not change.

Add pointIsVisible(), which is a helper to determine
if a point created by map.fromCoordinate() method is inside
the viewport. fromCoordinate() has to be called without the
"false" (clip) flag for this to work.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
d421660f91 mapwidgethelper: support tracking of all selected dive sites
MapWidgetHelper::centerOnDiveSite() now checks if more than
one dive sites are selected and finds the most top-left and
bottom-right ones in the coordinate system to form
a rectangle.

It also supports the special cases where a selected dive site
does not have coordinates or the case where only a single dive site
with GPS coordinates are selected.

TODO: implement mapwidget.qml::centerOnRectangle()
This QML function will receive a QGeoCoordinate based rectangle which
has to be centered in the viewport with animation.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
6fb841887d mapwidget.qml: add better error reporing on a missing map plugin
For instance, if the 'googlemaps' geoservices plugin is missing
a new message is now shown:
"qml: MapWidget.qml: cannot find a plugin with the name 'googlemaps'"

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Lubomir I. Ivanov
aea1cc4b8a mapwidget: use "satallite" maps instead of "hybrid"
Do so until the following issue is resolved:
https://github.com/vladest/googlemaps/issues/9

With the satellite map ([1]), the black tiles at relatively high
zoom levels over the Red Sea cannot be seen. Instead it shows white
tiles at the ultra-maximum zoom level at places.

As a side note, the "satellite" map does not have the country labels
which the "hybrid" map has.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-07 00:51:21 -07:00
Dirk Hohndel
0476f6dc18 QML UI: Settings: remove more margins
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-08-03 16:00:09 -07:00
Dirk Hohndel
c004e31dc2 QML UI: CloudCredentials: better use of space
No idea why this was restricted to be so narrow. Also, making
the font of the label smaller and lighter seems visually more
pleasing.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-08-03 15:31:23 -07:00
Dirk Hohndel
c043366b8f QML UI: remove unnecessary margin
This makes better use of the available space.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-08-03 15:30:32 -07:00
Dirk Hohndel
ada6a0d664 QML UI: remove unused code
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-08-03 15:29:50 -07:00
Dirk Hohndel
2b9523dcff Merge branch 'googlemaps' of git://github.com/neolit123/subsurface into googlemaps 2017-08-02 18:53:52 -07:00
Joakim Bygdell
bc1a388952 QML UI: dive edit autocomplete
This makes sure that the autocompleting comboboxes never displays the scroll list where the user can pick an entry, and as such forces the view of a autocompleting textfield from the users point of view. The reasoning is that when scrolling in the drop down list it it possible to scroll to far and thus abort the ongoing edit by flicking away the edit page.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
a9348607e7 QML UI: add more width to dive edit page
Mobile devices hare rather limited when it comes to screen size,
there is no point in reducing the availabel space more than neccecary.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
29e704a1b2 QML UI: loose focus on endEditMode
This handles a cornercase where a user starts editing and then cances the divedit followed by a return to edit mode. The previously acive textfield would then be active again even though all changes are lost.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
bc7d11860f QML UI: make sure textfields loose focus
For some reason the textfields on dive edit page did not loose focus when editing ended by press on the return key.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
97f1dc0b01 QML UI: autocomplete objects should lose focus on selection
When the user makes a selection using the autocomplete function while editing a dive the keyboard should close and the selection list should disappear.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
9e9e06aed6 QML UI: decrease fontsize on dive edit
Decrease the fontsize of the static text on the dive edits page.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
6a47af2d16 QML UI: enable modification of ratings
This enables editing of visibility and ratings for a dive.

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
9d7eb33a33 QML UI: display rating and visibility stars
Display rating and visibility stars on the dive details page. See #495

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Joakim Bygdell
ee17d54753 Add star icons
Add star icons from the material repository.
https://material.io/icons/
The icons are under Apache License Version 2.0

Signed-off-by: Joakim Bygdell <j.bygdell@gmail.com>
2017-08-02 18:49:47 -07:00
Lubomir I. Ivanov
5cb1d28861 mapwidget.qml: use a custom built googlemaps plugin
This patch makes use of the geolocation plugin "googlemaps"
for Qt Location with source code from here:
https://github.com/vladest/googlemaps

The change from the ESRI plugin is that it requires new indexes
for the Hybrid ([3]) and Street ([0]) map types.

There are more zoom levels in this plugins, but our default zoom-in
settings seem to transition well to it.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-08-02 00:51:12 +03:00
Robert C. Helling
757985bf2a Smaller buttons on map widget
... so they take up less space while still being clickable.

Signed-off-by: Robert C. Helling <helling@atdotde.de>
2017-07-31 16:55:12 -07:00
Dirk Hohndel
855dd0d1aa QML UI: stop showing location labels earlier
We are stepping by 2 - so 11 makes it clear that at 12 the labels are
shown, but at 10 they are not.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-07-31 12:57:07 -07:00
Jan Mulder
9a2759fc1f mobile: make sure old credentialStatus is defined
In commit e76f527fe5, the scenario of switching between 2 already
VERIFIED cloud accounts was identified, which was working poorly. It
needed a restart of the app to get the new account visible.

Reason for this, was the setting of the credentialStatus to the value
of an undefined (never set) old credentialStatus. This commit makes
sure we have a defined credentialStatus, just before changing it to
the new one.

A really mini step forward, as the behavior is still not perfect. Now,
the user has to select the dive list manually, after entering
credentials of the new clould account.

Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
2017-07-31 11:40:37 -07:00
Jan Mulder
61a35d0bd7 Trivial log string correction
The PIN (and cloud account creation) is not limited to the
desktop (any more). Correct the string accordingly.

Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
2017-07-29 08:30:08 -07:00
Dirk Hohndel
c59cdd6efd Switch new files to unix line endings
I thought we had this automated, but Lubomirs commits introduced a few
files with dos line endings. This is purely a change of line endings, no
other changes.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2017-07-28 22:01:36 -07:00
Lubomir I. Ivanov
69f8fc3c5b map: whitespace cleanup in QML and C++ files
- remove ";"s
- remove {} where not needed or move them to the same line

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
591c4bfcca mapwidget.qml: track the coordinatesChanged() signal in QML
The C++ side for the desktop version already does that. Add a slot
for that in QML, for later use in the mobile version.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
f6896c3b8e mapwidget.qml: use darker text color for the deselected markers
Use "lightgrey" instead of "white" for deselected markers.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
5270688483 mapwidget.qml: add new logic for zooming and editing support
The editing support is added via dragging. It is handled via the
MouseArea's drag.target of the MapQuickItem. The drag target changes
with the model selectedUuid.

"mapAnimationZoomIn" now also does an initial zoom-out before moving
to a new location.

centerOnCoordinate() now pefroms calculations to determine how much
the animation needs to zoom out. What it does is it reduces the Map
zoomLevel util both the current and the new target coordinates are visible.
It then restores the zoomLevel and performs animation based on newZoomOut.

animateMapZoomIn() is now obsolete.

The patch also includes the following smaller changes:
- remove the setSelectedUuid() call in deselectMapLocation()
This is now handled in C++
- sets "defaultZoomIn" to 12.0
- use ">=" when determining if a mapItem text should be visible

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
3589e2e952 mapwidget.qml: add visual tracking of editMode from MapWidgetHelper
The MapWidgetHelper QML instance now has the slot onEditModeChanged()
which toggles the visiblity of a newly added message box that
notifies the user if editing mode is enabled.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
4d698310ff mapwidgethelper: add methods for editing MapLocations
updateCurrentDiveSiteCoordinates() should be called from
QML when a marker changed it's location. it emits the coordinatesChanged()
signal, which should be tracked in the MapWidget class. The MapWidget
class should emit the same signal to the MainWindow (Marble does that).

editMode is now a boolean property, which should put the QML map into
editing mode.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
5e57e42874 mapwidgethelper: add the same logic for markers as in globe.cpp
The marble globe tracks dive sites with the same name and discards
such that are less than 50 meters apart.

We already store names in MapLocation objects, but using a
QMap<QString, MapLocation *> to check the names is probably faster
with the expense of using more memory.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
ff4924f650 mapwidgethelper: change centerOnDiveSite()
Call setSelectedUuid() from C++ also center on coodinates instead
on a MapLocation, as there is no point to pass the MapLocation object
back to QML.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
f7095aa89e mapwidgetcontextmenu: slight increase of element size
Increase the font and element height a little to make it
easier to click.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
f2a8bab01e mapwidget.qml: include map location text
The MapItemView delegate now includes a white Text element.
It uses the MapLocation "name" property as text.
This text is only visible if the map zoom is above "textVisibleZoom".

For hundreds of dives, using the DropShadow effect for the text
makes it laggy. Instead, using a fake drop shadow (duplicate black
Text under the default text) makes it much better.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
be0d513324 maplocationmodel: add the "namer" property
The MapLocation QObject now has a QString property "name", which is
translating the dive_site->name member.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
8c7d1a1163 mapwidget.qml: add zoom-in and zoom-out buttons
The buttons are positioned bellow the "toggle map type" button
and increment / decrement the zoom by "zoomStep" (2 for now).

Also clamp the zoom-in level to "map.maximumZoomLevel".

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
f94aa61009 mapwidget.qml: ";" and variable declaration cleanup
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
38d9759198 mapwidget.qml: add double click on zoom
Double clicking a marker or the newly added MouseArea now performs
a +2 zoom-in over a period of 500ms and centers on that clicked
coordinate.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00
Lubomir I. Ivanov
f1020a02ce mapwidget.qml: store the selected dives count in "nSelectedDives"
Different actions might be performed depending on the count of selected
dives - e.g. deep zoom only for a single selected dive.

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
2017-07-28 07:31:11 -07:00