mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-06 12:34:24 +00:00
Compare commits
4 Commits
test/2025.
...
v2025.12.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d551e5fb3 | ||
|
|
48f6fcf0ac | ||
|
|
72433c6754 | ||
|
|
7641ea3c74 |
17
SECURITY.md
17
SECURITY.md
@@ -1,17 +0,0 @@
|
|||||||
## Reporting Vulnerabilities
|
|
||||||
You can report a security vulnerability by creating an issue or send mail to security@comaps.app
|
|
||||||
|
|
||||||
## Verifying Fingerprints
|
|
||||||
|
|
||||||
To [verify](https://developer.android.com/studio/command-line/apksigner#usage-verify) the APK, use the following signing certificate fingerprints:
|
|
||||||
```
|
|
||||||
SHA-256: 4894e8e6963627ef660031d8593fe77297f835acb4e23810003e926135023b4c
|
|
||||||
SHA-1: 8b7b5739f917e9f7c681671ced0c9c8562123ade
|
|
||||||
MD5: 9cce0ffea281dc2f0e0a154d6d2e281e
|
|
||||||
```
|
|
||||||
|
|
||||||
To verify CoMaps via [AppVerifier](https://github.com/soupslurpr/AppVerifier), use the following signing certificate fingerprint:
|
|
||||||
```
|
|
||||||
app.comaps
|
|
||||||
48:94:E8:E6:96:36:27:EF:66:00:31:D8:59:3F:E7:72:97:F8:35:AC:B4:E2:38:10:00:3E:92:61:35:02:3B:4C
|
|
||||||
```
|
|
||||||
@@ -351,7 +351,6 @@ dependencies {
|
|||||||
implementation libs.androidx.recyclerview
|
implementation libs.androidx.recyclerview
|
||||||
implementation libs.androidx.work.runtime
|
implementation libs.androidx.work.runtime
|
||||||
implementation libs.androidx.lifecycle.process
|
implementation libs.androidx.lifecycle.process
|
||||||
implementation libs.androidx.documentfile
|
|
||||||
implementation libs.android.material
|
implementation libs.android.material
|
||||||
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
|
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
|
||||||
// https://github.com/organicmaps/organicmaps/issues/6106
|
// https://github.com/organicmaps/organicmaps/issues/6106
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
• OpenStreetMap Daten vom 17. Dezember
|
|
||||||
• Map download server nun wählbar
|
|
||||||
• Warnung über veraltete Karten hinzugefügt + Knopf zum updaten
|
|
||||||
• Vermeidung von Parkplatzwegen im Routing
|
|
||||||
• Neuer Zoombutton
|
|
||||||
• Verbesserte Französchische Suchsynonme
|
|
||||||
• OSM editor: Maximale Länge für OSM-Tags werden nun geprüft
|
|
||||||
Mehr auf codeberg.org/comaps/comaps/releases
|
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
• OpenStreetMap data as of December 17
|
This is a maps-only update just to keep your maps fresh!
|
||||||
• Make map download server configurable
|
• OpenStreetMap data as of December 27
|
||||||
• Added info about outdated maps and an update button to the selected place info card
|
|
||||||
• Avoid using parking aisles for routing
|
Please see previous releases' changes on codeberg.org/comaps/comaps/releases
|
||||||
• Changed shape of zoom buttons
|
|
||||||
• Improved French search synonyms
|
|
||||||
• OSM editor: check length limit for OSM tags in value validation
|
|
||||||
More details on codeberg.org/comaps/comaps/releases
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
• Données OpenStreetMap du 17 décembre
|
|
||||||
• Serveur de téléchargement de cartes configurable
|
|
||||||
• Ajout d'un message d'avertissement pour les cartes trop anciennes
|
|
||||||
• Évitement des allées de parking dans les itinéraires
|
|
||||||
• Mise à jour de l'apparence des boutons de zooms
|
|
||||||
• Amélioration des synonymes de recherche en français
|
|
||||||
• Editeur OSM: vérification de la taille limite des tags OSM
|
|
||||||
Plus d'informations sur codeberg.org/comaps/comaps/releases
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
• Dados OSM de 17/12
|
|
||||||
• Servidor de download de mapas configurável
|
|
||||||
• Adição de informações sobre mapas desatualizados e um botão de atualização ao cartão de informações do local selecionado
|
|
||||||
• Evita o uso de corredores de estacionamento para roteamento
|
|
||||||
• Formato dos botões de zoom alterado
|
|
||||||
• Sinônimos de busca em francês aprimorados
|
|
||||||
• Editor OSM: verificação do limite de comprimento das tags do OSM na validação de valores
|
|
||||||
Mais detalhes em codeberg.org/comaps/comaps/releases
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
• Карты OpenStreetMap от 17 декабря
|
|
||||||
• Возможность настройки сервера для скачивания карт
|
|
||||||
• Добавлена информация об устаревании карт и кнопка обновления (при выборе места на карте)
|
|
||||||
• Парковочные проезды больше не используются для транзитной маршрутизации
|
|
||||||
• Изменены кнопки масштабирования карты
|
|
||||||
• На карту добавлены ирригационные гидранты
|
|
||||||
• Редактор OSM: проверка максимальной длины OSM тегов
|
|
||||||
Подробнее на codeberg.org/comaps/comaps/releases
|
|
||||||
@@ -1 +1 @@
|
|||||||
version: 2025.03.02-7-FDroid+25030207
|
version: 2025.12.28-2-FDroid+25122802
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE;
|
|||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
||||||
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
|
import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE;
|
||||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW;
|
import static app.organicmaps.sdk.location.LocationState.FOLLOW;
|
||||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE_COMPASS;
|
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE;
|
||||||
import static app.organicmaps.sdk.location.LocationState.FOLLOW_AND_ROTATE_ROUTE;
|
|
||||||
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
|
import static app.organicmaps.sdk.location.LocationState.LOCATION_TAG;
|
||||||
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
import static app.organicmaps.sdk.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||||
import static app.organicmaps.sdk.util.Utils.dimen;
|
import static app.organicmaps.sdk.util.Utils.dimen;
|
||||||
@@ -1901,8 +1900,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||||||
|
|
||||||
locationHelper.restartWithNewMode();
|
locationHelper.restartWithNewMode();
|
||||||
|
|
||||||
if ((newMode == FOLLOW || newMode == FOLLOW_AND_ROTATE_ROUTE || newMode == FOLLOW_AND_ROTATE_COMPASS)
|
if ((newMode == FOLLOW || newMode == FOLLOW_AND_ROTATE) && !LocationUtils.checkFineLocationPermission(this))
|
||||||
&& !LocationUtils.checkFineLocationPermission(this))
|
|
||||||
{
|
{
|
||||||
// Try to optimistically request FINE permission for FOLLOW and FOLLOW_AND_ROTATE modes.
|
// Try to optimistically request FINE permission for FOLLOW and FOLLOW_AND_ROTATE modes.
|
||||||
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION permission for " + LocationState.nameOf(newMode));
|
Logger.i(LOCATION_TAG, "Requesting ACCESS_FINE_LOCATION permission for " + LocationState.nameOf(newMode));
|
||||||
|
|||||||
@@ -183,16 +183,11 @@ public final class UiHelpers
|
|||||||
drawableRes = R.drawable.ic_follow;
|
drawableRes = R.drawable.ic_follow;
|
||||||
tintColor = Colors.LOCATION_TINT;
|
tintColor = Colors.LOCATION_TINT;
|
||||||
}
|
}
|
||||||
case LocationState.FOLLOW_AND_ROTATE_COMPASS ->
|
case LocationState.FOLLOW_AND_ROTATE ->
|
||||||
{
|
{
|
||||||
drawableRes = R.drawable.ic_follow_and_rotate;
|
drawableRes = R.drawable.ic_follow_and_rotate;
|
||||||
tintColor = Colors.LOCATION_TINT;
|
tintColor = Colors.LOCATION_TINT;
|
||||||
}
|
}
|
||||||
case LocationState.FOLLOW_AND_ROTATE_ROUTE ->
|
|
||||||
{
|
|
||||||
drawableRes = R.drawable.ic_follow_route;
|
|
||||||
tintColor = Colors.LOCATION_TINT;
|
|
||||||
}
|
|
||||||
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
|
default -> throw new IllegalArgumentException("Invalid button mode: " + locationMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -948,7 +948,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
mDisused.setVisibility(Editor.nativeCanMarkPlaceAsDisused() ? View.VISIBLE : View.GONE);
|
mDisused.setVisibility(Editor.nativeCanMarkPlaceAsDisused() ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
if (Editor.nativeAreSomeFeatureChangesUploaded())
|
if (Editor.nativeIsMapObjectUploaded())
|
||||||
{
|
{
|
||||||
mReset.setText(R.string.editor_place_doesnt_exist);
|
mReset.setText(R.string.editor_place_doesnt_exist);
|
||||||
return;
|
return;
|
||||||
@@ -966,7 +966,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
|
|||||||
|
|
||||||
private void reset()
|
private void reset()
|
||||||
{
|
{
|
||||||
if (Editor.nativeAreSomeFeatureChangesUploaded())
|
if (Editor.nativeIsMapObjectUploaded())
|
||||||
{
|
{
|
||||||
placeDoesntExist();
|
placeDoesntExist();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -98,11 +98,6 @@ public class NavigationController implements TrafficManager.TrafficCallback, Nav
|
|||||||
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
|
mSpeedLimit = topFrame.findViewById(R.id.nav_speed_limit);
|
||||||
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
|
mCurrentSpeed = topFrame.findViewById(R.id.nav_current_speed);
|
||||||
|
|
||||||
View mTopbar = topFrame.findViewById(R.id.statutbar);
|
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(mTopbar,(v, windowInsets) -> {
|
|
||||||
UiUtils.setViewNavigationTopInsetsMargin(v, windowInsets);
|
|
||||||
return windowInsets;
|
|
||||||
});
|
|
||||||
// Show a blank view below the navbar to hide the menu content
|
// Show a blank view below the navbar to hide the menu content
|
||||||
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
|
final View navigationBarBackground = mFrame.findViewById(R.id.nav_bottom_sheet_nav_bar);
|
||||||
final View nextTurnContainer = mFrame.findViewById(R.id.nav_next_turn_container);
|
final View nextTurnContainer = mFrame.findViewById(R.id.nav_next_turn_container);
|
||||||
|
|||||||
@@ -281,14 +281,6 @@ public final class UiUtils
|
|||||||
view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, view.getPaddingBottom());
|
view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, view.getPaddingBottom());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setViewNavigationTopInsetsMargin(View view, WindowInsetsCompat windowInsets)
|
|
||||||
{
|
|
||||||
final Insets systemInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
|
|
||||||
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
|
|
||||||
lp.topMargin = systemInsets.top;
|
|
||||||
view.setLayoutParams(lp);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
|
public static void setupNavigationIcon(@NonNull MaterialToolbar toolbar, @NonNull View.OnClickListener listener)
|
||||||
{
|
{
|
||||||
View customNavigationButton = toolbar.findViewById(R.id.back);
|
View customNavigationButton = toolbar.findViewById(R.id.back);
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ public class MyPositionButton
|
|||||||
int colorAttr = R.attr.iconTint;
|
int colorAttr = R.attr.iconTint;
|
||||||
@DimenRes
|
@DimenRes
|
||||||
int sizeDimen = R.dimen.map_button_icon_size;
|
int sizeDimen = R.dimen.map_button_icon_size;
|
||||||
if (mode == LocationState.FOLLOW || mode == LocationState.FOLLOW_AND_ROTATE_ROUTE
|
if (mode == LocationState.FOLLOW || mode == LocationState.FOLLOW_AND_ROTATE
|
||||||
|| mode == LocationState.FOLLOW_AND_ROTATE_COMPASS || mode == LocationState.PENDING_POSITION)
|
|| mode == LocationState.PENDING_POSITION)
|
||||||
{
|
{
|
||||||
colorAttr = com.google.android.material.R.attr.colorSecondary;
|
colorAttr = com.google.android.material.R.attr.colorSecondary;
|
||||||
if (mode == LocationState.PENDING_POSITION)
|
if (mode == LocationState.PENDING_POSITION)
|
||||||
@@ -69,8 +69,7 @@ public class MyPositionButton
|
|||||||
case LocationState.NOT_FOLLOW_NO_POSITION -> R.drawable.ic_location_off;
|
case LocationState.NOT_FOLLOW_NO_POSITION -> R.drawable.ic_location_off;
|
||||||
case LocationState.NOT_FOLLOW -> R.drawable.ic_location_crosshair;
|
case LocationState.NOT_FOLLOW -> R.drawable.ic_location_crosshair;
|
||||||
case LocationState.FOLLOW -> R.drawable.ic_follow;
|
case LocationState.FOLLOW -> R.drawable.ic_follow;
|
||||||
case LocationState.FOLLOW_AND_ROTATE_COMPASS -> R.drawable.ic_follow_and_rotate;
|
case LocationState.FOLLOW_AND_ROTATE -> R.drawable.ic_follow_and_rotate;
|
||||||
case LocationState.FOLLOW_AND_ROTATE_ROUTE -> R.drawable.ic_follow_route;
|
|
||||||
default -> throw new IllegalArgumentException("Invalid button mode: " + mode);
|
default -> throw new IllegalArgumentException("Invalid button mode: " + mode);
|
||||||
};
|
};
|
||||||
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
|
image = ResourcesCompat.getDrawable(resources, drawableRes, context.getTheme());
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24">
|
|
||||||
<path
|
|
||||||
android:strokeColor="@android:color/white"
|
|
||||||
android:fillColor="@android:color/white"
|
|
||||||
android:pathData="M15.15 16.92l-7.04 2.8v0.4l2.63 1.07 0.98 2.67h0.39z"/>
|
|
||||||
<path
|
|
||||||
android:strokeColor="@android:color/white"
|
|
||||||
android:strokeWidth="2"
|
|
||||||
android:strokeLineJoin="miter"
|
|
||||||
android:pathData="m 16.25,15.95 c 2.29,-2.29 1.91,-3.87 -4.06,-3.87"/>
|
|
||||||
<path
|
|
||||||
android:strokeColor="@android:color/white"
|
|
||||||
android:strokeWidth="2"
|
|
||||||
android:strokeLineJoin="miter"
|
|
||||||
android:pathData="M8.98 7.43c-2.97 2.96-2.72 4.66 3.24 4.66"/>
|
|
||||||
<path
|
|
||||||
android:strokeColor="@android:color/white"
|
|
||||||
android:strokeWidth="2"
|
|
||||||
android:strokeLineJoin="miter"
|
|
||||||
android:pathData="M8.89 7.51l8.83-8.79"/>
|
|
||||||
<path
|
|
||||||
android:strokeColor="@android:color/white"
|
|
||||||
android:strokeWidth="2"
|
|
||||||
android:strokeLineJoin="miter"
|
|
||||||
android:pathData="M9.2 22.83c-0.64 0.57-2.9 2.5-3.56 3.13"/>
|
|
||||||
</vector>
|
|
||||||
@@ -11,12 +11,13 @@
|
|||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:id="@+id/statutbar"
|
android:id="@+id/statutbar"
|
||||||
android:layout_height="1dp"
|
android:layout_height="15dp"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/street_frame"
|
android:id="@+id/street_frame"
|
||||||
android:layout_width="500dp"
|
android:layout_width="500dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/margin_half_plus_eight"
|
||||||
android:layout_marginEnd="@dimen/margin_quarter"
|
android:layout_marginEnd="@dimen/margin_quarter"
|
||||||
app:cardCornerRadius="@dimen/margin_half"
|
app:cardCornerRadius="@dimen/margin_half"
|
||||||
android:elevation="@dimen/nav_elevation"
|
android:elevation="@dimen/nav_elevation"
|
||||||
@@ -51,6 +52,7 @@
|
|||||||
app:layout_constraintEnd_toStartOf="@+id/street_frame"
|
app:layout_constraintEnd_toStartOf="@+id/street_frame"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||||
|
android:layout_marginTop="@dimen/margin_half_plus_eight"
|
||||||
android:layout_marginStart="@dimen/margin_quarter"
|
android:layout_marginStart="@dimen/margin_quarter"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:elevation="@dimen/nav_elevation">
|
android:elevation="@dimen/nav_elevation">
|
||||||
|
|||||||
@@ -15,13 +15,7 @@
|
|||||||
android:theme="@style/MwmWidget.ToolbarTheme">
|
android:theme="@style/MwmWidget.ToolbarTheme">
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:id="@+id/save"
|
android:id="@+id/save"
|
||||||
android:layout_width="wrap_content"
|
style="@style/MwmWidget.Downloader.ToolbarButton"
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:gravity="center"
|
|
||||||
android:layout_gravity="end|center_vertical"
|
|
||||||
android:background="?selectableItemBackgroundBorderless"
|
|
||||||
android:padding="@dimen/margin_half"
|
|
||||||
android:textAppearance="@style/MwmTextAppearance.Toolbar.Title"
|
|
||||||
android:text="@string/editor_report_problem_send_button"/>
|
android:text="@string/editor_report_problem_send_button"/>
|
||||||
</com.google.android.material.appbar.MaterialToolbar>
|
</com.google.android.material.appbar.MaterialToolbar>
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:background="?windowBackgroundForced"
|
||||||
android:animateLayoutChanges="true"
|
android:animateLayoutChanges="true"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:background="?cardBackground"
|
android:background="?windowBackgroundForced"
|
||||||
android:padding="@dimen/margin_base">
|
android:padding="@dimen/margin_base">
|
||||||
<com.google.android.material.textview.MaterialTextView
|
<com.google.android.material.textview.MaterialTextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?cardBackground"
|
|
||||||
android:minHeight="@dimen/height_item_oneline"
|
android:minHeight="@dimen/height_item_oneline"
|
||||||
android:paddingStart="@dimen/margin_base_plus"
|
android:paddingStart="@dimen/margin_base_plus"
|
||||||
android:paddingEnd="@dimen/margin_base_plus">
|
android:paddingEnd="@dimen/margin_base_plus">
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?cardBackground"
|
|
||||||
android:minHeight="@dimen/height_item_oneline"
|
android:minHeight="@dimen/height_item_oneline"
|
||||||
android:paddingStart="@dimen/margin_base_plus"
|
android:paddingStart="@dimen/margin_base_plus"
|
||||||
android:paddingEnd="@dimen/margin_base_plus">
|
android:paddingEnd="@dimen/margin_base_plus">
|
||||||
|
|||||||
@@ -11,12 +11,13 @@
|
|||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:id="@+id/statutbar"
|
android:id="@+id/statutbar"
|
||||||
android:layout_height="1dp"
|
android:layout_height="25dp"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
<com.google.android.material.card.MaterialCardView
|
<com.google.android.material.card.MaterialCardView
|
||||||
android:id="@+id/street_frame"
|
android:id="@+id/street_frame"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/margin_half_plus"
|
||||||
android:layout_marginStart="@dimen/nav_street_left"
|
android:layout_marginStart="@dimen/nav_street_left"
|
||||||
android:layout_marginEnd="@dimen/margin_quarter"
|
android:layout_marginEnd="@dimen/margin_quarter"
|
||||||
app:cardCornerRadius="@dimen/margin_half"
|
app:cardCornerRadius="@dimen/margin_half"
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
app:layout_constraintTop_toBottomOf="@+id/statutbar"
|
||||||
android:layout_marginStart="@dimen/margin_half"
|
android:layout_marginStart="@dimen/margin_half"
|
||||||
|
android:layout_marginTop="@dimen/margin_half_plus"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:elevation="@dimen/nav_elevation">
|
android:elevation="@dimen/nav_elevation">
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="@dimen/margin_half_plus"
|
android:layout_marginBottom="@dimen/margin_half_plus"
|
||||||
android:textSize="@dimen/text_size_headline"
|
android:textAppearance="@style/MwmTextAppearance.Title.Toolbar"
|
||||||
android:fontFamily="@string/robotoMedium"
|
|
||||||
android:gravity="center_horizontal"
|
android:gravity="center_horizontal"
|
||||||
tools:text="Some long long long placeholder title"/>
|
tools:text="Some long long long placeholder title"/>
|
||||||
|
|||||||
8
android/app/src/main/res/layout/tab_timepicker.xml
Normal file
8
android/app/src/main/res/layout/tab_timepicker.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
style="@style/MwmWidget.Tab"
|
||||||
|
android:textAppearance="@style/MwmTextAppearance.Body3"
|
||||||
|
tools:drawableStart="@drawable/ic_menu_open"
|
||||||
|
tools:text="Some tab"/>
|
||||||
@@ -84,10 +84,10 @@
|
|||||||
<item name="transitRulerBackground">@color/white_4</item>
|
<item name="transitRulerBackground">@color/white_4</item>
|
||||||
<item name="transitStepDivider">@drawable/dot_divider</item>
|
<item name="transitStepDivider">@drawable/dot_divider</item>
|
||||||
<item name="accentColorSelector">@color/accent_color_selector</item>
|
<item name="accentColorSelector">@color/accent_color_selector</item>
|
||||||
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
<item name="android:textAppearance">@style/TextAppearance</item>
|
||||||
<item name="android:textAppearanceSmall">@style/MwmTextAppearance.Body4</item>
|
<item name="android:textAppearanceSmall">@style/TextAppearance.Small</item>
|
||||||
<item name="android:textAppearanceMedium">@style/MwmTextAppearance.Body2</item>
|
<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
|
||||||
<item name="android:textAppearanceLarge">@style/MwmTextAppearance.Body1</item>
|
<item name="android:textAppearanceLarge">@style/TextAppearance.Large</item>
|
||||||
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
||||||
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
||||||
<item name="elevationProfilePropIconTint">@color/white_secondary</item>
|
<item name="elevationProfilePropIconTint">@color/white_secondary</item>
|
||||||
|
|||||||
@@ -27,9 +27,9 @@
|
|||||||
<item>type2_combo</item>
|
<item>type2_combo</item>
|
||||||
<item>nacs</item>
|
<item>nacs</item>
|
||||||
<item>chademo</item>
|
<item>chademo</item>
|
||||||
<item>type2</item>
|
|
||||||
<item>type2_cable</item>
|
|
||||||
<item>type1</item>
|
<item>type1</item>
|
||||||
|
<item>type2_cable</item>
|
||||||
|
<item>type2</item>
|
||||||
<item>schuko</item>
|
<item>schuko</item>
|
||||||
<item>unknown</item>
|
<item>unknown</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|||||||
@@ -15,6 +15,11 @@
|
|||||||
<item name="android:textStyle">bold</item>
|
<item name="android:textStyle">bold</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="MwmTextAppearance.Title.Toolbar">
|
||||||
|
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||||
|
<item name="android:fontFamily">@string/robotoMedium</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="MwmTextAppearance.Headline">
|
<style name="MwmTextAppearance.Headline">
|
||||||
<item name="android:textSize">@dimen/text_size_headline</item>
|
<item name="android:textSize">@dimen/text_size_headline</item>
|
||||||
<item name="android:textColor">?android:textColorPrimary</item>
|
<item name="android:textColor">?android:textColorPrimary</item>
|
||||||
@@ -116,6 +121,10 @@
|
|||||||
<item name="android:textColor">@color/bg_cards</item>
|
<item name="android:textColor">@color/bg_cards</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="MwmTextAppearance.Toolbar.Title.Button">
|
||||||
|
<item name="android:textSize">@dimen/text_size_body_3</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="MwmTextAppearance.NavMenu">
|
<style name="MwmTextAppearance.NavMenu">
|
||||||
<item name="android:textStyle">bold</item>
|
<item name="android:textStyle">bold</item>
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -287,6 +287,13 @@
|
|||||||
<item name="android:textColor">@color/text_light</item>
|
<item name="android:textColor">@color/text_light</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="MwmWidget.Tab">
|
||||||
|
<item name="android:layout_width">wrap_content</item>
|
||||||
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
||||||
|
<item name="android:gravity">center</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="MwmWidget.TabLayout" parent="Widget.Design.TabLayout">
|
<style name="MwmWidget.TabLayout" parent="Widget.Design.TabLayout">
|
||||||
<item name="tabMaxWidth">0dp</item>
|
<item name="tabMaxWidth">0dp</item>
|
||||||
<item name="tabTextAppearance">@style/MwmTextAppearance.Tab</item>
|
<item name="tabTextAppearance">@style/MwmTextAppearance.Tab</item>
|
||||||
@@ -298,6 +305,16 @@
|
|||||||
<item name="tabSelectedTextColor">@color/white_primary</item>
|
<item name="tabSelectedTextColor">@color/white_primary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="MwmWidget.Downloader.ToolbarButton">
|
||||||
|
<item name="android:layout_width">wrap_content</item>
|
||||||
|
<item name="android:layout_height">match_parent</item>
|
||||||
|
<item name="android:gravity">center</item>
|
||||||
|
<item name="android:layout_gravity">end|center_vertical</item>
|
||||||
|
<item name="android:background">?selectableItemBackgroundBorderless</item>
|
||||||
|
<item name="android:padding">@dimen/margin_half</item>
|
||||||
|
<item name="android:textAppearance">@style/MwmTextAppearance.Toolbar.Title.Button</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="MwmWidget.MaterialCalendar.Theme.FullScreen.Dark"
|
<style name="MwmWidget.MaterialCalendar.Theme.FullScreen.Dark"
|
||||||
parent="ThemeOverlay.Material3.MaterialCalendar.Fullscreen">
|
parent="ThemeOverlay.Material3.MaterialCalendar.Fullscreen">
|
||||||
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
||||||
@@ -308,6 +325,26 @@
|
|||||||
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
<item name="colorSurface">@color/material_calendar_surface_dark</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="TextAppearance" parent="MwmTextAppearance.Body3"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Small" parent="MwmTextAppearance.Body4"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Medium" parent="MwmTextAppearance.Body2"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Large" parent="MwmTextAppearance.Body1">
|
||||||
|
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Inverse" parent="MwmTextAppearance.Body3.Light"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Small.Inverse" parent="MwmTextAppearance.Body4.Light"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Medium.Inverse" parent="MwmTextAppearance.Body2.Light"/>
|
||||||
|
|
||||||
|
<style name="TextAppearance.Large.Inverse" parent="MwmTextAppearance.Body1.Light">
|
||||||
|
<item name="android:textSize">@dimen/text_size_toolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style
|
<style
|
||||||
name="MwmTheme.BottomSheetDialog"
|
name="MwmTheme.BottomSheetDialog"
|
||||||
parent="@style/ThemeOverlay.Material3.BottomSheetDialog">
|
parent="@style/ThemeOverlay.Material3.BottomSheetDialog">
|
||||||
@@ -340,6 +377,9 @@
|
|||||||
<style name="MwmWidget.M3.Button" parent="Widget.Material3.Button">
|
<style name="MwmWidget.M3.Button" parent="Widget.Material3.Button">
|
||||||
<item name="android:layout_width">wrap_content</item>
|
<item name="android:layout_width">wrap_content</item>
|
||||||
<item name="android:layout_height">wrap_content</item>
|
<item name="android:layout_height">wrap_content</item>
|
||||||
|
<item name="android:textColor">?accentButtonTextColor</item>
|
||||||
|
<item name="backgroundTint">@null</item>
|
||||||
|
<item name="cornerRadius">20dp</item>
|
||||||
<item name="android:textSize">16sp</item>
|
<item name="android:textSize">16sp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
@@ -349,11 +389,13 @@
|
|||||||
|
|
||||||
<style name="MwmWidget.M3.Button.Secondary" parent="@style/Widget.Material3.Button.OutlinedButton">
|
<style name="MwmWidget.M3.Button.Secondary" parent="@style/Widget.Material3.Button.OutlinedButton">
|
||||||
<item name="android:textSize">16sp</item>
|
<item name="android:textSize">16sp</item>
|
||||||
|
<item name="strokeColor">?colorSecondary</item>
|
||||||
<item name="android:textColor">?colorSecondary</item>
|
<item name="android:textColor">?colorSecondary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="MwmWidget.M3.FAB.Primary" parent="@style/Widget.Material3.FloatingActionButton.Primary">
|
<style name="MwmWidget.M3.FAB.Primary" parent="@style/Widget.Material3.FloatingActionButton.Primary">
|
||||||
<item name="shapeAppearance">@style/ShapeAppearanceOverlay.Material3.FloatingActionButton</item>
|
<item name="shapeAppearance">@style/ShapeAppearanceOverlay.Material3.FloatingActionButton</item>
|
||||||
|
<item name="rippleColor">@null</item>
|
||||||
<item name="backgroundTint">?colorSecondary</item>
|
<item name="backgroundTint">?colorSecondary</item>
|
||||||
<item name="tint">?android:textColorPrimaryInverse</item>
|
<item name="tint">?android:textColorPrimaryInverse</item>
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -85,14 +85,14 @@
|
|||||||
<item name="transitRulerBackground">@color/black_4</item>
|
<item name="transitRulerBackground">@color/black_4</item>
|
||||||
<item name="transitStepDivider">@drawable/dot_divider</item>
|
<item name="transitStepDivider">@drawable/dot_divider</item>
|
||||||
<item name="accentColorSelector">@color/accent_color_selector</item>
|
<item name="accentColorSelector">@color/accent_color_selector</item>
|
||||||
<item name="android:textAppearance">@style/MwmTextAppearance.Body3</item>
|
<item name="android:textAppearance">@style/TextAppearance</item>
|
||||||
<item name="android:textAppearanceSmall">@style/MwmTextAppearance.Body4</item>
|
<item name="android:textAppearanceSmall">@style/TextAppearance.Small</item>
|
||||||
<item name="android:textAppearanceMedium">@style/MwmTextAppearance.Body2</item>
|
<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
|
||||||
<item name="android:textAppearanceLarge">@style/MwmTextAppearance.Body1</item>
|
<item name="android:textAppearanceLarge">@style/TextAppearance.Large</item>
|
||||||
<item name="android:textAppearanceInverse">@style/MwmTextAppearance.Body3.Light</item>
|
<item name="android:textAppearanceInverse">@style/TextAppearance.Inverse</item>
|
||||||
<item name="android:textAppearanceSmallInverse">@style/MwmTextAppearance.Body4.Light</item>
|
<item name="android:textAppearanceSmallInverse">@style/TextAppearance.Small.Inverse</item>
|
||||||
<item name="android:textAppearanceMediumInverse">@style/MwmTextAppearance.Body2.Light</item>
|
<item name="android:textAppearanceMediumInverse">@style/TextAppearance.Medium.Inverse</item>
|
||||||
<item name="android:textAppearanceLargeInverse">@style/MwmTextAppearance.Body1.Light</item>
|
<item name="android:textAppearanceLargeInverse">@style/TextAppearance.Large.Inverse</item>
|
||||||
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
<item name="drivingOptionsViewBg">@color/bg_primary_dark</item>
|
||||||
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
<item name="elevationProfilePropertyBg">@drawable/bg_rounded_rect</item>
|
||||||
<item name="elevationProfilePropIconTint">@color/black_secondary</item>
|
<item name="elevationProfilePropIconTint">@color/black_secondary</item>
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
[versions]
|
[versions]
|
||||||
androidGradlePlugin = "8.13.2"
|
androidGradlePlugin = "8.11.2"
|
||||||
androidxCarApp = "1.7.0"
|
androidxCarApp = "1.7.0"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
android-tools = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
|
android-tools = { module = "com.android.tools.build:gradle", version.ref = "androidGradlePlugin" }
|
||||||
triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.13.0" }
|
triplet-play-publisher = { module = "com.github.triplet.gradle:play-publisher", version = "3.12.1" }
|
||||||
huawei-publish = { module = "ru.cian:huawei-publish-gradle-plugin", version = "1.4.2" }
|
huawei-publish = { module = "ru.cian:huawei-publish-gradle-plugin", version = "1.4.2" }
|
||||||
android-tools-desugar = { module = "com.android.tools:desugar_jdk_libs", version = "2.1.5" }
|
android-tools-desugar = { module = "com.android.tools:desugar_jdk_libs", version = "2.1.5" }
|
||||||
microg-services-location = { module = "org.microg.gms:play-services-location", version = "0.3.6.244735" }
|
microg-services-location = { module = "org.microg.gms:play-services-location", version = "0.3.6.244735" }
|
||||||
androidx-core = { module = "androidx.core:core", version = "1.17.0" }
|
androidx-core = { module = "androidx.core:core", version = "1.17.0" }
|
||||||
jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.21" }
|
jetbrains-kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version = "2.2.20" }
|
||||||
androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }
|
androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }
|
||||||
androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.1" }
|
androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.1" }
|
||||||
androidx-car-app = { module = "androidx.car.app:app", version.ref = "androidxCarApp" }
|
androidx-car-app = { module = "androidx.car.app:app", version.ref = "androidxCarApp" }
|
||||||
@@ -21,13 +21,12 @@ androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version
|
|||||||
androidx-work-runtime = { module = "androidx.work:work-runtime", version = "2.10.5" }
|
androidx-work-runtime = { module = "androidx.work:work-runtime", version = "2.10.5" }
|
||||||
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version = "2.9.4" }
|
androidx-lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version = "2.9.4" }
|
||||||
androidx-media = { module = "androidx.media:media", version = "1.7.1" }
|
androidx-media = { module = "androidx.media:media", version = "1.7.1" }
|
||||||
androidx-documentfile= { module = "androidx.documentfile:documentfile", version ="1.1.0" }
|
|
||||||
android-material = { module = "com.google.android.material:material", version = "1.12.0" }
|
android-material = { module = "com.google.android.material:material", version = "1.12.0" }
|
||||||
google-guava = { module = "com.google.guava:guava", version = "33.5.0-android" }
|
google-guava = { module = "com.google.guava:guava", version = "33.4.8-android" }
|
||||||
appdevnext-androidchart = { module = "com.github.AppDevNext:AndroidChart", version = "3.1.0.31" }
|
appdevnext-androidchart = { module = "com.github.AppDevNext:AndroidChart", version = "3.1.0.31" }
|
||||||
androidx-test-junit = { module = "androidx.test.ext:junit", version = "1.3.0" }
|
androidx-test-junit = { module = "androidx.test.ext:junit", version = "1.3.0" }
|
||||||
junit = { module = "junit:junit", version = "4.13.2" }
|
junit = { module = "junit:junit", version = "4.13.2" }
|
||||||
mockito-core = { module = "org.mockito:mockito-core", version = "5.21.0" }
|
mockito-core = { module = "org.mockito:mockito-core", version = "5.20.0" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
|
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ dependencies {
|
|||||||
implementation libs.androidx.recyclerview
|
implementation libs.androidx.recyclerview
|
||||||
implementation libs.androidx.preference
|
implementation libs.androidx.preference
|
||||||
implementation libs.android.material
|
implementation libs.android.material
|
||||||
implementation libs.androidx.documentfile
|
|
||||||
|
|
||||||
testImplementation libs.junit
|
testImplementation libs.junit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../../../../data/mapcss-mapping.csv
|
|
||||||
|
@@ -580,10 +580,10 @@ JNIEXPORT jint JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeGetMapObject
|
|||||||
return static_cast<jint>(osm::Editor::Instance().GetFeatureStatus(g_editableMapObject.GetID()));
|
return static_cast<jint>(osm::Editor::Instance().GetFeatureStatus(g_editableMapObject.GetID()));
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeAreSomeFeatureChangesUploaded(JNIEnv * env, jclass clazz)
|
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_editor_Editor_nativeIsMapObjectUploaded(JNIEnv * env, jclass clazz)
|
||||||
{
|
{
|
||||||
return osm::Editor::Instance().AreSomeFeatureChangesUploaded(g_editableMapObject.GetID().m_mwmId,
|
return osm::Editor::Instance().IsFeatureUploaded(g_editableMapObject.GetID().m_mwmId,
|
||||||
g_editableMapObject.GetID().m_index);
|
g_editableMapObject.GetID().m_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static nativeMakeLocalizedName(String langCode, String name);
|
// static nativeMakeLocalizedName(String langCode, String name);
|
||||||
|
|||||||
@@ -190,5 +190,5 @@ public final class Editor
|
|||||||
|
|
||||||
@FeatureStatus
|
@FeatureStatus
|
||||||
public static native int nativeGetMapObjectStatus();
|
public static native int nativeGetMapObjectStatus();
|
||||||
public static native boolean nativeAreSomeFeatureChangesUploaded();
|
public static native boolean nativeIsMapObjectUploaded();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ public final class LocationState
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@IntDef({PENDING_POSITION, NOT_FOLLOW_NO_POSITION, NOT_FOLLOW, FOLLOW, FOLLOW_AND_ROTATE_COMPASS,
|
@IntDef({PENDING_POSITION, NOT_FOLLOW_NO_POSITION, NOT_FOLLOW, FOLLOW, FOLLOW_AND_ROTATE})
|
||||||
FOLLOW_AND_ROTATE_ROUTE})
|
|
||||||
@interface Value
|
@interface Value
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@@ -30,8 +29,7 @@ public final class LocationState
|
|||||||
public static final int NOT_FOLLOW_NO_POSITION = 1;
|
public static final int NOT_FOLLOW_NO_POSITION = 1;
|
||||||
public static final int NOT_FOLLOW = 2;
|
public static final int NOT_FOLLOW = 2;
|
||||||
public static final int FOLLOW = 3;
|
public static final int FOLLOW = 3;
|
||||||
public static final int FOLLOW_AND_ROTATE_COMPASS = 4;
|
public static final int FOLLOW_AND_ROTATE = 4;
|
||||||
public static final int FOLLOW_AND_ROTATE_ROUTE = 5;
|
|
||||||
|
|
||||||
// These constants should correspond to values defined in platform/location.hpp
|
// These constants should correspond to values defined in platform/location.hpp
|
||||||
// Leave 0-value as no any error.
|
// Leave 0-value as no any error.
|
||||||
@@ -71,8 +69,7 @@ public final class LocationState
|
|||||||
case NOT_FOLLOW_NO_POSITION -> "NOT_FOLLOW_NO_POSITION";
|
case NOT_FOLLOW_NO_POSITION -> "NOT_FOLLOW_NO_POSITION";
|
||||||
case NOT_FOLLOW -> "NOT_FOLLOW";
|
case NOT_FOLLOW -> "NOT_FOLLOW";
|
||||||
case FOLLOW -> "FOLLOW";
|
case FOLLOW -> "FOLLOW";
|
||||||
case FOLLOW_AND_ROTATE_COMPASS -> "FOLLOW_AND_ROTATE_COMPASS";
|
case FOLLOW_AND_ROTATE -> "FOLLOW_AND_ROTATE";
|
||||||
case FOLLOW_AND_ROTATE_ROUTE -> "FOLLOW_AND_ROTATE_ROUTE";
|
|
||||||
default -> "Unknown: " + mode;
|
default -> "Unknown: " + mode;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,7 +179,7 @@
|
|||||||
<!-- Compared to wilderness_hut its smaller and simpler, without a fireplace. -->
|
<!-- Compared to wilderness_hut its smaller and simpler, without a fireplace. -->
|
||||||
<string name="type.amenity.shelter.basic_hut">Bivouac Hut</string>
|
<string name="type.amenity.shelter.basic_hut">Bivouac Hut</string>
|
||||||
<!-- A traditional 3-walled shelter (one side open), suitable for overnight camping. -->
|
<!-- A traditional 3-walled shelter (one side open), suitable for overnight camping. -->
|
||||||
<string name="type.amenity.shelter.lean_to">Lean-to Sleep Shelter</string>
|
<string name="type.amenity.shelter.lean_to">Lean-to Shelter</string>
|
||||||
<string name="type.amenity.public_bath">Public Bath</string>
|
<string name="type.amenity.public_bath">Public Bath</string>
|
||||||
<string name="type.amenity.shower">Shower</string>
|
<string name="type.amenity.shower">Shower</string>
|
||||||
<string name="type.amenity.stripclub">Stripclub</string>
|
<string name="type.amenity.stripclub">Stripclub</string>
|
||||||
@@ -198,7 +198,7 @@
|
|||||||
<string name="type.amenity.vending_machine.food">Food Dispenser</string>
|
<string name="type.amenity.vending_machine.food">Food Dispenser</string>
|
||||||
<string name="type.amenity.vending_machine.newspapers">Newspaper Dispenser</string>
|
<string name="type.amenity.vending_machine.newspapers">Newspaper Dispenser</string>
|
||||||
<string name="type.amenity.vending_machine.parking_tickets">Parking Meter</string>
|
<string name="type.amenity.vending_machine.parking_tickets">Parking Meter</string>
|
||||||
<string name="type.amenity.vending_machine.public_transport_tickets">Public Transport Ticket Machine</string>
|
<string name="type.amenity.vending_machine.public_transport_tickets">Ticket Machine</string>
|
||||||
<string name="type.amenity.vending_machine.sweets">Sweets Dispenser</string>
|
<string name="type.amenity.vending_machine.sweets">Sweets Dispenser</string>
|
||||||
<string name="type.amenity.vending_machine.excrement_bags">Excrement Bags Dispenser</string>
|
<string name="type.amenity.vending_machine.excrement_bags">Excrement Bags Dispenser</string>
|
||||||
<string name="type.amenity.parcel_locker">Parcel Locker</string>
|
<string name="type.amenity.parcel_locker">Parcel Locker</string>
|
||||||
|
|||||||
@@ -81,9 +81,6 @@
|
|||||||
"amenity-townhall": "3Town Hall|townhall|city hall|guildhall|village hall|4municipal hall|civic centre",
|
"amenity-townhall": "3Town Hall|townhall|city hall|guildhall|village hall|4municipal hall|civic centre",
|
||||||
"tourism-attraction|@category_tourism": "4Attraction|U+1F3A0|U+1F3A1|U+1F3A2|U+1F3AA",
|
"tourism-attraction|@category_tourism": "4Attraction|U+1F3A0|U+1F3A1|U+1F3A2|U+1F3AA",
|
||||||
"tourism-artwork": "3Artwork|U+1F3A8",
|
"tourism-artwork": "3Artwork|U+1F3A8",
|
||||||
"tourism-artwork-sculpture": "Sculpture|Artwork|U+1F3A8",
|
|
||||||
"tourism-artwork-statue": "Statue|Artwork|U+1F3A8",
|
|
||||||
"tourism-artwork-painting": "Painting|Artwork|U+1F3A8",
|
|
||||||
"tourism-viewpoint|@category_tourism": "4Viewpoint|Vista",
|
"tourism-viewpoint|@category_tourism": "4Viewpoint|Vista",
|
||||||
"tourism-information": "4Tourist Information|4information|U+1F481",
|
"tourism-information": "4Tourist Information|4information|U+1F481",
|
||||||
"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Picnic Site|picnic|Barbecue Grill|Picnic Table|bbq|Barbec",
|
"tourism-picnic_site|amenity-bbq|leisure-picnic_table": "3Picnic Site|picnic|Barbecue Grill|Picnic Table|bbq|Barbec",
|
||||||
@@ -200,7 +197,7 @@
|
|||||||
"amenity-school": "3School|U+1F392|U+1F3EB",
|
"amenity-school": "3School|U+1F392|U+1F3EB",
|
||||||
"amenity-shelter": "4Shelter|refuge",
|
"amenity-shelter": "4Shelter|refuge",
|
||||||
"amenity-shelter-basic_hut": "basic hut|3Bivouac Hut|Bivvy|Bothy|Hut",
|
"amenity-shelter-basic_hut": "basic hut|3Bivouac Hut|Bivvy|Bothy|Hut",
|
||||||
"amenity-shelter-lean_to": "3Lean-to Sleep Shelter|4Shelter|Refuge|lean shelter|Lean-to Shelter",
|
"amenity-shelter-lean_to": "3Lean-to Shelter|4Shelter|Refuge|lean shelter|shelter",
|
||||||
"amenity-stripclub": "Stripclub|strip club",
|
"amenity-stripclub": "Stripclub|strip club",
|
||||||
"amenity-telephone": "2Phone|U+260E|U+1F4DE|5Telephone",
|
"amenity-telephone": "2Phone|U+260E|U+1F4DE|5Telephone",
|
||||||
"@category_toilet": "3Toilet|toilets|4Restroom|potty|WC|water closet",
|
"@category_toilet": "3Toilet|toilets|4Restroom|potty|WC|water closet",
|
||||||
@@ -368,21 +365,20 @@
|
|||||||
"shop-pet|@shop": "3Pet",
|
"shop-pet|@shop": "3Pet",
|
||||||
"tourism-zoo|@category_tourism|@category_children": "2Zoo",
|
"tourism-zoo|@category_tourism|@category_children": "2Zoo",
|
||||||
"attraction-animal": "Animal Enclosure",
|
"attraction-animal": "Animal Enclosure",
|
||||||
"tourism-information-office|amenity-ranger_station|@category_tourism": "4Tourist Office|Tourism office|6Ranger station|Information",
|
"tourism-information-office|amenity-ranger_station|@category_tourism": "4Tourism office|6Ranger station",
|
||||||
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Visitor centre|6Ranger station|Information",
|
"tourism-information-visitor_centre|amenity-ranger_station|@category_tourism": "3Visitor centre|6Ranger station",
|
||||||
"amenity-community_centre": "4Community centre",
|
"amenity-community_centre": "4Community centre",
|
||||||
"amenity-compressed_air": "6Compressed air",
|
"amenity-compressed_air": "6Compressed air",
|
||||||
"amenity-courthouse": "4Courthouse",
|
"amenity-courthouse": "4Courthouse",
|
||||||
"amenity-vending_machine": "Vending Machine",
|
"amenity-vending_machine-cigarettes": "4Cigarette dispenser",
|
||||||
"amenity-vending_machine-cigarettes": "4Cigarette dispenser|Vending Machine",
|
"amenity-vending_machine-coffee": "4Coffee dispenser|Coffee",
|
||||||
"amenity-vending_machine-coffee": "4Coffee dispenser|Coffee|Vending Machine",
|
"amenity-vending_machine-condoms": "4Condoms dispenser|Condoms|Condomat",
|
||||||
"amenity-vending_machine-condoms": "4Condoms dispenser|Condoms|Condomat|Vending Machine",
|
"amenity-vending_machine-drinks": "4Drinks dispenser|4Beverages",
|
||||||
"amenity-vending_machine-drinks": "4Drinks dispenser|4Beverages|Vending Machine",
|
"amenity-vending_machine-food|@category_food": "4Food dispenser|Food|Snacks",
|
||||||
"amenity-vending_machine-food|@category_food": "4Food dispenser|Food|Snacks|Vending Machine",
|
|
||||||
"amenity-vending_machine-parking_tickets|@category_parking": "4Parking tickets|3Pay and Display|Parkomat|Parking Meter",
|
"amenity-vending_machine-parking_tickets|@category_parking": "4Parking tickets|3Pay and Display|Parkomat|Parking Meter",
|
||||||
"amenity-vending_machine-public_transport_tickets|@category_transport": "4Public Transport Ticket Machine|6Ticket machine|Transport Tickets|Tickets|4Fare machine|Bus tickets|Train tickets|Ticketing|Vending Machine",
|
"amenity-vending_machine-public_transport_tickets|@category_transport": "6Ticket machine|Transport Tickets|Tickets|4Fare machine|Bus tickets|Train tickets|Ticketing",
|
||||||
"amenity-vending_machine-newspapers": "4Newspaper Dispenser|Newspapers",
|
"amenity-vending_machine-newspapers": "4Newspaper Dispenser|Newspapers",
|
||||||
"amenity-vending_machine-sweets": "4Sweets Dispenser|Sweets|4Candies|Lollies|Vending Machine",
|
"amenity-vending_machine-sweets": "4Sweets Dispenser|Sweets|4Candies|Lollies",
|
||||||
"amenity-vending_machine-excrement_bags": "5Excrement Bags Dispenser|4Poop Bags|3Dog Poop Bags|Animal Waste",
|
"amenity-vending_machine-excrement_bags": "5Excrement Bags Dispenser|4Poop Bags|3Dog Poop Bags|Animal Waste",
|
||||||
"amenity-parcel_locker|@category_post": "4Parcel Locker|4Parcel Pickup",
|
"amenity-parcel_locker|@category_post": "4Parcel Locker|4Parcel Pickup",
|
||||||
"shop-outpost": "4Pickup Point|4Parcel Pickup",
|
"shop-outpost": "4Pickup Point|4Parcel Pickup",
|
||||||
@@ -402,7 +398,6 @@
|
|||||||
"tourism-chalet|@category_hotel": "5Holiday Cottage|5vacation home|4Chalet",
|
"tourism-chalet|@category_hotel": "5Holiday Cottage|5vacation home|4Chalet",
|
||||||
"tourism-information-board": "Information Board",
|
"tourism-information-board": "Information Board",
|
||||||
"tourism-information-map": "Tourist map|map|4Information",
|
"tourism-information-map": "Tourist map|map|4Information",
|
||||||
"tourism-information-guidepost": "Guidepost",
|
|
||||||
"aerialway-station": "Aerialway Station|5Cable car station",
|
"aerialway-station": "Aerialway Station|5Cable car station",
|
||||||
"aeroway-helipad": "4Helipad",
|
"aeroway-helipad": "4Helipad",
|
||||||
"barrier-border_control": "4Border Control",
|
"barrier-border_control": "4Border Control",
|
||||||
@@ -458,7 +453,7 @@
|
|||||||
"shop-tattoo": "Tattoo Parlour|4tattoos",
|
"shop-tattoo": "Tattoo Parlour|4tattoos",
|
||||||
"shop-variety_store|@category_shopping|@shop": "4Variety|6Dollar store|5Pound shop|5Five and dime",
|
"shop-variety_store|@category_shopping|@shop": "4Variety|6Dollar store|5Pound shop|5Five and dime",
|
||||||
"shop-video|@shop": "4Video|3DVD|videoshop|5video shop|video rental|video rental shop|video rental store",
|
"shop-video|@shop": "4Video|3DVD|videoshop|5video shop|video rental|video rental shop|video rental store",
|
||||||
"shop-video_games|@shop": "Video games|4videogames|video games|videogames|gaming|games|video game|videogame|U+1F47E|U+1F579|U+1F3AE",
|
"shop-video_games|@shop": "Video games|4videogames|video games|videogames|gaming|games|U+1F47E|U+1F579|U+1F3AE",
|
||||||
"tourism-wilderness_hut|@category_hotel": "4Wilderness Hut|5backcountry hut|hut|mountain hut|bothy|bivvy",
|
"tourism-wilderness_hut|@category_hotel": "4Wilderness Hut|5backcountry hut|hut|mountain hut|bothy|bivvy",
|
||||||
"tourism-gallery|@category_tourism": "3Art Gallery|3Gallery|museum",
|
"tourism-gallery|@category_tourism": "3Art Gallery|3Gallery|museum",
|
||||||
"tourism-theme_park|@category_tourism|@category_children": "5Theme park|Amusement park",
|
"tourism-theme_park|@category_tourism|@category_children": "5Theme park|Amusement park",
|
||||||
@@ -504,7 +499,6 @@
|
|||||||
"leisure-track": "Track",
|
"leisure-track": "Track",
|
||||||
"leisure-bandstand": "5Bandstand",
|
"leisure-bandstand": "5Bandstand",
|
||||||
"power-plant": "Power Plant",
|
"power-plant": "Power Plant",
|
||||||
"power-generator-wind": "Wind Generator",
|
|
||||||
"shop-auction|@category_secondhand": "4Auction|Auctioneer|Auction House",
|
"shop-auction|@category_secondhand": "4Auction|Auctioneer|Auction House",
|
||||||
"shop-collector|@category_shopping|@category_secondhand": "Collectables|Collector",
|
"shop-collector|@category_shopping|@category_secondhand": "Collectables|Collector",
|
||||||
"man_made-cairn": "4Cairn",
|
"man_made-cairn": "4Cairn",
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
{
|
{
|
||||||
"World": {
|
|
||||||
"languages": ["int_name", "en", "default"]
|
|
||||||
},
|
|
||||||
"WorldCoasts": {
|
|
||||||
"languages": ["int_name", "en", "default"]
|
|
||||||
},
|
|
||||||
"Abkhazia": {
|
"Abkhazia": {
|
||||||
"languages": ["ab", "ru"]
|
"languages": ["ab", "ru"]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
-->
|
-->
|
||||||
<!-- TODO: grouping like in <type id="shop-bag" group="shop"> is not currently used,
|
<!-- TODO: grouping like in <type id="shop-bag" group="shop"> is not currently used,
|
||||||
see https://github.com/organicmaps/organicmaps/pull/7678#issuecomment-2017488467
|
see https://github.com/organicmaps/organicmaps/pull/7678#issuecomment-2017488467
|
||||||
-->
|
-->
|
||||||
<editor>
|
<editor>
|
||||||
<!-- TODO: disabling is not implemented, remove? see a todo in Editor::GetEditableProperties() -->
|
<!-- TODO: disabling is not implemented, remove? see a todo in Editor::GetEditableProperties() -->
|
||||||
<disable everywhere="no">
|
<disable everywhere="no">
|
||||||
@@ -122,10 +122,10 @@
|
|||||||
</value>
|
</value>
|
||||||
</field>
|
</field>
|
||||||
<!-- Uncomment this and other ele fields when the code supports it. -->
|
<!-- Uncomment this and other ele fields when the code supports it. -->
|
||||||
<!-- <field name="ele"> -->
|
<!-- <field name="ele">-->
|
||||||
<!-- <tag k="ele" /> -->
|
<!-- <tag k="ele" />-->
|
||||||
<!-- <value type="number" /> -->
|
<!-- <value type="number" />-->
|
||||||
<!-- </field> -->
|
<!-- </field>-->
|
||||||
<!-- Skipping FMD_TURN_LANES. -->
|
<!-- Skipping FMD_TURN_LANES. -->
|
||||||
<field name="email">
|
<field name="email">
|
||||||
<tag k="email" />
|
<tag k="email" />
|
||||||
@@ -135,9 +135,9 @@
|
|||||||
<tag k="addr:postcode" />
|
<tag k="addr:postcode" />
|
||||||
</field>
|
</field>
|
||||||
<!-- Uncomment this and other wiki fields when the code supports it. -->
|
<!-- Uncomment this and other wiki fields when the code supports it. -->
|
||||||
<!-- <field name="wikipedia" editable="no"> -->
|
<!-- <field name="wikipedia" editable="no">-->
|
||||||
<!-- <tag k="wikipedia" /> -->
|
<!-- <tag k="wikipedia" />-->
|
||||||
<!-- </field> -->
|
<!-- </field>-->
|
||||||
<!-- Skipping FMD_MAXSPEED. -->
|
<!-- Skipping FMD_MAXSPEED. -->
|
||||||
<field name="flats">
|
<field name="flats">
|
||||||
<tag k="addr:flats" />
|
<tag k="addr:flats" />
|
||||||
@@ -175,10 +175,10 @@
|
|||||||
</field>
|
</field>
|
||||||
<!-- Field groups. -->
|
<!-- Field groups. -->
|
||||||
<field_group name="charge_sockets">
|
<field_group name="charge_sockets">
|
||||||
<field_ref name="socket_type1_count" />
|
<field_ref name="socket_type1_count" />
|
||||||
<field_ref name="socket_type1_output" />
|
<field_ref name="socket_type1_output" />
|
||||||
<field_ref name="socket_type2_count" />
|
<field_ref name="socket_type2_count" />
|
||||||
<field_ref name="socket_type2_output" />
|
<field_ref name="socket_type2_output" />
|
||||||
</field_group>
|
</field_group>
|
||||||
<field_group name="address">
|
<field_group name="address">
|
||||||
<field_ref name="street" />
|
<field_ref name="street" />
|
||||||
@@ -236,11 +236,11 @@
|
|||||||
<types>
|
<types>
|
||||||
<type id="aeroway-aerodrome" editable="no">
|
<type id="aeroway-aerodrome" editable="no">
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
<!-- <include field="ele" /> -->
|
<!-- <include field="ele" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="aeroway-airport" editable="no">
|
<type id="aeroway-airport" editable="no">
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
<!-- <include field="ele" /> -->
|
<!-- <include field="ele" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-atm" group="banking" priority="low">
|
<type id="amenity-atm" group="banking" priority="low">
|
||||||
<include field="opening_hours" />
|
<include field="opening_hours" />
|
||||||
@@ -394,25 +394,32 @@
|
|||||||
<type id="amenity-pharmacy" group="shop">
|
<type id="amenity-pharmacy" group="shop">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-buddhist">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-buddhist" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-christian">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-christian" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-hindu">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-hindu" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-jewish">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-jewish" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-muslim">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-muslim" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-shinto">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-shinto" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship-taoist">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="amenity-place_of_worship-taoist" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-place_of_worship">
|
<type id="amenity-place_of_worship">
|
||||||
@@ -512,7 +519,7 @@
|
|||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-charging_station">
|
<type id="amenity-charging_station">
|
||||||
<include group="charge_sockets" />
|
<include group="charge_sockets" />
|
||||||
<include field="opening_hours" />
|
<include field="opening_hours" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
</type>
|
</type>
|
||||||
@@ -625,23 +632,23 @@
|
|||||||
</type>
|
</type>
|
||||||
<type id="historic-archaeological_site" group="historic">
|
<type id="historic-archaeological_site" group="historic">
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="historic-castle" group="historic">
|
<type id="historic-castle" group="historic">
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="historic-memorial" group="historic">
|
<type id="historic-memorial" group="historic">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="historic-monument" group="historic">
|
<type id="historic-monument" group="historic">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="historic-ruins" group="historic">
|
<type id="historic-ruins" group="historic">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="historic-aircraft" group="historic">
|
<type id="historic-aircraft" group="historic">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -689,7 +696,7 @@
|
|||||||
<!-- Not addable as mapping as a node is uncommon, also ambiguous with amenity-grave_yard -->
|
<!-- Not addable as mapping as a node is uncommon, also ambiguous with amenity-grave_yard -->
|
||||||
<type id="landuse-cemetery" can_add="no">
|
<type id="landuse-cemetery" can_add="no">
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<!-- Not addable as mapping as a node is uncommon -->
|
<!-- Not addable as mapping as a node is uncommon -->
|
||||||
<type id="leisure-garden" can_add="no">
|
<type id="leisure-garden" can_add="no">
|
||||||
@@ -698,9 +705,6 @@
|
|||||||
<type id="leisure-resort">
|
<type id="leisure-resort">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="leisure-sports_centre-sport-swimming">
|
|
||||||
<include group="poi_internet" />
|
|
||||||
</type>
|
|
||||||
<type id="leisure-sports_centre">
|
<type id="leisure-sports_centre">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
@@ -710,7 +714,7 @@
|
|||||||
<!-- Not addable as mapping as a node is uncommon -->
|
<!-- Not addable as mapping as a node is uncommon -->
|
||||||
<type id="leisure-stadium" can_add="no">
|
<type id="leisure-stadium" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<!-- Not addable as mapping as a node is uncommon -->
|
<!-- Not addable as mapping as a node is uncommon -->
|
||||||
<type id="leisure-swimming_pool" can_add="no">
|
<type id="leisure-swimming_pool" can_add="no">
|
||||||
@@ -719,7 +723,7 @@
|
|||||||
</type>
|
</type>
|
||||||
<type id="natural-cave_entrance" group="historic">
|
<type id="natural-cave_entrance" group="historic">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="natural-geyser">
|
<type id="natural-geyser">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -729,8 +733,8 @@
|
|||||||
</type>
|
</type>
|
||||||
<type id="natural-peak">
|
<type id="natural-peak">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
<!-- <include field="ele" /> -->
|
<!-- <include field="ele" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="natural-spring">
|
<type id="natural-spring">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -738,9 +742,10 @@
|
|||||||
<type id="waterway-waterfall">
|
<type id="waterway-waterfall">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<include field="height" />
|
<include field="height" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="office" group="office">
|
<!-- Too generic to be added -->
|
||||||
|
<type id="office" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="office-company" group="office">
|
<type id="office-company" group="office">
|
||||||
@@ -770,7 +775,7 @@
|
|||||||
<!-- Not addable because ambiguous with landuse=farmyard -->
|
<!-- Not addable because ambiguous with landuse=farmyard -->
|
||||||
<type id="place-farm" can_add="no">
|
<type id="place-farm" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
|
|
||||||
<!-- Do not allow to edit settlements.
|
<!-- Do not allow to edit settlements.
|
||||||
@@ -837,12 +842,6 @@
|
|||||||
<type id="shop-bathroom_furnishing" group="shop">
|
<type id="shop-bathroom_furnishing" group="shop">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="shop-beauty-nails">
|
|
||||||
<include group="poi_internet" />
|
|
||||||
</type>
|
|
||||||
<type id="shop-beauty-day_spa">
|
|
||||||
<include group="poi_internet" />
|
|
||||||
</type>
|
|
||||||
<type id="shop-beauty">
|
<type id="shop-beauty">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
@@ -1103,7 +1102,7 @@
|
|||||||
</type>
|
</type>
|
||||||
<type id="tourism-alpine_hut" group="accomodation">
|
<type id="tourism-alpine_hut" group="accomodation">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
<!-- <include field="ele" /> -->
|
<!-- <include field="ele" />-->
|
||||||
<include field="opening_hours" />
|
<include field="opening_hours" />
|
||||||
<include field="website" />
|
<include field="website" />
|
||||||
</type>
|
</type>
|
||||||
@@ -1113,22 +1112,12 @@
|
|||||||
<type id="tourism-aquarium">
|
<type id="tourism-aquarium">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-artwork-sculpture">
|
|
||||||
<include field="name" />
|
|
||||||
</type>
|
|
||||||
<type id="tourism-artwork-statue">
|
|
||||||
<include field="name" />
|
|
||||||
</type>
|
|
||||||
<type id="tourism-artwork-painting">
|
|
||||||
<include field="name" />
|
|
||||||
</type>
|
|
||||||
<type id="tourism-artwork">
|
<type id="tourism-artwork">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
<!-- Not addable because OSM category is too broad and due to vandalism problems -->
|
|
||||||
<type id="tourism-attraction" can_add="no">
|
<type id="tourism-attraction" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
<!-- <include field="wikipedia" /> -->
|
<!-- <include field="wikipedia" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="attraction-animal">
|
<type id="attraction-animal">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -1155,22 +1144,26 @@
|
|||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
<include field="self_service" />
|
<include field="self_service" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-information-office">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="tourism-information-office" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-information-visitor_centre">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="tourism-information-visitor_centre" can_add="no">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-information-board">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="tourism-information-board" can_add="no">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-information-map">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="tourism-information-map" can_add="no">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
<type id="tourism-information-guidepost">
|
<!-- Can not be added because it is a complex type -->
|
||||||
|
<type id="tourism-information-guidepost" can_add="no">
|
||||||
</type>
|
</type>
|
||||||
<!-- Too generic to add -->
|
<type id="tourism-information">
|
||||||
<type id="tourism-information" can_add="no">
|
|
||||||
<include group="poi" />
|
<include group="poi" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-ranger_station">
|
<type id="amenity-ranger_station">
|
||||||
@@ -1192,12 +1185,6 @@
|
|||||||
<type id="amenity-compressed_air" />
|
<type id="amenity-compressed_air" />
|
||||||
<type id="amenity-bbq" />
|
<type id="amenity-bbq" />
|
||||||
<type id="leisure-slipway" />
|
<type id="leisure-slipway" />
|
||||||
<type id="amenity-shelter-basic_hut">
|
|
||||||
<include field="name" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-shelter-lean_to">
|
|
||||||
<include field="name" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-shelter">
|
<type id="amenity-shelter">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
@@ -1395,9 +1382,6 @@
|
|||||||
<type id="leisure-indoor_play">
|
<type id="leisure-indoor_play">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="leisure-fitness_centre-sport-yoga">
|
|
||||||
<include group="poi_internet" />
|
|
||||||
</type>
|
|
||||||
<type id="leisure-fitness_centre">
|
<type id="leisure-fitness_centre">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
@@ -1422,7 +1406,7 @@
|
|||||||
<type id="man_made-petroleum_well">
|
<type id="man_made-petroleum_well">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<!-- <include field="ele" /> -->
|
<!-- <include field="ele" />-->
|
||||||
</type>
|
</type>
|
||||||
<type id="man_made-water_well">
|
<type id="man_made-water_well">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -1449,14 +1433,10 @@
|
|||||||
<type id="man_made-lighthouse">
|
<type id="man_made-lighthouse">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
<type id="man_made-mast-communication" />
|
|
||||||
<type id="man_made-mast" />
|
<type id="man_made-mast" />
|
||||||
<type id="man_made-survey_point">
|
<type id="man_made-survey_point">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
<type id="power-generator-wind">
|
|
||||||
<include field="operator" />
|
|
||||||
</type>
|
|
||||||
<type id="man_made-windmill">
|
<type id="man_made-windmill">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
</type>
|
</type>
|
||||||
@@ -1529,50 +1509,67 @@
|
|||||||
<type id="leisure-escape_game">
|
<type id="leisure-escape_game">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-parking_tickets">
|
<!-- Uncomment this after our editor core supports complex types
|
||||||
<include field="operator" />
|
|
||||||
<include field="level" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-vending_machine-public_transport_tickets">
|
|
||||||
<include field="operator" />
|
|
||||||
<include field="level" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-vending_machine-cigarettes">
|
<type id="amenity-vending_machine-cigarettes">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="cigarettes" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-vending_machine-drinks">
|
|
||||||
<include field="operator" />
|
|
||||||
<include field="level" />
|
|
||||||
</type>
|
|
||||||
<type id="amenity-vending_machine-excrement_bags">
|
|
||||||
<include field="operator" />
|
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-coffee">
|
<type id="amenity-vending_machine-coffee">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="coffee" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-condoms">
|
<type id="amenity-vending_machine-condoms">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="condoms" />
|
||||||
|
<include field="operator" />
|
||||||
|
</type>
|
||||||
|
<type id="amenity-vending_machine-drinks">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="drinks" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-food">
|
<type id="amenity-vending_machine-food">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="food" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-newspapers">
|
<type id="amenity-vending_machine-newspapers">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="newspapers" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine-sweets">
|
<type id="amenity-vending_machine-sweets">
|
||||||
|
<tag k="amenity" v="vending_machine" />
|
||||||
|
<tag k="vending" v="sweets" />
|
||||||
<include field="operator" />
|
<include field="operator" />
|
||||||
<include field="level" />
|
|
||||||
</type>
|
</type>
|
||||||
<type id="amenity-vending_machine">
|
<type id="shop-car_repair-tyres">
|
||||||
<include field="operator" />
|
<tag k="shop" v="car_repair" />
|
||||||
<include field="level" />
|
<tag k="service" v="tyres" />
|
||||||
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
|
<type id="leisure-sports_centre-climbing">
|
||||||
|
<tag k="leisure" v="sports_centre" />
|
||||||
|
<tag k="sport" v="climbing" />
|
||||||
|
<include group="poi_internet" />
|
||||||
|
</type>
|
||||||
|
<type id="leisure-sports_centre-shooting">
|
||||||
|
<tag k="leisure" v="sports_centre" />
|
||||||
|
<tag k="sport" v="shooting" />
|
||||||
|
<include group="poi_internet" />
|
||||||
|
</type>
|
||||||
|
<type id="leisure-sports_centre-swimming">
|
||||||
|
<tag k="leisure" v="sports_centre" />
|
||||||
|
<tag k="sport" v="swimming" />
|
||||||
|
<include group="poi_internet" />
|
||||||
|
</type>
|
||||||
|
<type id="leisure-sports_centre-yoga">
|
||||||
|
<tag k="leisure" v="sports_centre" />
|
||||||
|
<tag k="sport" v="yoga" />
|
||||||
|
<include group="poi_internet" />
|
||||||
|
</type-->
|
||||||
<!-- Not addable as mapping as a node is uncommon -->
|
<!-- Not addable as mapping as a node is uncommon -->
|
||||||
<type id="natural-beach" can_add="no">
|
<type id="natural-beach" can_add="no">
|
||||||
<include field="name" />
|
<include field="name" />
|
||||||
@@ -1584,6 +1581,9 @@
|
|||||||
<type id="building-address" can_add="yes">
|
<type id="building-address" can_add="yes">
|
||||||
<include group="address" />
|
<include group="address" />
|
||||||
</type>
|
</type>
|
||||||
|
<!-- Uncomment this after a map style is added
|
||||||
|
<type id="man_made-surveillance">
|
||||||
|
</type-->
|
||||||
<type id="tourism-theme_park">
|
<type id="tourism-theme_park">
|
||||||
<include group="poi_internet" />
|
<include group="poi_internet" />
|
||||||
</type>
|
</type>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# highway|bus_stop;[highway=bus_stop];;name;int_name;22;
|
# highway|bus_stop;[highway=bus_stop];;name;int_name;22;
|
||||||
# It contains:
|
# It contains:
|
||||||
# - type name: "highway|bus_stop" ("|" is converted to "-" internally)
|
# - type name: "highway|bus_stop" ("|" is converted to "-" internally)
|
||||||
# - mapcss selectors for tags: "[highway=bus_stop]", multiple selectors are separated with commas, best practice tagging for OSM editor is listed first
|
# - mapcss selectors for tags: "[highway=bus_stop]", multiple selectors are separated with commas
|
||||||
# - "x" for a deprecated type or an empty cell otherwise
|
# - "x" for a deprecated type or an empty cell otherwise
|
||||||
# - primary title tag (usually "name")
|
# - primary title tag (usually "name")
|
||||||
# - secondary title tag (usually "int_name")
|
# - secondary title tag (usually "int_name")
|
||||||
@@ -101,7 +101,7 @@ natural|wetland;33;
|
|||||||
deprecated:highway|track|grade3:04.4024;[highway=track][tracktype=grade3];x;name;int_name;34;highway|track
|
deprecated:highway|track|grade3:04.4024;[highway=track][tracktype=grade3];x;name;int_name;34;highway|track
|
||||||
# ~1M usages.
|
# ~1M usages.
|
||||||
power|minor_line;[power=minor_line][!location];;;;35;
|
power|minor_line;[power=minor_line][!location];;;;35;
|
||||||
amenity|school;[amenity=school][education=school],[amenity=school],[education=school];;;;36;
|
amenity|school;[amenity=school],[education=school];;name;int_name;36;
|
||||||
# Dedicated/segregated cycleways (e.g. segregated paths are converted into cycleways + footways, see osm2type.cpp).
|
# Dedicated/segregated cycleways (e.g. segregated paths are converted into cycleways + footways, see osm2type.cpp).
|
||||||
highway|cycleway;37;
|
highway|cycleway;37;
|
||||||
# ~16M usages.
|
# ~16M usages.
|
||||||
@@ -202,7 +202,7 @@ landuse|commercial;111;
|
|||||||
moved:railway|station:05.2024;112;railway|station
|
moved:railway|station:05.2024;112;railway|station
|
||||||
deprecated:highway|path|hiking:04.2024;[highway=path][route=hiking],[highway=path][sac_scale=hiking];x;name;int_name;113;highway|path
|
deprecated:highway|path|hiking:04.2024;[highway=path][route=hiking],[highway=path][sac_scale=hiking];x;name;int_name;113;highway|path
|
||||||
# ~200k usages.
|
# ~200k usages.
|
||||||
amenity|hospital;[amenity=hospital][healthcare=hospital],[amenity=hospital],[healthcare=hospital];;;;114;
|
amenity|hospital;114;
|
||||||
# TODO: merge with "intermittent".
|
# TODO: merge with "intermittent".
|
||||||
waterway|stream|ephemeral;[waterway=stream][intermittent=ephemeral];;name;int_name;115;
|
waterway|stream|ephemeral;[waterway=stream][intermittent=ephemeral];;name;int_name;115;
|
||||||
highway|trunk|bridge;[highway=trunk][bridge?];;name;int_name;116;
|
highway|trunk|bridge;[highway=trunk][bridge?];;name;int_name;116;
|
||||||
@@ -210,7 +210,7 @@ highway|trunk|bridge;[highway=trunk][bridge?];;name;int_name;116;
|
|||||||
amenity|post_office;117;
|
amenity|post_office;117;
|
||||||
# ~230k usages.
|
# ~230k usages.
|
||||||
landuse|quarry;118;
|
landuse|quarry;118;
|
||||||
amenity|pharmacy;[amenity=pharmacy][healthcare=pharmacy],[amenity=pharmacy],[healthcare=pharmacy];;;;119;
|
amenity|pharmacy;119;
|
||||||
man_made|pier;120;
|
man_made|pier;120;
|
||||||
# ~220k usages.
|
# ~220k usages.
|
||||||
highway|motorway_junction;121;
|
highway|motorway_junction;121;
|
||||||
@@ -276,7 +276,7 @@ deprecated:natural|wood|coniferous:01.2020;[natural=wood][wood=coniferous],[natu
|
|||||||
landuse|recreation_ground;173;
|
landuse|recreation_ground;173;
|
||||||
landuse|village_green;174;
|
landuse|village_green;174;
|
||||||
amenity|drinking_water;175;
|
amenity|drinking_water;175;
|
||||||
amenity|university;[amenity=university][education=university],[amenity=university],[education=university];;;;176;
|
amenity|university;[amenity=university],[education=university];;name;int_name;176;
|
||||||
highway|secondary_link;177;
|
highway|secondary_link;177;
|
||||||
power|substation;178;
|
power|substation;178;
|
||||||
railway|tram_stop;179;
|
railway|tram_stop;179;
|
||||||
@@ -309,7 +309,7 @@ power|portal;204;
|
|||||||
# Marsh 500K usages, wet_meadow 160K
|
# Marsh 500K usages, wet_meadow 160K
|
||||||
natural|wetland|marsh;[natural=wetland][wetland=marsh],[natural=wetland][wetland=wet_meadow],[natural=wetland][wetland=dambo];;;;205;
|
natural|wetland|marsh;[natural=wetland][wetland=marsh],[natural=wetland][wetland=wet_meadow],[natural=wetland][wetland=dambo];;;;205;
|
||||||
leisure|stadium;206;
|
leisure|stadium;206;
|
||||||
amenity|doctors;[amenity=doctors][healthcare=doctor],[amenity=doctors],[healthcare=doctor];;;;207;
|
amenity|doctors;207;
|
||||||
railway|disused;208;
|
railway|disused;208;
|
||||||
aeroway|runway;209;
|
aeroway|runway;209;
|
||||||
railway|halt;210;
|
railway|halt;210;
|
||||||
@@ -327,7 +327,7 @@ sport|swimming;220;
|
|||||||
leisure|track;221;
|
leisure|track;221;
|
||||||
sport|skateboard;222;
|
sport|skateboard;222;
|
||||||
barrier|retaining_wall;223;
|
barrier|retaining_wall;223;
|
||||||
amenity|college;[amenity=college][education=college],[amenity=college],[education=college];;;;224;
|
amenity|college;[amenity=college],[education=college];;name;int_name;224;
|
||||||
sport|baseball;225;
|
sport|baseball;225;
|
||||||
highway|service|area;[highway=service][area?];;name;int_name;226;
|
highway|service|area;[highway=service][area?];;name;int_name;226;
|
||||||
highway|residential|area;[highway=residential][area?];;name;int_name;227;
|
highway|residential|area;[highway=residential][area?];;name;int_name;227;
|
||||||
@@ -625,9 +625,9 @@ toilets|yes;502;
|
|||||||
highway|trunk_link|tunnel;[highway=trunk_link][tunnel?];;name;int_name;503;
|
highway|trunk_link|tunnel;[highway=trunk_link][tunnel?];;name;int_name;503;
|
||||||
drinking_water|yes;[drinking_water=yes],[drinking_water=treated],[drinking_water:refill=yes];;;;504;
|
drinking_water|yes;[drinking_water=yes],[drinking_water=treated],[drinking_water:refill=yes];;;;504;
|
||||||
drinking_water|no;505;
|
drinking_water|no;505;
|
||||||
amenity|sailing_school;[amenity=sailing_school][education=sailing_school],[amenity=sailing_school],[education=sailing_school];;;;506;
|
amenity|sailing_school;[amenity=sailing_school],[education=sailing_school];;name;int_name;506;
|
||||||
amenity|flight_school;[amenity=flight_school][education=flight_school],[amenity=flight_school],[education=flight_school];;;;507;
|
amenity|flight_school;[amenity=sailing_school],[education=flight_school];;name;int_name;507;
|
||||||
amenity|prep_school;[amenity=prep_school][education=prep_school],[amenity=prep_school],[education=prep_school];;;;508;
|
amenity|prep_school;[amenity=prep_school],[education=prep_school];;name;int_name;508;
|
||||||
amenity|car_pooling;509;
|
amenity|car_pooling;509;
|
||||||
social_facility|soup_kitchen;510;
|
social_facility|soup_kitchen;510;
|
||||||
social_facility|food_bank;511;
|
social_facility|food_bank;511;
|
||||||
@@ -1160,8 +1160,8 @@ railway|subway_entrance|madrid;[railway=subway_entrance][city=madrid];;name;int_
|
|||||||
railway|subway_entrance|roma;[railway=subway_entrance][city=roma];;name;int_name;1033;
|
railway|subway_entrance|roma;[railway=subway_entrance][city=roma];;name;int_name;1033;
|
||||||
railway|subway_entrance|spb;[railway=subway_entrance][city=spb];;name;int_name;1034;
|
railway|subway_entrance|spb;[railway=subway_entrance][city=spb];;name;int_name;1034;
|
||||||
aerialway|drag_lift;1035;
|
aerialway|drag_lift;1035;
|
||||||
amenity|dentist;[amenity=dentist][healthcare=dentist],[amenity=dentist],[healthcare=dentist];;;;1036;
|
amenity|dentist;1036;
|
||||||
amenity|clinic;[amenity=clinic][healthcare=clinic],[amenity=clinic],[healthcare=clinic];;;;1037;
|
amenity|clinic;1037;
|
||||||
barrier|entrance;1038;
|
barrier|entrance;1038;
|
||||||
barrier|border_control;1039;
|
barrier|border_control;1039;
|
||||||
shop|laundry;1040;
|
shop|laundry;1040;
|
||||||
@@ -1257,8 +1257,8 @@ amenity|vending_machine|food;[amenity=vending_machine][vending=food];;name;int_n
|
|||||||
amenity|vending_machine|newspapers;[amenity=vending_machine][vending=newspapers];;name;int_name;1130;
|
amenity|vending_machine|newspapers;[amenity=vending_machine][vending=newspapers];;name;int_name;1130;
|
||||||
amenity|vending_machine|sweets;[amenity=vending_machine][vending=sweets];;name;int_name;1131;
|
amenity|vending_machine|sweets;[amenity=vending_machine][vending=sweets];;name;int_name;1131;
|
||||||
leisure|dance;[leisure=dance],[amenity=dancing_school];;;;1132;
|
leisure|dance;[leisure=dance],[amenity=dancing_school];;;;1132;
|
||||||
amenity|music_school;[amenity=music_school][education=music_school],[amenity=music_school],[education=music_school];;;;1133;
|
amenity|music_school;[amenity=music_school],[education=music_school];;name;int_name;1133;
|
||||||
amenity|language_school;[amenity=language_school][education=language_school],[amenity=language_school],[education=language_school];;;;1134;
|
amenity|language_school;[amenity=language_school],[education=language_school];;name;int_name;1134;
|
||||||
historic|city_gate;1135;
|
historic|city_gate;1135;
|
||||||
sport|padel;1136;
|
sport|padel;1136;
|
||||||
sport|futsal;1137;
|
sport|futsal;1137;
|
||||||
@@ -1285,7 +1285,7 @@ shop|charity;1157;
|
|||||||
hwtag|toll;1158;
|
hwtag|toll;1158;
|
||||||
amenity|arts_centre;1159;
|
amenity|arts_centre;1159;
|
||||||
amenity|biergarten;1160;
|
amenity|biergarten;1160;
|
||||||
amenity|driving_school;[amenity=driving_school][education=driving_school],[amenity=driving_school],[education=driving_school];;;;1161;
|
amenity|driving_school;[amenity=driving_school],[education=driving_school];;name;int_name;1161;
|
||||||
amenity|food_court;1162;
|
amenity|food_court;1162;
|
||||||
amenity|ice_cream;1163;
|
amenity|ice_cream;1163;
|
||||||
amenity|internet_cafe;1164;
|
amenity|internet_cafe;1164;
|
||||||
|
|||||||
|
Can't render this file because it contains an unexpected character in line 7 and column 16.
|
@@ -1,108 +0,0 @@
|
|||||||
{
|
|
||||||
"make_a_slight_right_turn":"லேசாக வலதுபுறம் திரும்புங்கள்.",
|
|
||||||
"make_a_slight_right_turn_street":"NULL",
|
|
||||||
"make_a_slight_right_turn_street_verb":"NULL",
|
|
||||||
"make_a_right_turn":"வலதுபுறமாக திரும்புங்கள்.",
|
|
||||||
"make_a_right_turn_street":"NULL",
|
|
||||||
"make_a_sharp_right_turn":"கூர்மையாக வலதுபுறம் திரும்புங்கள்.",
|
|
||||||
"make_a_sharp_right_turn_street":"NULL",
|
|
||||||
"enter_the_roundabout":"ரவுண்டபௌட்டை நுழையுங்கள்.",
|
|
||||||
"enter_the_roundabout_street":"NULL",
|
|
||||||
"enter_the_roundabout_street_verb":"NULL",
|
|
||||||
"leave_the_roundabout":"ரவுண்டபௌட்டை வெளியேறுங்கள்.",
|
|
||||||
"leave_the_roundabout_street":"NULL",
|
|
||||||
"leave_the_roundabout_street_verb":"NULL",
|
|
||||||
"make_a_slight_left_turn":"லேசாக இடதுபுறம் திரும்புங்கள்.",
|
|
||||||
"make_a_slight_left_turn_street":"NULL",
|
|
||||||
"make_a_slight_left_turn_street_verb":"NULL",
|
|
||||||
"make_a_left_turn":"இடதுபுறமாக திரும்புங்கள்.",
|
|
||||||
"make_a_left_turn_street":"NULL",
|
|
||||||
"make_a_sharp_left_turn":"கூர்மையாக இடதுபுறம் திரும்புங்கள்.",
|
|
||||||
"make_a_sharp_left_turn_street":"NULL",
|
|
||||||
"make_a_u_turn":"U-வழியில் திரும்புங்கள்.",
|
|
||||||
"make_a_u_turn_street":"NULL",
|
|
||||||
"make_a_u_turn_street_verb":"NULL",
|
|
||||||
"go_straight":"நேரா போங்க.",
|
|
||||||
"exit":"வெளியேறுங்கள்.",
|
|
||||||
"onto":"நோக்கி",
|
|
||||||
"take_exit_number":"வெளியேறும் வழி எடுங்கள்",
|
|
||||||
"take_exit_number_street_verb":"NULL",
|
|
||||||
"route_recalculating":"வழி மறுபடி கணிக்கிறது",
|
|
||||||
"destination":"நீங்கள் வருவீர்கள்.",
|
|
||||||
"you_have_reached_the_destination":"நீங்கள் வந்துவிட்டீர்கள்..",
|
|
||||||
"in_50_meters":"ஐம்பது மீட்டரில்",
|
|
||||||
"in_100_meters":"நூறு மீட்டரில்",
|
|
||||||
"in_200_meters":"இருநூறு மீட்டரில்",
|
|
||||||
"in_250_meters":"இருநூற்று ஐம்பது மீட்டரில்",
|
|
||||||
"in_300_meters":"முன்னூறு மீட்டரில்",
|
|
||||||
"in_400_meters":"நானூறு மீட்டரில்",
|
|
||||||
"in_500_meters":"ஐநூறு மீட்டரில்",
|
|
||||||
"in_600_meters":"அறுநூறு மீட்டரில்",
|
|
||||||
"in_700_meters":"எழுநூறு மீட்டரில்",
|
|
||||||
"in_750_meters":"எழுநூறு ஐம்பது மீட்டரில்",
|
|
||||||
"in_800_meters":"எண்ணூறு மீட்டரில்",
|
|
||||||
"in_900_meters":"தொள்ளாயிரம் மீட்டரில்",
|
|
||||||
"in_1_kilometer":"ஒரு கிலோமீட்டரில்",
|
|
||||||
"in_1_5_kilometers":"ஒன்றரை கிலோமீட்டரில்",
|
|
||||||
"in_2_kilometers":"இரண்டு கிலோமீட்டரில்",
|
|
||||||
"in_2_5_kilometers":"இரண்டரை கிலோமீட்டரில்",
|
|
||||||
"in_3_kilometers":"மூன்று கிலோமீட்டரில்",
|
|
||||||
"then":"அடுத்தது",
|
|
||||||
"dist_direction_onto_street":"%1$s %4$s %3$s %5$s %2$s",
|
|
||||||
"take_the_1_exit":"ஒன்றாம் வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_1_exit_street":"NULL",
|
|
||||||
"take_the_1_exit_street_verb":"NULL",
|
|
||||||
"take_the_2_exit":"இரண்டாம் வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_2_exit_street":"NULL",
|
|
||||||
"take_the_2_exit_street_verb":"NULL",
|
|
||||||
"take_the_3_exit":"மூன்றாம் வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_3_exit_street":"NULL",
|
|
||||||
"take_the_3_exit_street_verb":"NULL",
|
|
||||||
"take_the_4_exit":"நான்காவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_4_exit_street":"NULL",
|
|
||||||
"take_the_4_exit_street_verb":"NULL",
|
|
||||||
"take_the_5_exit":"ஐந்தாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_5_exit_street":"NULL",
|
|
||||||
"take_the_5_exit_street_verb":"NULL",
|
|
||||||
"take_the_6_exit":"ஆறாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_6_exit_street":"NULL",
|
|
||||||
"take_the_6_exit_street_verb":"NULL",
|
|
||||||
"take_the_7_exit":"ஏழாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_7_exit_street":"NULL",
|
|
||||||
"take_the_7_exit_street_verb":"NULL",
|
|
||||||
"take_the_8_exit":"எட்டாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_8_exit_street":"NULL",
|
|
||||||
"take_the_8_exit_street_verb":"NULL",
|
|
||||||
"take_the_9_exit":"ஒன்பதாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_9_exit_street":"NULL",
|
|
||||||
"take_the_9_exit_street_verb":"NULL",
|
|
||||||
"take_the_10_exit":"பத்தாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_10_exit_street":"NULL",
|
|
||||||
"take_the_10_exit_street_verb":"NULL",
|
|
||||||
"take_the_11_exit":"பதினொன்றாவது வெளியேறும் வழி எடுங்கள்.",
|
|
||||||
"take_the_11_exit_street":"NULL",
|
|
||||||
"take_the_11_exit_street_verb":"NULL",
|
|
||||||
"in_50_feet":"ஐம்பது அடியில்",
|
|
||||||
"in_100_feet":"நூறு அடியில்",
|
|
||||||
"in_200_feet":"இருநூறு அடியில்",
|
|
||||||
"in_300_feet":"முன்னூறு அடியில்",
|
|
||||||
"in_400_feet":"நானூறு அடியில்",
|
|
||||||
"in_500_feet":"ஐநூறு அடியில்",
|
|
||||||
"in_600_feet":"அறுநூறு அடியில்",
|
|
||||||
"in_700_feet":"எழுநூறு அடியில்",
|
|
||||||
"in_800_feet":"எண்ணூறு அடியில்",
|
|
||||||
"in_900_feet":"தொள்ளாயிரம் அடியில்",
|
|
||||||
"in_1000_feet":"ஆயிரம் அடியில்",
|
|
||||||
"in_1500_feet":"ஆயிரம் ஐநூறு அடியில்",
|
|
||||||
"in_2000_feet":"இரண்டு ஆயிரம் அடியில்",
|
|
||||||
"in_2500_feet":"இரண்டு ஆயிரம் ஐநூறு அடியில்",
|
|
||||||
"in_3000_feet":"மூன்று ஆயிரம் அடியில்",
|
|
||||||
"in_3500_feet":"மூன்று ஆயிரம் ஐநூறு அடியில்",
|
|
||||||
"in_4000_feet":"நான்கு ஆயிரம் அடியில்",
|
|
||||||
"in_4500_feet":"நான்கு ஆயிரம் ஐநூறு அடியில்",
|
|
||||||
"in_5000_feet":"ஐந்து ஆயிரம் அடியில்",
|
|
||||||
"in_1_mile":"ஒன்று மைலில்",
|
|
||||||
"in_1_5_miles":"ஒன்றரை மைலில்",
|
|
||||||
"in_2_miles":"இரண்டு மைலில்",
|
|
||||||
"unknown_camera":"கேமரா முன்னால் இருக்கிறது"
|
|
||||||
}
|
|
||||||
@@ -2455,9 +2455,9 @@ node|z17-[amenity=parking],
|
|||||||
{icon-image: parking-m.svg;font-size: 11;icon-min-distance: 10}
|
{icon-image: parking-m.svg;font-size: 11;icon-min-distance: 10}
|
||||||
|
|
||||||
node|z16-[amenity=car_pooling],
|
node|z16-[amenity=car_pooling],
|
||||||
{icon-image: parking_pooling-s.svg;icon-min-distance: 5;}
|
{icon-image: parking-pooling-s.svg;icon-min-distance: 5;}
|
||||||
node|z17-[amenity=car_pooling],
|
node|z17-[amenity=car_pooling],
|
||||||
{icon-image: parking_pooling-m.svg;font-size: 11;icon-min-distance: 10}
|
{icon-image: parking-pooling-m.svg;font-size: 11;icon-min-distance: 10}
|
||||||
|
|
||||||
node|z16-[amenity=parking][location=underground],
|
node|z16-[amenity=parking][location=underground],
|
||||||
{icon-image:parking_underground-m.svg;}
|
{icon-image:parking_underground-m.svg;}
|
||||||
|
|||||||
@@ -734,7 +734,7 @@ node|z18-[amenity=water_point][drinking_water=not],
|
|||||||
node|z15-[amenity=parking],
|
node|z15-[amenity=parking],
|
||||||
{icon-image: parking-m.svg;icon-min-distance: 10;font-size: 12.5;}
|
{icon-image: parking-m.svg;icon-min-distance: 10;font-size: 12.5;}
|
||||||
node|z15-[amenity=car_pooling],
|
node|z15-[amenity=car_pooling],
|
||||||
{icon-image: parking_pooling-m.svg;icon-min-distance: 10;font-size: 12.5;}
|
{icon-image: parking-pooling-m.svg;icon-min-distance: 10;font-size: 12.5;}
|
||||||
node|z17[amenity=parking],
|
node|z17[amenity=parking],
|
||||||
node|z17[amenity=car_pooling],
|
node|z17[amenity=car_pooling],
|
||||||
{icon-min-distance: 15;font-size: 13.75;}
|
{icon-min-distance: 15;font-size: 13.75;}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"data_format": 1,
|
"data_format": 1,
|
||||||
"data_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/taginfo.json",
|
"data_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/taginfo.json",
|
||||||
"data_updated": "20251228T203737Z",
|
"data_updated": "20251120T121118Z",
|
||||||
"project": {
|
"project": {
|
||||||
"name": "CoMaps",
|
"name": "CoMaps",
|
||||||
"description": "CoMaps is a community-focused privacy navigation iOS & Android app for travelers - drivers, hikers, and cyclists.",
|
"description": "CoMaps is a community-focused privacy navigation iOS & Android app for travelers - drivers, hikers, and cyclists.",
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
"description": "amenity=car_pooling",
|
"description": "amenity=car_pooling",
|
||||||
"key": "amenity",
|
"key": "amenity",
|
||||||
"value": "car_pooling",
|
"value": "car_pooling",
|
||||||
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/parking_pooling-m.svg"
|
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/parking-pooling-m.svg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "amenity=car_rental",
|
"description": "amenity=car_rental",
|
||||||
@@ -431,12 +431,6 @@
|
|||||||
"value": "hunting_stand",
|
"value": "hunting_stand",
|
||||||
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/hunting-tower-m.svg"
|
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/hunting-tower-m.svg"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"description": "amenity=hydrant",
|
|
||||||
"key": "amenity",
|
|
||||||
"value": "hydrant",
|
|
||||||
"icon_url": "https://codeberg.org/comaps/comaps/raw/branch/main/data/styles/default/light/symbols/hydrant-m.svg"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"description": "amenity=ice_cream",
|
"description": "amenity=ice_cream",
|
||||||
"key": "amenity",
|
"key": "amenity",
|
||||||
|
|||||||
@@ -68,10 +68,6 @@ and apply the [Ubuntu workarounds accordingly](#workarounds-for-older-ubuntu-ver
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo dnf install -y \
|
sudo dnf install -y \
|
||||||
awk \
|
|
||||||
wget \
|
|
||||||
optipng \
|
|
||||||
git \
|
|
||||||
clang \
|
clang \
|
||||||
cmake \
|
cmake \
|
||||||
ninja-build \
|
ninja-build \
|
||||||
@@ -84,13 +80,8 @@ sudo dnf install -y \
|
|||||||
qt6-qtpositioning \
|
qt6-qtpositioning \
|
||||||
qt6-qtpositioning-devel \
|
qt6-qtpositioning-devel \
|
||||||
qt6-qtsvg-devel \
|
qt6-qtsvg-devel \
|
||||||
python3-pip \
|
python3-protobuf \
|
||||||
sqlite-devel \
|
sqlite-devel
|
||||||
libXrandr-devel \
|
|
||||||
libXinerama-devel \
|
|
||||||
libXcursor-devel \
|
|
||||||
libXi-devel
|
|
||||||
pip3 install "protobuf<3.21" --break-system-packages
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Alpine
|
#### Alpine
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ final class CarPlayService: NSObject {
|
|||||||
MapTemplateBuilder.configureBaseUI(mapTemplate: mapTemplate)
|
MapTemplateBuilder.configureBaseUI(mapTemplate: mapTemplate)
|
||||||
if currentPositionMode == .pendingPosition {
|
if currentPositionMode == .pendingPosition {
|
||||||
mapTemplate.leadingNavigationBarButtons = []
|
mapTemplate.leadingNavigationBarButtons = []
|
||||||
} else if currentPositionMode == .follow || currentPositionMode == .followAndRotateCompass || currentPositionMode == .followAndRotateRoute {
|
} else if currentPositionMode == .follow || currentPositionMode == .followAndRotate {
|
||||||
MapTemplateBuilder.setupDestinationButton(mapTemplate: mapTemplate)
|
MapTemplateBuilder.setupDestinationButton(mapTemplate: mapTemplate)
|
||||||
} else {
|
} else {
|
||||||
MapTemplateBuilder.setupRecenterButton(mapTemplate: mapTemplate)
|
MapTemplateBuilder.setupRecenterButton(mapTemplate: mapTemplate)
|
||||||
@@ -623,32 +623,22 @@ extension CarPlayService: CarPlayRouterListener {
|
|||||||
extension CarPlayService: LocationModeListener {
|
extension CarPlayService: LocationModeListener {
|
||||||
func processMyPositionStateModeEvent(_ mode: MWMMyPositionMode) {
|
func processMyPositionStateModeEvent(_ mode: MWMMyPositionMode) {
|
||||||
currentPositionMode = mode
|
currentPositionMode = mode
|
||||||
|
guard let rootMapTemplate = rootMapTemplate,
|
||||||
// make sure we have a rootMapTemplate
|
let info = rootMapTemplate.userInfo as? MapInfo,
|
||||||
guard let rootMapTemplate = rootMapTemplate else {
|
info.type == CPConstants.TemplateType.main else {
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// exit if we're navigating
|
|
||||||
guard let info = rootMapTemplate.userInfo as? MapInfo,
|
|
||||||
info.type == CPConstants.TemplateType.main else {
|
|
||||||
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch mode {
|
switch mode {
|
||||||
case .follow, .followAndRotateCompass, .followAndRotateRoute:
|
case .follow, .followAndRotate:
|
||||||
if !rootMapTemplate.isPanningInterfaceVisible {
|
if !rootMapTemplate.isPanningInterfaceVisible {
|
||||||
MapTemplateBuilder.setupDestinationButton(mapTemplate: rootMapTemplate)
|
MapTemplateBuilder.setupDestinationButton(mapTemplate: rootMapTemplate)
|
||||||
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
|
|
||||||
}
|
}
|
||||||
case .notFollow:
|
case .notFollow:
|
||||||
if !rootMapTemplate.isPanningInterfaceVisible {
|
if !rootMapTemplate.isPanningInterfaceVisible {
|
||||||
MapTemplateBuilder.setupRecenterButton(mapTemplate: rootMapTemplate)
|
MapTemplateBuilder.setupRecenterButton(mapTemplate: rootMapTemplate)
|
||||||
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
|
|
||||||
}
|
}
|
||||||
case .pendingPosition, .notFollowNoPosition:
|
case .pendingPosition, .notFollowNoPosition:
|
||||||
rootMapTemplate.leadingNavigationBarButtons = []
|
rootMapTemplate.leadingNavigationBarButtons = []
|
||||||
MapTemplateBuilder.updateMyPositionModeButton(mapTemplate: rootMapTemplate, newMode: mode)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ final class MapTemplateBuilder {
|
|||||||
case startPanning
|
case startPanning
|
||||||
case zoomIn
|
case zoomIn
|
||||||
case zoomOut
|
case zoomOut
|
||||||
case myPositionMode
|
|
||||||
}
|
}
|
||||||
enum BarButtonType {
|
enum BarButtonType {
|
||||||
case dismissPaning
|
case dismissPaning
|
||||||
@@ -29,7 +28,7 @@ final class MapTemplateBuilder {
|
|||||||
configureBaseUI(mapTemplate: mapTemplate)
|
configureBaseUI(mapTemplate: mapTemplate)
|
||||||
if positionMode == .pendingPosition {
|
if positionMode == .pendingPosition {
|
||||||
mapTemplate.leadingNavigationBarButtons = []
|
mapTemplate.leadingNavigationBarButtons = []
|
||||||
} else if positionMode == .follow || positionMode == .followAndRotateCompass || positionMode == .followAndRotateRoute {
|
} else if positionMode == .follow || positionMode == .followAndRotate {
|
||||||
setupDestinationButton(mapTemplate: mapTemplate)
|
setupDestinationButton(mapTemplate: mapTemplate)
|
||||||
} else {
|
} else {
|
||||||
setupRecenterButton(mapTemplate: mapTemplate)
|
setupRecenterButton(mapTemplate: mapTemplate)
|
||||||
@@ -70,10 +69,7 @@ final class MapTemplateBuilder {
|
|||||||
let zoomOutButton = buildMapButton(type: .zoomOut) { _ in
|
let zoomOutButton = buildMapButton(type: .zoomOut) { _ in
|
||||||
FrameworkHelper.zoomMap(.out)
|
FrameworkHelper.zoomMap(.out)
|
||||||
}
|
}
|
||||||
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
|
mapTemplate.mapButtons = [panningButton, zoomInButton, zoomOutButton]
|
||||||
FrameworkHelper.switchMyPositionMode()
|
|
||||||
}
|
|
||||||
mapTemplate.mapButtons = [myPositionModeButton, panningButton, zoomInButton, zoomOutButton]
|
|
||||||
|
|
||||||
let settingsButton = buildBarButton(type: .settings) { _ in
|
let settingsButton = buildBarButton(type: .settings) { _ in
|
||||||
let gridTemplate = SettingsTemplateBuilder.buildGridTemplate()
|
let gridTemplate = SettingsTemplateBuilder.buildGridTemplate()
|
||||||
@@ -103,10 +99,7 @@ final class MapTemplateBuilder {
|
|||||||
let panningButton = buildMapButton(type: .startPanning) { _ in
|
let panningButton = buildMapButton(type: .startPanning) { _ in
|
||||||
mapTemplate.showPanningInterface(animated: true)
|
mapTemplate.showPanningInterface(animated: true)
|
||||||
}
|
}
|
||||||
let myPositionModeButton = buildMapButton(type: .myPositionMode) { _ in
|
mapTemplate.mapButtons = [panningButton]
|
||||||
FrameworkHelper.switchMyPositionMode()
|
|
||||||
}
|
|
||||||
mapTemplate.mapButtons = [myPositionModeButton, panningButton]
|
|
||||||
setupMuteAndRedirectButtons(template: mapTemplate)
|
setupMuteAndRedirectButtons(template: mapTemplate)
|
||||||
let endButton = buildBarButton(type: .endRoute) { _ in
|
let endButton = buildBarButton(type: .endRoute) { _ in
|
||||||
CarPlayService.shared.cancelCurrentTrip()
|
CarPlayService.shared.cancelCurrentTrip()
|
||||||
@@ -124,28 +117,6 @@ final class MapTemplateBuilder {
|
|||||||
mapTemplate.leadingNavigationBarButtons = [destinationButton]
|
mapTemplate.leadingNavigationBarButtons = [destinationButton]
|
||||||
}
|
}
|
||||||
|
|
||||||
class func updateMyPositionModeButton(mapTemplate: CPMapTemplate, newMode: MWMMyPositionMode) {
|
|
||||||
let button = CPMapButton(handler: { _ in
|
|
||||||
FrameworkHelper.switchMyPositionMode()
|
|
||||||
})
|
|
||||||
|
|
||||||
switch newMode {
|
|
||||||
case .pendingPosition:
|
|
||||||
button.image = UIImage(systemName: "location.fill")
|
|
||||||
case .notFollowNoPosition:
|
|
||||||
button.image = UIImage(systemName: "location")
|
|
||||||
case .notFollow:
|
|
||||||
button.image = UIImage(systemName: "location")
|
|
||||||
case .follow:
|
|
||||||
button.image = UIImage(systemName: "location.fill")
|
|
||||||
case .followAndRotate:
|
|
||||||
button.image = UIImage(systemName: "location.north.line.fill")
|
|
||||||
}
|
|
||||||
if mapTemplate.mapButtons.count > 0 {
|
|
||||||
mapTemplate.mapButtons[0] = button
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class func setupRecenterButton(mapTemplate: CPMapTemplate) {
|
class func setupRecenterButton(mapTemplate: CPMapTemplate) {
|
||||||
let recenterButton = buildBarButton(type: .recenter) { _ in
|
let recenterButton = buildBarButton(type: .recenter) { _ in
|
||||||
FrameworkHelper.switchMyPositionMode()
|
FrameworkHelper.switchMyPositionMode()
|
||||||
@@ -195,8 +166,6 @@ final class MapTemplateBuilder {
|
|||||||
button.image = UIImage(systemName: "plus")
|
button.image = UIImage(systemName: "plus")
|
||||||
case .zoomOut:
|
case .zoomOut:
|
||||||
button.image = UIImage(systemName: "minus")
|
button.image = UIImage(systemName: "minus")
|
||||||
case .myPositionMode:
|
|
||||||
button.image = UIImage(systemName: "location")
|
|
||||||
}
|
}
|
||||||
// Remove code below once Apple has fixed its issue with the button background
|
// Remove code below once Apple has fixed its issue with the button background
|
||||||
if #unavailable(iOS 26) {
|
if #unavailable(iOS 26) {
|
||||||
@@ -207,8 +176,6 @@ final class MapTemplateBuilder {
|
|||||||
button.focusedImage = UIImage(systemName: "plus.circle.fill")
|
button.focusedImage = UIImage(systemName: "plus.circle.fill")
|
||||||
case .zoomOut:
|
case .zoomOut:
|
||||||
button.focusedImage = UIImage(systemName: "minus.circle.fill")
|
button.focusedImage = UIImage(systemName: "minus.circle.fill")
|
||||||
case .myPositionMode:
|
|
||||||
button.image = UIImage(systemName: "location.fill")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return button
|
return button
|
||||||
|
|||||||
@@ -91,8 +91,7 @@ NSString * const kUDDidShowLongTapToShowSideButtonsToast = @"kUDDidShowLongTapTo
|
|||||||
case MWMMyPositionModeNotFollow:
|
case MWMMyPositionModeNotFollow:
|
||||||
case MWMMyPositionModeNotFollowNoPosition: [locBtn setStyleNameAndApply: @"ButtonGetPosition"]; break;
|
case MWMMyPositionModeNotFollowNoPosition: [locBtn setStyleNameAndApply: @"ButtonGetPosition"]; break;
|
||||||
case MWMMyPositionModeFollow: [locBtn setStyleNameAndApply: @"ButtonFollow"]; break;
|
case MWMMyPositionModeFollow: [locBtn setStyleNameAndApply: @"ButtonFollow"]; break;
|
||||||
case MWMMyPositionModeFollowAndRotateCompass: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotateCompass"]; break;
|
case MWMMyPositionModeFollowAndRotate: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotate"]; break;
|
||||||
case MWMMyPositionModeFollowAndRotateRoute: [locBtn setStyleNameAndApply: @"ButtonFollowAndRotateRoute"]; break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -632,8 +632,7 @@ NSString *const kAboutSegue = @"Map2About";
|
|||||||
case MWMMyPositionModeNotFollow:
|
case MWMMyPositionModeNotFollow:
|
||||||
break;
|
break;
|
||||||
case MWMMyPositionModeFollow:
|
case MWMMyPositionModeFollow:
|
||||||
case MWMMyPositionModeFollowAndRotateCompass:
|
case MWMMyPositionModeFollowAndRotate:
|
||||||
case MWMMyPositionModeFollowAndRotateRoute:
|
|
||||||
self.disableStandbyOnLocationStateMode = YES;
|
self.disableStandbyOnLocationStateMode = YES;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,7 @@ static inline MWMMyPositionMode mwmMyPositionMode(location::EMyPositionMode mode
|
|||||||
case location::EMyPositionMode::NotFollowNoPosition: return MWMMyPositionModeNotFollowNoPosition;
|
case location::EMyPositionMode::NotFollowNoPosition: return MWMMyPositionModeNotFollowNoPosition;
|
||||||
case location::EMyPositionMode::NotFollow: return MWMMyPositionModeNotFollow;
|
case location::EMyPositionMode::NotFollow: return MWMMyPositionModeNotFollow;
|
||||||
case location::EMyPositionMode::Follow: return MWMMyPositionModeFollow;
|
case location::EMyPositionMode::Follow: return MWMMyPositionModeFollow;
|
||||||
case location::EMyPositionMode::FollowAndRotateCompass: return MWMMyPositionModeFollowAndRotateCompass;
|
case location::EMyPositionMode::FollowAndRotate: return MWMMyPositionModeFollowAndRotate;
|
||||||
case location::EMyPositionMode::FollowAndRotateRoute: return MWMMyPositionModeFollowAndRotateRoute;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace location_helpers
|
} // namespace location_helpers
|
||||||
|
|||||||
@@ -50,8 +50,7 @@ std::string DebugPrint(MWMMyPositionMode mode) {
|
|||||||
case MWMMyPositionModeNotFollowNoPosition: return "MWMMyPositionModeNotFollowNoPosition";
|
case MWMMyPositionModeNotFollowNoPosition: return "MWMMyPositionModeNotFollowNoPosition";
|
||||||
case MWMMyPositionModeNotFollow: return "MWMMyPositionModeNotFollow";
|
case MWMMyPositionModeNotFollow: return "MWMMyPositionModeNotFollow";
|
||||||
case MWMMyPositionModeFollow: return "MWMMyPositionModeFollow";
|
case MWMMyPositionModeFollow: return "MWMMyPositionModeFollow";
|
||||||
case MWMMyPositionModeFollowAndRotateCompass: return "MWMMyPositionModeFollowAndRotateCompass";
|
case MWMMyPositionModeFollowAndRotate: return "MWMMyPositionModeFollowAndRotate";
|
||||||
case MWMMyPositionModeFollowAndRotateRoute: return "MWMMyPositionModeFollowAndRotateRoute";
|
|
||||||
}
|
}
|
||||||
CHECK(false, ("Unsupported value", static_cast<int>(mode)));
|
CHECK(false, ("Unsupported value", static_cast<int>(mode)));
|
||||||
}
|
}
|
||||||
@@ -368,8 +367,7 @@ void setShowLocationAlert(BOOL needShow) {
|
|||||||
case MWMMyPositionModeNotFollowNoPosition:
|
case MWMMyPositionModeNotFollowNoPosition:
|
||||||
case MWMMyPositionModeNotFollow: manager.geoMode = GeoMode::NotInPosition; break;
|
case MWMMyPositionModeNotFollow: manager.geoMode = GeoMode::NotInPosition; break;
|
||||||
case MWMMyPositionModeFollow: manager.geoMode = GeoMode::InPosition; break;
|
case MWMMyPositionModeFollow: manager.geoMode = GeoMode::InPosition; break;
|
||||||
case MWMMyPositionModeFollowAndRotateCompass:
|
case MWMMyPositionModeFollowAndRotate: manager.geoMode = GeoMode::FollowAndRotate; break;
|
||||||
case MWMMyPositionModeFollowAndRotateRoute: manager.geoMode = GeoMode::FollowAndRotate; break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ NSUInteger constexpr kMaxPredictionCount = 20;
|
|||||||
|
|
||||||
- (void)setMyPositionMode:(MWMMyPositionMode)mode
|
- (void)setMyPositionMode:(MWMMyPositionMode)mode
|
||||||
{
|
{
|
||||||
self.isLastPositionModeValid = (mode == MWMMyPositionModeFollowAndRotateCompass);
|
self.isLastPositionModeValid = (mode == MWMMyPositionModeFollowAndRotate);
|
||||||
[self restart];
|
[self restart];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,5 @@ typedef NS_CLOSED_ENUM(NSUInteger, MWMMyPositionMode) {
|
|||||||
MWMMyPositionModeNotFollowNoPosition,
|
MWMMyPositionModeNotFollowNoPosition,
|
||||||
MWMMyPositionModeNotFollow,
|
MWMMyPositionModeNotFollow,
|
||||||
MWMMyPositionModeFollow,
|
MWMMyPositionModeFollow,
|
||||||
MWMMyPositionModeFollowAndRotateCompass,
|
MWMMyPositionModeFollowAndRotate
|
||||||
MWMMyPositionModeFollowAndRotateRoute
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,14 +41,13 @@ final class ThemeManager: NSObject {
|
|||||||
}
|
}
|
||||||
}(actualTheme)
|
}(actualTheme)
|
||||||
|
|
||||||
let isCarPlayActive = CarPlayService.shared.isCarplayActivated
|
if Settings.mapAppearance == .light {
|
||||||
if !isCarPlayActive, Settings.mapAppearance == .light {
|
|
||||||
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
|
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
|
||||||
FrameworkHelper.setTheme(.vehicleDay)
|
FrameworkHelper.setTheme(.vehicleDay)
|
||||||
} else {
|
} else {
|
||||||
FrameworkHelper.setTheme(.day)
|
FrameworkHelper.setTheme(.day)
|
||||||
}
|
}
|
||||||
} else if !isCarPlayActive, Settings.mapAppearance == .dark {
|
} else if Settings.mapAppearance == .dark {
|
||||||
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
|
if actualTheme == .vehicleDay || actualTheme == .vehicleNight {
|
||||||
FrameworkHelper.setTheme(.vehicleNight)
|
FrameworkHelper.setTheme(.vehicleNight)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ enum MapStyleSheet: String, CaseIterable {
|
|||||||
case mapButtonPending = "ButtonPending"
|
case mapButtonPending = "ButtonPending"
|
||||||
case mapButtonGetPosition = "ButtonGetPosition"
|
case mapButtonGetPosition = "ButtonGetPosition"
|
||||||
case mapButtonFollow = "ButtonFollow"
|
case mapButtonFollow = "ButtonFollow"
|
||||||
case mapButtonFollowAndRotateCompass = "ButtonFollowAndRotateCompass"
|
case mapButtonFollowAndRotate = "ButtonFollowAndRotate"
|
||||||
case mapButtonFollowAndRotateRoute = "ButtonFollowAndRotateRoute"
|
|
||||||
case mapButtonMapBookmarks = "ButtonMapBookmarks"
|
case mapButtonMapBookmarks = "ButtonMapBookmarks"
|
||||||
case mapPromoDiscoveryButton = "PromoDiscroveryButton"
|
case mapPromoDiscoveryButton = "PromoDiscroveryButton"
|
||||||
case mapButtonBookmarksBack = "ButtonBookmarksBack"
|
case mapButtonBookmarksBack = "ButtonBookmarksBack"
|
||||||
@@ -68,14 +67,10 @@ extension MapStyleSheet: IStyleSheet {
|
|||||||
return .add { s in
|
return .add { s in
|
||||||
s.mwmImage = "btn_follow"
|
s.mwmImage = "btn_follow"
|
||||||
}
|
}
|
||||||
case .mapButtonFollowAndRotateCompass:
|
case .mapButtonFollowAndRotate:
|
||||||
return .add { s in
|
return .add { s in
|
||||||
s.mwmImage = "btn_follow_and_rotate"
|
s.mwmImage = "btn_follow_and_rotate"
|
||||||
}
|
}
|
||||||
case .mapButtonFollowAndRotateRoute:
|
|
||||||
return .add { s in
|
|
||||||
s.mwmImage = "btn_follow_route"
|
|
||||||
}
|
|
||||||
case .mapButtonMapBookmarks:
|
case .mapButtonMapBookmarks:
|
||||||
return .add { s in
|
return .add { s in
|
||||||
s.mwmImage = "ic_routing_bookmark"
|
s.mwmImage = "ic_routing_bookmark"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"info" : {
|
"info" : {
|
||||||
"author" : "xcode",
|
"version" : 1,
|
||||||
"version" : 1
|
"author" : "xcode"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "btn_follow_route_dark.png",
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "btn_follow_route_highlighted_dark.png",
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "btn_follow_route_highlighted_light.png",
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "btn_follow_route_light.png",
|
|
||||||
"idiom" : "universal",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
@@ -189,7 +189,7 @@
|
|||||||
"type.amenity.shelter.basic_hut" = "Bivouac Hut";
|
"type.amenity.shelter.basic_hut" = "Bivouac Hut";
|
||||||
|
|
||||||
/* A traditional 3-walled shelter (one side open), suitable for overnight camping. */
|
/* A traditional 3-walled shelter (one side open), suitable for overnight camping. */
|
||||||
"type.amenity.shelter.lean_to" = "Lean-to Sleep Shelter";
|
"type.amenity.shelter.lean_to" = "Lean-to Shelter";
|
||||||
"type.amenity.public_bath" = "Public Bath";
|
"type.amenity.public_bath" = "Public Bath";
|
||||||
"type.amenity.shower" = "Shower";
|
"type.amenity.shower" = "Shower";
|
||||||
"type.amenity.stripclub" = "Stripclub";
|
"type.amenity.stripclub" = "Stripclub";
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
"type.amenity.vending_machine.food" = "Food Dispenser";
|
"type.amenity.vending_machine.food" = "Food Dispenser";
|
||||||
"type.amenity.vending_machine.newspapers" = "Newspaper Dispenser";
|
"type.amenity.vending_machine.newspapers" = "Newspaper Dispenser";
|
||||||
"type.amenity.vending_machine.parking_tickets" = "Parking Meter";
|
"type.amenity.vending_machine.parking_tickets" = "Parking Meter";
|
||||||
"type.amenity.vending_machine.public_transport_tickets" = "Public Transport Ticket Machine";
|
"type.amenity.vending_machine.public_transport_tickets" = "Ticket Machine";
|
||||||
"type.amenity.vending_machine.sweets" = "Sweets Dispenser";
|
"type.amenity.vending_machine.sweets" = "Sweets Dispenser";
|
||||||
"type.amenity.vending_machine.excrement_bags" = "Excrement Bags Dispenser";
|
"type.amenity.vending_machine.excrement_bags" = "Excrement Bags Dispenser";
|
||||||
"type.amenity.parcel_locker" = "Parcel Locker";
|
"type.amenity.parcel_locker" = "Parcel Locker";
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
27AF18562E1DB63000CD41E2 /* PowerSavingMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */; };
|
27AF18562E1DB63000CD41E2 /* PowerSavingMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */; };
|
||||||
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18572E1DB63900CD41E2 /* Appearance.swift */; };
|
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18572E1DB63900CD41E2 /* Appearance.swift */; };
|
||||||
27AF185A2E1DB64500CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */; };
|
27AF185A2E1DB64500CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */; };
|
||||||
27FDBF212EEEFC830045621D /* mapcss-mapping.csv in Resources */ = {isa = PBXBuildFile; fileRef = 27FDBF202EEEFC830045621D /* mapcss-mapping.csv */; };
|
|
||||||
3304306D21D4EAFB00317CA3 /* SearchCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */; };
|
3304306D21D4EAFB00317CA3 /* SearchCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */; };
|
||||||
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; };
|
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; };
|
||||||
337F98A621D37B7400C8AC27 /* SearchTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337F98A521D37B7400C8AC27 /* SearchTabViewController.swift */; };
|
337F98A621D37B7400C8AC27 /* SearchTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337F98A521D37B7400C8AC27 /* SearchTabViewController.swift */; };
|
||||||
@@ -790,7 +789,6 @@
|
|||||||
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowerSavingMode.swift; sourceTree = "<group>"; };
|
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowerSavingMode.swift; sourceTree = "<group>"; };
|
||||||
27AF18572E1DB63900CD41E2 /* Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Appearance.swift; sourceTree = "<group>"; };
|
27AF18572E1DB63900CD41E2 /* Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Appearance.swift; sourceTree = "<group>"; };
|
||||||
27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncingSpeedTrapsWhileVoiceRouting.swift; sourceTree = "<group>"; };
|
27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncingSpeedTrapsWhileVoiceRouting.swift; sourceTree = "<group>"; };
|
||||||
27FDBF202EEEFC830045621D /* mapcss-mapping.csv */ = {isa = PBXFileReference; lastKnownFileType = text; name = "mapcss-mapping.csv"; path = "/Users/yannikbloscheck/Apps/CoMaps/Code/data/mapcss-mapping.csv"; sourceTree = "<absolute>"; };
|
|
||||||
28A0AB4B0D9B1048005BE974 /* Maps_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Maps_Prefix.pch; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
28A0AB4B0D9B1048005BE974 /* Maps_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Maps_Prefix.pch; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||||
29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; indentWidth = 2; path = main.mm; sourceTree = "<group>"; tabWidth = 2; };
|
29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; indentWidth = 2; path = main.mm; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
30034C5C2B3F0B74005D961A /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
|
30034C5C2B3F0B74005D961A /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
@@ -3950,7 +3948,6 @@
|
|||||||
6B9978341C89A316003B8AA0 /* editor.config */,
|
6B9978341C89A316003B8AA0 /* editor.config */,
|
||||||
978D4A30199A11E600D72CA7 /* faq.html */,
|
978D4A30199A11E600D72CA7 /* faq.html */,
|
||||||
BB7626B41E8559980031D71C /* icudt75l.dat */,
|
BB7626B41E8559980031D71C /* icudt75l.dat */,
|
||||||
27FDBF202EEEFC830045621D /* mapcss-mapping.csv */,
|
|
||||||
F623DA6A1C9C2731006A3436 /* opening_hours_how_to_edit.html */,
|
F623DA6A1C9C2731006A3436 /* opening_hours_how_to_edit.html */,
|
||||||
FA85F632145DDDC20090E1A0 /* packed_polygons.bin */,
|
FA85F632145DDDC20090E1A0 /* packed_polygons.bin */,
|
||||||
451950391B7A3E070085DA05 /* patterns.txt */,
|
451950391B7A3E070085DA05 /* patterns.txt */,
|
||||||
@@ -4204,7 +4201,6 @@
|
|||||||
34F73F9F1E082FF800AC1FD6 /* Localizable.strings in Resources */,
|
34F73F9F1E082FF800AC1FD6 /* Localizable.strings in Resources */,
|
||||||
340E1EF21E2F614400CE49BF /* Main.storyboard in Resources */,
|
340E1EF21E2F614400CE49BF /* Main.storyboard in Resources */,
|
||||||
F6E2FE521E097BA00083EBEC /* MWMActionBarButton.xib in Resources */,
|
F6E2FE521E097BA00083EBEC /* MWMActionBarButton.xib in Resources */,
|
||||||
27FDBF212EEEFC830045621D /* mapcss-mapping.csv in Resources */,
|
|
||||||
EDBD68072B625724005DD151 /* LocationServicesDisabledAlert.xib in Resources */,
|
EDBD68072B625724005DD151 /* LocationServicesDisabledAlert.xib in Resources */,
|
||||||
993DF0CA23F6BD0600AC231A /* ElevationDetailsViewController.xib in Resources */,
|
993DF0CA23F6BD0600AC231A /* ElevationDetailsViewController.xib in Resources */,
|
||||||
F623DA6F1C9C2E62006A3436 /* MWMAddPlaceNavigationBar.xib in Resources */,
|
F623DA6F1C9C2E62006A3436 /* MWMAddPlaceNavigationBar.xib in Resources */,
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ import AVFoundation
|
|||||||
return mapAppearance
|
return mapAppearance
|
||||||
}
|
}
|
||||||
|
|
||||||
return .light
|
return .auto
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
UserDefaults.standard.set(newValue.rawValue, forKey: userDefaultsKeyMapAppearance)
|
UserDefaults.standard.set(newValue.rawValue, forKey: userDefaultsKeyMapAppearance)
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ void registerCellsForTableView(std::vector<MWMEditorCellID> const & cells, UITab
|
|||||||
[self configNavBar];
|
[self configNavBar];
|
||||||
auto const & fid = m_mapObject.GetID();
|
auto const & fid = m_mapObject.GetID();
|
||||||
self.featureStatus = osm::Editor::Instance().GetFeatureStatus(fid.m_mwmId, fid.m_index);
|
self.featureStatus = osm::Editor::Instance().GetFeatureStatus(fid.m_mwmId, fid.m_index);
|
||||||
self.isFeatureUploaded = osm::Editor::Instance().AreSomeFeatureChangesUploaded(fid.m_mwmId, fid.m_index);
|
self.isFeatureUploaded = osm::Editor::Instance().IsFeatureUploaded(fid.m_mwmId, fid.m_index);
|
||||||
m_newAdditionalLanguages.clear();
|
m_newAdditionalLanguages.clear();
|
||||||
if (self.isCreating)
|
if (self.isCreating)
|
||||||
{
|
{
|
||||||
@@ -1089,7 +1089,7 @@ void registerCellsForTableView(std::vector<MWMEditorCellID> const & cells, UITab
|
|||||||
- (void)tapOnButtonCell:(UITableViewCell *)cell
|
- (void)tapOnButtonCell:(UITableViewCell *)cell
|
||||||
{
|
{
|
||||||
auto const & fid = m_mapObject.GetID();
|
auto const & fid = m_mapObject.GetID();
|
||||||
self.isFeatureUploaded = osm::Editor::Instance().AreSomeFeatureChangesUploaded(fid.m_mwmId, fid.m_index);
|
self.isFeatureUploaded = osm::Editor::Instance().IsFeatureUploaded(fid.m_mwmId, fid.m_index);
|
||||||
NSIndexPath * ip = [self.tableView indexPathForCell:cell];
|
NSIndexPath * ip = [self.tableView indexPathForCell:cell];
|
||||||
[self.tableView reloadRowsAtIndexPaths:@[ ip ] withRowAnimation:UITableViewRowAnimationFade];
|
[self.tableView reloadRowsAtIndexPaths:@[ ip ] withRowAnimation:UITableViewRowAnimationFade];
|
||||||
|
|
||||||
|
|||||||
@@ -260,14 +260,6 @@ WeekDayView getWeekDayView()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)extendedToggleButtonTap
|
|
||||||
{
|
|
||||||
id<MWMPlacePageOpeningHoursCellProtocol> delegate = self.delegate;
|
|
||||||
if (delegate.isEditor) {
|
|
||||||
[delegate setOpeningHoursCellExpanded:!delegate.openingHoursCellExpanded];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Properties
|
#pragma mark - Properties
|
||||||
|
|
||||||
- (BOOL)isExpanded
|
- (BOOL)isExpanded
|
||||||
|
|||||||
@@ -172,30 +172,17 @@
|
|||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fNU-1q-AiR">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fNU-1q-AiR">
|
||||||
<rect key="frame" x="0.0" y="127" width="320" height="122"/>
|
<rect key="frame" x="0.0" y="127" width="320" height="122"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
<gestureRecognizers/>
|
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="122" id="Ifb-EB-LIb"/>
|
<constraint firstAttribute="height" constant="122" id="Ifb-EB-LIb"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hYN-dO-J0e" userLabel="Editor Button">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="249"/>
|
|
||||||
<state key="normal" title="Button"/>
|
|
||||||
<buttonConfiguration key="configuration" style="plain"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="extendedToggleButtonTap" destination="KGk-i7-Jjw" eventType="touchUpInside" id="BSf-KC-HgD"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="fNU-1q-AiR" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="08I-np-9jr"/>
|
<constraint firstItem="fNU-1q-AiR" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="08I-np-9jr"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="hYN-dO-J0e" secondAttribute="trailing" id="0Vo-1D-dPq"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="fNU-1q-AiR" secondAttribute="trailing" id="2Hz-cA-KuN"/>
|
<constraint firstAttribute="trailing" secondItem="fNU-1q-AiR" secondAttribute="trailing" id="2Hz-cA-KuN"/>
|
||||||
<constraint firstItem="hYN-dO-J0e" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="GVQ-l4-vnQ"/>
|
|
||||||
<constraint firstItem="0kQ-hh-2Cy" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="60" id="KwF-TF-PmH"/>
|
<constraint firstItem="0kQ-hh-2Cy" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="60" id="KwF-TF-PmH"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="0kQ-hh-2Cy" secondAttribute="trailing" constant="32" id="RqH-0b-AyG"/>
|
<constraint firstAttribute="trailing" secondItem="0kQ-hh-2Cy" secondAttribute="trailing" constant="32" id="RqH-0b-AyG"/>
|
||||||
<constraint firstItem="hYN-dO-J0e" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="Sav-rp-wo2"/>
|
|
||||||
<constraint firstItem="swk-um-XzG" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="VsQ-qI-dIi"/>
|
<constraint firstItem="swk-um-XzG" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="VsQ-qI-dIi"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="hYN-dO-J0e" secondAttribute="bottom" id="Xe1-4J-wRh"/>
|
|
||||||
<constraint firstItem="0kQ-hh-2Cy" firstAttribute="top" secondItem="swk-um-XzG" secondAttribute="bottom" id="Xrh-Vg-VYg"/>
|
<constraint firstItem="0kQ-hh-2Cy" firstAttribute="top" secondItem="swk-um-XzG" secondAttribute="bottom" id="Xrh-Vg-VYg"/>
|
||||||
<constraint firstItem="swk-um-XzG" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="p14-Mi-kcR"/>
|
<constraint firstItem="swk-um-XzG" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="p14-Mi-kcR"/>
|
||||||
<constraint firstItem="fNU-1q-AiR" firstAttribute="top" secondItem="0kQ-hh-2Cy" secondAttribute="bottom" id="uKD-bb-yHT"/>
|
<constraint firstItem="fNU-1q-AiR" firstAttribute="top" secondItem="0kQ-hh-2Cy" secondAttribute="bottom" id="uKD-bb-yHT"/>
|
||||||
@@ -205,7 +192,6 @@
|
|||||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Background"/>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
<gestureRecognizers/>
|
|
||||||
<inset key="separatorInset" minX="60" minY="0.0" maxX="0.0" maxY="0.0"/>
|
<inset key="separatorInset" minX="60" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="currentDay" destination="swk-um-XzG" id="CJG-LQ-Pu8"/>
|
<outlet property="currentDay" destination="swk-um-XzG" id="CJG-LQ-Pu8"/>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
#include "drape/support_manager.hpp"
|
#include "drape/support_manager.hpp"
|
||||||
|
|
||||||
#include "platform/settings.hpp"
|
#include "platform/settings.hpp"
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ DrapeEngine::DrapeEngine(Params && params)
|
|||||||
|
|
||||||
using namespace location;
|
using namespace location;
|
||||||
EMyPositionMode mode = PendingPosition;
|
EMyPositionMode mode = PendingPosition;
|
||||||
if (settings::Get(kLocationStateMode, mode) && mode == FollowAndRotateCompass)
|
if (settings::Get(kLocationStateMode, mode) && mode == FollowAndRotate)
|
||||||
{
|
{
|
||||||
// If the screen rect setting in follow and rotate mode is missing or invalid, it could cause
|
// If the screen rect setting in follow and rotate mode is missing or invalid, it could cause
|
||||||
// invalid animations, so the follow and rotate mode should be discarded.
|
// invalid animations, so the follow and rotate mode should be discarded.
|
||||||
@@ -442,12 +441,13 @@ void DrapeEngine::SetCompassInfo(location::CompassInfo const & info)
|
|||||||
MessagePriority::Normal);
|
MessagePriority::Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrapeEngine::SetGpsInfo(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
|
void DrapeEngine::SetGpsInfo(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
|
||||||
location::RouteMatchingInfo const & routeInfo)
|
location::RouteMatchingInfo const & routeInfo)
|
||||||
{
|
{
|
||||||
m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread,
|
m_threadCommutator->PostMessage(
|
||||||
make_unique_dp<GpsInfoMessage>(info, navigationContext, routeInfo),
|
ThreadsCommutator::RenderThread,
|
||||||
MessagePriority::Normal);
|
make_unique_dp<GpsInfoMessage>(info, isNavigable, distToNextTurn, speedLimit, routeInfo),
|
||||||
|
MessagePriority::Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrapeEngine::SwitchMyPositionNextMode()
|
void DrapeEngine::SwitchMyPositionNextMode()
|
||||||
@@ -474,13 +474,12 @@ void DrapeEngine::StopLocationFollow()
|
|||||||
MessagePriority::Normal);
|
MessagePriority::Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrapeEngine::FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued,
|
void DrapeEngine::FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued)
|
||||||
bool allowRouteRotation)
|
|
||||||
{
|
{
|
||||||
m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread,
|
m_threadCommutator->PostMessage(
|
||||||
make_unique_dp<FollowRouteMessage>(preferredZoomLevel, preferredZoomLevel3d,
|
ThreadsCommutator::RenderThread,
|
||||||
enableAutoZoom, isArrowGlued, allowRouteRotation),
|
make_unique_dp<FollowRouteMessage>(preferredZoomLevel, preferredZoomLevel3d, enableAutoZoom, isArrowGlued),
|
||||||
MessagePriority::Normal);
|
MessagePriority::Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrapeEngine::SetModelViewListener(ModelViewChangedHandler && fn)
|
void DrapeEngine::SetModelViewListener(ModelViewChangedHandler && fn)
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "drape_frontend/my_position_controller.hpp"
|
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
#include "traffic/traffic_info.hpp"
|
#include "traffic/traffic_info.hpp"
|
||||||
|
|
||||||
#include "drape_frontend/backend_renderer.hpp"
|
#include "drape_frontend/backend_renderer.hpp"
|
||||||
@@ -156,7 +154,7 @@ public:
|
|||||||
void UpdateMapStyle();
|
void UpdateMapStyle();
|
||||||
|
|
||||||
void SetCompassInfo(location::CompassInfo const & info);
|
void SetCompassInfo(location::CompassInfo const & info);
|
||||||
void SetGpsInfo(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
|
void SetGpsInfo(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
|
||||||
location::RouteMatchingInfo const & routeInfo);
|
location::RouteMatchingInfo const & routeInfo);
|
||||||
void SwitchMyPositionNextMode();
|
void SwitchMyPositionNextMode();
|
||||||
void LoseLocation();
|
void LoseLocation();
|
||||||
@@ -173,8 +171,7 @@ public:
|
|||||||
|
|
||||||
dp::DrapeID AddSubroute(SubrouteConstPtr subroute);
|
dp::DrapeID AddSubroute(SubrouteConstPtr subroute);
|
||||||
void RemoveSubroute(dp::DrapeID subrouteId, bool deactivateFollowing);
|
void RemoveSubroute(dp::DrapeID subrouteId, bool deactivateFollowing);
|
||||||
void FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued,
|
void FollowRoute(int preferredZoomLevel, int preferredZoomLevel3d, bool enableAutoZoom, bool isArrowGlued);
|
||||||
bool allowRouteRotation);
|
|
||||||
void DeactivateRouteFollowing();
|
void DeactivateRouteFollowing();
|
||||||
void SetSubrouteVisibility(dp::DrapeID subrouteId, bool isVisible);
|
void SetSubrouteVisibility(dp::DrapeID subrouteId, bool isVisible);
|
||||||
dp::DrapeID AddRoutePreviewSegment(m2::PointD const & startPt, m2::PointD const & finishPt);
|
dp::DrapeID AddRoutePreviewSegment(m2::PointD const & startPt, m2::PointD const & finishPt);
|
||||||
|
|||||||
@@ -438,8 +438,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
ref_ptr<GpsInfoMessage> msg = message;
|
ref_ptr<GpsInfoMessage> msg = message;
|
||||||
m_myPositionController->OnLocationUpdate(msg->GetInfo(), msg->GetNavigationContext(),
|
m_myPositionController->OnLocationUpdate(msg->GetInfo(), msg->IsNavigable(), msg->GetDistanceToNextTurn(),
|
||||||
m_userEventStream.GetCurrentScreen());
|
msg->GetSpeedLimit(), m_userEventStream.GetCurrentScreen());
|
||||||
|
|
||||||
location::RouteMatchingInfo const & info = msg->GetRouteInfo();
|
location::RouteMatchingInfo const & info = msg->GetRouteInfo();
|
||||||
if (info.HasDistanceFromBegin())
|
if (info.HasDistanceFromBegin())
|
||||||
@@ -512,8 +512,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
|
|||||||
if (m_pendingFollowRoute != nullptr)
|
if (m_pendingFollowRoute != nullptr)
|
||||||
{
|
{
|
||||||
FollowRoute(m_pendingFollowRoute->m_preferredZoomLevel, m_pendingFollowRoute->m_preferredZoomLevelIn3d,
|
FollowRoute(m_pendingFollowRoute->m_preferredZoomLevel, m_pendingFollowRoute->m_preferredZoomLevelIn3d,
|
||||||
m_pendingFollowRoute->m_enableAutoZoom, m_pendingFollowRoute->m_isArrowGlued,
|
m_pendingFollowRoute->m_enableAutoZoom, m_pendingFollowRoute->m_isArrowGlued);
|
||||||
m_pendingFollowRoute->m_allowRouteRotation);
|
|
||||||
m_pendingFollowRoute.reset();
|
m_pendingFollowRoute.reset();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -585,14 +584,13 @@ void FrontendRenderer::AcceptMessage(ref_ptr<Message> message)
|
|||||||
// receive FollowRoute message before FlushSubroute message, so we need to postpone its processing.
|
// receive FollowRoute message before FlushSubroute message, so we need to postpone its processing.
|
||||||
if (m_routeRenderer->GetSubroutes().empty())
|
if (m_routeRenderer->GetSubroutes().empty())
|
||||||
{
|
{
|
||||||
m_pendingFollowRoute =
|
m_pendingFollowRoute = std::make_unique<FollowRouteData>(
|
||||||
std::make_unique<FollowRouteData>(msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(),
|
msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(), msg->EnableAutoZoom(), msg->IsArrowGlued());
|
||||||
msg->EnableAutoZoom(), msg->IsArrowGlued(), msg->AllowRouteRotation());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FollowRoute(msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(), msg->EnableAutoZoom(),
|
FollowRoute(msg->GetPreferredZoomLevel(), msg->GetPreferredZoomLevelIn3d(), msg->EnableAutoZoom(),
|
||||||
msg->IsArrowGlued(), msg->AllowRouteRotation());
|
msg->IsArrowGlued());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1059,11 +1057,10 @@ void FrontendRenderer::UpdateContextDependentResources()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FrontendRenderer::FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom,
|
void FrontendRenderer::FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom,
|
||||||
bool isArrowGlued, bool allowRouteRotation)
|
bool isArrowGlued)
|
||||||
{
|
{
|
||||||
m_myPositionController->ActivateRouting(
|
m_myPositionController->ActivateRouting(
|
||||||
!m_enablePerspectiveInNavigation ? preferredZoomLevel : preferredZoomLevelIn3d, enableAutoZoom, isArrowGlued,
|
!m_enablePerspectiveInNavigation ? preferredZoomLevel : preferredZoomLevelIn3d, enableAutoZoom, isArrowGlued);
|
||||||
allowRouteRotation);
|
|
||||||
|
|
||||||
if (m_enablePerspectiveInNavigation)
|
if (m_enablePerspectiveInNavigation)
|
||||||
AddUserEvent(make_unique_dp<SetAutoPerspectiveEvent>(true /* isAutoPerspective */));
|
AddUserEvent(make_unique_dp<SetAutoPerspectiveEvent>(true /* isAutoPerspective */));
|
||||||
|
|||||||
@@ -261,8 +261,7 @@ private:
|
|||||||
using TRenderGroupRemovePredicate = std::function<bool(drape_ptr<RenderGroup> const &)>;
|
using TRenderGroupRemovePredicate = std::function<bool(drape_ptr<RenderGroup> const &)>;
|
||||||
void RemoveRenderGroupsLater(TRenderGroupRemovePredicate const & predicate);
|
void RemoveRenderGroupsLater(TRenderGroupRemovePredicate const & predicate);
|
||||||
|
|
||||||
void FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
|
void FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued);
|
||||||
bool allowRouteRotation);
|
|
||||||
|
|
||||||
bool CheckRouteRecaching(ref_ptr<BaseSubrouteData> subrouteData);
|
bool CheckRouteRecaching(ref_ptr<BaseSubrouteData> subrouteData);
|
||||||
|
|
||||||
@@ -373,20 +372,17 @@ private:
|
|||||||
|
|
||||||
struct FollowRouteData
|
struct FollowRouteData
|
||||||
{
|
{
|
||||||
FollowRouteData(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
|
FollowRouteData(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued)
|
||||||
bool allowRouteRotation)
|
|
||||||
: m_preferredZoomLevel(preferredZoomLevel)
|
: m_preferredZoomLevel(preferredZoomLevel)
|
||||||
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
|
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
|
||||||
, m_enableAutoZoom(enableAutoZoom)
|
, m_enableAutoZoom(enableAutoZoom)
|
||||||
, m_isArrowGlued(isArrowGlued)
|
, m_isArrowGlued(isArrowGlued)
|
||||||
, m_allowRouteRotation(allowRouteRotation)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
int m_preferredZoomLevel;
|
int m_preferredZoomLevel;
|
||||||
int m_preferredZoomLevelIn3d;
|
int m_preferredZoomLevelIn3d;
|
||||||
bool m_enableAutoZoom;
|
bool m_enableAutoZoom;
|
||||||
bool m_isArrowGlued;
|
bool m_isArrowGlued;
|
||||||
bool m_allowRouteRotation;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<FollowRouteData> m_pendingFollowRoute;
|
std::unique_ptr<FollowRouteData> m_pendingFollowRoute;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "drape_frontend/gui/skin.hpp"
|
#include "drape_frontend/gui/skin.hpp"
|
||||||
#include "drape_frontend/message.hpp"
|
#include "drape_frontend/message.hpp"
|
||||||
#include "drape_frontend/my_position.hpp"
|
#include "drape_frontend/my_position.hpp"
|
||||||
#include "drape_frontend/my_position_controller.hpp"
|
|
||||||
#include "drape_frontend/overlay_batcher.hpp"
|
#include "drape_frontend/overlay_batcher.hpp"
|
||||||
#include "drape_frontend/postprocess_renderer.hpp"
|
#include "drape_frontend/postprocess_renderer.hpp"
|
||||||
#include "drape_frontend/render_node.hpp"
|
#include "drape_frontend/render_node.hpp"
|
||||||
@@ -30,7 +29,6 @@
|
|||||||
|
|
||||||
#include "geometry/rect2d.hpp"
|
#include "geometry/rect2d.hpp"
|
||||||
#include "geometry/triangle2d.hpp"
|
#include "geometry/triangle2d.hpp"
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@@ -477,22 +475,28 @@ private:
|
|||||||
class GpsInfoMessage : public Message
|
class GpsInfoMessage : public Message
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GpsInfoMessage(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
|
GpsInfoMessage(location::GpsInfo const & info, bool isNavigable, double distToNextTurn, double speedLimit,
|
||||||
location::RouteMatchingInfo const & routeInfo)
|
location::RouteMatchingInfo const & routeInfo)
|
||||||
: m_info(info)
|
: m_info(info)
|
||||||
, m_navigationContext(navigationContext)
|
, m_isNavigable(isNavigable)
|
||||||
|
, m_distToNextTurn(distToNextTurn)
|
||||||
|
, m_speedLimit(speedLimit)
|
||||||
, m_routeInfo(routeInfo)
|
, m_routeInfo(routeInfo)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Type GetType() const override { return Type::GpsInfo; }
|
Type GetType() const override { return Type::GpsInfo; }
|
||||||
|
|
||||||
location::GpsInfo const & GetInfo() const { return m_info; }
|
location::GpsInfo const & GetInfo() const { return m_info; }
|
||||||
df::NavigationContext const & GetNavigationContext() const { return m_navigationContext; }
|
bool IsNavigable() const { return m_isNavigable; }
|
||||||
|
double const & GetSpeedLimit() const { return m_speedLimit; }
|
||||||
|
double const & GetDistanceToNextTurn() const { return m_distToNextTurn; }
|
||||||
location::RouteMatchingInfo const & GetRouteInfo() const { return m_routeInfo; }
|
location::RouteMatchingInfo const & GetRouteInfo() const { return m_routeInfo; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
location::GpsInfo const m_info;
|
location::GpsInfo const m_info;
|
||||||
df::NavigationContext const m_navigationContext;
|
bool const m_isNavigable;
|
||||||
|
double const m_distToNextTurn;
|
||||||
|
double const m_speedLimit;
|
||||||
location::RouteMatchingInfo const m_routeInfo;
|
location::RouteMatchingInfo const m_routeInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -736,13 +740,11 @@ public:
|
|||||||
class FollowRouteMessage : public Message
|
class FollowRouteMessage : public Message
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FollowRouteMessage(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued,
|
FollowRouteMessage(int preferredZoomLevel, int preferredZoomLevelIn3d, bool enableAutoZoom, bool isArrowGlued)
|
||||||
bool allowRouteRotation)
|
|
||||||
: m_preferredZoomLevel(preferredZoomLevel)
|
: m_preferredZoomLevel(preferredZoomLevel)
|
||||||
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
|
, m_preferredZoomLevelIn3d(preferredZoomLevelIn3d)
|
||||||
, m_enableAutoZoom(enableAutoZoom)
|
, m_enableAutoZoom(enableAutoZoom)
|
||||||
, m_isArrowGlued(isArrowGlued)
|
, m_isArrowGlued(isArrowGlued)
|
||||||
, m_allowRouteRotation(allowRouteRotation)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Type GetType() const override { return Type::FollowRoute; }
|
Type GetType() const override { return Type::FollowRoute; }
|
||||||
@@ -751,14 +753,12 @@ public:
|
|||||||
int GetPreferredZoomLevelIn3d() const { return m_preferredZoomLevelIn3d; }
|
int GetPreferredZoomLevelIn3d() const { return m_preferredZoomLevelIn3d; }
|
||||||
bool EnableAutoZoom() const { return m_enableAutoZoom; }
|
bool EnableAutoZoom() const { return m_enableAutoZoom; }
|
||||||
bool IsArrowGlued() const { return m_isArrowGlued; }
|
bool IsArrowGlued() const { return m_isArrowGlued; }
|
||||||
bool AllowRouteRotation() const { return m_allowRouteRotation; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int const m_preferredZoomLevel;
|
int const m_preferredZoomLevel;
|
||||||
int const m_preferredZoomLevelIn3d;
|
int const m_preferredZoomLevelIn3d;
|
||||||
bool const m_enableAutoZoom;
|
bool const m_enableAutoZoom;
|
||||||
bool const m_isArrowGlued;
|
bool const m_isArrowGlued;
|
||||||
bool const m_allowRouteRotation;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class SwitchMapStyleMessage : public BaseBlockingMessage
|
class SwitchMapStyleMessage : public BaseBlockingMessage
|
||||||
|
|||||||
@@ -9,11 +9,9 @@
|
|||||||
|
|
||||||
#include "geometry/mercator.hpp"
|
#include "geometry/mercator.hpp"
|
||||||
|
|
||||||
#include "platform/location.hpp"
|
|
||||||
#include "platform/measurement_utils.hpp"
|
#include "platform/measurement_utils.hpp"
|
||||||
|
|
||||||
#include "base/math.hpp"
|
#include "base/math.hpp"
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
@@ -33,9 +31,6 @@ double constexpr kMaxTimeInBackgroundSec = 60.0 * 60 * 30; // 30 hours before s
|
|||||||
double constexpr kMaxNotFollowRoutingTimeSec = 20.0;
|
double constexpr kMaxNotFollowRoutingTimeSec = 20.0;
|
||||||
double constexpr kMaxUpdateLocationInvervalSec = 30.0;
|
double constexpr kMaxUpdateLocationInvervalSec = 30.0;
|
||||||
double constexpr kMaxBlockAutoZoomTimeSec = 10.0;
|
double constexpr kMaxBlockAutoZoomTimeSec = 10.0;
|
||||||
double constexpr kDefaultSpeedLimitKmpH = 50.0;
|
|
||||||
double constexpr kLookaheadTimeSpeedRatio = 0.3;
|
|
||||||
double constexpr kMaxLookaheadTimeSec = 25.0;
|
|
||||||
|
|
||||||
int constexpr kZoomThreshold = 10;
|
int constexpr kZoomThreshold = 10;
|
||||||
int constexpr kMaxScaleZoomLevel = 16;
|
int constexpr kMaxScaleZoomLevel = 16;
|
||||||
@@ -71,6 +66,7 @@ double CalculateZoomByMaxSpeed(double speedMpS, bool isPerspectiveAllowed)
|
|||||||
|
|
||||||
std::array<TSpeedScale, 2> const & scales = isPerspectiveAllowed ? scales3d : scales2d;
|
std::array<TSpeedScale, 2> const & scales = isPerspectiveAllowed ? scales3d : scales2d;
|
||||||
|
|
||||||
|
double constexpr kDefaultSpeedLimitKmpH = 50.0;
|
||||||
double const speedKmpH = speedMpS > 0 ? measurement_utils::MpsToKmph(speedMpS) : kDefaultSpeedLimitKmpH;
|
double const speedKmpH = speedMpS > 0 ? measurement_utils::MpsToKmph(speedMpS) : kDefaultSpeedLimitKmpH;
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
@@ -147,7 +143,7 @@ void ResetNotification(uint64_t & notifyId)
|
|||||||
|
|
||||||
bool IsModeChangeViewport(location::EMyPositionMode mode)
|
bool IsModeChangeViewport(location::EMyPositionMode mode)
|
||||||
{
|
{
|
||||||
return mode == location::Follow || mode == location::FollowAndRotateCompass || mode == location::FollowAndRotateRoute;
|
return mode == location::Follow || mode == location::FollowAndRotate;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@@ -161,11 +157,9 @@ MyPositionController::MyPositionController(Params && params, ref_ptr<DrapeNotifi
|
|||||||
, m_errorRadius(0.0)
|
, m_errorRadius(0.0)
|
||||||
, m_horizontalAccuracy(0.0)
|
, m_horizontalAccuracy(0.0)
|
||||||
, m_position(m2::PointD::Zero())
|
, m_position(m2::PointD::Zero())
|
||||||
, m_direction(0.0)
|
, m_drawDirection(0.0)
|
||||||
, m_routeDirection(0.0)
|
|
||||||
, m_arrowDirection(0.0)
|
|
||||||
, m_oldPosition(m2::PointD::Zero())
|
, m_oldPosition(m2::PointD::Zero())
|
||||||
, m_oldArrowDirection(0.0)
|
, m_oldDrawDirection(0.0)
|
||||||
, m_enablePerspectiveInRouting(false)
|
, m_enablePerspectiveInRouting(false)
|
||||||
, m_enableAutoZoomInRouting(params.m_isAutozoomEnabled)
|
, m_enableAutoZoomInRouting(params.m_isAutozoomEnabled)
|
||||||
, m_autoScale2d(GetScreenScale(kDefaultAutoZoom))
|
, m_autoScale2d(GetScreenScale(kDefaultAutoZoom))
|
||||||
@@ -177,8 +171,7 @@ MyPositionController::MyPositionController(Params && params, ref_ptr<DrapeNotifi
|
|||||||
, m_isDirtyAutoZoom(false)
|
, m_isDirtyAutoZoom(false)
|
||||||
, m_isPendingAnimation(false)
|
, m_isPendingAnimation(false)
|
||||||
, m_isPositionAssigned(false)
|
, m_isPositionAssigned(false)
|
||||||
, m_isArrowDirectionAssigned(false)
|
, m_isDirectionAssigned(false)
|
||||||
, m_isRouteDirectionAssigned(false)
|
|
||||||
, m_isCompassAvailable(false)
|
, m_isCompassAvailable(false)
|
||||||
, m_positionIsObsolete(false)
|
, m_positionIsObsolete(false)
|
||||||
, m_needBlockAutoZoom(false)
|
, m_needBlockAutoZoom(false)
|
||||||
@@ -297,7 +290,7 @@ void MyPositionController::ScaleEnded()
|
|||||||
|
|
||||||
void MyPositionController::Rotated()
|
void MyPositionController::Rotated()
|
||||||
{
|
{
|
||||||
if (m_mode == location::FollowAndRotateCompass)
|
if (m_mode == location::FollowAndRotate)
|
||||||
m_wasRotationInScaling = true;
|
m_wasRotationInScaling = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,32 +398,25 @@ void MyPositionController::NextMode(ScreenBase const & screen)
|
|||||||
// In routing not-follow -> follow-and-rotate, otherwise not-follow -> follow.
|
// In routing not-follow -> follow-and-rotate, otherwise not-follow -> follow.
|
||||||
if (m_mode == location::NotFollow)
|
if (m_mode == location::NotFollow)
|
||||||
{
|
{
|
||||||
ChangeMode(m_isInRouting ? location::FollowAndRotateCompass : location::Follow);
|
ChangeMode(m_isInRouting ? location::FollowAndRotate : location::Follow);
|
||||||
UpdateViewport(preferredZoomLevel);
|
UpdateViewport(preferredZoomLevel);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// From follow mode we transit to follow-and-rotate-compass, if in routing
|
// From follow mode we transit to follow-and-rotate if compass is available or
|
||||||
|
// routing is enabled.
|
||||||
if (m_mode == location::Follow)
|
if (m_mode == location::Follow)
|
||||||
{
|
{
|
||||||
if (IsArrowRotationAvailable() || m_isInRouting)
|
if (IsRotationAvailable() || m_isInRouting)
|
||||||
{
|
{
|
||||||
ChangeMode(location::FollowAndRotateCompass);
|
ChangeMode(location::FollowAndRotate);
|
||||||
UpdateViewport(preferredZoomLevel);
|
UpdateViewport(preferredZoomLevel);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// From -rotate-compass mode we transit to -rotate-route mode, if allowed
|
// From follow-and-rotate mode we can transit to follow mode.
|
||||||
if (m_mode == location::FollowAndRotateCompass && IsRouteRotationAvailable() && m_allowRouteRotationInRouting)
|
if (m_mode == location::FollowAndRotate)
|
||||||
{
|
|
||||||
ChangeMode(location::FollowAndRotateRoute);
|
|
||||||
UpdateViewport(preferredZoomLevel);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// From -rotate-route mode, or from -rotate-compass if -rotate-route is not allowed, we return to follow mode
|
|
||||||
if (m_mode == location::FollowAndRotateRoute || m_mode == location::FollowAndRotateCompass)
|
|
||||||
{
|
{
|
||||||
if (m_isInRouting && screen.isPerspective())
|
if (m_isInRouting && screen.isPerspective())
|
||||||
preferredZoomLevel = static_cast<int>(GetZoomLevel(ScreenBase::GetStartPerspectiveScale() * 1.1));
|
preferredZoomLevel = static_cast<int>(GetZoomLevel(ScreenBase::GetStartPerspectiveScale() * 1.1));
|
||||||
@@ -439,8 +425,8 @@ void MyPositionController::NextMode(ScreenBase const & screen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
|
void MyPositionController::OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, double distanceToNextTurn,
|
||||||
df::NavigationContext const & navigationContext, ScreenBase const & screen)
|
double speedLimit, ScreenBase const & screen)
|
||||||
{
|
{
|
||||||
m2::PointD const oldPos = GetDrawablePosition();
|
m2::PointD const oldPos = GetDrawablePosition();
|
||||||
double const oldAzimut = GetDrawableAzimut();
|
double const oldAzimut = GetDrawableAzimut();
|
||||||
@@ -452,62 +438,33 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
|
|||||||
m_errorRadius = rect.SizeX() * 0.5;
|
m_errorRadius = rect.SizeX() * 0.5;
|
||||||
m_horizontalAccuracy = info.m_horizontalAccuracy;
|
m_horizontalAccuracy = info.m_horizontalAccuracy;
|
||||||
|
|
||||||
if (navigationContext.m_distanceToNextTurn >= 0.0 || navigationContext.m_speedLimit >= 0.0)
|
if (distanceToNextTurn >= 0.0 || speedLimit >= 0.0)
|
||||||
{
|
{
|
||||||
double const mercatorPerMeter = m_errorRadius / info.m_horizontalAccuracy;
|
double const mercatorPerMeter = m_errorRadius / info.m_horizontalAccuracy;
|
||||||
m_autoScale2d =
|
m_autoScale2d =
|
||||||
mercatorPerMeter * CalculateAutoZoom(navigationContext.m_speedLimit, navigationContext.m_distanceToNextTurn,
|
mercatorPerMeter * CalculateAutoZoom(speedLimit, distanceToNextTurn, false /* isPerspectiveAllowed */);
|
||||||
false /* isPerspectiveAllowed */);
|
|
||||||
m_autoScale3d =
|
m_autoScale3d =
|
||||||
mercatorPerMeter * CalculateAutoZoom(navigationContext.m_speedLimit, navigationContext.m_distanceToNextTurn,
|
mercatorPerMeter * CalculateAutoZoom(speedLimit, distanceToNextTurn, true /* isPerspectiveAllowed */);
|
||||||
true /* isPerspectiveAllowed */);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_autoScale2d = m_autoScale3d = kUnknownAutoZoom;
|
m_autoScale2d = m_autoScale3d = kUnknownAutoZoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets arrow direction based on GPS if:
|
// Sets direction based on GPS if:
|
||||||
// 1. Compass is not available.
|
// 1. Compass is not available.
|
||||||
// 2. Direction must be glued to the route during routing (route-corrected angle is set only in
|
// 2. Direction must be glued to the route during routing (route-corrected angle is set only in
|
||||||
// OnLocationUpdate(): in OnCompassUpdate() the angle always has the original value.
|
// OnLocationUpdate(): in OnCompassUpdate() the angle always has the original value.
|
||||||
// 3. Device is moving faster then pedestrian.
|
// 3. Device is moving faster then pedestrian.
|
||||||
bool const isMovingFast = info.HasSpeed() && info.m_speed > kMinSpeedThresholdMps;
|
bool const isMovingFast = info.HasSpeed() && info.m_speed > kMinSpeedThresholdMps;
|
||||||
bool const glueArrowInRouting = navigationContext.m_isNavigable && m_isArrowGluedInRouting;
|
bool const glueArrowInRouting = isNavigable && m_isArrowGluedInRouting;
|
||||||
|
|
||||||
// Calculate the route direction by looking ahead a distance in the route
|
|
||||||
// depending on the current speed
|
|
||||||
if (glueArrowInRouting && navigationContext.m_followedPolyline != nullptr)
|
|
||||||
{
|
|
||||||
double const speed =
|
|
||||||
(navigationContext.m_speedLimit > 0 ? measurement_utils::MpsToKmph(navigationContext.m_speedLimit)
|
|
||||||
: kDefaultSpeedLimitKmpH);
|
|
||||||
double const lookaheadTimeSec = std::min(speed * kLookaheadTimeSpeedRatio, kMaxLookaheadTimeSec);
|
|
||||||
double const lookaheadDistance = std::min(speed * lookaheadTimeSec, navigationContext.m_distanceToNextTurn);
|
|
||||||
|
|
||||||
auto const & iter = navigationContext.m_followedPolyline->GetCurrentIter();
|
|
||||||
m2::PointD const point = navigationContext.m_followedPolyline->GetLookaheadPoint(lookaheadDistance);
|
|
||||||
|
|
||||||
auto angle = math::RadToDeg(ang::AngleTo(iter.m_pt, point));
|
|
||||||
if (std::isnan(angle) || std::isinf(angle))
|
|
||||||
{
|
|
||||||
// fallback in case the current route becomes invalid for any reason
|
|
||||||
SetRouteDirection(info.m_bearing);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetRouteDirection(math::DegToRad(location::AngleToBearing(angle)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!m_isCompassAvailable || glueArrowInRouting || isMovingFast) && info.HasBearing())
|
if ((!m_isCompassAvailable || glueArrowInRouting || isMovingFast) && info.HasBearing())
|
||||||
{
|
{
|
||||||
SetArrowDirection(math::DegToRad(info.m_bearing));
|
SetDirection(math::DegToRad(info.m_bearing));
|
||||||
m_lastGPSBearingTimer.Reset();
|
m_lastGPSBearingTimer.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_direction = m_mode == location::FollowAndRotateRoute ? m_routeDirection : m_arrowDirection;
|
|
||||||
|
|
||||||
if (m_isPositionAssigned && (!AlmostCurrentPosition(oldPos) || !AlmostCurrentAzimut(oldAzimut)))
|
if (m_isPositionAssigned && (!AlmostCurrentPosition(oldPos) || !AlmostCurrentAzimut(oldAzimut)))
|
||||||
{
|
{
|
||||||
CreateAnim(oldPos, oldAzimut, screen);
|
CreateAnim(oldPos, oldAzimut, screen);
|
||||||
@@ -530,9 +487,9 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
|
|||||||
{
|
{
|
||||||
ChangeModelView(m_position, kDoNotChangeZoom);
|
ChangeModelView(m_position, kDoNotChangeZoom);
|
||||||
}
|
}
|
||||||
else if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
|
else if (m_mode == location::FollowAndRotate)
|
||||||
{
|
{
|
||||||
ChangeModelView(m_position, m_direction,
|
ChangeModelView(m_position, m_drawDirection,
|
||||||
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(),
|
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(),
|
||||||
kDoNotChangeZoom);
|
kDoNotChangeZoom);
|
||||||
}
|
}
|
||||||
@@ -542,7 +499,7 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
|
|||||||
{
|
{
|
||||||
if (m_isInRouting)
|
if (m_isInRouting)
|
||||||
{
|
{
|
||||||
ChangeMode(location::FollowAndRotateCompass);
|
ChangeMode(location::FollowAndRotate);
|
||||||
UpdateViewport(kMaxScaleZoomLevel);
|
UpdateViewport(kMaxScaleZoomLevel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -568,7 +525,7 @@ void MyPositionController::OnLocationUpdate(location::GpsInfo const & info,
|
|||||||
{
|
{
|
||||||
if (m_isInRouting)
|
if (m_isInRouting)
|
||||||
{
|
{
|
||||||
ChangeMode(location::FollowAndRotateCompass);
|
ChangeMode(location::FollowAndRotate);
|
||||||
UpdateViewport(kMaxScaleZoomLevel);
|
UpdateViewport(kMaxScaleZoomLevel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -595,8 +552,7 @@ void MyPositionController::LoseLocation()
|
|||||||
{
|
{
|
||||||
if (m_mode == location::NotFollowNoPosition)
|
if (m_mode == location::NotFollowNoPosition)
|
||||||
return;
|
return;
|
||||||
else if (m_mode == location::Follow || m_mode == location::FollowAndRotateCompass ||
|
else if (m_mode == location::Follow || m_mode == location::FollowAndRotate)
|
||||||
m_mode == location::FollowAndRotateRoute)
|
|
||||||
ChangeMode(location::PendingPosition);
|
ChangeMode(location::PendingPosition);
|
||||||
else
|
else
|
||||||
ChangeMode(location::NotFollowNoPosition);
|
ChangeMode(location::NotFollowNoPosition);
|
||||||
@@ -614,11 +570,10 @@ void MyPositionController::OnCompassUpdate(location::CompassInfo const & info, S
|
|||||||
if ((IsInRouting() && m_isArrowGluedInRouting) || existsFreshGpsBearing)
|
if ((IsInRouting() && m_isArrowGluedInRouting) || existsFreshGpsBearing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SetArrowDirection(info.m_bearing);
|
SetDirection(info.m_bearing);
|
||||||
|
|
||||||
if (m_isPositionAssigned && !AlmostCurrentAzimut(oldAzimut) && m_mode == location::FollowAndRotateCompass)
|
if (m_isPositionAssigned && !AlmostCurrentAzimut(oldAzimut) && m_mode == location::FollowAndRotate)
|
||||||
{
|
{
|
||||||
m_direction = info.m_bearing;
|
|
||||||
CreateAnim(GetDrawablePosition(), oldAzimut, screen);
|
CreateAnim(GetDrawablePosition(), oldAzimut, screen);
|
||||||
m_isDirtyViewport = true;
|
m_isDirtyViewport = true;
|
||||||
}
|
}
|
||||||
@@ -627,10 +582,10 @@ void MyPositionController::OnCompassUpdate(location::CompassInfo const & info, S
|
|||||||
bool MyPositionController::UpdateViewportWithAutoZoom()
|
bool MyPositionController::UpdateViewportWithAutoZoom()
|
||||||
{
|
{
|
||||||
double const autoScale = m_enablePerspectiveInRouting ? m_autoScale3d : m_autoScale2d;
|
double const autoScale = m_enablePerspectiveInRouting ? m_autoScale3d : m_autoScale2d;
|
||||||
if (autoScale > 0.0 && (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute) &&
|
if (autoScale > 0.0 && m_mode == location::FollowAndRotate && m_isInRouting && m_enableAutoZoomInRouting &&
|
||||||
m_isInRouting && m_enableAutoZoomInRouting && !m_needBlockAutoZoom)
|
!m_needBlockAutoZoom)
|
||||||
{
|
{
|
||||||
ChangeModelView(autoScale, m_position, m_direction, GetRoutingRotationPixelCenter());
|
ChangeModelView(autoScale, m_position, m_drawDirection, GetRoutingRotationPixelCenter());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -662,7 +617,7 @@ void MyPositionController::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<
|
|||||||
m_shape->SetPositionObsolete(m_positionIsObsolete);
|
m_shape->SetPositionObsolete(m_positionIsObsolete);
|
||||||
m_shape->SetPosition(m2::PointF(GetDrawablePosition()));
|
m_shape->SetPosition(m2::PointF(GetDrawablePosition()));
|
||||||
m_shape->SetAzimuth(static_cast<float>(GetDrawableAzimut()));
|
m_shape->SetAzimuth(static_cast<float>(GetDrawableAzimut()));
|
||||||
m_shape->SetIsValidAzimuth(IsArrowRotationAvailable());
|
m_shape->SetIsValidAzimuth(IsRotationAvailable());
|
||||||
m_shape->SetAccuracy(static_cast<float>(m_errorRadius));
|
m_shape->SetAccuracy(static_cast<float>(m_errorRadius));
|
||||||
m_shape->SetRoutingMode(IsInRouting());
|
m_shape->SetRoutingMode(IsInRouting());
|
||||||
|
|
||||||
@@ -676,7 +631,7 @@ void MyPositionController::Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<
|
|||||||
|
|
||||||
bool MyPositionController::IsRouteFollowingActive() const
|
bool MyPositionController::IsRouteFollowingActive() const
|
||||||
{
|
{
|
||||||
return IsInRouting() && m_mode == location::FollowAndRotateCompass;
|
return IsInRouting() && m_mode == location::FollowAndRotate;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyPositionController::AlmostCurrentPosition(m2::PointD const & pos) const
|
bool MyPositionController::AlmostCurrentPosition(m2::PointD const & pos) const
|
||||||
@@ -688,25 +643,18 @@ bool MyPositionController::AlmostCurrentPosition(m2::PointD const & pos) const
|
|||||||
bool MyPositionController::AlmostCurrentAzimut(double azimut) const
|
bool MyPositionController::AlmostCurrentAzimut(double azimut) const
|
||||||
{
|
{
|
||||||
double constexpr kDirectionEqualityDelta = 1e-3;
|
double constexpr kDirectionEqualityDelta = 1e-3;
|
||||||
return AlmostEqualAbs(azimut, m_direction, kDirectionEqualityDelta);
|
return AlmostEqualAbs(azimut, m_drawDirection, kDirectionEqualityDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPositionController::SetRouteDirection(double bearing)
|
void MyPositionController::SetDirection(double bearing)
|
||||||
{
|
{
|
||||||
m_routeDirection = bearing;
|
m_drawDirection = bearing;
|
||||||
m_isRouteDirectionAssigned = true;
|
m_isDirectionAssigned = true;
|
||||||
}
|
|
||||||
|
|
||||||
void MyPositionController::SetArrowDirection(double bearing)
|
|
||||||
{
|
|
||||||
m_arrowDirection = bearing;
|
|
||||||
m_isArrowDirectionAssigned = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPositionController::ChangeMode(location::EMyPositionMode newMode)
|
void MyPositionController::ChangeMode(location::EMyPositionMode newMode)
|
||||||
{
|
{
|
||||||
if (m_isInRouting && (m_mode != newMode) &&
|
if (m_isInRouting && (m_mode != newMode) && (newMode == location::FollowAndRotate))
|
||||||
(newMode == location::FollowAndRotateCompass || newMode == location::FollowAndRotateRoute))
|
|
||||||
ResetBlockAutoZoomTimer();
|
ResetBlockAutoZoomTimer();
|
||||||
|
|
||||||
m_mode = newMode;
|
m_mode = newMode;
|
||||||
@@ -727,8 +675,7 @@ bool MyPositionController::IsWaitingForLocation() const
|
|||||||
|
|
||||||
void MyPositionController::StopLocationFollow()
|
void MyPositionController::StopLocationFollow()
|
||||||
{
|
{
|
||||||
if (m_mode == location::Follow || m_mode == location::FollowAndRotateCompass ||
|
if (m_mode == location::Follow || m_mode == location::FollowAndRotate)
|
||||||
m_mode == location::FollowAndRotateRoute)
|
|
||||||
ChangeMode(location::NotFollow);
|
ChangeMode(location::NotFollow);
|
||||||
m_desiredInitMode = location::NotFollow;
|
m_desiredInitMode = location::NotFollow;
|
||||||
|
|
||||||
@@ -743,7 +690,7 @@ void MyPositionController::OnEnterForeground(double backgroundTime)
|
|||||||
// When location was active during previous session the app will try to follow the user.
|
// When location was active during previous session the app will try to follow the user.
|
||||||
if (m_mode == location::NotFollow)
|
if (m_mode == location::NotFollow)
|
||||||
{
|
{
|
||||||
ChangeMode(m_isInRouting ? location::FollowAndRotateCompass : location::Follow);
|
ChangeMode(m_isInRouting ? location::FollowAndRotate : location::Follow);
|
||||||
UpdateViewport(kDoNotChangeZoom);
|
UpdateViewport(kDoNotChangeZoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -759,7 +706,7 @@ void MyPositionController::OnEnterBackground() {}
|
|||||||
|
|
||||||
void MyPositionController::OnCompassTapped()
|
void MyPositionController::OnCompassTapped()
|
||||||
{
|
{
|
||||||
if (m_mode == location::FollowAndRotateCompass)
|
if (m_mode == location::FollowAndRotate)
|
||||||
{
|
{
|
||||||
ChangeMode(location::Follow);
|
ChangeMode(location::Follow);
|
||||||
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
|
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
|
||||||
@@ -816,9 +763,9 @@ void MyPositionController::UpdateViewport(int zoomLevel)
|
|||||||
{
|
{
|
||||||
ChangeModelView(m_position, zoomLevel);
|
ChangeModelView(m_position, zoomLevel);
|
||||||
}
|
}
|
||||||
else if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
|
else if (m_mode == location::FollowAndRotate)
|
||||||
{
|
{
|
||||||
ChangeModelView(m_position, m_direction,
|
ChangeModelView(m_position, m_drawDirection,
|
||||||
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(), zoomLevel);
|
m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center(), zoomLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -828,7 +775,7 @@ m2::PointD MyPositionController::GetRotationPixelCenter() const
|
|||||||
if (m_mode == location::Follow)
|
if (m_mode == location::Follow)
|
||||||
return m_visiblePixelRect.Center();
|
return m_visiblePixelRect.Center();
|
||||||
|
|
||||||
if (m_mode == location::FollowAndRotateCompass || m_mode == location::FollowAndRotateRoute)
|
if (m_mode == location::FollowAndRotate)
|
||||||
return m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center();
|
return m_isInRouting ? GetRoutingRotationPixelCenter() : m_visiblePixelRect.Center();
|
||||||
|
|
||||||
return m2::PointD::Zero();
|
return m2::PointD::Zero();
|
||||||
@@ -870,15 +817,15 @@ double MyPositionController::GetDrawableAzimut()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_isPendingAnimation)
|
if (m_isPendingAnimation)
|
||||||
return m_oldArrowDirection;
|
return m_oldDrawDirection;
|
||||||
|
|
||||||
return m_arrowDirection;
|
return m_drawDirection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimut, ScreenBase const & screen)
|
void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimut, ScreenBase const & screen)
|
||||||
{
|
{
|
||||||
double const moveDuration = PositionInterpolator::GetMoveDuration(oldPos, m_position, screen);
|
double const moveDuration = PositionInterpolator::GetMoveDuration(oldPos, m_position, screen);
|
||||||
double const rotateDuration = AngleInterpolator::GetRotateDuration(oldAzimut, m_arrowDirection);
|
double const rotateDuration = AngleInterpolator::GetRotateDuration(oldAzimut, m_drawDirection);
|
||||||
if (df::IsAnimationAllowed(std::max(moveDuration, rotateDuration), screen))
|
if (df::IsAnimationAllowed(std::max(moveDuration, rotateDuration), screen))
|
||||||
{
|
{
|
||||||
if (IsModeChangeViewport())
|
if (IsModeChangeViewport())
|
||||||
@@ -887,7 +834,7 @@ void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimu
|
|||||||
{
|
{
|
||||||
drape_ptr<Animation> anim = make_unique_dp<ArrowAnimation>(
|
drape_ptr<Animation> anim = make_unique_dp<ArrowAnimation>(
|
||||||
GetDrawablePosition(), m_position, syncAnim == nullptr ? moveDuration : syncAnim->GetDuration(),
|
GetDrawablePosition(), m_position, syncAnim == nullptr ? moveDuration : syncAnim->GetDuration(),
|
||||||
GetDrawableAzimut(), m_arrowDirection);
|
GetDrawableAzimut(), m_drawDirection);
|
||||||
if (syncAnim != nullptr)
|
if (syncAnim != nullptr)
|
||||||
{
|
{
|
||||||
anim->SetMaxDuration(syncAnim->GetMaxDuration());
|
anim->SetMaxDuration(syncAnim->GetMaxDuration());
|
||||||
@@ -896,13 +843,13 @@ void MyPositionController::CreateAnim(m2::PointD const & oldPos, double oldAzimu
|
|||||||
return anim;
|
return anim;
|
||||||
};
|
};
|
||||||
m_oldPosition = oldPos;
|
m_oldPosition = oldPos;
|
||||||
m_oldArrowDirection = oldAzimut;
|
m_oldDrawDirection = oldAzimut;
|
||||||
m_isPendingAnimation = true;
|
m_isPendingAnimation = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AnimationSystem::Instance().CombineAnimation(
|
AnimationSystem::Instance().CombineAnimation(
|
||||||
make_unique_dp<ArrowAnimation>(oldPos, m_position, moveDuration, oldAzimut, m_arrowDirection));
|
make_unique_dp<ArrowAnimation>(oldPos, m_position, moveDuration, oldAzimut, m_drawDirection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -921,18 +868,16 @@ void MyPositionController::EnableAutoZoomInRouting(bool enableAutoZoom)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyPositionController::ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued,
|
void MyPositionController::ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued)
|
||||||
bool allowRouteRotation)
|
|
||||||
{
|
{
|
||||||
if (!m_isInRouting)
|
if (!m_isInRouting)
|
||||||
{
|
{
|
||||||
m_isInRouting = true;
|
m_isInRouting = true;
|
||||||
m_isArrowGluedInRouting = isArrowGlued;
|
m_isArrowGluedInRouting = isArrowGlued;
|
||||||
m_enableAutoZoomInRouting = enableAutoZoom;
|
m_enableAutoZoomInRouting = enableAutoZoom;
|
||||||
m_allowRouteRotationInRouting = allowRouteRotation;
|
|
||||||
|
|
||||||
ChangeMode(location::FollowAndRotateCompass);
|
ChangeMode(location::FollowAndRotate);
|
||||||
ChangeModelView(m_position, m_isRouteDirectionAssigned ? m_routeDirection : 0.0, GetRoutingRotationPixelCenter(),
|
ChangeModelView(m_position, m_isDirectionAssigned ? m_drawDirection : 0.0, GetRoutingRotationPixelCenter(),
|
||||||
zoomLevel, [this](ref_ptr<Animation> anim) { UpdateViewport(kDoNotChangeZoom); });
|
zoomLevel, [this](ref_ptr<Animation> anim) { UpdateViewport(kDoNotChangeZoom); });
|
||||||
ResetRoutingNotFollowTimer();
|
ResetRoutingNotFollowTimer();
|
||||||
}
|
}
|
||||||
@@ -944,10 +889,8 @@ void MyPositionController::DeactivateRouting()
|
|||||||
{
|
{
|
||||||
m_isInRouting = false;
|
m_isInRouting = false;
|
||||||
m_isArrowGluedInRouting = false;
|
m_isArrowGluedInRouting = false;
|
||||||
m_allowRouteRotationInRouting = false;
|
|
||||||
|
|
||||||
m_isArrowDirectionAssigned = m_isCompassAvailable && m_isArrowDirectionAssigned;
|
m_isDirectionAssigned = m_isCompassAvailable && m_isDirectionAssigned;
|
||||||
m_isRouteDirectionAssigned = false;
|
|
||||||
|
|
||||||
ChangeMode(location::Follow);
|
ChangeMode(location::Follow);
|
||||||
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
|
ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), kDoNotChangeZoom);
|
||||||
@@ -976,7 +919,7 @@ void MyPositionController::CheckNotFollowRouting()
|
|||||||
CHECK_ON_TIMEOUT(m_routingNotFollowNotifyId, kMaxNotFollowRoutingTimeSec, CheckNotFollowRouting);
|
CHECK_ON_TIMEOUT(m_routingNotFollowNotifyId, kMaxNotFollowRoutingTimeSec, CheckNotFollowRouting);
|
||||||
if (m_routingNotFollowTimer.ElapsedSeconds() >= kMaxNotFollowRoutingTimeSec)
|
if (m_routingNotFollowTimer.ElapsedSeconds() >= kMaxNotFollowRoutingTimeSec)
|
||||||
{
|
{
|
||||||
ChangeMode(location::FollowAndRotateCompass);
|
ChangeMode(location::FollowAndRotate);
|
||||||
UpdateViewport(kDoNotChangeZoom);
|
UpdateViewport(kDoNotChangeZoom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include "drape/pointers.hpp"
|
#include "drape/pointers.hpp"
|
||||||
|
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
#include "shaders/program_manager.hpp"
|
#include "shaders/program_manager.hpp"
|
||||||
|
|
||||||
#include "platform/location.hpp"
|
#include "platform/location.hpp"
|
||||||
@@ -25,24 +24,6 @@ using TAnimationCreator = std::function<drape_ptr<Animation>(ref_ptr<Animation>)
|
|||||||
|
|
||||||
class DrapeNotifier;
|
class DrapeNotifier;
|
||||||
|
|
||||||
struct NavigationContext
|
|
||||||
{
|
|
||||||
bool m_isNavigable = false;
|
|
||||||
double m_distanceToNextTurn = 0.0;
|
|
||||||
double m_speedLimit = 0.0;
|
|
||||||
routing::FollowedPolyline const * m_followedPolyline = nullptr;
|
|
||||||
|
|
||||||
NavigationContext() = default;
|
|
||||||
|
|
||||||
NavigationContext(bool navigable, double distanceToTurn, double speedLimit,
|
|
||||||
routing::FollowedPolyline const & followedPolyline)
|
|
||||||
: m_isNavigable(navigable)
|
|
||||||
, m_distanceToNextTurn(distanceToTurn)
|
|
||||||
, m_speedLimit(speedLimit)
|
|
||||||
, m_followedPolyline(&followedPolyline)
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
class MyPositionController
|
class MyPositionController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -121,7 +102,7 @@ public:
|
|||||||
drape_ptr<MyPosition> && shape, Arrow3d::PreloadedData && preloadedData);
|
drape_ptr<MyPosition> && shape, Arrow3d::PreloadedData && preloadedData);
|
||||||
void ResetRenderShape();
|
void ResetRenderShape();
|
||||||
|
|
||||||
void ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued, bool allowRouteRotation);
|
void ActivateRouting(int zoomLevel, bool enableAutoZoom, bool isArrowGlued);
|
||||||
void DeactivateRouting();
|
void DeactivateRouting();
|
||||||
|
|
||||||
void EnablePerspectiveInRouting(bool enablePerspective);
|
void EnablePerspectiveInRouting(bool enablePerspective);
|
||||||
@@ -136,15 +117,14 @@ public:
|
|||||||
void OnEnterBackground();
|
void OnEnterBackground();
|
||||||
|
|
||||||
void OnCompassTapped();
|
void OnCompassTapped();
|
||||||
void OnLocationUpdate(location::GpsInfo const & info, df::NavigationContext const & navigationContext,
|
void OnLocationUpdate(location::GpsInfo const & info, bool isNavigable, double distanceToNextTurn, double speedLimit,
|
||||||
ScreenBase const & screen);
|
ScreenBase const & screen);
|
||||||
void OnCompassUpdate(location::CompassInfo const & info, ScreenBase const & screen);
|
void OnCompassUpdate(location::CompassInfo const & info, ScreenBase const & screen);
|
||||||
|
|
||||||
void Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
|
void Render(ref_ptr<dp::GraphicsContext> context, ref_ptr<gpu::ProgramManager> mng, ScreenBase const & screen,
|
||||||
int zoomLevel, FrameValues const & frameValues);
|
int zoomLevel, FrameValues const & frameValues);
|
||||||
|
|
||||||
bool IsArrowRotationAvailable() const { return m_isArrowDirectionAssigned; }
|
bool IsRotationAvailable() const { return m_isDirectionAssigned; }
|
||||||
bool IsRouteRotationAvailable() const { return m_isRouteDirectionAssigned; }
|
|
||||||
bool IsInRouting() const { return m_isInRouting; }
|
bool IsInRouting() const { return m_isInRouting; }
|
||||||
bool IsRouteFollowingActive() const;
|
bool IsRouteFollowingActive() const;
|
||||||
bool IsModeChangeViewport() const;
|
bool IsModeChangeViewport() const;
|
||||||
@@ -155,8 +135,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void ChangeMode(location::EMyPositionMode newMode);
|
void ChangeMode(location::EMyPositionMode newMode);
|
||||||
void SetRouteDirection(double bearing);
|
void SetDirection(double bearing);
|
||||||
void SetArrowDirection(double bearing);
|
|
||||||
|
|
||||||
void ChangeModelView(m2::PointD const & center, int zoomLevel);
|
void ChangeModelView(m2::PointD const & center, int zoomLevel);
|
||||||
void ChangeModelView(double azimuth);
|
void ChangeModelView(double azimuth);
|
||||||
@@ -199,15 +178,12 @@ private:
|
|||||||
double m_errorRadius; // error radius in mercator.
|
double m_errorRadius; // error radius in mercator.
|
||||||
double m_horizontalAccuracy;
|
double m_horizontalAccuracy;
|
||||||
m2::PointD m_position; // position in mercator.
|
m2::PointD m_position; // position in mercator.
|
||||||
double m_direction;
|
double m_drawDirection;
|
||||||
double m_routeDirection;
|
|
||||||
double m_arrowDirection;
|
|
||||||
m2::PointD m_oldPosition; // position in mercator.
|
m2::PointD m_oldPosition; // position in mercator.
|
||||||
double m_oldArrowDirection;
|
double m_oldDrawDirection;
|
||||||
|
|
||||||
bool m_enablePerspectiveInRouting;
|
bool m_enablePerspectiveInRouting;
|
||||||
bool m_enableAutoZoomInRouting;
|
bool m_enableAutoZoomInRouting;
|
||||||
bool m_allowRouteRotationInRouting;
|
|
||||||
double m_autoScale2d;
|
double m_autoScale2d;
|
||||||
double m_autoScale3d;
|
double m_autoScale3d;
|
||||||
|
|
||||||
@@ -229,8 +205,7 @@ private:
|
|||||||
TAnimationCreator m_animCreator;
|
TAnimationCreator m_animCreator;
|
||||||
|
|
||||||
bool m_isPositionAssigned;
|
bool m_isPositionAssigned;
|
||||||
bool m_isArrowDirectionAssigned;
|
bool m_isDirectionAssigned;
|
||||||
bool m_isRouteDirectionAssigned;
|
|
||||||
bool m_isCompassAvailable;
|
bool m_isCompassAvailable;
|
||||||
|
|
||||||
bool m_positionIsObsolete;
|
bool m_positionIsObsolete;
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ namespace df
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
uint64_t constexpr kDoubleTapPauseMs = 200;
|
uint64_t constexpr kDoubleTapPauseMs = 250;
|
||||||
uint64_t constexpr kLongTouchMs = 700;
|
uint64_t constexpr kLongTouchMs = 500;
|
||||||
uint64_t constexpr kKineticDelayMs = 500;
|
uint64_t constexpr kKineticDelayMs = 500;
|
||||||
|
|
||||||
float constexpr kForceTapThreshold = 0.75;
|
float constexpr kForceTapThreshold = 0.75;
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ set(SRC
|
|||||||
edits_migration.hpp
|
edits_migration.hpp
|
||||||
feature_matcher.cpp
|
feature_matcher.cpp
|
||||||
feature_matcher.hpp
|
feature_matcher.hpp
|
||||||
feature_type_to_osm.cpp
|
|
||||||
feature_type_to_osm.hpp
|
|
||||||
new_feature_categories.cpp
|
new_feature_categories.cpp
|
||||||
new_feature_categories.hpp
|
new_feature_categories.hpp
|
||||||
opening_hours_ui.cpp
|
opening_hours_ui.cpp
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ set(SRC
|
|||||||
editor_config_test.cpp
|
editor_config_test.cpp
|
||||||
editor_notes_test.cpp
|
editor_notes_test.cpp
|
||||||
feature_matcher_test.cpp
|
feature_matcher_test.cpp
|
||||||
feature_type_to_osm_test.cpp
|
|
||||||
match_by_geometry_test.cpp
|
match_by_geometry_test.cpp
|
||||||
new_feature_categories_test.cpp
|
new_feature_categories_test.cpp
|
||||||
opening_hours_ui_test.cpp
|
opening_hours_ui_test.cpp
|
||||||
|
|||||||
@@ -1,224 +0,0 @@
|
|||||||
#include "testing/testing.hpp"
|
|
||||||
|
|
||||||
#include "editor/feature_type_to_osm.hpp"
|
|
||||||
|
|
||||||
#include "indexer/classificator.hpp"
|
|
||||||
#include "indexer/classificator_loader.hpp"
|
|
||||||
|
|
||||||
using namespace editor;
|
|
||||||
|
|
||||||
UNIT_TEST(simpleType)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"amenity|restaurant;61;\n"
|
|
||||||
"amenity|bicycle_parking;1071;\n";
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
|
|
||||||
uint32_t type = classif().GetTypeByReadableObjectName("amenity-restaurant");
|
|
||||||
std::vector<OSMTag> result = translator.OsmTagsFromType(type);
|
|
||||||
TEST_EQUAL(result.size(), 1, ());
|
|
||||||
TEST_EQUAL(result[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(result[0].value, "restaurant", ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(simpleTypeWithTags)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"building;[building];;addr:housenumber;name;1;\n"
|
|
||||||
"amenity|school;[amenity=school],[education=school];;name;int_name;36;\n"
|
|
||||||
"amenity|doctors;[amenity=doctors][healthcare=doctor],[amenity=doctors],[healthcare=doctor];;name;int_name;207;\n";
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
|
|
||||||
uint32_t buildingType = classif().GetTypeByReadableObjectName("building");
|
|
||||||
std::vector<OSMTag> buildingResult = translator.OsmTagsFromType(buildingType);
|
|
||||||
TEST_EQUAL(buildingResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(buildingResult[0].key, "building", ());
|
|
||||||
TEST_EQUAL(buildingResult[0].value, "yes", ());
|
|
||||||
|
|
||||||
uint32_t schoolType = classif().GetTypeByReadableObjectName("amenity-school");
|
|
||||||
std::vector<OSMTag> schoolResult = translator.OsmTagsFromType(schoolType);
|
|
||||||
TEST_EQUAL(schoolResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(schoolResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(schoolResult[0].value, "school", ());
|
|
||||||
|
|
||||||
uint32_t doctorType = classif().GetTypeByReadableObjectName("amenity-doctors");
|
|
||||||
std::vector<OSMTag> doctorResult = translator.OsmTagsFromType(doctorType);
|
|
||||||
TEST_EQUAL(doctorResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(doctorResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(doctorResult[0].value, "doctors", ());
|
|
||||||
TEST_EQUAL(doctorResult[1].key, "healthcare", ());
|
|
||||||
TEST_EQUAL(doctorResult[1].value, "doctor", ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(complexType)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"building;[building];;addr:housenumber;name;1;\n"
|
|
||||||
" # comment that should be ignored\n"
|
|
||||||
"\n"
|
|
||||||
"amenity|restaurant;61;\n"
|
|
||||||
"tourism|information|office;[tourism=information][information=office];;name;int_name;313;\n"
|
|
||||||
"historic|castle|fortress;[historic=castle][castle_type=fortress],[historic=fortress];;name;int_name;1144;\n"
|
|
||||||
"#comment\n"
|
|
||||||
"amenity|place_of_worship|christian|mormon;[amenity=place_of_worship][religion=christian][denomination=mormon];;name;int_name;1572;\n";
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
|
|
||||||
uint32_t officeType = classif().GetTypeByReadableObjectName("tourism-information-office");
|
|
||||||
std::vector<OSMTag> officeResult = translator.OsmTagsFromType(officeType);
|
|
||||||
TEST_EQUAL(officeResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(officeResult[0].key, "tourism", ());
|
|
||||||
TEST_EQUAL(officeResult[0].value, "information", ());
|
|
||||||
TEST_EQUAL(officeResult[1].key, "information", ());
|
|
||||||
TEST_EQUAL(officeResult[1].value, "office", ());
|
|
||||||
|
|
||||||
uint32_t fortressType = classif().GetTypeByReadableObjectName("historic-castle-fortress");
|
|
||||||
std::vector<OSMTag> fortressResult = translator.OsmTagsFromType(fortressType);
|
|
||||||
TEST_EQUAL(fortressResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(fortressResult[0].key, "historic", ());
|
|
||||||
TEST_EQUAL(fortressResult[0].value, "castle", ());
|
|
||||||
TEST_EQUAL(fortressResult[1].key, "castle_type", ());
|
|
||||||
TEST_EQUAL(fortressResult[1].value, "fortress", ());
|
|
||||||
|
|
||||||
uint32_t mormonType = classif().GetTypeByReadableObjectName("amenity-place_of_worship-christian-mormon");
|
|
||||||
std::vector<OSMTag> mormonResult = translator.OsmTagsFromType(mormonType);
|
|
||||||
TEST_EQUAL(mormonResult.size(), 3, ());
|
|
||||||
TEST_EQUAL(mormonResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(mormonResult[0].value, "place_of_worship", ());
|
|
||||||
TEST_EQUAL(mormonResult[1].key, "religion", ());
|
|
||||||
TEST_EQUAL(mormonResult[1].value, "christian", ());
|
|
||||||
TEST_EQUAL(mormonResult[2].key, "denomination", ());
|
|
||||||
TEST_EQUAL(mormonResult[2].value, "mormon", ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(mandatorySelector)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"amenity|parking|fee;[amenity=parking][fee];;name;int_name;125;\n"
|
|
||||||
"highway|track|bridge;[highway=track][bridge?];;name;int_name;193;\n"
|
|
||||||
"shop;[shop?];;name;int_name;943;\n"
|
|
||||||
"disusedbusiness;[disused:shop?],[disused:amenity=restaurant],[disused:amenity=fast_food],[disused:amenity=cafe],[disused:amenity=pub],[disused:amenity=bar];;;;1237;\n";
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
|
|
||||||
uint32_t parkingType = classif().GetTypeByReadableObjectName("amenity-parking-fee");
|
|
||||||
std::vector<OSMTag> parkingResult = translator.OsmTagsFromType(parkingType);
|
|
||||||
TEST_EQUAL(parkingResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(parkingResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(parkingResult[0].value, "parking", ());
|
|
||||||
TEST_EQUAL(parkingResult[1].key, "fee", ());
|
|
||||||
TEST_EQUAL(parkingResult[1].value, "yes", ());
|
|
||||||
|
|
||||||
uint32_t trackType = classif().GetTypeByReadableObjectName("highway-track-bridge");
|
|
||||||
std::vector<OSMTag> trackResult = translator.OsmTagsFromType(trackType);
|
|
||||||
TEST_EQUAL(trackResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(trackResult[0].key, "highway", ());
|
|
||||||
TEST_EQUAL(trackResult[0].value, "track", ());
|
|
||||||
TEST_EQUAL(trackResult[1].key, "bridge", ());
|
|
||||||
TEST_EQUAL(trackResult[1].value, "yes", ());
|
|
||||||
|
|
||||||
uint32_t shopType = classif().GetTypeByReadableObjectName("shop");
|
|
||||||
std::vector<OSMTag> shopResult = translator.OsmTagsFromType(shopType);
|
|
||||||
TEST_EQUAL(shopResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(shopResult[0].key, "shop", ());
|
|
||||||
TEST_EQUAL(shopResult[0].value, "yes", ());
|
|
||||||
|
|
||||||
uint32_t disusedType = classif().GetTypeByReadableObjectName("disusedbusiness");
|
|
||||||
std::vector<OSMTag> disusedResult = translator.OsmTagsFromType(disusedType);
|
|
||||||
TEST_EQUAL(disusedResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(disusedResult[0].key, "disused:shop", ());
|
|
||||||
TEST_EQUAL(disusedResult[0].value, "yes", ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(forbiddenSelector)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"amenity|lounger;[amenity=lounger][!seasonal];;name;int_name;153;\n"
|
|
||||||
"amenity|charging_station|motorcar|small;[amenity=charging_station][motorcar?][!capacity],[amenity=charging_station][motorcar?][capacity=1],[amenity=charging_station][motorcar?][capacity=2];;name;int_name;201;\n";
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
|
|
||||||
uint32_t loungerType = classif().GetTypeByReadableObjectName("amenity-lounger");
|
|
||||||
std::vector<OSMTag> loungerResult = translator.OsmTagsFromType(loungerType);
|
|
||||||
TEST_EQUAL(loungerResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(loungerResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(loungerResult[0].value, "lounger", ());
|
|
||||||
|
|
||||||
uint32_t chargingType = classif().GetTypeByReadableObjectName("amenity-charging_station-motorcar-small");
|
|
||||||
std::vector<OSMTag> chargingResult = translator.OsmTagsFromType(chargingType);
|
|
||||||
TEST_EQUAL(chargingResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(chargingResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(chargingResult[0].value, "charging_station", ());
|
|
||||||
TEST_EQUAL(chargingResult[1].key, "motorcar", ());
|
|
||||||
TEST_EQUAL(chargingResult[1].value, "yes", ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(ignoreComments)
|
|
||||||
{
|
|
||||||
std::string data =
|
|
||||||
"building;[building];;addr:housenumber;name;1;\n"
|
|
||||||
" # comment that should be ignored\n"
|
|
||||||
"\n"
|
|
||||||
"deprecated:waterway|riverbank:05.2024;52;x\n"
|
|
||||||
"amenity|restaurant;61;\n"
|
|
||||||
"moved:amenity|telephone:05.2024;122;amenity|telephone\n"
|
|
||||||
"natural|lake;564;natural|water|lake\n"; // moved type, should be ignored
|
|
||||||
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
std::stringstream s(data);
|
|
||||||
translator.LoadFromStream(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(loadConfigFile)
|
|
||||||
{
|
|
||||||
TypeToOSMTranslator translator(false);
|
|
||||||
translator.LoadConfigFile();
|
|
||||||
|
|
||||||
size_t size = translator.GetStorage().size();
|
|
||||||
LOG(LINFO, ("Size of feature type storage:", size));
|
|
||||||
ASSERT(size > 1300, ());
|
|
||||||
ASSERT(size < 1700, ());
|
|
||||||
}
|
|
||||||
|
|
||||||
UNIT_TEST(testWithRealFile)
|
|
||||||
{
|
|
||||||
classificator::Load();
|
|
||||||
|
|
||||||
uint32_t restaurantType = classif().GetTypeByReadableObjectName("amenity-restaurant");
|
|
||||||
std::vector<OSMTag> restaurantResult = GetOSMTranslator().OsmTagsFromType(restaurantType);
|
|
||||||
TEST_EQUAL(restaurantResult.size(), 1, ());
|
|
||||||
TEST_EQUAL(restaurantResult[0].key, "amenity", ());
|
|
||||||
TEST_EQUAL(restaurantResult[0].value, "restaurant", ());
|
|
||||||
|
|
||||||
uint32_t officeType = classif().GetTypeByReadableObjectName("tourism-information-office");
|
|
||||||
std::vector<OSMTag> officeResult = GetOSMTranslator().OsmTagsFromType(officeType);
|
|
||||||
TEST_EQUAL(officeResult.size(), 2, ());
|
|
||||||
TEST_EQUAL(officeResult[0].key, "tourism", ());
|
|
||||||
TEST_EQUAL(officeResult[0].value, "information", ());
|
|
||||||
TEST_EQUAL(officeResult[1].key, "information", ());
|
|
||||||
TEST_EQUAL(officeResult[1].value, "office", ());
|
|
||||||
}
|
|
||||||
@@ -406,7 +406,7 @@ void EditorTest::GetFeatureStatusTest()
|
|||||||
TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), FeatureStatus::Created, ());
|
TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), FeatureStatus::Created, ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorTest::AreSomeFeatureChangesUploadedTest()
|
void EditorTest::IsFeatureUploadedTest()
|
||||||
{
|
{
|
||||||
auto & editor = osm::Editor::Instance();
|
auto & editor = osm::Editor::Instance();
|
||||||
|
|
||||||
@@ -419,25 +419,19 @@ void EditorTest::AreSomeFeatureChangesUploadedTest()
|
|||||||
});
|
});
|
||||||
|
|
||||||
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft)
|
ForEachCafeAtPoint(m_dataSource, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft)
|
||||||
{ TEST(!editor.AreSomeFeatureChangesUploaded(ft.GetID().m_mwmId, ft.GetID().m_index), ()); });
|
{ TEST(!editor.IsFeatureUploaded(ft.GetID().m_mwmId, ft.GetID().m_index), ()); });
|
||||||
|
|
||||||
osm::EditableMapObject emo;
|
osm::EditableMapObject emo;
|
||||||
CreateCafeAtPoint({3.0, 3.0}, mwmId, emo);
|
CreateCafeAtPoint({3.0, 3.0}, mwmId, emo);
|
||||||
|
|
||||||
TEST(!editor.AreSomeFeatureChangesUploaded(emo.GetID().m_mwmId, emo.GetID().m_index), ());
|
TEST(!editor.IsFeatureUploaded(emo.GetID().m_mwmId, emo.GetID().m_index), ());
|
||||||
|
|
||||||
// generate journal with uploaded changes
|
|
||||||
osm::EditJournal journal;
|
|
||||||
journal.AddTagChange("addr:housenumber", "", "42");
|
|
||||||
journal.Clear();
|
|
||||||
emo.SetJournal(std::move(journal));
|
|
||||||
|
|
||||||
pugi::xml_document doc;
|
pugi::xml_document doc;
|
||||||
GenerateUploadedFeature(mwmId, emo, doc);
|
GenerateUploadedFeature(mwmId, emo, doc);
|
||||||
editor.m_storage->Save(doc);
|
editor.m_storage->Save(doc);
|
||||||
editor.LoadEdits();
|
editor.LoadEdits();
|
||||||
|
|
||||||
TEST(editor.AreSomeFeatureChangesUploaded(emo.GetID().m_mwmId, emo.GetID().m_index), ());
|
TEST(editor.IsFeatureUploaded(emo.GetID().m_mwmId, emo.GetID().m_index), ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorTest::DeleteFeatureTest()
|
void EditorTest::DeleteFeatureTest()
|
||||||
@@ -1315,9 +1309,9 @@ UNIT_CLASS_TEST(EditorTest, GetFeatureStatusTest)
|
|||||||
EditorTest::GetFeatureStatusTest();
|
EditorTest::GetFeatureStatusTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIT_CLASS_TEST(EditorTest, AreSomeFeatureChangesUploadedTest)
|
UNIT_CLASS_TEST(EditorTest, IsFeatureUploadedTest)
|
||||||
{
|
{
|
||||||
EditorTest::AreSomeFeatureChangesUploadedTest();
|
EditorTest::IsFeatureUploadedTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNIT_CLASS_TEST(EditorTest, DeleteFeatureTest)
|
UNIT_CLASS_TEST(EditorTest, DeleteFeatureTest)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public:
|
|||||||
void SetIndexTest();
|
void SetIndexTest();
|
||||||
void GetEditedFeatureStreetTest();
|
void GetEditedFeatureStreetTest();
|
||||||
void GetFeatureStatusTest();
|
void GetFeatureStatusTest();
|
||||||
void AreSomeFeatureChangesUploadedTest();
|
void IsFeatureUploadedTest();
|
||||||
void DeleteFeatureTest();
|
void DeleteFeatureTest();
|
||||||
void ClearAllLocalEditsTest();
|
void ClearAllLocalEditsTest();
|
||||||
void GetFeaturesByStatusTest();
|
void GetFeaturesByStatusTest();
|
||||||
|
|||||||
@@ -1,166 +0,0 @@
|
|||||||
#include "editor/feature_type_to_osm.hpp"
|
|
||||||
|
|
||||||
#include "base/assert.hpp"
|
|
||||||
#include "coding/reader_streambuf.hpp"
|
|
||||||
#include "indexer/classificator.hpp"
|
|
||||||
#include "platform/platform.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace editor
|
|
||||||
{
|
|
||||||
TypeToOSMTranslator::TypeToOSMTranslator(bool initialize)
|
|
||||||
{
|
|
||||||
if (initialize)
|
|
||||||
LoadConfigFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TypeToOSMTranslator::LoadConfigFile()
|
|
||||||
{
|
|
||||||
Platform & p = GetPlatform();
|
|
||||||
std::unique_ptr<ModelReader> reader = p.GetReader("mapcss-mapping.csv");
|
|
||||||
ReaderStreamBuf buffer(std::move(reader));
|
|
||||||
std::istream s(&buffer);
|
|
||||||
|
|
||||||
LoadFromStream(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TypeToOSMTranslator::LoadFromStream(std::istream & s)
|
|
||||||
{
|
|
||||||
m_storage.clear();
|
|
||||||
|
|
||||||
std::string line;
|
|
||||||
while (s.good())
|
|
||||||
{
|
|
||||||
getline(s, line);
|
|
||||||
strings::Trim(line);
|
|
||||||
|
|
||||||
// skip empty lines, comments, deprecated and moved types
|
|
||||||
if (line.empty() || line.front() == '#' || line.starts_with("deprecated") || line.starts_with("moved") ||
|
|
||||||
line.back() != ';')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
std::vector<std::string_view> const rowTokens = strings::Tokenize(line, ";");
|
|
||||||
if (rowTokens.size() < 2)
|
|
||||||
{
|
|
||||||
ASSERT(false, ("Invalid feature type definition:", line));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get internal feature type
|
|
||||||
std::vector<std::string_view> const featureTypeTokens = strings::Tokenize(rowTokens[0], "|");
|
|
||||||
uint32_t const type = classif().GetTypeByPathSafe(featureTypeTokens);
|
|
||||||
ASSERT(type != IndexAndTypeMapping::INVALID_TYPE, ("Feature with invalid type:", line));
|
|
||||||
|
|
||||||
if (rowTokens.size() == 2)
|
|
||||||
{
|
|
||||||
// Derive OSM tags from type name
|
|
||||||
ASSERT(featureTypeTokens.size() <= 2, ("OSM tags can not be inferred from name:", line));
|
|
||||||
|
|
||||||
OSMTag osmTag;
|
|
||||||
|
|
||||||
// e.g. "amenity-restaurant"
|
|
||||||
if (featureTypeTokens.size() >= 2)
|
|
||||||
{
|
|
||||||
osmTag.key = featureTypeTokens[0];
|
|
||||||
osmTag.value = featureTypeTokens[1];
|
|
||||||
}
|
|
||||||
// e.g. "building"
|
|
||||||
else if (featureTypeTokens.size() == 1)
|
|
||||||
{
|
|
||||||
osmTag.key = featureTypeTokens[0];
|
|
||||||
osmTag.value = "yes";
|
|
||||||
}
|
|
||||||
|
|
||||||
m_storage.insert({type, {osmTag}});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// OSM tags are listed in the feature type entry
|
|
||||||
std::vector<std::string_view> const osmTagTokens = strings::Tokenize(rowTokens[1], ",");
|
|
||||||
|
|
||||||
// First entry is the best practice way to tag a feature
|
|
||||||
std::string_view const osmTagList = osmTagTokens[0];
|
|
||||||
|
|
||||||
// Process OSM tag list (e.g. "[tourism=information][information=office]")
|
|
||||||
std::vector<OSMTag> osmTags;
|
|
||||||
size_t pos = 0;
|
|
||||||
|
|
||||||
while ((pos = osmTagList.find('[', pos)) != std::string::npos)
|
|
||||||
{
|
|
||||||
size_t end = osmTagList.find(']', pos);
|
|
||||||
|
|
||||||
if (end == std::string::npos)
|
|
||||||
{
|
|
||||||
ASSERT(false, ("Bracket not closed in OSM tag:", line));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string_view keyValuePair = osmTagList.substr(pos + 1, end - pos - 1);
|
|
||||||
|
|
||||||
if (keyValuePair.empty())
|
|
||||||
{
|
|
||||||
ASSERT(false, ("Key value pair is empty:", line));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t equalSign = keyValuePair.find('=');
|
|
||||||
if (equalSign != std::string::npos)
|
|
||||||
{
|
|
||||||
// Tags in key=value format
|
|
||||||
OSMTag osmTag;
|
|
||||||
osmTag.key = keyValuePair.substr(0, equalSign);
|
|
||||||
osmTag.value = keyValuePair.substr(equalSign + 1);
|
|
||||||
|
|
||||||
// mapcss-mapping.csv uses 'not' instead of 'no' as a workaround for the rendering engine
|
|
||||||
if (osmTag.value == "not")
|
|
||||||
osmTag.value = "no";
|
|
||||||
|
|
||||||
osmTags.push_back(osmTag);
|
|
||||||
}
|
|
||||||
else if (keyValuePair.front() == '!')
|
|
||||||
{
|
|
||||||
// Tags with "forbidden" selector '!' are skipped
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Tags with optional "mandatory" selector '?'
|
|
||||||
if (keyValuePair.back() == '?')
|
|
||||||
keyValuePair.remove_suffix(1);
|
|
||||||
|
|
||||||
OSMTag osmTag;
|
|
||||||
osmTag.key = keyValuePair;
|
|
||||||
osmTag.value = "yes";
|
|
||||||
|
|
||||||
osmTags.push_back(osmTag);
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = end + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(!osmTags.empty(), ("No OSM tags found for feature:", line));
|
|
||||||
|
|
||||||
m_storage.insert({type, osmTags});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<OSMTag> const & TypeToOSMTranslator::OsmTagsFromType(uint32_t type) const
|
|
||||||
{
|
|
||||||
auto it = m_storage.find(type);
|
|
||||||
|
|
||||||
if (it == m_storage.end())
|
|
||||||
{
|
|
||||||
ASSERT(false, ("OSM tags for type", type, "could not be found"));
|
|
||||||
return kEmptyResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
TypeToOSMTranslator const & GetOSMTranslator()
|
|
||||||
{
|
|
||||||
static TypeToOSMTranslator translator;
|
|
||||||
return translator;
|
|
||||||
}
|
|
||||||
} // namespace editor
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace editor
|
|
||||||
{
|
|
||||||
|
|
||||||
struct OSMTag
|
|
||||||
{
|
|
||||||
std::string key;
|
|
||||||
std::string value;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TypeToOSMTranslator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::vector<OSMTag> static constexpr kEmptyResult = {};
|
|
||||||
|
|
||||||
TypeToOSMTranslator() : TypeToOSMTranslator(true) {}
|
|
||||||
explicit TypeToOSMTranslator(bool initialize);
|
|
||||||
|
|
||||||
void LoadConfigFile();
|
|
||||||
void LoadFromStream(std::istream & s);
|
|
||||||
std::vector<OSMTag> const & OsmTagsFromType(uint32_t type) const;
|
|
||||||
|
|
||||||
std::unordered_map<uint32_t, std::vector<OSMTag>> const & GetStorage() const { return m_storage; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::unordered_map<uint32_t, std::vector<OSMTag>> m_storage;
|
|
||||||
};
|
|
||||||
|
|
||||||
TypeToOSMTranslator const & GetOSMTranslator();
|
|
||||||
|
|
||||||
} // namespace editor
|
|
||||||
@@ -279,10 +279,10 @@ FeatureStatus Editor::GetFeatureStatus(FeatureID const & fid) const
|
|||||||
return GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index);
|
return GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Editor::AreSomeFeatureChangesUploaded(MwmId const & mwmId, uint32_t index) const
|
bool Editor::IsFeatureUploaded(MwmId const & mwmId, uint32_t index) const
|
||||||
{
|
{
|
||||||
auto const features = m_features.Get();
|
auto const features = m_features.Get();
|
||||||
return AreSomeFeatureChangesUploadedImpl(*features, mwmId, index);
|
return IsFeatureUploadedImpl(*features, mwmId, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::DeleteFeature(FeatureID const & fid)
|
void Editor::DeleteFeature(FeatureID const & fid)
|
||||||
@@ -425,7 +425,7 @@ bool Editor::RollBackChanges(FeatureID const & fid)
|
|||||||
{
|
{
|
||||||
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
|
CHECK_THREAD_CHECKER(MainThreadChecker, (""));
|
||||||
|
|
||||||
if (AreSomeFeatureChangesUploaded(fid.m_mwmId, fid.m_index))
|
if (IsFeatureUploaded(fid.m_mwmId, fid.m_index))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return RemoveFeature(fid);
|
return RemoveFeature(fid);
|
||||||
@@ -982,7 +982,7 @@ void Editor::CreateNote(ms::LatLon const & latLon, FeatureID const & fid, featur
|
|||||||
"but was not found on the ground.\n";
|
"but was not found on the ground.\n";
|
||||||
auto const features = m_features.Get();
|
auto const features = m_features.Get();
|
||||||
auto const isCreated = GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index) == FeatureStatus::Created;
|
auto const isCreated = GetFeatureStatusImpl(*features, fid.m_mwmId, fid.m_index) == FeatureStatus::Created;
|
||||||
auto const createdAndUploaded = (isCreated && AreSomeFeatureChangesUploadedImpl(*features, fid.m_mwmId, fid.m_index));
|
auto const createdAndUploaded = (isCreated && IsFeatureUploadedImpl(*features, fid.m_mwmId, fid.m_index));
|
||||||
CHECK(!isCreated || createdAndUploaded, ());
|
CHECK(!isCreated || createdAndUploaded, ());
|
||||||
|
|
||||||
if (createdAndUploaded)
|
if (createdAndUploaded)
|
||||||
@@ -1177,10 +1177,10 @@ FeatureStatus Editor::GetFeatureStatusImpl(FeaturesContainer const & features, M
|
|||||||
return featureInfo->m_status;
|
return featureInfo->m_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Editor::AreSomeFeatureChangesUploadedImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index)
|
bool Editor::IsFeatureUploadedImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index)
|
||||||
{
|
{
|
||||||
auto const * info = GetFeatureTypeInfo(features, mwmId, index);
|
auto const * info = GetFeatureTypeInfo(features, mwmId, index);
|
||||||
return info && !info->m_object.GetJournal().GetJournalHistory().empty();
|
return info && info->m_uploadStatus == kUploaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::UpdateXMLFeatureTags(editor::XMLFeature & feature, std::list<JournalEntry> const & journal,
|
void Editor::UpdateXMLFeatureTags(editor::XMLFeature & feature, std::list<JournalEntry> const & journal,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ public:
|
|||||||
FeatureStatus GetFeatureStatus(FeatureID const & fid) const;
|
FeatureStatus GetFeatureStatus(FeatureID const & fid) const;
|
||||||
|
|
||||||
/// @returns true if a feature was uploaded to osm.
|
/// @returns true if a feature was uploaded to osm.
|
||||||
bool AreSomeFeatureChangesUploaded(MwmId const & mwmId, uint32_t index) const;
|
bool IsFeatureUploaded(MwmId const & mwmId, uint32_t index) const;
|
||||||
|
|
||||||
/// Marks feature as "deleted" from MwM file.
|
/// Marks feature as "deleted" from MwM file.
|
||||||
void DeleteFeature(FeatureID const & fid);
|
void DeleteFeature(FeatureID const & fid);
|
||||||
@@ -240,7 +240,7 @@ private:
|
|||||||
|
|
||||||
static FeatureStatus GetFeatureStatusImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index);
|
static FeatureStatus GetFeatureStatusImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index);
|
||||||
|
|
||||||
static bool AreSomeFeatureChangesUploadedImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index);
|
static bool IsFeatureUploadedImpl(FeaturesContainer const & features, MwmId const & mwmId, uint32_t index);
|
||||||
|
|
||||||
static void UpdateXMLFeatureTags(editor::XMLFeature & feature, std::list<JournalEntry> const & journal,
|
static void UpdateXMLFeatureTags(editor::XMLFeature & feature, std::list<JournalEntry> const & journal,
|
||||||
ChangesetWrapper & changeset);
|
ChangesetWrapper & changeset);
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#include "editor/xml_feature.hpp"
|
#include "editor/xml_feature.hpp"
|
||||||
|
|
||||||
#include "editor/feature_type_to_osm.hpp"
|
|
||||||
#include "editor/keys_to_remove.hpp"
|
#include "editor/keys_to_remove.hpp"
|
||||||
|
|
||||||
#include "indexer/classificator.hpp"
|
#include "indexer/classificator.hpp"
|
||||||
@@ -642,16 +640,36 @@ void XMLFeature::RemoveTag(string_view key)
|
|||||||
|
|
||||||
void XMLFeature::SetOSMTagsForType(uint32_t type)
|
void XMLFeature::SetOSMTagsForType(uint32_t type)
|
||||||
{
|
{
|
||||||
if (ftypes::IsAddressChecker::Instance()(type))
|
if (ftypes::IsRecyclingCentreChecker::Instance()(type))
|
||||||
|
{
|
||||||
|
SetTagValue("amenity", "recycling");
|
||||||
|
SetTagValue("recycling_type", "centre");
|
||||||
|
}
|
||||||
|
else if (ftypes::IsRecyclingContainerChecker::Instance()(type))
|
||||||
|
{
|
||||||
|
SetTagValue("amenity", "recycling");
|
||||||
|
SetTagValue("recycling_type", "container");
|
||||||
|
}
|
||||||
|
else if (ftypes::IsAddressChecker::Instance()(type))
|
||||||
{
|
{
|
||||||
// Addresses don't have a category tag
|
// Addresses don't have a category tag
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string const strType = classif().GetReadableObjectName(type);
|
||||||
|
strings::SimpleTokenizer iter(strType, "-");
|
||||||
|
string_view const k = *iter;
|
||||||
|
|
||||||
std::vector<OSMTag> const & osmTags = GetOSMTranslator().OsmTagsFromType(type);
|
if (++iter)
|
||||||
|
{
|
||||||
for (auto const & osmTag : osmTags)
|
// Main type is stored as "k=amenity v=restaurant"
|
||||||
SetTagValue(osmTag.key, osmTag.value);
|
SetTagValue(k, *iter);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Main type is stored as "k=building v=yes"
|
||||||
|
SetTagValue(k, kYes);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void XMLFeature::UpdateOSMTag(std::string_view key, std::string_view value)
|
void XMLFeature::UpdateOSMTag(std::string_view key, std::string_view value)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include "ge0/url_generator.hpp"
|
#include "ge0/url_generator.hpp"
|
||||||
|
|
||||||
#include "platform/location.hpp"
|
|
||||||
#include "routing/route.hpp"
|
#include "routing/route.hpp"
|
||||||
#include "routing/speed_camera_prohibition.hpp"
|
#include "routing/speed_camera_prohibition.hpp"
|
||||||
|
|
||||||
@@ -1454,7 +1453,7 @@ void Framework::CreateDrapeEngine(ref_ptr<dp::GraphicsContextFactory> contextFac
|
|||||||
GetPlatform().RunTask(Platform::Thread::Gui, [this, mode, routingActive]()
|
GetPlatform().RunTask(Platform::Thread::Gui, [this, mode, routingActive]()
|
||||||
{
|
{
|
||||||
// Deactivate selection (and hide place page) if we return to routing in F&R mode.
|
// Deactivate selection (and hide place page) if we return to routing in F&R mode.
|
||||||
if (routingActive && (mode == location::FollowAndRotateCompass || mode == location::FollowAndRotateRoute))
|
if (routingActive && mode == location::FollowAndRotate)
|
||||||
DeactivateMapSelection();
|
DeactivateMapSelection();
|
||||||
|
|
||||||
if (m_myPositionListener != nullptr)
|
if (m_myPositionListener != nullptr)
|
||||||
@@ -3209,7 +3208,6 @@ void Framework::ReadFeatures(function<void(FeatureType &)> const & reader, vecto
|
|||||||
void Framework::OnRouteFollow(routing::RouterType type)
|
void Framework::OnRouteFollow(routing::RouterType type)
|
||||||
{
|
{
|
||||||
bool const isPedestrianRoute = type == RouterType::Pedestrian;
|
bool const isPedestrianRoute = type == RouterType::Pedestrian;
|
||||||
bool const allowRouteRotation = type == RouterType::Vehicle;
|
|
||||||
bool const enableAutoZoom = isPedestrianRoute ? false : LoadAutoZoom();
|
bool const enableAutoZoom = isPedestrianRoute ? false : LoadAutoZoom();
|
||||||
int const scale = isPedestrianRoute ? scales::GetPedestrianNavigationScale() : scales::GetNavigationScale();
|
int const scale = isPedestrianRoute ? scales::GetPedestrianNavigationScale() : scales::GetNavigationScale();
|
||||||
int scale3d = isPedestrianRoute ? scales::GetPedestrianNavigation3dScale() : scales::GetNavigation3dScale();
|
int scale3d = isPedestrianRoute ? scales::GetPedestrianNavigation3dScale() : scales::GetNavigation3dScale();
|
||||||
@@ -3225,7 +3223,7 @@ void Framework::OnRouteFollow(routing::RouterType type)
|
|||||||
// TODO. We need to sync two enums VehicleType and RouterType to be able to pass
|
// TODO. We need to sync two enums VehicleType and RouterType to be able to pass
|
||||||
// GetRoutingSettings(type).m_matchRoute to the FollowRoute() instead of |isPedestrianRoute|.
|
// GetRoutingSettings(type).m_matchRoute to the FollowRoute() instead of |isPedestrianRoute|.
|
||||||
// |isArrowGlued| parameter fully corresponds to |m_matchRoute| in RoutingSettings.
|
// |isArrowGlued| parameter fully corresponds to |m_matchRoute| in RoutingSettings.
|
||||||
m_drapeEngine->FollowRoute(scale, scale3d, enableAutoZoom, !isPedestrianRoute /* isArrowGlued */, allowRouteRotation);
|
m_drapeEngine->FollowRoute(scale, scale3d, enableAutoZoom, !isPedestrianRoute /* isArrowGlued */);
|
||||||
}
|
}
|
||||||
|
|
||||||
// RoutingManager::Delegate
|
// RoutingManager::Delegate
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
#include "routing_manager.hpp"
|
#include "routing_manager.hpp"
|
||||||
|
|
||||||
#include "drape_frontend/my_position_controller.hpp"
|
|
||||||
#include "geometry/angles.hpp"
|
|
||||||
#include "map/chart_generator.hpp"
|
#include "map/chart_generator.hpp"
|
||||||
#include "map/routing_mark.hpp"
|
#include "map/routing_mark.hpp"
|
||||||
|
|
||||||
#include "routing/absent_regions_finder.hpp"
|
#include "routing/absent_regions_finder.hpp"
|
||||||
#include "routing/base/followed_polyline.hpp"
|
|
||||||
#include "routing/checkpoint_predictor.hpp"
|
#include "routing/checkpoint_predictor.hpp"
|
||||||
#include "routing/index_router.hpp"
|
#include "routing/index_router.hpp"
|
||||||
#include "routing/route.hpp"
|
#include "routing/route.hpp"
|
||||||
@@ -1173,9 +1170,9 @@ void RoutingManager::SetDrapeEngine(ref_ptr<df::DrapeEngine> engine, bool is3dAl
|
|||||||
if (m_gpsInfoCache != nullptr)
|
if (m_gpsInfoCache != nullptr)
|
||||||
{
|
{
|
||||||
auto routeMatchingInfo = GetRouteMatchingInfo(*m_gpsInfoCache);
|
auto routeMatchingInfo = GetRouteMatchingInfo(*m_gpsInfoCache);
|
||||||
df::NavigationContext navigationContext(m_routingSession.IsNavigable(), m_routingSession.GetDistanceToNextTurn(),
|
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, *m_gpsInfoCache, m_routingSession.IsNavigable(),
|
||||||
m_routingSession.GetCurrentSpeedLimit(), GetRoutePolyline());
|
m_routingSession.GetDistanceToNextTurn(), m_routingSession.GetCurrentSpeedLimit(),
|
||||||
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, *m_gpsInfoCache, navigationContext, routeMatchingInfo);
|
routeMatchingInfo);
|
||||||
m_gpsInfoCache.reset();
|
m_gpsInfoCache.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1519,9 +1516,9 @@ void RoutingManager::OnExtrapolatedLocationUpdate(location::GpsInfo const & info
|
|||||||
m_gpsInfoCache = make_unique<location::GpsInfo>(gpsInfo);
|
m_gpsInfoCache = make_unique<location::GpsInfo>(gpsInfo);
|
||||||
|
|
||||||
auto routeMatchingInfo = GetRouteMatchingInfo(gpsInfo);
|
auto routeMatchingInfo = GetRouteMatchingInfo(gpsInfo);
|
||||||
df::NavigationContext navigationContext(m_routingSession.IsNavigable(), m_routingSession.GetDistanceToNextTurn(),
|
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, gpsInfo, m_routingSession.IsNavigable(),
|
||||||
m_routingSession.GetCurrentSpeedLimit(), GetRoutePolyline());
|
m_routingSession.GetDistanceToNextTurn(), m_routingSession.GetCurrentSpeedLimit(),
|
||||||
m_drapeEngine.SafeCall(&df::DrapeEngine::SetGpsInfo, gpsInfo, navigationContext, routeMatchingInfo);
|
routeMatchingInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoutingManager::DeleteSavedRoutePoints()
|
void RoutingManager::DeleteSavedRoutePoints()
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace routing::turns::sound
|
|||||||
* - All other variants default to `zh-Hans` (Simplified Chinese).
|
* - All other variants default to `zh-Hans` (Simplified Chinese).
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
std::array<std::pair<std::string_view, std::string_view>, 43> constexpr kLanguageList = {{
|
std::array<std::pair<std::string_view, std::string_view>, 42> constexpr kLanguageList = {{
|
||||||
{"en", "English"},
|
{"en", "English"},
|
||||||
{"id", "Bahasa Indonesia"},
|
{"id", "Bahasa Indonesia"},
|
||||||
{"ca", "Català"},
|
{"ca", "Català"},
|
||||||
@@ -82,6 +82,5 @@ std::array<std::pair<std::string_view, std::string_view>, 43> constexpr kLanguag
|
|||||||
#endif
|
#endif
|
||||||
{"ja", "日本語"},
|
{"ja", "日本語"},
|
||||||
{"ko", "한국어"},
|
{"ko", "한국어"},
|
||||||
{"ta", "தமிழ்"},
|
|
||||||
}};
|
}};
|
||||||
} // namespace routing::turns::sound
|
} // namespace routing::turns::sound
|
||||||
|
|||||||
@@ -139,8 +139,7 @@ enum EMyPositionMode
|
|||||||
NotFollowNoPosition,
|
NotFollowNoPosition,
|
||||||
NotFollow,
|
NotFollow,
|
||||||
Follow,
|
Follow,
|
||||||
FollowAndRotateCompass,
|
FollowAndRotate
|
||||||
FollowAndRotateRoute
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using TMyPositionModeChanged = std::function<void(location::EMyPositionMode, bool)>;
|
using TMyPositionModeChanged = std::function<void(location::EMyPositionMode, bool)>;
|
||||||
|
|||||||
@@ -308,8 +308,7 @@ string ToString<location::EMyPositionMode>(location::EMyPositionMode const & v)
|
|||||||
case location::NotFollow: return "NotFollow";
|
case location::NotFollow: return "NotFollow";
|
||||||
case location::NotFollowNoPosition: return "NotFollowNoPosition";
|
case location::NotFollowNoPosition: return "NotFollowNoPosition";
|
||||||
case location::Follow: return "Follow";
|
case location::Follow: return "Follow";
|
||||||
case location::FollowAndRotateCompass: return "FollowAndRotateCompass";
|
case location::FollowAndRotate: return "FollowAndRotate";
|
||||||
case location::FollowAndRotateRoute: return "FollowAndRotateRoute";
|
|
||||||
default: return "Pending";
|
default: return "Pending";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -325,10 +324,8 @@ bool FromString<location::EMyPositionMode>(string const & s, location::EMyPositi
|
|||||||
v = location::NotFollowNoPosition;
|
v = location::NotFollowNoPosition;
|
||||||
else if (s == "Follow")
|
else if (s == "Follow")
|
||||||
v = location::Follow;
|
v = location::Follow;
|
||||||
else if (s == "FollowAndRotateCompass")
|
else if (s == "FollowAndRotate")
|
||||||
v = location::FollowAndRotateCompass;
|
v = location::FollowAndRotate;
|
||||||
else if (s == "FollowAndRotateRoute")
|
|
||||||
v = location::FollowAndRotateRoute;
|
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -237,34 +237,4 @@ Iter FollowedPolyline::GetClosestMatchingProjectionInInterval(m2::RectD const &
|
|||||||
|
|
||||||
return nearestIter;
|
return nearestIter;
|
||||||
}
|
}
|
||||||
|
|
||||||
m2::PointD FollowedPolyline::GetLookaheadPoint(double lookaheadDistanceM) const
|
|
||||||
{
|
|
||||||
if (!IsValid())
|
|
||||||
return m2::PointD();
|
|
||||||
|
|
||||||
size_t segmentIdx = m_current.m_ind;
|
|
||||||
m2::PointD prev = m_current.m_pt;
|
|
||||||
|
|
||||||
size_t const maxSegmentIdx = m_poly.GetSize() - 1;
|
|
||||||
double remaining = lookaheadDistanceM;
|
|
||||||
|
|
||||||
while (segmentIdx < maxSegmentIdx)
|
|
||||||
{
|
|
||||||
m2::PointD const & next = m_poly.GetPoint(segmentIdx + 1);
|
|
||||||
double segLen = mercator::DistanceOnEarth(prev, next);
|
|
||||||
|
|
||||||
if (remaining <= segLen)
|
|
||||||
{
|
|
||||||
double t = remaining / segLen;
|
|
||||||
return prev + (next - prev) * t;
|
|
||||||
}
|
|
||||||
|
|
||||||
remaining -= segLen;
|
|
||||||
prev = next;
|
|
||||||
segmentIdx += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_poly.GetPoint(segmentIdx);
|
|
||||||
}
|
|
||||||
} // namespace routing
|
} // namespace routing
|
||||||
|
|||||||
@@ -125,9 +125,6 @@ public:
|
|||||||
|
|
||||||
bool IsFakeSegment(size_t index) const;
|
bool IsFakeSegment(size_t index) const;
|
||||||
|
|
||||||
/// \brief Obtain a point |lookaheadDistanceM| meters along the current route
|
|
||||||
m2::PointD GetLookaheadPoint(double lookaheadDistanceM) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// \returns iterator to the best projection of center of |posRect| to the |m_poly|.
|
/// \returns iterator to the best projection of center of |posRect| to the |m_poly|.
|
||||||
/// If there's a good projection of center of |posRect| to two closest segments of |m_poly|
|
/// If there's a good projection of center of |posRect| to two closest segments of |m_poly|
|
||||||
|
|||||||
@@ -126,7 +126,6 @@ copy_resources(
|
|||||||
patterns.txt
|
patterns.txt
|
||||||
transit_colors.txt
|
transit_colors.txt
|
||||||
types.txt
|
types.txt
|
||||||
mapcss-mapping.csv
|
|
||||||
World.mwm
|
World.mwm
|
||||||
WorldCoasts.mwm
|
WorldCoasts.mwm
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,9 +8,6 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
271DC2172EC60C0C00442D94 /* keys_to_remove.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */; };
|
271DC2172EC60C0C00442D94 /* keys_to_remove.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */; };
|
||||||
27FDBF1B2EEEFC3F0045621D /* feature_type_to_osm_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27FDBF1A2EEEFC3F0045621D /* feature_type_to_osm_test.cpp */; };
|
|
||||||
27FDBF1E2EEEFC5A0045621D /* feature_type_to_osm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 27FDBF1D2EEEFC5A0045621D /* feature_type_to_osm.cpp */; };
|
|
||||||
27FDBF1F2EEEFC5A0045621D /* feature_type_to_osm.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 27FDBF1C2EEEFC5A0045621D /* feature_type_to_osm.hpp */; };
|
|
||||||
340C20DE1C3E4DFD00111D22 /* osm_auth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 340C20DC1C3E4DFD00111D22 /* osm_auth.cpp */; };
|
340C20DE1C3E4DFD00111D22 /* osm_auth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 340C20DC1C3E4DFD00111D22 /* osm_auth.cpp */; };
|
||||||
340C20DF1C3E4DFD00111D22 /* osm_auth.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 340C20DD1C3E4DFD00111D22 /* osm_auth.hpp */; };
|
340C20DF1C3E4DFD00111D22 /* osm_auth.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 340C20DD1C3E4DFD00111D22 /* osm_auth.hpp */; };
|
||||||
340DC8291C4E71E500EAA2CC /* changeset_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 340DC8271C4E71E500EAA2CC /* changeset_wrapper.cpp */; };
|
340DC8291C4E71E500EAA2CC /* changeset_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 340DC8271C4E71E500EAA2CC /* changeset_wrapper.cpp */; };
|
||||||
@@ -80,10 +77,6 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
270C9C212E16AABF00ABA688 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = ../../libs/editor/module.modulemap; sourceTree = SOURCE_ROOT; };
|
270C9C212E16AABF00ABA688 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = ../../libs/editor/module.modulemap; sourceTree = SOURCE_ROOT; };
|
||||||
271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = keys_to_remove.hpp; sourceTree = "<group>"; };
|
271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = keys_to_remove.hpp; sourceTree = "<group>"; };
|
||||||
27998A9E2EEEFE09001EAFD0 /* mapcss-mapping.csv */ = {isa = PBXFileReference; lastKnownFileType = text; name = "mapcss-mapping.csv"; path = "../../data/mapcss-mapping.csv"; sourceTree = SOURCE_ROOT; };
|
|
||||||
27FDBF1A2EEEFC3F0045621D /* feature_type_to_osm_test.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = feature_type_to_osm_test.cpp; sourceTree = "<group>"; };
|
|
||||||
27FDBF1C2EEEFC5A0045621D /* feature_type_to_osm.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = feature_type_to_osm.hpp; sourceTree = "<group>"; };
|
|
||||||
27FDBF1D2EEEFC5A0045621D /* feature_type_to_osm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = feature_type_to_osm.cpp; sourceTree = "<group>"; };
|
|
||||||
340C20DC1C3E4DFD00111D22 /* osm_auth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = osm_auth.cpp; sourceTree = "<group>"; };
|
340C20DC1C3E4DFD00111D22 /* osm_auth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = osm_auth.cpp; sourceTree = "<group>"; };
|
||||||
340C20DD1C3E4DFD00111D22 /* osm_auth.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = osm_auth.hpp; sourceTree = "<group>"; };
|
340C20DD1C3E4DFD00111D22 /* osm_auth.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = osm_auth.hpp; sourceTree = "<group>"; };
|
||||||
340DC8271C4E71E500EAA2CC /* changeset_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = changeset_wrapper.cpp; sourceTree = "<group>"; };
|
340DC8271C4E71E500EAA2CC /* changeset_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = changeset_wrapper.cpp; sourceTree = "<group>"; };
|
||||||
@@ -206,7 +199,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
3496AC041DC204B700C5DDBA /* editor.config */,
|
3496AC041DC204B700C5DDBA /* editor.config */,
|
||||||
27998A9E2EEEFE09001EAFD0 /* mapcss-mapping.csv */,
|
|
||||||
270C9C212E16AABF00ABA688 /* module.modulemap */,
|
270C9C212E16AABF00ABA688 /* module.modulemap */,
|
||||||
34F5586E1DBF49B200A4FC11 /* common-debug.xcconfig */,
|
34F5586E1DBF49B200A4FC11 /* common-debug.xcconfig */,
|
||||||
34F5586F1DBF49B200A4FC11 /* common-release.xcconfig */,
|
34F5586F1DBF49B200A4FC11 /* common-release.xcconfig */,
|
||||||
@@ -250,8 +242,6 @@
|
|||||||
6715560420BEC331002BA3B4 /* edits_migration.hpp */,
|
6715560420BEC331002BA3B4 /* edits_migration.hpp */,
|
||||||
3D052486200F62ED00F24998 /* feature_matcher.cpp */,
|
3D052486200F62ED00F24998 /* feature_matcher.cpp */,
|
||||||
3D052485200F62ED00F24998 /* feature_matcher.hpp */,
|
3D052485200F62ED00F24998 /* feature_matcher.hpp */,
|
||||||
27FDBF1D2EEEFC5A0045621D /* feature_type_to_osm.cpp */,
|
|
||||||
27FDBF1C2EEEFC5A0045621D /* feature_type_to_osm.hpp */,
|
|
||||||
271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */,
|
271DC2162EC60C0C00442D94 /* keys_to_remove.hpp */,
|
||||||
6715565220BF0F86002BA3B4 /* new_feature_categories.cpp */,
|
6715565220BF0F86002BA3B4 /* new_feature_categories.cpp */,
|
||||||
6715565320BF0F87002BA3B4 /* new_feature_categories.hpp */,
|
6715565320BF0F87002BA3B4 /* new_feature_categories.hpp */,
|
||||||
@@ -280,7 +270,6 @@
|
|||||||
3496ABD21DC2034900C5DDBA /* editor_config_test.cpp */,
|
3496ABD21DC2034900C5DDBA /* editor_config_test.cpp */,
|
||||||
3496ABD31DC2034900C5DDBA /* editor_notes_test.cpp */,
|
3496ABD31DC2034900C5DDBA /* editor_notes_test.cpp */,
|
||||||
3D052489200F630000F24998 /* feature_matcher_test.cpp */,
|
3D052489200F630000F24998 /* feature_matcher_test.cpp */,
|
||||||
27FDBF1A2EEEFC3F0045621D /* feature_type_to_osm_test.cpp */,
|
|
||||||
3D05248A200F630000F24998 /* match_by_geometry_test.cpp */,
|
3D05248A200F630000F24998 /* match_by_geometry_test.cpp */,
|
||||||
6715560920BEF0A4002BA3B4 /* new_feature_categories_test.cpp */,
|
6715560920BEF0A4002BA3B4 /* new_feature_categories_test.cpp */,
|
||||||
3496ABD41DC2034900C5DDBA /* opening_hours_ui_test.cpp */,
|
3496ABD41DC2034900C5DDBA /* opening_hours_ui_test.cpp */,
|
||||||
@@ -349,7 +338,6 @@
|
|||||||
34527C521C89B1770015050E /* editor_config.hpp in Headers */,
|
34527C521C89B1770015050E /* editor_config.hpp in Headers */,
|
||||||
675B562820D2706000A521D2 /* editable_feature_source.hpp in Headers */,
|
675B562820D2706000A521D2 /* editable_feature_source.hpp in Headers */,
|
||||||
6715565520BF0F87002BA3B4 /* new_feature_categories.hpp in Headers */,
|
6715565520BF0F87002BA3B4 /* new_feature_categories.hpp in Headers */,
|
||||||
27FDBF1F2EEEFC5A0045621D /* feature_type_to_osm.hpp in Headers */,
|
|
||||||
6715560820BEC332002BA3B4 /* edits_migration.hpp in Headers */,
|
6715560820BEC332002BA3B4 /* edits_migration.hpp in Headers */,
|
||||||
3D052487200F62EE00F24998 /* feature_matcher.hpp in Headers */,
|
3D052487200F62EE00F24998 /* feature_matcher.hpp in Headers */,
|
||||||
271DC2172EC60C0C00442D94 /* keys_to_remove.hpp in Headers */,
|
271DC2172EC60C0C00442D94 /* keys_to_remove.hpp in Headers */,
|
||||||
@@ -482,7 +470,6 @@
|
|||||||
340C20DE1C3E4DFD00111D22 /* osm_auth.cpp in Sources */,
|
340C20DE1C3E4DFD00111D22 /* osm_auth.cpp in Sources */,
|
||||||
6715560720BEC332002BA3B4 /* osm_editor.cpp in Sources */,
|
6715560720BEC332002BA3B4 /* osm_editor.cpp in Sources */,
|
||||||
3D052488200F62EE00F24998 /* feature_matcher.cpp in Sources */,
|
3D052488200F62EE00F24998 /* feature_matcher.cpp in Sources */,
|
||||||
27FDBF1E2EEEFC5A0045621D /* feature_type_to_osm.cpp in Sources */,
|
|
||||||
3D489BEF1D4F67E10052AA38 /* editor_storage.cpp in Sources */,
|
3D489BEF1D4F67E10052AA38 /* editor_storage.cpp in Sources */,
|
||||||
3411387A1C15AE42002E3B3E /* ui2oh.cpp in Sources */,
|
3411387A1C15AE42002E3B3E /* ui2oh.cpp in Sources */,
|
||||||
340DC8291C4E71E500EAA2CC /* changeset_wrapper.cpp in Sources */,
|
340DC8291C4E71E500EAA2CC /* changeset_wrapper.cpp in Sources */,
|
||||||
@@ -501,7 +488,6 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
3496ABE11DC2035800C5DDBA /* config_loader_test.cpp in Sources */,
|
3496ABE11DC2035800C5DDBA /* config_loader_test.cpp in Sources */,
|
||||||
27FDBF1B2EEEFC3F0045621D /* feature_type_to_osm_test.cpp in Sources */,
|
|
||||||
671555E820BDC5D3002BA3B4 /* osm_editor_test.cpp in Sources */,
|
671555E820BDC5D3002BA3B4 /* osm_editor_test.cpp in Sources */,
|
||||||
3496ABE21DC2035800C5DDBA /* editor_config_test.cpp in Sources */,
|
3496ABE21DC2035800C5DDBA /* editor_config_test.cpp in Sources */,
|
||||||
FACB76B826B89DF700810C9C /* feature_matcher_test.cpp in Sources */,
|
FACB76B826B89DF700810C9C /* feature_matcher_test.cpp in Sources */,
|
||||||
|
|||||||
Reference in New Issue
Block a user