Helicopter/Ruler routing #5381
104 changed files with 843 additions and 145 deletions
|
@ -1425,6 +1425,7 @@ Java_app_organicmaps_Framework_nativeSetRouter(JNIEnv * env, jclass, jint router
|
|||
case 1: type = Type::Pedestrian; break;
|
||||
case 2: type = Type::Bicycle; break;
|
||||
case 3: type = Type::Transit; break;
|
||||
case 4: type = Type::Ruler; break;
|
||||
default: assert(false); break;
|
||||
}
|
||||
g_framework->GetRoutingManager().SetRouter(type);
|
||||
|
|
31
android/res/drawable/ic_ruler_route.xml
Normal file
31
android/res/drawable/ic_ruler_route.xml
Normal file
|
@ -0,0 +1,31 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="40dp"
|
||||
android:height="40dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M15.081,6.622m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
|
||||
android:strokeWidth="1.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
<path
|
||||
android:pathData="M18.156,15.261m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
|
||||
android:strokeWidth="1.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
<path
|
||||
android:pathData="M6.24,16.538m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"
|
||||
android:strokeWidth="1.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
<path
|
||||
android:pathData="M7.301,15.429 L14.284,7.608"
|
||||
android:strokeWidth="1.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
<path
|
||||
android:pathData="m15.495,7.908 l2.15,6.228"
|
||||
android:strokeWidth="1.2"
|
||||
android:fillColor="#00000000"
|
||||
android:strokeColor="#000"/>
|
||||
</vector>
|
|
@ -46,7 +46,7 @@
|
|||
android:id="@+id/transit_recycler_view"
|
||||
android:layout_marginTop="@dimen/margin_half_plus"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_below="@id/total_distance"
|
||||
android:layout_below="@id/total_time"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -73,6 +73,14 @@
|
|||
android:layout_marginEnd="12dp"
|
||||
tools:button="@drawable/ic_bike"
|
||||
tools:buttonTint="?iconTintLight" />
|
||||
|
||||
<app.organicmaps.widget.RoutingToolbarButton
|
||||
android:id="@+id/ruler"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="12dp"
|
||||
tools:button="@drawable/ic_ruler_route"
|
||||
tools:buttonTint="?iconTintLight" />
|
||||
</RadioGroup>
|
||||
|
||||
<LinearLayout
|
||||
|
@ -113,6 +121,13 @@
|
|||
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
|
||||
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
|
||||
android:layout_marginEnd="12dp"/>
|
||||
|
||||
<app.organicmaps.widget.WheelProgressView
|
||||
android:id="@+id/progress_ruler"
|
||||
style="@style/MwmWidget.ProgressWheel.RoutingPlan"
|
||||
android:layout_marginTop="@dimen/routing_selector_wheel_margin"
|
||||
android:layout_marginBottom="@dimen/routing_selector_wheel_margin"
|
||||
android:layout_marginEnd="12dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
<string name="duration_6_hours">6 ساعات</string>
|
||||
<string name="duration_12_hours">12 ساعة</string>
|
||||
<string name="duration_1_day">1 يوم</string>
|
||||
<string name="placepage_distance">المسافة</string>
|
||||
<string name="search_show_on_map">مشاهدة على الخريطة</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">القائمة</string>
|
||||
|
|
|
@ -238,6 +238,7 @@
|
|||
<string name="duration_6_hours">6 гадзін</string>
|
||||
<string name="duration_12_hours">12 гадзін</string>
|
||||
<string name="duration_1_day">1 дзень</string>
|
||||
<string name="placepage_distance">Адлегласць</string>
|
||||
<string name="search_show_on_map">Паглядзець на мапе</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Вэб-сайт</string>
|
||||
|
|
|
@ -229,6 +229,7 @@
|
|||
<string name="duration_6_hours">6 hores</string>
|
||||
<string name="duration_12_hours">12 hores</string>
|
||||
<string name="duration_1_day">1 dia</string>
|
||||
<string name="placepage_distance">Distància</string>
|
||||
<string name="search_show_on_map">Veure al mapa</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menú</string>
|
||||
|
|
|
@ -224,6 +224,7 @@
|
|||
<string name="duration_6_hours">6 hodin</string>
|
||||
<string name="duration_12_hours">12 hodin</string>
|
||||
<string name="duration_1_day">1 den</string>
|
||||
<string name="placepage_distance">Vzdálenost</string>
|
||||
<string name="search_show_on_map">Zobrazit na mapě</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Webové stránky</string>
|
||||
|
|
|
@ -220,6 +220,7 @@
|
|||
<string name="duration_6_hours">6 timer</string>
|
||||
<string name="duration_12_hours">12 timer</string>
|
||||
<string name="duration_1_day">1 dag</string>
|
||||
<string name="placepage_distance">Afstand</string>
|
||||
<string name="search_show_on_map">Vis på kortet</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Hjemmeside</string>
|
||||
|
|
|
@ -237,6 +237,7 @@
|
|||
<string name="duration_6_hours">6 Stunden</string>
|
||||
<string name="duration_12_hours">12 Stunden</string>
|
||||
<string name="duration_1_day">1 Tag</string>
|
||||
<string name="placepage_distance">Entfernung</string>
|
||||
<string name="search_show_on_map">Auf der Karte ansehen</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Webseite</string>
|
||||
|
|
|
@ -237,6 +237,7 @@
|
|||
<string name="duration_6_hours">6 horas</string>
|
||||
<string name="duration_12_hours">12 horas</string>
|
||||
<string name="duration_1_day">1 día</string>
|
||||
<string name="placepage_distance">Distancia</string>
|
||||
<string name="search_show_on_map">Ver en el mapa</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menú</string>
|
||||
|
|
|
@ -229,6 +229,7 @@
|
|||
<string name="duration_6_hours">6 tundi</string>
|
||||
<string name="duration_12_hours">12 tundi</string>
|
||||
<string name="duration_1_day">1 päev</string>
|
||||
<string name="placepage_distance">Kaugus</string>
|
||||
<string name="search_show_on_map">Vaata kaardil</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Veebileht</string>
|
||||
|
|
|
@ -237,6 +237,7 @@
|
|||
<string name="duration_6_hours">6 ordu</string>
|
||||
<string name="duration_12_hours">12 ordu</string>
|
||||
<string name="duration_1_day">egun 1</string>
|
||||
<string name="placepage_distance">Distantzia</string>
|
||||
<string name="search_show_on_map">Ikusi mapan</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menua</string>
|
||||
|
|
|
@ -213,6 +213,7 @@
|
|||
<string name="duration_6_hours">6 ساعت</string>
|
||||
<string name="duration_12_hours">12 ساعت</string>
|
||||
<string name="duration_1_day">1 روز</string>
|
||||
<string name="placepage_distance">مسافت</string>
|
||||
<string name="search_show_on_map">مشاهده بر روی نقشه</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">وب سایت</string>
|
||||
|
|
|
@ -239,6 +239,7 @@
|
|||
<string name="duration_6_hours">6 tuntia</string>
|
||||
<string name="duration_12_hours">12 tuntia</string>
|
||||
<string name="duration_1_day">1 päivä</string>
|
||||
<string name="placepage_distance">Etäisyys</string>
|
||||
<string name="search_show_on_map">Näytä kartalla</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menu</string>
|
||||
|
|
|
@ -239,6 +239,7 @@
|
|||
<string name="duration_6_hours">6 heures</string>
|
||||
<string name="duration_12_hours">12 heures</string>
|
||||
<string name="duration_1_day">1 jour</string>
|
||||
<string name="placepage_distance">Distance</string>
|
||||
<string name="search_show_on_map">Voir sur la carte</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menu</string>
|
||||
|
|
|
@ -234,6 +234,7 @@
|
|||
<string name="duration_6_hours">6 óra</string>
|
||||
<string name="duration_12_hours">12 óra</string>
|
||||
<string name="duration_1_day">1 nap</string>
|
||||
<string name="placepage_distance">Távolság</string>
|
||||
<string name="search_show_on_map">Megtekintés a térképen</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Honlap</string>
|
||||
|
|
|
@ -222,6 +222,7 @@
|
|||
<string name="duration_6_hours">6 jam</string>
|
||||
<string name="duration_12_hours">12 jam</string>
|
||||
<string name="duration_1_day">1 hari</string>
|
||||
<string name="placepage_distance">Jarak</string>
|
||||
<string name="search_show_on_map">Tampilkan pada peta</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Situs Web</string>
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
<string name="duration_6_hours">6 ore</string>
|
||||
<string name="duration_12_hours">12 ore</string>
|
||||
<string name="duration_1_day">1 giorno</string>
|
||||
<string name="placepage_distance">Distanza</string>
|
||||
<string name="search_show_on_map">Visualizza sulla mappa</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Sito web</string>
|
||||
|
|
|
@ -172,6 +172,7 @@
|
|||
<string name="pref_zoom_summary">הצג על המסך</string>
|
||||
<!-- A message in Settings/Preferences explaining why is it not possible to enable 3D buildings when max power saving mode is enabled -->
|
||||
<string name="pref_map_3d_buildings_disabled_summary">מבנים תלת מימדיים כבויים במצב חיסכון בחשמל</string>
|
||||
<string name="placepage_distance">מרחק</string>
|
||||
<string name="search_show_on_map">ראה במפה</string>
|
||||
<!-- Text in About menu, opens Organic Maps news website -->
|
||||
<string name="news">תוֹשׁדָחֲ</string>
|
||||
|
|
|
@ -218,6 +218,7 @@
|
|||
<string name="duration_6_hours">6時間</string>
|
||||
<string name="duration_12_hours">12時間</string>
|
||||
<string name="duration_1_day">1日</string>
|
||||
<string name="placepage_distance">距離</string>
|
||||
<string name="search_show_on_map">地図に表示</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">ウェブサイト</string>
|
||||
|
|
|
@ -220,6 +220,7 @@
|
|||
<string name="duration_6_hours">6시간</string>
|
||||
<string name="duration_12_hours">12시간</string>
|
||||
<string name="duration_1_day">1일</string>
|
||||
<string name="placepage_distance">거리</string>
|
||||
<string name="search_show_on_map">지도 보기</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">웹사이트</string>
|
||||
|
|
|
@ -213,6 +213,7 @@
|
|||
<string name="duration_6_hours">६ तास</string>
|
||||
<string name="duration_12_hours">१२ तास</string>
|
||||
<string name="duration_1_day">१ दिवस</string>
|
||||
<string name="placepage_distance">अंतर</string>
|
||||
<string name="search_show_on_map">नकाशावर पहा</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">संकेतस्थळ</string>
|
||||
|
|
|
@ -239,6 +239,7 @@
|
|||
<string name="duration_6_hours">6 timer</string>
|
||||
<string name="duration_12_hours">12 timer</string>
|
||||
<string name="duration_1_day">1 dag</string>
|
||||
<string name="placepage_distance">Avstand</string>
|
||||
<string name="search_show_on_map">Vis på kartet</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Meny</string>
|
||||
|
|
|
@ -237,6 +237,7 @@
|
|||
<string name="duration_6_hours">6 uur</string>
|
||||
<string name="duration_12_hours">12 uur</string>
|
||||
<string name="duration_1_day">1 dag</string>
|
||||
<string name="placepage_distance">Afstand</string>
|
||||
<string name="search_show_on_map">Op kaart bekijken</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Website</string>
|
||||
|
|
|
@ -237,6 +237,7 @@
|
|||
<string name="duration_6_hours">6 godzin</string>
|
||||
<string name="duration_12_hours">12 godzin</string>
|
||||
<string name="duration_1_day">1 dzień</string>
|
||||
<string name="placepage_distance">Dystans</string>
|
||||
<string name="search_show_on_map">Wyświetl na mapie</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menu</string>
|
||||
|
|
|
@ -235,6 +235,7 @@
|
|||
<string name="duration_6_hours">6 horas</string>
|
||||
<string name="duration_12_hours">12 horas</string>
|
||||
<string name="duration_1_day">1 dia</string>
|
||||
<string name="placepage_distance">Distância</string>
|
||||
<string name="search_show_on_map">Ver no mapa</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Site</string>
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
<string name="duration_6_hours">6 horas</string>
|
||||
<string name="duration_12_hours">12 horas</string>
|
||||
<string name="duration_1_day">1 dia</string>
|
||||
<string name="placepage_distance">Distância</string>
|
||||
<string name="search_show_on_map">Ver no mapa</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Site</string>
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
<string name="duration_6_hours">6 ore</string>
|
||||
<string name="duration_12_hours">12 ore</string>
|
||||
<string name="duration_1_day">1 zi</string>
|
||||
<string name="placepage_distance">Distanță</string>
|
||||
<string name="search_show_on_map">Vezi pe hartă</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Site web</string>
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
<string name="duration_6_hours">6 часов</string>
|
||||
<string name="duration_12_hours">12 часов</string>
|
||||
<string name="duration_1_day">1 сутки</string>
|
||||
<string name="placepage_distance">Расстояние</string>
|
||||
<string name="search_show_on_map">Посмотреть на карте</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Меню</string>
|
||||
|
|
|
@ -220,6 +220,7 @@
|
|||
<string name="duration_6_hours">6 hodín</string>
|
||||
<string name="duration_12_hours">12 hodín</string>
|
||||
<string name="duration_1_day">1 deň</string>
|
||||
<string name="placepage_distance">Vzdialenosť</string>
|
||||
<string name="search_show_on_map">Zobraziť na mape</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Webové stránky</string>
|
||||
|
|
|
@ -218,6 +218,7 @@
|
|||
<string name="duration_6_hours">6 timmar</string>
|
||||
<string name="duration_12_hours">12 timmar</string>
|
||||
<string name="duration_1_day">1 dag</string>
|
||||
<string name="placepage_distance">Avstånd</string>
|
||||
<string name="search_show_on_map">Visa på kartan</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Webbplats</string>
|
||||
|
|
|
@ -222,6 +222,7 @@
|
|||
<string name="duration_6_hours">6 ชั่วโมง</string>
|
||||
<string name="duration_12_hours">12 ชั่วโมง</string>
|
||||
<string name="duration_1_day">1 วัน</string>
|
||||
<string name="placepage_distance">ระยะห่าง</string>
|
||||
<string name="search_show_on_map">ดูบนแผนที่</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">เว็บไซต์</string>
|
||||
|
|
|
@ -239,6 +239,7 @@
|
|||
<string name="duration_6_hours">6 saat</string>
|
||||
<string name="duration_12_hours">12 saat</string>
|
||||
<string name="duration_1_day">1 gün</string>
|
||||
<string name="placepage_distance">Mesafe</string>
|
||||
<string name="search_show_on_map">Haritada görüntüle</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Web Sitesi</string>
|
||||
|
|
|
@ -233,6 +233,7 @@
|
|||
<string name="duration_6_hours">6 годин</string>
|
||||
<string name="duration_12_hours">12 годин</string>
|
||||
<string name="duration_1_day">1 день</string>
|
||||
<string name="placepage_distance">Відстань</string>
|
||||
<string name="search_show_on_map">Подивитись на мапі</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Меню</string>
|
||||
|
|
|
@ -220,6 +220,7 @@
|
|||
<string name="duration_6_hours">6 giờ</string>
|
||||
<string name="duration_12_hours">12 giờ</string>
|
||||
<string name="duration_1_day">1 ngày</string>
|
||||
<string name="placepage_distance">Khoảng cách</string>
|
||||
<string name="search_show_on_map">Xem trên bản đồ</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">Trang web</string>
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
<string name="duration_6_hours">6小時</string>
|
||||
<string name="duration_12_hours">12小時</string>
|
||||
<string name="duration_1_day">1天</string>
|
||||
<string name="placepage_distance">距离</string>
|
||||
<string name="search_show_on_map">在地圖上查看</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">網站</string>
|
||||
|
|
|
@ -224,6 +224,7 @@
|
|||
<string name="duration_6_hours">6小时</string>
|
||||
<string name="duration_12_hours">12小时</string>
|
||||
<string name="duration_1_day">1天</string>
|
||||
<string name="placepage_distance">距离</string>
|
||||
<string name="search_show_on_map">在地图上查看</string>
|
||||
<!-- Text in menu -->
|
||||
<string name="website">网站</string>
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
<dimen name="text_size_routing_dimension_inline">20sp</dimen>
|
||||
<dimen name="text_size_routing_plan_detail">16sp</dimen>
|
||||
<dimen name="text_size_routing_plan_detail_arrival">14sp</dimen>
|
||||
<dimen name="text_size_routing_plan_detail_intermediate">20sp</dimen>
|
||||
<dimen name="text_size_time_picker">56sp</dimen>
|
||||
|
||||
<dimen name="text_size_nav_street">17sp</dimen>
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
<string name="duration_6_hours">6 hours</string>
|
||||
<string name="duration_12_hours">12 hours</string>
|
||||
<string name="duration_1_day">1 day</string>
|
||||
<string name="placepage_distance">Distance</string>
|
||||
<string name="search_show_on_map">View on map</string>
|
||||
<!-- Menu button -->
|
||||
<string name="menu">Menu</string>
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
<attr name="routingButtonHint" format="color" />
|
||||
<attr name="drivingOptionsViewBg" format="color" />
|
||||
<attr name="transitPedestrianBackground" format="color" />
|
||||
<attr name="transitRulerBackground" format="color" />
|
||||
<attr name="colorBtnHighlight" format="color" />
|
||||
<attr name="transitStepDivider" format="reference" />
|
||||
<attr name="colorAccentTransparent" format="reference" />
|
||||
|
|
|
@ -87,6 +87,7 @@
|
|||
<item name="homeAsUpIndicator">@drawable/back_arrow</item>
|
||||
|
||||
<item name="transitPedestrianBackground">@color/black_4</item>
|
||||
<item name="transitRulerBackground">@color/black_4</item>
|
||||
<item name="transitStepDivider">@drawable/dot_divider</item>
|
||||
<item name="trafficMenuEnabled">@drawable/ic_layers_traffic_active</item>
|
||||
<item name="subwayMenuEnabled">@drawable/ic_layers_subway_active</item>
|
||||
|
@ -221,6 +222,7 @@
|
|||
<item name="homeAsUpIndicator">@drawable/back_arrow</item>
|
||||
|
||||
<item name="transitPedestrianBackground">@color/white_4</item>
|
||||
<item name="transitRulerBackground">@color/white_4</item>
|
||||
<item name="transitStepDivider">@drawable/dot_divider_night</item>
|
||||
<item name="trafficMenuEnabled">@drawable/ic_layers_traffic_active_night</item>
|
||||
<item name="subwayMenuEnabled">@drawable/ic_layers_subway_active_night</item>
|
||||
|
|
|
@ -46,7 +46,7 @@ public class Framework
|
|||
public static final int MAP_STYLE_VEHICLE_DARK = 4;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ ROUTER_TYPE_VEHICLE, ROUTER_TYPE_PEDESTRIAN, ROUTER_TYPE_BICYCLE, ROUTER_TYPE_TRANSIT })
|
||||
@IntDef({ ROUTER_TYPE_VEHICLE, ROUTER_TYPE_PEDESTRIAN, ROUTER_TYPE_BICYCLE, ROUTER_TYPE_TRANSIT, ROUTER_TYPE_RULER })
|
||||
|
||||
public @interface RouterType {}
|
||||
|
||||
|
@ -54,6 +54,7 @@ public class Framework
|
|||
public static final int ROUTER_TYPE_PEDESTRIAN = 1;
|
||||
public static final int ROUTER_TYPE_BICYCLE = 2;
|
||||
public static final int ROUTER_TYPE_TRANSIT = 3;
|
||||
public static final int ROUTER_TYPE_RULER = 4;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({DO_AFTER_UPDATE_NOTHING, DO_AFTER_UPDATE_AUTO_UPDATE, DO_AFTER_UPDATE_ASK_FOR_UPDATE})
|
||||
|
|
|
@ -29,13 +29,17 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.bookmarks.data.DistanceAndAzimut;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.util.Distance;
|
||||
import app.organicmaps.widget.recycler.DotDividerItemDecoration;
|
||||
import app.organicmaps.widget.recycler.MultilineLayoutManager;
|
||||
import app.organicmaps.util.Graphics;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
final class RoutingBottomMenuController implements View.OnClickListener
|
||||
|
@ -135,9 +139,10 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||
|
||||
void showAltitudeChartAndRoutingDetails()
|
||||
{
|
||||
UiUtils.hide(mError, mActionFrame, mTransitFrame);
|
||||
UiUtils.hide(mError, mActionFrame, mAltitudeChart, mAltitudeDifference, mTransitFrame);
|
||||
|
||||
showRouteAltitudeChart();
|
||||
if (!RoutingController.get().isVehicleRouterType() && !RoutingController.get().isRulerRouterType())
|
||||
showRouteAltitudeChart();
|
||||
showRoutingDetails();
|
||||
UiUtils.show(mAltitudeChartFrame);
|
||||
}
|
||||
|
@ -172,6 +177,53 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||
distanceView.setText(info.getTotalPedestrianDistance() + " " + info.getTotalPedestrianDistanceUnits());
|
||||
strump
commented
Added Added `final` keyword
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
void showRulerInfo(@NonNull RouteMarkData[] points, Distance totalLength)
|
||||
{
|
||||
UiUtils.hide(mError, mAltitudeChartFrame, mActionFrame, mAltitudeChartFrame);
|
||||
showStartButton(false);
|
||||
UiUtils.show(mTransitFrame);
|
||||
final RecyclerView rv = mTransitFrame.findViewById(R.id.transit_recycler_view);
|
||||
if (points.length > 2)
|
||||
{
|
||||
UiUtils.show(rv);
|
||||
final TransitStepAdapter adapter = new TransitStepAdapter();
|
||||
rv.setLayoutManager(new MultilineLayoutManager());
|
||||
rv.setNestedScrollingEnabled(false);
|
||||
rv.removeItemDecoration(mTransitViewDecorator);
|
||||
rv.addItemDecoration(mTransitViewDecorator);
|
||||
rv.setAdapter(adapter);
|
||||
adapter.setItems(pointsToRulerSteps(points));
|
||||
}
|
||||
else
|
||||
UiUtils.hide(rv); // Show only distance between start and finish
|
||||
|
||||
TextView totalTimeView = mTransitFrame.findViewById(R.id.total_time);
|
||||
totalTimeView.setText(mContext.getString(R.string.placepage_distance) + ": " +
|
||||
totalLength.mDistanceStr + " " + totalLength.getUnitsStr(mContext));
|
||||
|
||||
UiUtils.hide(mTransitFrame, R.id.dot);
|
||||
UiUtils.hide(mTransitFrame, R.id.pedestrian_icon);
|
||||
UiUtils.hide(mTransitFrame, R.id.total_distance);
|
||||
}
|
||||
|
||||
// Create steps info to use in TransitStepAdapter.
|
||||
private List<TransitStepInfo> pointsToRulerSteps(RouteMarkData[] points)
|
||||
{
|
||||
List<TransitStepInfo> transitSteps = new LinkedList<>();
|
||||
for (int i = 1; i < points.length; i++)
|
||||
{
|
||||
RouteMarkData segmentStart = points[i - 1];
|
||||
RouteMarkData segmentEnd = points[i];
|
||||
DistanceAndAzimut dist = Framework.nativeGetDistanceAndAzimuthFromLatLon(segmentStart.mLat, segmentStart.mLon, segmentEnd.mLat, segmentEnd.mLon, 0);
|
||||
if (i > 1)
|
||||
transitSteps.add(TransitStepInfo.intermediatePoint(i - 2));
|
||||
transitSteps.add(TransitStepInfo.ruler(dist.getDistance().mDistanceStr, dist.getDistance().getUnitsStr(mContext)));
|
||||
}
|
||||
|
||||
return transitSteps;
|
||||
}
|
||||
|
||||
void showAddStartFrame()
|
||||
{
|
||||
UiUtils.hide(mError, mTransitFrame);
|
||||
|
@ -206,15 +258,18 @@ final class RoutingBottomMenuController implements View.OnClickListener
|
|||
UiUtils.hide(mActionFrame);
|
||||
![]()
```suggestion
if (show)
{
mStart.setText(mContext.getText(R.string.p2p_start));
```
strump
commented
Fixed formatting Fixed formatting
|
||||
}
|
||||
|
||||
void setStartButton()
|
||||
void setStartButton(boolean show)
|
||||
{
|
||||
mStart.setText(mContext.getText(R.string.p2p_start));
|
||||
mStart.setOnClickListener(v -> {
|
||||
if (mListener != null)
|
||||
mListener.onRoutingStart();
|
||||
});
|
||||
if (show)
|
||||
{
|
||||
mStart.setText(mContext.getText(R.string.p2p_start));
|
||||
mStart.setOnClickListener(v -> {
|
||||
if (mListener != null)
|
||||
mListener.onRoutingStart();
|
||||
});
|
||||
}
|
||||
|
||||
showStartButton(true);
|
||||
showStartButton(show);
|
||||
}
|
||||
|
||||
private void showError(@NonNull String message)
|
||||
|
|
|
@ -603,6 +603,11 @@ public class RoutingController implements Initializable<Void>
|
|||
return mLastRouterType == Framework.ROUTER_TYPE_VEHICLE;
|
||||
}
|
||||
|
||||
boolean isRulerRouterType()
|
||||
{
|
||||
return mLastRouterType == Framework.ROUTER_TYPE_RULER;
|
||||
}
|
||||
|
||||
public boolean isNavigating()
|
||||
{
|
||||
return mState == State.NAVIGATION;
|
||||
|
@ -815,22 +820,14 @@ public class RoutingController implements Initializable<Void>
|
|||
}
|
||||
|
||||
if (isSamePoint)
|
||||
{
|
||||
Logger.d(TAG, "setEndPoint: skip the same end point");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (point != null && point.sameAs(startPoint))
|
||||
{
|
||||
if (endPoint == null)
|
||||
{
|
||||
Logger.d(TAG, "setEndPoint: skip because end point is empty");
|
||||
return false;
|
||||
}
|
||||
|
||||
Logger.d(TAG, "setEndPoint: swap with starting point");
|
||||
startPoint = endPoint;
|
||||
|
||||
}
|
||||
|
||||
endPoint = point;
|
||||
|
|
|
@ -39,6 +39,8 @@ public class RoutingPlanController extends ToolbarController
|
|||
private final WheelProgressView mProgressTransit;
|
||||
@NonNull
|
||||
private final WheelProgressView mProgressBicycle;
|
||||
@NonNull
|
||||
private final WheelProgressView mProgressRuler;
|
||||
|
||||
// @NonNull
|
||||
// private final WheelProgressView mProgressTaxi;
|
||||
|
@ -93,6 +95,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
mProgressPedestrian = progressFrame.findViewById(R.id.progress_pedestrian);
|
||||
mProgressTransit = progressFrame.findViewById(R.id.progress_transit);
|
||||
mProgressBicycle = progressFrame.findViewById(R.id.progress_bicycle);
|
||||
mProgressRuler = progressFrame.findViewById(R.id.progress_ruler);
|
||||
// mProgressTaxi = (WheelProgressView) progressFrame.findViewById(R.id.progress_taxi);
|
||||
|
||||
mRoutingBottomMenuController = RoutingBottomMenuController.newInstance(requireActivity(), mFrame, listener);
|
||||
|
@ -128,12 +131,13 @@ public class RoutingPlanController extends ToolbarController
|
|||
{
|
||||
setupRouterButton(R.id.vehicle, R.drawable.ic_car, this::onVehicleModeSelected);
|
||||
setupRouterButton(R.id.pedestrian, R.drawable.ic_pedestrian, this::onPedestrianModeSelected);
|
||||
setupRouterButton(R.id.bicycle, R.drawable.ic_bike, this::onBicycleModeSelected);
|
||||
// setupRouterButton(R.id.taxi, R.drawable.ic_taxi, this::onTaxiModeSelected);
|
||||
setupRouterButton(R.id.transit, R.drawable.ic_transit, v -> onTransitModeSelected());
|
||||
setupRouterButton(R.id.transit, R.drawable.ic_transit, this::onTransitModeSelected);
|
||||
setupRouterButton(R.id.bicycle, R.drawable.ic_bike, this::onBicycleModeSelected);
|
||||
setupRouterButton(R.id.ruler, R.drawable.ic_ruler_route, this::onRulerModeSelected);
|
||||
}
|
||||
|
||||
private void onTransitModeSelected()
|
||||
private void onTransitModeSelected(@NonNull View v)
|
||||
{
|
||||
RoutingController.get().setRouterType(Framework.ROUTER_TYPE_TRANSIT);
|
||||
}
|
||||
|
@ -143,6 +147,11 @@ public class RoutingPlanController extends ToolbarController
|
|||
RoutingController.get().setRouterType(Framework.ROUTER_TYPE_BICYCLE);
|
||||
}
|
||||
|
||||
private void onRulerModeSelected(@NonNull View v)
|
||||
{
|
||||
RoutingController.get().setRouterType(Framework.ROUTER_TYPE_RULER);
|
||||
}
|
||||
|
||||
private void onPedestrianModeSelected(@NonNull View v)
|
||||
{
|
||||
RoutingController.get().setRouterType(Framework.ROUTER_TYPE_PEDESTRIAN);
|
||||
|
@ -172,7 +181,7 @@ public class RoutingPlanController extends ToolbarController
|
|||
{
|
||||
RoutingController.BuildState buildState = RoutingController.get().getBuildState();
|
||||
|
||||
boolean ready = (buildState == RoutingController.BuildState.BUILT);
|
||||
final boolean ready = (buildState == RoutingController.BuildState.BUILT);
|
||||
|
||||
if (!ready)
|
||||
{
|
||||
|
@ -188,39 +197,53 @@ public class RoutingPlanController extends ToolbarController
|
|||
return;
|
||||
}
|
||||
|
||||
mRoutingBottomMenuController.setStartButton();
|
||||
if (isRulerType())
|
||||
{
|
||||
RoutingInfo routingInfo = RoutingController.get().getCachedRoutingInfo();
|
||||
if (routingInfo != null)
|
||||
mRoutingBottomMenuController.showRulerInfo(Framework.nativeGetRoutePoints(), routingInfo.distToTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean showStartButton = !RoutingController.get().isRulerRouterType();
|
||||
mRoutingBottomMenuController.setStartButton(showStartButton);
|
||||
mRoutingBottomMenuController.showAltitudeChartAndRoutingDetails();
|
||||
}
|
||||
|
||||
public void updateBuildProgress(int progress, @Framework.RouterType int router)
|
||||
{
|
||||
UiUtils.invisible(mProgressVehicle, mProgressPedestrian, mProgressTransit,
|
||||
mProgressBicycle);
|
||||
mProgressBicycle, mProgressRuler);
|
||||
WheelProgressView progressView;
|
||||
if (router == Framework.ROUTER_TYPE_VEHICLE)
|
||||
switch(router)
|
||||
{
|
||||
case Framework.ROUTER_TYPE_VEHICLE:
|
||||
mRouterTypes.check(R.id.vehicle);
|
||||
progressView = mProgressVehicle;
|
||||
}
|
||||
else if (router == Framework.ROUTER_TYPE_PEDESTRIAN)
|
||||
{
|
||||
break;
|
||||
case Framework.ROUTER_TYPE_PEDESTRIAN:
|
||||
mRouterTypes.check(R.id.pedestrian);
|
||||
progressView = mProgressPedestrian;
|
||||
}
|
||||
// else if (router == Framework.ROUTER_TYPE_TAXI)
|
||||
// {
|
||||
// mRouterTypes.check(R.id.taxi);
|
||||
// progressView = mProgressTaxi;
|
||||
// }
|
||||
else if (router == Framework.ROUTER_TYPE_TRANSIT)
|
||||
{
|
||||
break;
|
||||
//case Framework.ROUTER_TYPE_TAXI:
|
||||
// {
|
||||
// mRouterTypes.check(R.id.taxi);
|
||||
// progressView = mProgressTaxi;
|
||||
// }
|
||||
case Framework.ROUTER_TYPE_TRANSIT:
|
||||
mRouterTypes.check(R.id.transit);
|
||||
progressView = mProgressTransit;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
case Framework.ROUTER_TYPE_BICYCLE:
|
||||
mRouterTypes.check(R.id.bicycle);
|
||||
progressView = mProgressBicycle;
|
||||
break;
|
||||
case Framework.ROUTER_TYPE_RULER:
|
||||
mRouterTypes.check(R.id.ruler);
|
||||
progressView = mProgressRuler;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("unknown router: " + router);
|
||||
}
|
||||
|
||||
RoutingToolbarButton button = mRouterTypes
|
||||
|
@ -246,6 +269,11 @@ public class RoutingPlanController extends ToolbarController
|
|||
return RoutingController.get().isTransitType();
|
||||
}
|
||||
|
||||
private boolean isRulerType()
|
||||
{
|
||||
return RoutingController.get().isRulerRouterType();
|
||||
}
|
||||
|
||||
void saveRoutingPanelState(@NonNull Bundle outState)
|
||||
{
|
||||
mRoutingBottomMenuController.saveRoutingPanelState(outState);
|
||||
|
|
|
@ -18,10 +18,11 @@ public class TransitStepInfo
|
|||
private static final int TRANSIT_TYPE_TRAIN = 3;
|
||||
private static final int TRANSIT_TYPE_LIGHT_RAIL = 4;
|
||||
private static final int TRANSIT_TYPE_MONORAIL = 5;
|
||||
private static final int TRANSIT_TYPE_RULER = 6;
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ TRANSIT_TYPE_INTERMEDIATE_POINT, TRANSIT_TYPE_PEDESTRIAN, TRANSIT_TYPE_SUBWAY,
|
||||
TRANSIT_TYPE_TRAIN, TRANSIT_TYPE_LIGHT_RAIL, TRANSIT_TYPE_MONORAIL })
|
||||
TRANSIT_TYPE_TRAIN, TRANSIT_TYPE_LIGHT_RAIL, TRANSIT_TYPE_MONORAIL, TRANSIT_TYPE_RULER})
|
||||
@interface TransitType {}
|
||||
|
||||
@NonNull
|
||||
|
@ -48,6 +49,18 @@ public class TransitStepInfo
|
|||
mIntermediateIndex = intermediateIndex;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static TransitStepInfo intermediatePoint(int intermediateIndex)
|
||||
{
|
||||
return new TransitStepInfo(TRANSIT_TYPE_INTERMEDIATE_POINT, null, null, 0, null, 0, intermediateIndex);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static TransitStepInfo ruler(@NonNull String distance, @NonNull String distanceUnits)
|
||||
{
|
||||
return new TransitStepInfo(TRANSIT_TYPE_RULER, distance, distanceUnits, 0, null, 0, -1);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TransitStepType getType()
|
||||
{
|
||||
|
|
|
@ -12,7 +12,8 @@ public enum TransitStepType
|
|||
SUBWAY(R.drawable.ic_20px_route_planning_metro),
|
||||
TRAIN(R.drawable.ic_20px_route_planning_train),
|
||||
LIGHT_RAIL(R.drawable.ic_20px_route_planning_lightrail),
|
||||
MONORAIL(R.drawable.ic_20px_route_planning_monorail);
|
||||
MONORAIL(R.drawable.ic_20px_route_planning_monorail),
|
||||
RULER(R.drawable.ic_ruler_route);
|
||||
|
||||
@DrawableRes
|
||||
private final int mDrawable;
|
||||
|
|
|
@ -85,6 +85,12 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
|
|||
mDrawable = null;
|
||||
mText = String.valueOf(info.getIntermediateIndex() + 1);
|
||||
}
|
||||
else if (mStepType == TransitStepType.RULER)
|
||||
{
|
||||
mDrawable = null;
|
||||
mText = info.getDistance() + " " + info.getDistanceUnits();
|
||||
mTextPaint.setColor(Color.BLACK);
|
||||
}
|
||||
else
|
||||
{
|
||||
mDrawable = ResourcesCompat.getDrawable(getResources(), mStepType.getDrawable(), null);
|
||||
|
@ -101,6 +107,8 @@ public class TransitStepView extends View implements MultilineLayoutManager.Sque
|
|||
{
|
||||
case PEDESTRIAN:
|
||||
return ThemeUtils.getColor(context, R.attr.transitPedestrianBackground);
|
||||
case RULER:
|
||||
return ThemeUtils.getColor(context, R.attr.transitRulerBackground);
|
||||
case INTERMEDIATE_POINT:
|
||||
return ThemeUtils.getColor(context, R.attr.colorPrimary);
|
||||
default:
|
||||
|
|
|
@ -313,6 +313,7 @@
|
|||
436207616
|
||||
437326080
|
||||
442260561
|
||||
442905727
|
||||
444234362
|
||||
451800027
|
||||
452984831
|
||||
|
@ -367,6 +368,7 @@
|
|||
1300793480
|
||||
1301043238
|
||||
1301133440
|
||||
1301433013
|
||||
1304608947
|
||||
1306780114
|
||||
1308576652
|
||||
|
|
Binary file not shown.
|
@ -104992,6 +104992,10 @@ colors {
|
|||
name: "RoutePreview"
|
||||
color: 3003121664
|
||||
}
|
||||
value {
|
||||
name: "RouteRuler"
|
||||
color: 442905727
|
||||
}
|
||||
value {
|
||||
name: "RouteTrafficG0"
|
||||
color: 10167040
|
||||
|
|
Binary file not shown.
|
@ -105079,6 +105079,10 @@ colors {
|
|||
name: "RoutePreview"
|
||||
color: 3019898879
|
||||
}
|
||||
value {
|
||||
name: "RouteRuler"
|
||||
color: 1301433013
|
||||
}
|
||||
value {
|
||||
name: "RouteTrafficG0"
|
||||
color: 6164237
|
||||
|
|
Binary file not shown.
|
@ -74571,6 +74571,10 @@ colors {
|
|||
name: "RoutePreview"
|
||||
color: 3003121664
|
||||
}
|
||||
value {
|
||||
name: "RouteRuler"
|
||||
color: 857551774
|
||||
}
|
||||
value {
|
||||
name: "RouteTrafficG0"
|
||||
color: 10167040
|
||||
|
|
Binary file not shown.
|
@ -74948,6 +74948,10 @@ colors {
|
|||
name: "RoutePreview"
|
||||
color: 3019898879
|
||||
}
|
||||
value {
|
||||
name: "RouteRuler"
|
||||
color: 1308604747
|
||||
}
|
||||
value {
|
||||
name: "RouteTrafficG0"
|
||||
color: 6164237
|
||||
|
|
|
@ -5710,7 +5710,7 @@
|
|||
zh-Hant = 它可讓您記錄特定期間所行經的路徑,並在地圖上看到該路徑。請注意:啟用此項功能會增加電池使用量。在時間間隔過期後,會從地圖中自動移除行進路線。
|
||||
|
||||
[placepage_distance]
|
||||
tags = ios
|
||||
tags = android,ios
|
||||
en = Distance
|
||||
af = Afstand
|
||||
ar = المسافة
|
||||
|
|
|
@ -36,6 +36,8 @@ colors
|
|||
RoutePedestrian-opacity: 0.8;
|
||||
RouteBicycle-color: #9C27B0;
|
||||
RouteBicycle-opacity: 0.8;
|
||||
RouteRuler-color: #66347F;
|
||||
RouteRuler-opacity: 0.9;
|
||||
RoutePreview-color: #000000;
|
||||
RoutePreview-opacity: 0.3;
|
||||
RouteMaskCar-color: #000000;
|
||||
|
|
|
@ -36,6 +36,8 @@ colors
|
|||
RoutePedestrian-opacity: 0.7;
|
||||
RouteBicycle-color: #FF4B8C;
|
||||
RouteBicycle-opacity: 0.7;
|
||||
RouteRuler-color: #924ab5;
|
||||
RouteRuler-opacity: 0.7;
|
||||
RoutePreview-color: #FFFFFF;
|
||||
RoutePreview-opacity: 0.3;
|
||||
RouteMaskCar-color: #000000;
|
||||
|
|
|
@ -36,6 +36,8 @@ colors
|
|||
RoutePedestrian-opacity: 0.8;
|
||||
RouteBicycle-color: #9C27B0;
|
||||
RouteBicycle-opacity: 0.8;
|
||||
RouteRuler-color: #1D339E;
|
||||
RouteRuler-opacity: 0.8;
|
||||
RoutePreview-color: #000000;
|
||||
RoutePreview-opacity: 0.3;
|
||||
RouteMaskCar-color: #000000;
|
||||
|
|
|
@ -36,6 +36,8 @@ colors
|
|||
RoutePedestrian-opacity: 0.7;
|
||||
RouteBicycle-color: #FF4B8C;
|
||||
RouteBicycle-opacity: 0.7;
|
||||
RouteRuler-color: #FFB94B;
|
||||
RouteRuler-opacity: 0.7;
|
||||
RoutePreview-color: #FFFFFF;
|
||||
RoutePreview-opacity: 0.3;
|
||||
RouteMaskCar-color: #000000;
|
||||
|
|
|
@ -1433,7 +1433,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView, bool activeFram
|
|||
Render2dLayer(modelView);
|
||||
RenderUserMarksLayer(modelView, DepthLayer::UserLineLayer);
|
||||
|
||||
if (m_buildingsFramebuffer->IsSupported())
|
||||
if (m_buildingsFramebuffer->IsSupported() && !m_routeRenderer->IsRulerRoute())
|
||||
{
|
||||
RenderTrafficLayer(modelView);
|
||||
if (!HasTransitRouteData())
|
||||
|
|
|
@ -17,6 +17,7 @@ std::string const kRouteColor = "Route";
|
|||
std::string const kRouteOutlineColor = "RouteOutline";
|
||||
std::string const kRoutePedestrian = "RoutePedestrian";
|
||||
std::string const kRouteBicycle = "RouteBicycle";
|
||||
std::string const kRouteRuler = "RouteRuler";
|
||||
std::string const kRoutePreview = "RoutePreview";
|
||||
std::string const kRouteMaskCar = "RouteMaskCar";
|
||||
std::string const kRouteFirstSegmentArrowsMaskCar = "RouteFirstSegmentArrowsMaskCar";
|
||||
|
@ -797,10 +798,18 @@ void RouteRenderer::SetSubrouteVisibility(dp::DrapeID id, bool isVisible)
|
|||
bool RouteRenderer::HasTransitData() const
|
||||
{
|
||||
for (auto const & subroute : m_subroutes)
|
||||
{
|
||||
if (subroute.m_subroute->m_routeType == RouteType::Transit)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RouteRenderer::IsRulerRoute() const
|
||||
{
|
||||
for (auto const & subroute : m_subroutes)
|
||||
if (subroute.m_subroute->m_routeType == RouteType::Ruler)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ extern std::string const kRouteColor;
|
|||
extern std::string const kRouteOutlineColor;
|
||||
extern std::string const kRoutePedestrian;
|
||||
extern std::string const kRouteBicycle;
|
||||
extern std::string const kRouteRuler;
|
||||
extern std::string const kTransitStopInnerMarkerColor;
|
||||
|
||||
class RouteRenderer final
|
||||
|
@ -98,6 +99,7 @@ public:
|
|||
void SetSubrouteVisibility(dp::DrapeID id, bool isVisible);
|
||||
|
||||
bool HasTransitData() const;
|
||||
bool IsRulerRoute() const;
|
||||
bool HasData() const;
|
||||
bool HasPreviewData() const;
|
||||
|
||||
|
|
|
@ -46,7 +46,8 @@ enum class RouteType : uint8_t
|
|||
Pedestrian,
|
||||
Bicycle,
|
||||
Taxi,
|
||||
Transit
|
||||
Transit,
|
||||
Ruler
|
||||
};
|
||||
|
||||
struct RoutePattern
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#import "MWMNavigationDashboardManager.h"
|
||||
#import "MWMRoutePoint.h"
|
||||
#import "MWMRouterType.h"
|
||||
|
||||
namespace routing {
|
||||
|
@ -9,7 +10,7 @@ struct TransitRouteInfo;
|
|||
|
||||
@interface MWMNavigationDashboardManager (Entity)
|
||||
|
||||
- (void)updateFollowingInfo:(routing::FollowingInfo const &)info type:(MWMRouterType)type;
|
||||
- (void)updateFollowingInfo:(routing::FollowingInfo const &)info routePoints:(NSArray<MWMRoutePoint *> *)points type:(MWMRouterType)type;
|
||||
- (void)updateTransitInfo:(TransitRouteInfo const &)info;
|
||||
|
||||
@end
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#import "SwiftBridge.h"
|
||||
|
||||
#import <AudioToolbox/AudioServices.h>
|
||||
#import <CoreApi/Framework.h>
|
||||
|
||||
#include "routing/following_info.hpp"
|
||||
#include "routing/turns.hpp"
|
||||
|
@ -69,10 +70,13 @@ UIImage *image(routing::turns::PedestrianDirection t) {
|
|||
}
|
||||
|
||||
NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *distanceUnits,
|
||||
NSDictionary *primaryAttributes, NSDictionary *secondaryAttributes, BOOL isWalk) {
|
||||
NSString *eta = [NSDateComponentsFormatter etaStringFrom:time];
|
||||
auto result = [[NSMutableAttributedString alloc] initWithString:eta attributes:primaryAttributes];
|
||||
[result appendAttributedString:MWMNavigationDashboardEntity.estimateDot];
|
||||
NSDictionary *primaryAttributes, NSDictionary *secondaryAttributes, BOOL isWalk, BOOL showEta) {
|
||||
auto result = [[NSMutableAttributedString alloc] initWithString:@""];
|
||||
if (showEta) {
|
||||
NSString *eta = [NSDateComponentsFormatter etaStringFrom:time];
|
||||
[result appendAttributedString:[[NSMutableAttributedString alloc] initWithString:eta attributes:primaryAttributes]];
|
||||
[result appendAttributedString:MWMNavigationDashboardEntity.estimateDot];
|
||||
}
|
||||
|
||||
if (isWalk) {
|
||||
UIFont *font = primaryAttributes[NSFontAttributeName];
|
||||
|
@ -95,6 +99,33 @@ NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
NSArray<MWMRouterTransitStepInfo *> *buildRouteTransitSteps(NSArray<MWMRoutePoint *> *points) {
|
||||
// Generate step info in format: (Segment 1 distance) (1) (Segment 2 distance) (2) ... (n-1) (Segment N distance).
|
||||
NSMutableArray<MWMRouterTransitStepInfo *> *steps = [NSMutableArray arrayWithCapacity:[points count] * 2 - 1];
|
||||
auto const numPoints = [points count];
|
||||
for (int i = 0; i < numPoints - 1; i++) {
|
||||
MWMRoutePoint* segmentStart = points[i];
|
||||
MWMRoutePoint* segmentEnd = points[i + 1];
|
||||
auto const distance = platform::Distance::CreateFormatted(
|
||||
ms::DistanceOnEarth(segmentStart.latitude, segmentStart.longitude, segmentEnd.latitude, segmentEnd.longitude));
|
||||
|
||||
MWMRouterTransitStepInfo* segmentInfo = [[MWMRouterTransitStepInfo alloc] init];
|
||||
segmentInfo.type = MWMRouterTransitTypeRuler;
|
||||
segmentInfo.distance = @(distance.GetDistanceString().c_str());
|
||||
segmentInfo.distanceUnits = @(distance.GetUnitsString().c_str());
|
||||
steps[i * 2] = segmentInfo;
|
||||
|
||||
if (i < numPoints - 2) {
|
||||
MWMRouterTransitStepInfo* stopInfo = [[MWMRouterTransitStepInfo alloc] init];
|
||||
stopInfo.type = MWMRouterTransitTypeIntermediatePoint;
|
||||
stopInfo.intermediateIndex = i;
|
||||
steps[i * 2 + 1] = stopInfo;
|
||||
}
|
||||
}
|
||||
|
||||
return steps;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@interface MWMNavigationDashboardEntity ()
|
||||
|
@ -155,7 +186,7 @@ NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *
|
|||
|
||||
@implementation MWMNavigationDashboardManager (Entity)
|
||||
|
||||
- (void)updateFollowingInfo:(routing::FollowingInfo const &)info type:(MWMRouterType)type {
|
||||
- (void)updateFollowingInfo:(routing::FollowingInfo const &)info routePoints:(NSArray<MWMRoutePoint *> *)points type:(MWMRouterType)type {
|
||||
if ([MWMRouter isRouteFinished]) {
|
||||
[MWMRouter stopRouting];
|
||||
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
|
||||
|
@ -163,6 +194,8 @@ NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *
|
|||
}
|
||||
|
||||
if (auto entity = self.entity) {
|
||||
BOOL const showEta = (type != MWMRouterTypeRuler);
|
||||
|
||||
entity.isValid = YES;
|
||||
entity.timeToTarget = info.m_time;
|
||||
entity.targetDistance = @(info.m_distToTarget.GetDistanceString().c_str());
|
||||
|
@ -174,7 +207,11 @@ NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *
|
|||
entity.speedLimitMps = info.m_speedLimitMps;
|
||||
|
||||
entity.estimate = estimate(entity.timeToTarget, entity.targetDistance, entity.targetUnits,
|
||||
self.etaAttributes, self.etaSecondaryAttributes, NO);
|
||||
self.etaAttributes, self.etaSecondaryAttributes, NO, showEta);
|
||||
if (type == MWMRouterTypeRuler && [points count] > 2)
|
||||
entity.transitSteps = buildRouteTransitSteps(points);
|
||||
else
|
||||
entity.transitSteps = [[NSArray alloc] init];
|
||||
|
||||
if (type == MWMRouterTypePedestrian) {
|
||||
entity.turnImage = image(info.m_pedestrianTurn);
|
||||
|
@ -200,8 +237,8 @@ NSAttributedString *estimate(NSTimeInterval time, NSString *distance, NSString *
|
|||
entity.isValid = YES;
|
||||
entity.estimate =
|
||||
estimate(info.m_totalTimeInSec, @(info.m_totalPedestrianDistanceStr.c_str()),
|
||||
@(info.m_totalPedestrianUnitsSuffix.c_str()), self.etaAttributes, self.etaSecondaryAttributes, YES);
|
||||
NSMutableArray<MWMRouterTransitStepInfo *> *transitSteps = [@[] mutableCopy];
|
||||
@(info.m_totalPedestrianUnitsSuffix.c_str()), self.etaAttributes, self.etaSecondaryAttributes, YES, YES);
|
||||
NSMutableArray<MWMRouterTransitStepInfo *> *transitSteps = [NSMutableArray new];
|
||||
for (auto const &stepInfo : info.m_steps)
|
||||
[transitSteps addObject:[[MWMRouterTransitStepInfo alloc] initWithStepInfo:stepInfo]];
|
||||
entity.transitSteps = transitSteps;
|
||||
|
|
|
@ -82,8 +82,10 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
|
|||
if (!entity.isValid)
|
||||
return;
|
||||
[_navigationInfoView onNavigationInfoUpdated:entity];
|
||||
if ([MWMRouter type] == MWMRouterTypePublicTransport)
|
||||
[_transportRoutePreviewStatus onNavigationInfoUpdated:entity];
|
||||
bool const isPublicTransport = [MWMRouter type] == MWMRouterTypePublicTransport;
|
||||
bool const isRuler = [MWMRouter type] == MWMRouterTypeRuler;
|
||||
if (isPublicTransport || isRuler)
|
||||
[_transportRoutePreviewStatus onNavigationInfoUpdated:entity prependDistance:isRuler];
|
||||
else
|
||||
[_baseRoutePreviewStatus onNavigationInfoUpdated:entity];
|
||||
[_navigationControlView onNavigationInfoUpdated:entity];
|
||||
|
@ -172,17 +174,24 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
|
|||
|
||||
- (void)stateReady {
|
||||
// TODO: Here assert sometimes fires with _state = MWMNavigationDashboardStateReady, if app was stopped while navigating and then restarted.
|
||||
NSAssert(_state == MWMNavigationDashboardStatePlanning, @"Invalid state change (ready)");
|
||||
// Also in ruler mode when new point is added by single tap on the map state MWMNavigationDashboardStatePlanning is skipped and we get _state = MWMNavigationDashboardStateReady.
|
||||
NSAssert(_state == MWMNavigationDashboardStatePlanning || _state == MWMNavigationDashboardStateReady, @"Invalid state change (ready)");
|
||||
[self setRouteBuilderProgress:100.];
|
||||
[self updateGoButtonTitle];
|
||||
auto const isTransport = ([MWMRouter type] == MWMRouterTypePublicTransport);
|
||||
if (isTransport)
|
||||
bool const isTransport = ([MWMRouter type] == MWMRouterTypePublicTransport);
|
||||
bool const isRuler = ([MWMRouter type] == MWMRouterTypeRuler);
|
||||
if (isTransport || isRuler)
|
||||
[self.transportRoutePreviewStatus showReady];
|
||||
else
|
||||
[self.baseRoutePreviewStatus showReady];
|
||||
self.goButtonsContainer.hidden = isTransport;
|
||||
self.goButtonsContainer.hidden = isTransport || isRuler;
|
||||
for (MWMRouteStartButton *button in self.goButtons)
|
||||
[button stateReady];
|
||||
{
|
||||
if (isRuler)
|
||||
[button stateHidden];
|
||||
else
|
||||
[button stateReady];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)onRouteStart {
|
||||
|
|
|
@ -18,7 +18,7 @@ static CGFloat const kDrivingOptionsHeight = 48;
|
|||
@property(weak, nonatomic) IBOutlet UIView * contentView;
|
||||
@property(weak, nonatomic) IBOutlet UIView * pedestrian;
|
||||
@property(weak, nonatomic) IBOutlet UIView * publicTransport;
|
||||
@property(weak, nonatomic) IBOutlet UIView * helicopter;
|
||||
@property(weak, nonatomic) IBOutlet UIView * ruler;
|
||||
@property(weak, nonatomic) IBOutlet UIView * vehicle;
|
||||
@property(strong, nonatomic) IBOutlet NSLayoutConstraint * drivingOptionHeightConstraint;
|
||||
@property(strong, nonatomic) IBOutlet UIButton * drivingOptionsButton;
|
||||
|
@ -73,6 +73,7 @@ static CGFloat const kDrivingOptionsHeight = 48;
|
|||
imageName:@"ic_train"
|
||||
routerType:MWMRouterTypePublicTransport];
|
||||
[self addProgress:self.bicycle imageName:@"ic_bike" routerType:MWMRouterTypeBicycle];
|
||||
[self addProgress:self.ruler imageName:@"ic_ruler_route" routerType:MWMRouterTypeRuler];
|
||||
}
|
||||
|
||||
- (void)addProgress:(UIView *)parentView
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -109,10 +109,10 @@
|
|||
<constraint firstAttribute="width" secondItem="yiM-fM-sSS" secondAttribute="height" multiplier="1:1" id="1N1-y5-Mwc"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="f6i-lw-K3R" userLabel="Helicopter">
|
||||
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f6i-lw-K3R" userLabel="Ruler">
|
||||
<rect key="frame" x="198" y="0.0" width="40" height="40"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeHelicopter"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeRuler"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="f6i-lw-K3R" secondAttribute="height" multiplier="1:1" id="iex-7v-w3k"/>
|
||||
</constraints>
|
||||
|
@ -139,9 +139,6 @@
|
|||
<constraint firstItem="jDl-pu-eov" firstAttribute="top" secondItem="sXu-tl-a0m" secondAttribute="top" id="sf1-S5-kmZ"/>
|
||||
</constraints>
|
||||
<variation key="default">
|
||||
<mask key="subviews">
|
||||
<exclude reference="f6i-lw-K3R"/>
|
||||
</mask>
|
||||
<mask key="constraints">
|
||||
<exclude reference="BWr-hr-pwo"/>
|
||||
<exclude reference="Cd3-ev-uFS"/>
|
||||
|
@ -355,7 +352,7 @@
|
|||
<outlet property="resultsBoxBottom" destination="82W-n1-9wJ" id="RLp-VX-RD7"/>
|
||||
</connections>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FXb-tH-ZTF" customClass="MWMTransportRoutePreviewStatus">
|
||||
<view contentMode="scaleToFill" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FXb-tH-ZTF" customClass="MWMTransportRoutePreviewStatus">
|
||||
<rect key="frame" x="0.0" y="152" width="320" height="80"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tuZ-25-ltG">
|
||||
|
@ -364,7 +361,7 @@
|
|||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<collectionView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" alwaysBounceHorizontal="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" delaysContentTouches="NO" canCancelContentTouches="NO" bouncesZoom="NO" dataMode="none" prefetchingEnabled="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8Ey-lL-uzF" customClass="TransportTransitStepsCollectionView" customModule="Organic_Maps" customModuleProvider="target">
|
||||
<collectionView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" ambiguous="YES" alwaysBounceVertical="YES" alwaysBounceHorizontal="YES" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" delaysContentTouches="NO" canCancelContentTouches="NO" bouncesZoom="NO" dataMode="none" prefetchingEnabled="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8Ey-lL-uzF" customClass="TransportTransitStepsCollectionView" customModule="Organic_Maps" customModuleProvider="target">
|
||||
<rect key="frame" x="16" y="44" width="288" height="20"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
|
@ -381,7 +378,7 @@
|
|||
<constraint firstAttribute="bottom" secondItem="8Ey-lL-uzF" secondAttribute="bottom" constant="16" id="KxL-xf-eVL"/>
|
||||
<constraint firstAttribute="trailing" secondItem="8Ey-lL-uzF" secondAttribute="trailing" constant="16" id="ejR-Po-Dxm"/>
|
||||
<constraint firstItem="8Ey-lL-uzF" firstAttribute="leading" secondItem="tuZ-25-ltG" secondAttribute="leading" id="gkU-xQ-hb2"/>
|
||||
<constraint firstAttribute="height" priority="100" constant="80" id="lLi-5o-PDI"/>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" priority="100" constant="40" id="lLi-5o-PDI"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="RouteBasePreview"/>
|
||||
|
@ -459,7 +456,7 @@
|
|||
<outlet property="drivingOptionsButton" destination="Opi-yT-xIZ" id="tMG-Af-HEo"/>
|
||||
<outlet property="pedestrian" destination="VhE-hA-Leo" id="R3O-th-Jw0"/>
|
||||
<outlet property="publicTransport" destination="Eu3-bT-Dom" id="XNh-uW-Kog"/>
|
||||
<outlet property="taxi" destination="f6i-lw-K3R" id="s0G-le-Kbz"/>
|
||||
<outlet property="ruler" destination="f6i-lw-K3R" id="s0G-le-Kbz"/>
|
||||
<outlet property="vehicle" destination="jDl-pu-eov" id="awM-KI-2xO"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="448" y="573.46326836581716"/>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -22,7 +22,7 @@
|
|||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ib5-qh-Cmo">
|
||||
<rect key="frame" x="0.0" y="48" width="320" height="48"/>
|
||||
<rect key="frame" x="0.0" y="34" width="320" height="48"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZXA-Og-q2I">
|
||||
<rect key="frame" x="72.5" y="12" width="175" height="24"/>
|
||||
|
@ -47,17 +47,17 @@
|
|||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tRj-9k-ciR">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="0.0"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="20"/>
|
||||
<color key="backgroundColor" red="0.1215686275" green="0.59999999999999998" blue="0.32156862749999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="PrimaryBackground"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WqK-Yb-PmP" customClass="SolidTouchView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
|
||||
<rect key="frame" x="0.0" y="20" width="320" height="14"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="wpf-tw-Coz" userLabel="Back">
|
||||
<rect key="frame" x="0.0" y="0.0" width="48" height="48"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="14" height="14"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="goBackButton"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="wpf-tw-Coz" secondAttribute="height" multiplier="1:1" id="CvM-v4-Hlm"/>
|
||||
|
@ -68,7 +68,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oQc-l8-sZH" userLabel="Buttons Box">
|
||||
<rect key="frame" x="62" y="4" width="196" height="40"/>
|
||||
<rect key="frame" x="106" y="4" width="108" height="6"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cZF-Ha-2tB">
|
||||
<rect key="frame" x="6" y="0.0" width="40" height="40"/>
|
||||
|
@ -82,7 +82,7 @@
|
|||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6D3-QF-6wm">
|
||||
<rect key="frame" x="54" y="0.0" width="40" height="40"/>
|
||||
<rect key="frame" x="54" y="0.0" width="6" height="6"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routePedestrian"/>
|
||||
<constraints>
|
||||
|
@ -90,7 +90,7 @@
|
|||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yIt-eq-pV5">
|
||||
<rect key="frame" x="102" y="0.0" width="40" height="40"/>
|
||||
<rect key="frame" x="68" y="0.0" width="6" height="6"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeAuto"/>
|
||||
<constraints>
|
||||
|
@ -98,17 +98,17 @@
|
|||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FuO-c6-y9C" userLabel="Bicycle">
|
||||
<rect key="frame" x="150" y="0.0" width="40" height="40"/>
|
||||
<rect key="frame" x="82" y="0.0" width="6" height="6"/>
|
||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeBicycle"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="FuO-c6-y9C" secondAttribute="height" multiplier="1:1" id="2Fj-re-jjm"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="15Q-ZN-NzE" userLabel="Helicopter">
|
||||
<rect key="frame" x="198" y="0.0" width="40" height="40"/>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="15Q-ZN-NzE" userLabel="Ruler">
|
||||
<rect key="frame" x="96" y="0.0" width="6" height="6"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeHelicopter"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="routeRuler"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="15Q-ZN-NzE" secondAttribute="height" multiplier="1:1" id="8os-Sl-i57"/>
|
||||
</constraints>
|
||||
|
@ -142,17 +142,6 @@
|
|||
<variation key="heightClass=compact" constant="16"/>
|
||||
</constraint>
|
||||
</constraints>
|
||||
<variation key="default">
|
||||
<mask key="subviews">
|
||||
<exclude reference="15Q-ZN-NzE"/>
|
||||
</mask>
|
||||
<mask key="constraints">
|
||||
<exclude reference="D1r-cA-jTR"/>
|
||||
<exclude reference="WHK-N0-dCc"/>
|
||||
<exclude reference="Wve-9m-8zL"/>
|
||||
<exclude reference="my7-I5-Qu3"/>
|
||||
</mask>
|
||||
</variation>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" red="0.12156862745098039" green="0.59999999999999998" blue="0.32156862745098036" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
|
@ -198,9 +187,9 @@
|
|||
<outlet property="contentView" destination="WqK-Yb-PmP" id="4ph-Dm-EFr"/>
|
||||
<outlet property="drivingOptionHeightConstraint" destination="Oxx-fO-ZLa" id="JOa-ih-oHZ"/>
|
||||
<outlet property="drivingOptionsButton" destination="ZXA-Og-q2I" id="IZf-0l-IIV"/>
|
||||
<outlet property="helicopter" destination="15Q-ZN-NzE" id="Hel-ic-Opt"/>
|
||||
<outlet property="pedestrian" destination="6D3-QF-6wm" id="bdh-zx-9LW"/>
|
||||
<outlet property="publicTransport" destination="yIt-eq-pV5" id="yIX-eM-Hrs"/>
|
||||
<outlet property="ruler" destination="15Q-ZN-NzE" id="Hel-ic-Opt"/>
|
||||
<outlet property="vehicle" destination="cZF-Ha-2tB" id="QP3-tU-nfO"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="448" y="364.31784107946032"/>
|
||||
|
@ -209,7 +198,7 @@
|
|||
<rect key="frame" x="0.0" y="0.0" width="320" height="152"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o7e-Ce-Flg">
|
||||
<rect key="frame" x="-100" y="0.0" width="520" height="252"/>
|
||||
<rect key="frame" x="-100" y="20" width="520" height="232"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="RouteBasePreview"/>
|
||||
|
@ -239,8 +228,8 @@
|
|||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Tai-sE-6DC" userLabel="Results Box">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="48"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="results" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sjQ-Sc-mtN">
|
||||
<rect key="frame" x="16" y="14" width="51" height="20"/>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="results" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sjQ-Sc-mtN">
|
||||
<rect key="frame" x="16" y="10" width="51" height="28"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
|
@ -287,11 +276,14 @@
|
|||
<constraint firstItem="sjQ-Sc-mtN" firstAttribute="centerY" secondItem="Tai-sE-6DC" secondAttribute="centerY" id="Aer-5j-lt1"/>
|
||||
<constraint firstAttribute="trailing" secondItem="CQB-xn-DSM" secondAttribute="trailing" constant="12" id="Any-Qx-9mT"/>
|
||||
<constraint firstItem="Zzm-Yo-BvL" firstAttribute="bottom" secondItem="CQB-xn-DSM" secondAttribute="bottom" id="V0p-f2-5K1"/>
|
||||
<constraint firstItem="sjQ-Sc-mtN" firstAttribute="top" secondItem="Tai-sE-6DC" secondAttribute="top" constant="10" id="Vhr-Mv-2aa"/>
|
||||
<constraint firstItem="CQB-xn-DSM" firstAttribute="centerY" secondItem="Tai-sE-6DC" secondAttribute="centerY" id="XI7-0e-bgf"/>
|
||||
<constraint firstItem="CQB-xn-DSM" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="sjQ-Sc-mtN" secondAttribute="trailing" constant="16" id="Xqn-Rd-gR3"/>
|
||||
<constraint firstItem="Zzm-Yo-BvL" firstAttribute="top" secondItem="CQB-xn-DSM" secondAttribute="top" id="cyE-HM-Ovf"/>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="48" id="dZS-mi-2sg"/>
|
||||
<constraint firstItem="sjQ-Sc-mtN" firstAttribute="leading" secondItem="Tai-sE-6DC" secondAttribute="leading" constant="16" id="gdz-UZ-QkO"/>
|
||||
<constraint firstAttribute="height" constant="48" id="tqy-f7-E4I"/>
|
||||
<constraint firstAttribute="bottom" secondItem="sjQ-Sc-mtN" secondAttribute="bottom" constant="10" id="pnl-MH-dtY"/>
|
||||
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="96" id="tqy-f7-E4I"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FBs-iT-nWY" userLabel="Height Box">
|
||||
|
@ -400,7 +392,7 @@
|
|||
<outlet property="resultsBox" destination="Tai-sE-6DC" id="l4p-m2-z4z"/>
|
||||
<outlet property="resultsBoxBottom" destination="trf-mi-xeb" id="tdb-sa-2ak"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="448" y="521"/>
|
||||
<point key="canvasLocation" x="448" y="520.83958020989508"/>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iWi-pM-AJF" customClass="MWMTransportRoutePreviewStatus">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="80"/>
|
||||
|
@ -412,8 +404,11 @@
|
|||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="RouteBasePreview"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Iu4-M8-t6g">
|
||||
<rect key="frame" x="16" y="12" width="42" height="20"/>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Iu4-M8-t6g">
|
||||
<rect key="frame" x="16" y="12" width="41.5" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="20" id="qgy-7x-cjR"/>
|
||||
</constraints>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
|
@ -431,7 +426,7 @@
|
|||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="Iu4-M8-t6g" firstAttribute="leading" secondItem="iWi-pM-AJF" secondAttribute="leading" constant="16" id="5Ge-fx-3pw"/>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="80" id="CQk-tf-wu9"/>
|
||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="40" id="CQk-tf-wu9"/>
|
||||
<constraint firstItem="RVh-LF-kSn" firstAttribute="top" secondItem="Iu4-M8-t6g" secondAttribute="bottom" constant="12" id="DOH-Jl-zYW"/>
|
||||
<constraint firstItem="RVh-LF-kSn" firstAttribute="leading" secondItem="Iu4-M8-t6g" secondAttribute="leading" id="Jo0-dN-03y"/>
|
||||
<constraint firstItem="Iu4-M8-t6g" firstAttribute="top" secondItem="iWi-pM-AJF" secondAttribute="top" constant="12" id="Zyw-PT-55a"/>
|
||||
|
|
|
@ -145,6 +145,7 @@ final class BaseRoutePreviewStatus: SolidTouchView {
|
|||
result.append(MWMNavigationDashboardEntity.estimateDot())
|
||||
result.append(elevation)
|
||||
}
|
||||
|
||||
resultLabel.attributedText = result
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,10 +38,19 @@ final class TransportRoutePreviewStatus: SolidTouchView {
|
|||
updateHeight()
|
||||
}
|
||||
|
||||
@objc func onNavigationInfoUpdated(_ info: MWMNavigationDashboardEntity) {
|
||||
@objc func onNavigationInfoUpdated(_ info: MWMNavigationDashboardEntity, prependDistance: Bool) {
|
||||
![]() https://stackoverflow.com/questions/57655129/ios-autolayout-how-to-show-hide-a-view-including-its-margins
strump
commented
There was a problem with panel min height = 80. I changed constraint to have height >= 40 and no more empty space )) There was a problem with panel min height = 80. I changed constraint to have height >= 40 and no more empty space ))
|
||||
navigationInfo = info
|
||||
etaLabel.attributedText = info.estimate
|
||||
if (prependDistance) {
|
||||
let labelText = NSMutableAttributedString(string: NSLocalizedString("placepage_distance", comment: "") + ": ")
|
||||
labelText.append(info.estimate)
|
||||
etaLabel.attributedText = labelText
|
||||
}
|
||||
else {
|
||||
etaLabel.attributedText = info.estimate
|
||||
}
|
||||
stepsCollectionView.steps = info.transitSteps
|
||||
|
||||
stepsCollectionView.isHidden = info.transitSteps.isEmpty
|
||||
}
|
||||
|
||||
private func updateHeight() {
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
final class TransportRuler: TransportTransitCell {
|
||||
enum Config {
|
||||
static let backgroundCornerRadius: CGFloat = 4
|
||||
static var backgroundColor: UIColor { return UIColor.blackOpaque() }
|
||||
static var imageColor: UIColor { return UIColor.blackSecondaryText() }
|
||||
static var labelTextColor: UIColor { return .black }
|
||||
static let labelTextFont = UIFont.bold12()
|
||||
static let labelTrailing: CGFloat = 8
|
||||
}
|
||||
|
||||
@IBOutlet private weak var background: UIView! {
|
||||
didSet {
|
||||
background.layer.cornerRadius = Config.backgroundCornerRadius
|
||||
background.backgroundColor = Config.backgroundColor
|
||||
}
|
||||
}
|
||||
|
||||
@IBOutlet private weak var label: UILabel! {
|
||||
didSet {
|
||||
label.textColor = Config.labelTextColor
|
||||
label.font = Config.labelTextFont
|
||||
}
|
||||
}
|
||||
|
||||
override class func estimatedCellSize(step: MWMRouterTransitStepInfo) -> CGSize {
|
||||
let defaultSize = super.estimatedCellSize(step: step)
|
||||
let labelText = step.distance + " " + step.distanceUnits;
|
||||
let labelSize = labelText.size(width: CGFloat.greatestFiniteMagnitude, font: Config.labelTextFont, maxNumberOfLines: 1)
|
||||
return CGSize(width: labelSize.width + Config.labelTrailing, height: defaultSize.height)
|
||||
}
|
||||
|
||||
override func config(step: MWMRouterTransitStepInfo) {
|
||||
label.isHidden = step.distance.isEmpty && step.distanceUnits.isEmpty
|
||||
label.text = step.distance + " " + step.distanceUnits
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="TransportRuler" customModule="Organic_Maps" customModuleProvider="target" propertyAccessControl="all">
|
||||
<rect key="frame" x="0.0" y="0.0" width="20" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
|
||||
<rect key="frame" x="0.0" y="0.0" width="20" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="zFu-7m-DoW">
|
||||
<rect key="frame" x="0.0" y="0.0" width="20" height="20"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="450" verticalCompressionResistancePriority="450" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="E5p-F1-lok">
|
||||
<rect key="frame" x="-25.5" y="0.0" width="41.5" height="20"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="E5p-F1-lok" secondAttribute="trailing" priority="750" id="5NZ-eM-6di"/>
|
||||
<constraint firstAttribute="bottom" secondItem="E5p-F1-lok" secondAttribute="bottom" id="Gu9-KZ-D9R"/>
|
||||
<constraint firstAttribute="trailing" secondItem="E5p-F1-lok" secondAttribute="trailing" priority="250" constant="4" id="YNn-8w-SmG"/>
|
||||
<constraint firstItem="E5p-F1-lok" firstAttribute="top" secondItem="zFu-7m-DoW" secondAttribute="top" id="ZPx-f9-8LV"/>
|
||||
<constraint firstAttribute="height" constant="20" id="nQ0-T1-CvV"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
</view>
|
||||
<viewLayoutGuide key="safeArea" id="UN7-Tp-qio"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="zFu-7m-DoW" secondAttribute="bottom" id="3wL-hq-d5s"/>
|
||||
<constraint firstItem="zFu-7m-DoW" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="JMg-4a-h4Z"/>
|
||||
<constraint firstItem="zFu-7m-DoW" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="MOo-JD-4vU"/>
|
||||
<constraint firstAttribute="trailing" secondItem="zFu-7m-DoW" secondAttribute="trailing" id="gmg-yt-uVD"/>
|
||||
</constraints>
|
||||
<size key="customSize" width="744" height="20"/>
|
||||
<connections>
|
||||
<outlet property="background" destination="zFu-7m-DoW" id="fh8-Ss-FeL"/>
|
||||
<outlet property="label" destination="E5p-F1-lok" id="rsx-8D-Hvq"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="612.79999999999995" y="48.575712143928037"/>
|
||||
</collectionViewCell>
|
||||
</objects>
|
||||
</document>
|
|
@ -20,7 +20,8 @@ final class TransportTransitStepsCollectionView: UICollectionView {
|
|||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
dataSource = self
|
||||
[TransportTransitIntermediatePoint.self, TransportTransitPedestrian.self, TransportTransitTrain.self].forEach {
|
||||
[TransportTransitIntermediatePoint.self, TransportTransitPedestrian.self,
|
||||
TransportTransitTrain.self, TransportRuler.self].forEach {
|
||||
register(cellClass: $0)
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +35,7 @@ final class TransportTransitStepsCollectionView: UICollectionView {
|
|||
case .subway: fallthrough
|
||||
case .lightRail: fallthrough
|
||||
case .monorail: return TransportTransitTrain.self
|
||||
case .ruler: return TransportRuler.self
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ final class TransportTransitTrain: TransportTransitCell {
|
|||
case .subway: image.image = #imageLiteral(resourceName: "ic_20px_route_planning_metro")
|
||||
case .lightRail: image.image = #imageLiteral(resourceName: "ic_20px_route_planning_lightrail")
|
||||
case .monorail: image.image = #imageLiteral(resourceName: "ic_20px_route_planning_monorail")
|
||||
case .ruler: fatalError()
|
||||
}
|
||||
background.backgroundColor = step.color
|
||||
|
||||
|
|
|
@ -15,6 +15,11 @@ final class RouteStartButton: UIButton {
|
|||
isEnabled = true
|
||||
}
|
||||
|
||||
@objc func stateHidden() {
|
||||
isHidden = true
|
||||
isEnabled = true
|
||||
}
|
||||
|
||||
override func applyTheme() {
|
||||
super.applyTheme()
|
||||
setBackgroundImage(UIColor.linkBlue().getImage(), for: .normal)
|
||||
|
|
|
@ -10,6 +10,7 @@ static inline routing::RouterType coreRouterType(MWMRouterType type)
|
|||
case MWMRouterTypePedestrian: return routing::RouterType::Pedestrian;
|
||||
case MWMRouterTypePublicTransport: return routing::RouterType::Transit;
|
||||
case MWMRouterTypeBicycle: return routing::RouterType::Bicycle;
|
||||
case MWMRouterTypeRuler: return routing::RouterType::Ruler;
|
||||
default:
|
||||
ASSERT(false, ("Invalid routing type"));
|
||||
return routing::RouterType::Vehicle;
|
||||
|
@ -24,6 +25,7 @@ static inline MWMRouterType routerType(routing::RouterType type)
|
|||
case routing::RouterType::Transit: return MWMRouterTypePublicTransport;
|
||||
case routing::RouterType::Pedestrian: return MWMRouterTypePedestrian;
|
||||
case routing::RouterType::Bicycle: return MWMRouterTypeBicycle;
|
||||
case routing::RouterType::Ruler: return MWMRouterTypeRuler;
|
||||
default:
|
||||
ASSERT(false, ("Invalid routing type"));
|
||||
return MWMRouterTypeVehicle;
|
||||
|
|
|
@ -56,6 +56,7 @@ char const *kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeIm
|
|||
switch ([self type]) {
|
||||
case MWMRouterTypeVehicle:
|
||||
case MWMRouterTypePublicTransport:
|
||||
case MWMRouterTypeRuler:
|
||||
return NO;
|
||||
case MWMRouterTypePedestrian:
|
||||
case MWMRouterTypeBicycle:
|
||||
|
@ -350,7 +351,7 @@ char const *kRenderAltitudeImagesQueueLabel = "mapsme.mwmrouter.renderAltitudeIm
|
|||
if ([MWMRouter type] == MWMRouterTypePublicTransport)
|
||||
[navManager updateTransitInfo:rm.GetTransitRouteInfo()];
|
||||
else
|
||||
[navManager updateFollowingInfo:info type:[MWMRouter type]];
|
||||
[navManager updateFollowingInfo:info routePoints:[MWMRouter points] type:[MWMRouter type]];
|
||||
}
|
||||
|
||||
+ (void)routeAltitudeImageForSize:(CGSize)size completion:(MWMImageHeightBlock)block {
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
@interface MWMRouterTransitStepInfo : NSObject
|
||||
|
||||
@property(nonatomic, readonly) MWMRouterTransitType type;
|
||||
@property(copy, nonatomic, readonly) NSString * distance;
|
||||
@property(copy, nonatomic, readonly) NSString * distanceUnits;
|
||||
@property(copy, nonatomic, readonly) NSString * number;
|
||||
@property(nonatomic, readonly) UIColor * color;
|
||||
@property(nonatomic, readonly) NSInteger intermediateIndex;
|
||||
@property(nonatomic, readwrite) MWMRouterTransitType type;
|
||||
@property(copy, nonatomic, readwrite) NSString * distance;
|
||||
@property(copy, nonatomic, readwrite) NSString * distanceUnits;
|
||||
@property(copy, nonatomic, readwrite) NSString * number;
|
||||
@property(nonatomic, readwrite) UIColor * color;
|
||||
@property(nonatomic, readwrite) NSInteger intermediateIndex;
|
||||
|
||||
@end
|
||||
|
|
|
@ -34,17 +34,6 @@ UIColor * convertColor(uint32_t colorARGB)
|
|||
}
|
||||
} // namespace
|
||||
|
||||
@interface MWMRouterTransitStepInfo ()
|
||||
|
||||
@property(nonatomic, readwrite) MWMRouterTransitType type;
|
||||
@property(copy, nonatomic, readwrite) NSString * distance;
|
||||
@property(copy, nonatomic, readwrite) NSString * distanceUnits;
|
||||
@property(copy, nonatomic, readwrite) NSString * number;
|
||||
@property(nonatomic, readwrite) UIColor * color;
|
||||
@property(nonatomic, readwrite) NSInteger intermediateIndex;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMRouterTransitStepInfo
|
||||
|
||||
- (instancetype)initWithStepInfo:(TransitStepInfo const &)info
|
||||
|
|
|
@ -4,5 +4,6 @@ typedef NS_CLOSED_ENUM(NSUInteger, MWMRouterTransitType) {
|
|||
MWMRouterTransitTypeSubway,
|
||||
MWMRouterTransitTypeTrain,
|
||||
MWMRouterTransitTypeLightRail,
|
||||
MWMRouterTransitTypeMonorail
|
||||
MWMRouterTransitTypeMonorail,
|
||||
MWMRouterTransitTypeRuler
|
||||
};
|
||||
|
|
|
@ -3,4 +3,5 @@ typedef NS_ENUM(NSUInteger, MWMRouterType) {
|
|||
MWMRouterTypePedestrian,
|
||||
MWMRouterTypePublicTransport,
|
||||
MWMRouterTypeBicycle,
|
||||
MWMRouterTypeRuler,
|
||||
};
|
||||
|
|
12
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route.imageset/Contents.json
vendored
Normal file
12
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "ic_ruler_route.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
13
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route.imageset/ic_ruler_route.svg
vendored
Normal file
13
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route.imageset/ic_ruler_route.svg
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="ic_ruler_route" width="40" height="40" viewBox="0 0 24 24" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="12" fill="#000" fill-opacity="0.1" fill-rule="nonzero"/>
|
||||
<g fill="none" stroke="#FFF" stroke-width="1.2" stoke-opacity="1">
|
||||
<circle cx="15.081" cy="6.6216998" r="1.5" />
|
||||
<circle cx="18.156366" cy="15.261349" r="1.5" />
|
||||
<circle cx="6.2401419" cy="16.537542" r="1.5" />
|
||||
<path d="M 7.3012803,15.429267 14.284339,7.6078359" />
|
||||
<path d="m 15.494528,7.907841 2.150295,6.228382" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 656 B |
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "ic_ruler_route_highlighted.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="vector" width="40" height="40" version="1.1" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="12" fill="#000" fill-opacity="0.1" fill-rule="nonzero"/>
|
||||
<g fill="none" stroke="#FFF" stroke-width="1.2" opacity="0.28">
|
||||
<circle cx="15.081" cy="6.6216998" r="1.5" />
|
||||
<circle cx="18.156366" cy="15.261349" r="1.5" />
|
||||
<circle cx="6.2401419" cy="16.537542" r="1.5" />
|
||||
<path d="M 7.3012803,15.429267 14.284339,7.6078359" />
|
||||
<path d="m 15.494528,7.907841 2.150295,6.228382" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 607 B |
12
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route_selected.imageset/Contents.json
vendored
Normal file
12
iphone/Maps/Images.xcassets/NavigationDashboard/ic_ruler_route_selected.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "ic_ruler_route_selected.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg id="ic_ruler_route_selected"
|
||||
width="40" height="40" viewBox="0 0 24 24" version="1.1"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
|
||||
<path
|
||||
style="fill:#FFF;fill-opacity:1"
|
||||
d="M 12 0 A 12 12 0 0 0 0 12 A 12 12 0 0 0 12 24 A 12 12 0 0 0 24 12 A 12 12 0 0 0 12 0 z M 15.079687 4.5210937 C 16.232375 4.5210938 17.182031 5.4684061 17.182031 6.6210937 C 17.182031 7.3292082 16.823137 7.9598545 16.279687 8.3414062 L 17.948437 13.173047 C 18.016825 13.166214 18.085784 13.1625 18.155859 13.1625 C 19.308547 13.1625 20.255859 14.10864 20.255859 15.261328 C 20.255859 16.414016 19.308547 17.361328 18.155859 17.361328 C 17.003173 17.361328 16.057031 16.414016 16.057031 15.261328 C 16.057031 14.607046 16.361701 14.019744 16.836328 13.633594 L 15.140625 8.7210937 C 15.120397 8.7216816 15.100046 8.7222656 15.079687 8.7222656 C 14.785576 8.7222656 14.505009 8.6600012 14.25 8.5488281 L 8.0542969 15.486328 C 8.2351988 15.796084 8.3402344 16.15563 8.3402344 16.5375 C 8.3402344 17.690188 7.392922 18.636328 6.2402344 18.636328 C 5.0875465 18.636328 4.1402344 17.690188 4.1402344 16.5375 C 4.1402344 15.384812 5.0875465 14.4375 6.2402344 14.4375 C 6.5774922 14.4375 6.8966137 14.518941 7.1800781 14.6625 L 13.330078 7.7765625 C 13.109439 7.4441534 12.980859 7.0464465 12.980859 6.6210937 C 12.980859 5.4684061 13.927001 4.5210937 15.079687 4.5210937 z M 15.079687 5.7222656 C 14.575527 5.7222656 14.182031 6.1169324 14.182031 6.6210937 C 14.182031 7.1252553 14.575527 7.5210937 15.079687 7.5210937 C 15.58385 7.5210937 15.980859 7.1252553 15.980859 6.6210937 C 15.980859 6.1169324 15.58385 5.7222656 15.079687 5.7222656 z M 18.155859 14.361328 C 17.651698 14.361328 17.255859 14.757167 17.255859 15.261328 C 17.255859 15.76549 17.651698 16.1625 18.155859 16.1625 C 18.660022 16.1625 19.057031 15.76549 19.057031 15.261328 C 19.057031 14.757167 18.660022 14.361328 18.155859 14.361328 z M 6.2402344 15.636328 C 5.7360728 15.636328 5.3402344 16.03334 5.3402344 16.5375 C 5.3402345 17.041661 5.7360728 17.4375 6.2402344 17.4375 C 6.7443959 17.4375 7.1402344 17.041661 7.1402344 16.5375 C 7.1402344 16.03334 6.7443959 15.636328 6.2402344 15.636328 z " />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -184,6 +184,8 @@
|
|||
3DBD7BE42425015C00ED9FE8 /* ParntersStyleSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DBD7BE32425015C00ED9FE8 /* ParntersStyleSheet.swift */; };
|
||||
3DEE1AEB21F72CD300054A91 /* MWMPowerManagmentViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DEE1AEA21F72CD300054A91 /* MWMPowerManagmentViewController.mm */; };
|
||||
408645FC21495EB1000A4A1D /* categories_cuisines.txt in Resources */ = {isa = PBXBuildFile; fileRef = 408645FB21495EB1000A4A1D /* categories_cuisines.txt */; };
|
||||
44360A0D2A7D34990016F412 /* TransportRuler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44360A0C2A7D34990016F412 /* TransportRuler.swift */; };
|
||||
44360A112A7D35440016F412 /* TransportRuler.xib in Resources */ = {isa = PBXBuildFile; fileRef = 44360A102A7D35440016F412 /* TransportRuler.xib */; };
|
||||
4501B1942077C35A001B9173 /* resources-xxxhdpi_clear in Resources */ = {isa = PBXBuildFile; fileRef = 4501B1922077C35A001B9173 /* resources-xxxhdpi_clear */; };
|
||||
4501B1952077C35A001B9173 /* resources-xxxhdpi_dark in Resources */ = {isa = PBXBuildFile; fileRef = 4501B1932077C35A001B9173 /* resources-xxxhdpi_dark */; };
|
||||
4554B6EC1E55F0EF0084017F /* drules_proto_vehicle_clear.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4554B6E81E55F02B0084017F /* drules_proto_vehicle_clear.bin */; };
|
||||
|
@ -1027,6 +1029,8 @@
|
|||
3DEE1AE921F72CD300054A91 /* MWMPowerManagmentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPowerManagmentViewController.h; sourceTree = "<group>"; };
|
||||
3DEE1AEA21F72CD300054A91 /* MWMPowerManagmentViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPowerManagmentViewController.mm; sourceTree = "<group>"; };
|
||||
408645FB21495EB1000A4A1D /* categories_cuisines.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = categories_cuisines.txt; path = ../../data/categories_cuisines.txt; sourceTree = "<group>"; };
|
||||
44360A0C2A7D34990016F412 /* TransportRuler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransportRuler.swift; sourceTree = "<group>"; };
|
||||
44360A102A7D35440016F412 /* TransportRuler.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TransportRuler.xib; sourceTree = "<group>"; };
|
||||
4501B1922077C35A001B9173 /* resources-xxxhdpi_clear */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-xxxhdpi_clear"; path = "../../data/resources-xxxhdpi_clear"; sourceTree = "<group>"; };
|
||||
4501B1932077C35A001B9173 /* resources-xxxhdpi_dark */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-xxxhdpi_dark"; path = "../../data/resources-xxxhdpi_dark"; sourceTree = "<group>"; };
|
||||
451950391B7A3E070085DA05 /* patterns.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = patterns.txt; path = ../../data/patterns.txt; sourceTree = "<group>"; };
|
||||
|
@ -2341,6 +2345,8 @@
|
|||
34AB65F61FC5AA320078E451 /* TransportTransitStepsCollectionView.swift */,
|
||||
34AB65F31FC5AA320078E451 /* TransportTransitTrain.swift */,
|
||||
34AB65F71FC5AA320078E451 /* TransportTransitTrain.xib */,
|
||||
44360A0C2A7D34990016F412 /* TransportRuler.swift */,
|
||||
44360A102A7D35440016F412 /* TransportRuler.xib */,
|
||||
);
|
||||
path = TransportTransitSteps;
|
||||
sourceTree = "<group>";
|
||||
|
@ -3854,6 +3860,7 @@
|
|||
6741A9551BF340DE002C974C /* resources-xxhdpi_dark in Resources */,
|
||||
340E1EF51E2F614400CE49BF /* SearchFilters.storyboard in Resources */,
|
||||
340E1EF81E2F614400CE49BF /* Settings.storyboard in Resources */,
|
||||
44360A112A7D35440016F412 /* TransportRuler.xib in Resources */,
|
||||
6741A9421BF340DE002C974C /* sound-strings in Resources */,
|
||||
F69018BD1E9F7CB600B3C10B /* MWMAutoupdateController.xib in Resources */,
|
||||
6741A97D1BF340DE002C974C /* synonyms.txt in Resources */,
|
||||
|
@ -3988,6 +3995,7 @@
|
|||
47E3C72D2111E6A2008B3B27 /* FadeTransitioning.swift in Sources */,
|
||||
34845DAF1E1649F6003D55B9 /* DownloaderNoResultsEmbedViewController.swift in Sources */,
|
||||
993DF0B523F6B2EF00AC231A /* PlacePageElevationLayout.swift in Sources */,
|
||||
44360A0D2A7D34990016F412 /* TransportRuler.swift in Sources */,
|
||||
CD6E8677226774C700D1EDF7 /* CPConstants.swift in Sources */,
|
||||
99A906DE23F6F7030005872B /* PlacePageBookmarkViewController.swift in Sources */,
|
||||
F6791B141C43DF0B007A8A6E /* MWMStartButton.m in Sources */,
|
||||
|
|
|
@ -2043,6 +2043,32 @@ void Framework::DeactivateHotelSearchMark()
|
|||
void Framework::OnTapEvent(place_page::BuildInfo const & buildInfo)
|
||||
{
|
||||
auto placePageInfo = BuildPlacePageInfo(buildInfo);
|
||||
bool isRoutePoint = placePageInfo.has_value() && placePageInfo->IsRoutePoint();
|
||||
|
||||
if (m_routingManager.IsRoutingActive()
|
||||
&& m_routingManager.GetCurrentRouterType() == routing::RouterType::Ruler
|
||||
&& !buildInfo.m_isLongTap
|
||||
&& !isRoutePoint)
|
||||
{
|
||||
DeactivateMapSelection(true /* notifyUI */);
|
||||
|
||||
// Continue route to the point
|
||||
RouteMarkData data;
|
||||
data.m_title = placePageInfo ? placePageInfo->GetTitle() : std::string();
|
||||
data.m_subTitle = std::string();
|
||||
data.m_pointType = RouteMarkType::Finish;
|
||||
data.m_intermediateIndex = m_routingManager.GetRoutePointsCount();
|
||||
data.m_isMyPosition = false;
|
||||
data.m_position = buildInfo.m_mercator;
|
||||
|
||||
m_routingManager.ContinueRouteToPoint(std::move(data));
|
||||
|
||||
// Refresh route
|
||||
m_routingManager.RemoveRoute(false /* deactivateFollowing */);
|
||||
m_routingManager.BuildRoute();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (placePageInfo)
|
||||
{
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "routing/route.hpp"
|
||||
#include "routing/routing_callbacks.hpp"
|
||||
#include "routing/routing_helpers.hpp"
|
||||
#include "routing/ruler_router.hpp"
|
||||
#include "routing/speed_camera.hpp"
|
||||
|
||||
#include "storage/country_info_getter.hpp"
|
||||
|
@ -200,6 +201,7 @@ VehicleType GetVehicleType(RouterType routerType)
|
|||
case RouterType::Bicycle: return VehicleType::Bicycle;
|
||||
case RouterType::Vehicle: return VehicleType::Car;
|
||||
case RouterType::Transit: return VehicleType::Transit;
|
||||
case RouterType::Ruler: return VehicleType::Transit;
|
||||
case RouterType::Count: CHECK(false, ("Invalid type", routerType)); return VehicleType::Count;
|
||||
}
|
||||
UNREACHABLE();
|
||||
|
@ -219,7 +221,7 @@ RoadWarningMarkType GetRoadType(RoutingOptions::Road road)
|
|||
}
|
||||
|
||||
drape_ptr<df::Subroute> CreateDrapeSubroute(vector<RouteSegment> const & segments, m2::PointD const & startPt,
|
||||
double baseDistance, double baseDepth, bool isTransit)
|
||||
double baseDistance, double baseDepth, routing::RouterType routerType)
|
||||
{
|
||||
auto subroute = make_unique_dp<df::Subroute>();
|
||||
subroute->m_baseDistance = baseDistance;
|
||||
|
@ -227,7 +229,7 @@ drape_ptr<df::Subroute> CreateDrapeSubroute(vector<RouteSegment> const & segment
|
|||
|
||||
auto constexpr kBias = 1.0;
|
||||
|
||||
if (isTransit)
|
||||
if (routerType == RouterType::Transit)
|
||||
{
|
||||
subroute->m_headFakeDistance = -kBias;
|
||||
subroute->m_tailFakeDistance = kBias;
|
||||
|
@ -247,6 +249,15 @@ drape_ptr<df::Subroute> CreateDrapeSubroute(vector<RouteSegment> const & segment
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
if (routerType == RouterType::Ruler)
|
||||
{
|
||||
auto const subrouteLen = segments.back().GetDistFromBeginningMerc() - baseDistance;
|
||||
subroute->m_headFakeDistance = -kBias;
|
||||
subroute->m_tailFakeDistance = subrouteLen + kBias;
|
||||
subroute->m_polyline = m2::PolylineD(std::move(points));
|
||||
return subroute;
|
||||
}
|
||||
|
||||
// We support visualization of fake edges only in the head and in the tail of subroute.
|
||||
auto constexpr kInvalidId = std::numeric_limits<size_t>::max();
|
||||
auto firstReal = kInvalidId;
|
||||
|
@ -292,7 +303,7 @@ drape_ptr<df::Subroute> CreateDrapeSubroute(vector<RouteSegment> const & segment
|
|||
subroute->m_tailFakeDistance = tailLen;
|
||||
}
|
||||
|
||||
subroute->m_polyline = m2::PolylineD(points);
|
||||
subroute->m_polyline = m2::PolylineD(std::move(points));
|
||||
return subroute;
|
||||
}
|
||||
} // namespace
|
||||
|
@ -401,7 +412,7 @@ void RoutingManager::OnBuildRouteReady(Route const & route, RouterResultCode cod
|
|||
|
||||
// Validate route (in case of bicycle routing it can be invalid).
|
||||
ASSERT(route.IsValid(), ());
|
||||
if (route.IsValid())
|
||||
if (route.IsValid() && m_currentRouterType != routing::RouterType::Ruler)
|
||||
{
|
||||
m2::RectD routeRect = route.GetPoly().GetLimitRect();
|
||||
routeRect.Scale(kRouteScaleMultiplier);
|
||||
|
@ -479,7 +490,8 @@ RouterType RoutingManager::GetLastUsedRouter() const
|
|||
{
|
||||
case RouterType::Pedestrian:
|
||||
case RouterType::Bicycle:
|
||||
case RouterType::Transit: return routerType;
|
||||
case RouterType::Transit:
|
||||
case RouterType::Ruler: return routerType;
|
||||
default: return RouterType::Vehicle;
|
||||
}
|
||||
}
|
||||
|
@ -517,7 +529,11 @@ void RoutingManager::SetRouterImpl(RouterType type)
|
|||
auto regionsFinder =
|
||||
make_unique<AbsentRegionsFinder>(countryFileGetter, localFileChecker, numMwmIds, dataSource);
|
||||
|
||||
auto router = make_unique<IndexRouter>(vehicleType, m_loadAltitudes, m_callbacks.m_countryParentNameGetterFn,
|
||||
std::unique_ptr<IRouter> router;
|
||||
if (type == RouterType::Ruler)
|
||||
router = make_unique<RulerRouter>();
|
||||
else
|
||||
router = make_unique<IndexRouter>(vehicleType, m_loadAltitudes, m_callbacks.m_countryParentNameGetterFn,
|
||||
countryFileGetter, getMwmRectByName, numMwmIds,
|
||||
MakeNumMwmTree(*numMwmIds, m_callbacks.m_countryInfoGetter()),
|
||||
m_routingSession, dataSource);
|
||||
|
@ -668,7 +684,8 @@ bool RoutingManager::InsertRoute(Route const & route)
|
|||
|
||||
auto const startPt = route.GetSubrouteAttrs(subrouteIndex).GetStart().GetPoint();
|
||||
auto subroute = CreateDrapeSubroute(segments, startPt, distance,
|
||||
static_cast<double>(subroutesCount - subrouteIndex - 1), isTransitRoute);
|
||||
static_cast<double>(subroutesCount - subrouteIndex - 1),
|
||||
m_currentRouterType);
|
||||
if (!subroute)
|
||||
continue;
|
||||
distance = segments.back().GetDistFromBeginningMerc();
|
||||
|
@ -702,6 +719,12 @@ bool RoutingManager::InsertRoute(Route const & route)
|
|||
FillTurnsDistancesForRendering(segments, subroute->m_baseDistance, subroute->m_turns);
|
||||
break;
|
||||
}
|
||||
case RouterType::Ruler:
|
||||
{
|
||||
subroute->m_routeType = df::RouteType::Ruler;
|
||||
subroute->AddStyle(df::SubrouteStyle(df::kRouteRuler, df::RoutePattern(16.0, 2.0)));
|
||||
break;
|
||||
}
|
||||
default: CHECK(false, ("Unknown router type"));
|
||||
}
|
||||
|
||||
|
@ -838,6 +861,30 @@ void RoutingManager::AddRoutePoint(RouteMarkData && markData)
|
|||
ReorderIntermediatePoints();
|
||||
}
|
||||
|
||||
void RoutingManager::ContinueRouteToPoint(RouteMarkData && markData)
|
||||
{
|
||||
ASSERT(m_bmManager != nullptr, ());
|
||||
ASSERT(markData.m_pointType == RouteMarkType::Finish, ("New route point should have type RouteMarkType::Finish"));
|
||||
RoutePointsLayout routePoints(*m_bmManager);
|
||||
|
||||
// Finish point is now Intermediate point
|
||||
RouteMarkPoint * finishMarkData = routePoints.GetRoutePointForEdit(RouteMarkType::Finish);
|
||||
finishMarkData->SetRoutePointType(RouteMarkType::Intermediate);
|
||||
finishMarkData->SetIntermediateIndex(routePoints.GetRoutePointsCount()-1);
|
||||
|
||||
if (markData.m_isMyPosition)
|
||||
{
|
||||
RouteMarkPoint const * mark = routePoints.GetMyPositionPoint();
|
||||
if (mark)
|
||||
routePoints.RemoveRoutePoint(mark->GetRoutePointType(), mark->GetIntermediateIndex());
|
||||
}
|
||||
|
||||
markData.m_intermediateIndex = routePoints.GetRoutePointsCount();
|
||||
markData.m_isVisible = !markData.m_isMyPosition;
|
||||
routePoints.AddRoutePoint(move(markData));
|
||||
ReorderIntermediatePoints();
|
||||
}
|
||||
|
||||
void RoutingManager::RemoveRoutePoint(RouteMarkType type, size_t intermediateIndex)
|
||||
{
|
||||
ASSERT(m_bmManager != nullptr, ());
|
||||
|
|
|
@ -226,6 +226,7 @@ public:
|
|||
void GenerateNotifications(std::vector<std::string> & notifications);
|
||||
|
||||
void AddRoutePoint(RouteMarkData && markData);
|
||||
void ContinueRouteToPoint(RouteMarkData && markData);
|
||||
std::vector<RouteMarkData> GetRoutePoints() const;
|
||||
size_t GetRoutePointsCount() const;
|
||||
void RemoveRoutePoint(RouteMarkType type, size_t intermediateIndex = 0);
|
||||
|
|
|
@ -131,6 +131,7 @@ RoutingSettings::RoutingSettings(QWidget * parent, Framework & framework)
|
|||
m_routerType->insertItem(static_cast<int>(RouterType::Pedestrian), "pedestrian");
|
||||
m_routerType->insertItem(static_cast<int>(RouterType::Bicycle), "bicycle");
|
||||
m_routerType->insertItem(static_cast<int>(RouterType::Transit), "transit");
|
||||
m_routerType->insertItem(static_cast<int>(RouterType::Ruler), "ruler");
|
||||
form->addRow("Choose router:", m_routerType);
|
||||
|
||||
m_showTurnsCheckbox = new QCheckBox({}, frame);
|
||||
|
|
|
@ -139,6 +139,8 @@ set(SRC
|
|||
routing_session.hpp
|
||||
routing_settings.cpp
|
||||
routing_settings.hpp
|
||||
ruler_router.cpp
|
||||
ruler_router.hpp
|
||||
segment.cpp
|
||||
segment.hpp
|
||||
segmented_route.cpp
|
||||
|
|
|
@ -371,17 +371,21 @@ void AsyncRouter::CalculateRoute()
|
|||
[delegateProxy, route, code]() { delegateProxy->OnReady(route, code); });
|
||||
}
|
||||
|
||||
bool const needAbsentRegions = (code != RouterResultCode::Cancelled);
|
||||
bool const needAbsentRegions = (code != RouterResultCode::Cancelled &&
|
||||
route->GetRouterId() != "ruler-router");
|
||||
|
||||
std::set<std::string> absent;
|
||||
if (absentRegionsFinder && needAbsentRegions)
|
||||
absentRegionsFinder->GetAbsentRegions(absent);
|
||||
|
||||
absent.insert(route->GetAbsentCountries().cbegin(), route->GetAbsentCountries().cend());
|
||||
if (!absent.empty())
|
||||
if (needAbsentRegions)
|
||||
{
|
||||
code = RouterResultCode::NeedMoreMaps;
|
||||
LOG(LDEBUG, ("Absent regions:", absent));
|
||||
if (absentRegionsFinder)
|
||||
absentRegionsFinder->GetAbsentRegions(absent);
|
||||
|
||||
absent.insert(route->GetAbsentCountries().cbegin(), route->GetAbsentCountries().cend());
|
||||
if (!absent.empty())
|
||||
{
|
||||
code = RouterResultCode::NeedMoreMaps;
|
||||
LOG(LDEBUG, ("Absent regions:", absent));
|
||||
}
|
||||
}
|
||||
|
||||
elapsedSec = timer.ElapsedSeconds(); // routing time + absents fetch time
|
||||
|
|
|
@ -10,6 +10,7 @@ std::string ToString(RouterType type)
|
|||
case RouterType::Pedestrian: return "pedestrian";
|
||||
case RouterType::Bicycle: return "bicycle";
|
||||
case RouterType::Transit: return "transit";
|
||||
case RouterType::Ruler: return "ruler";
|
||||
case RouterType::Count: return "count";
|
||||
}
|
||||
ASSERT(false, ());
|
||||
|
@ -26,6 +27,8 @@ RouterType FromString(std::string const & str)
|
|||
return RouterType::Bicycle;
|
||||
if (str == "transit")
|
||||
return RouterType::Transit;
|
||||
if (str == "ruler" || str == "helicopter") // TODO: "helicopter" is left for Beta version compatibility. Remove after ruler release.
|
||||
return RouterType::Ruler;
|
||||
|
||||
ASSERT(false, ("Incorrect routing string:", str));
|
||||
return RouterType::Vehicle;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue
nit: final for non-modified variables.