Helicopter/Ruler routing #5381

Merged
root merged 14 commits from helicopter-navigation-v2 into master 2023-08-31 10:29:26 +00:00
104 changed files with 843 additions and 145 deletions

View file

@ -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);

View 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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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" />

View file

@ -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>

View file

@ -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})

View file

@ -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());
biodranik commented 2023-08-26 21:47:36 +00:00 (Migrated from github.com)
Review

nit: final for non-modified variables.

nit: final for non-modified variables.
Review

Added final keyword

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);
biodranik commented 2023-08-26 21:48:44 +00:00 (Migrated from github.com)
Review
    if (show)
    {
      mStart.setText(mContext.getText(R.string.p2p_start));
```suggestion if (show) { mStart.setText(mContext.getText(R.string.p2p_start)); ```
Review

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)

View file

@ -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;

View file

@ -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);

View file

@ -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()
{

View file

@ -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;

View file

@ -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:

View file

@ -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.

View file

@ -104992,6 +104992,10 @@ colors {
name: "RoutePreview"
color: 3003121664
}
value {
name: "RouteRuler"
color: 442905727
}
value {
name: "RouteTrafficG0"
color: 10167040

Binary file not shown.

View file

@ -105079,6 +105079,10 @@ colors {
name: "RoutePreview"
color: 3019898879
}
value {
name: "RouteRuler"
color: 1301433013
}
value {
name: "RouteTrafficG0"
color: 6164237

Binary file not shown.

View file

@ -74571,6 +74571,10 @@ colors {
name: "RoutePreview"
color: 3003121664
}
value {
name: "RouteRuler"
color: 857551774
}
value {
name: "RouteTrafficG0"
color: 10167040

Binary file not shown.

View file

@ -74948,6 +74948,10 @@ colors {
name: "RoutePreview"
color: 3019898879
}
value {
name: "RouteRuler"
color: 1308604747
}
value {
name: "RouteTrafficG0"
color: 6164237

View file

@ -5710,7 +5710,7 @@
zh-Hant = 它可讓您記錄特定期間所行經的路徑,並在地圖上看到該路徑。請注意:啟用此項功能會增加電池使用量。在時間間隔過期後,會從地圖中自動移除行進路線。
[placepage_distance]
tags = ios
tags = android,ios
en = Distance
af = Afstand
ar = المسافة

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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())

View file

@ -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;
}

View file

@ -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;

View file

@ -46,7 +46,8 @@ enum class RouteType : uint8_t
Pedestrian,
Bicycle,
Taxi,
Transit
Transit,
Ruler
};
struct RoutePattern

View file

@ -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

View file

@ -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;

View file

@ -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 {

View file

@ -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

View file

@ -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"/>

View file

@ -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"/>

View file

@ -145,6 +145,7 @@ final class BaseRoutePreviewStatus: SolidTouchView {
result.append(MWMNavigationDashboardEntity.estimateDot())
result.append(elevation)
}
resultLabel.attributedText = result
}
}

View file

@ -38,10 +38,19 @@ final class TransportRoutePreviewStatus: SolidTouchView {
updateHeight()
}
@objc func onNavigationInfoUpdated(_ info: MWMNavigationDashboardEntity) {
@objc func onNavigationInfoUpdated(_ info: MWMNavigationDashboardEntity, prependDistance: Bool) {
biodranik commented 2023-08-26 22:02:00 +00:00 (Migrated from github.com)
Review
https://stackoverflow.com/questions/57655129/ios-autolayout-how-to-show-hide-a-view-including-its-margins
Review

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() {

View file

@ -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
}
}

View file

@ -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>

View file

@ -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
}
}

View file

@ -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

View file

@ -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)

View file

@ -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;

View file

@ -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 {

View file

@ -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

View file

@ -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

View file

@ -4,5 +4,6 @@ typedef NS_CLOSED_ENUM(NSUInteger, MWMRouterTransitType) {
MWMRouterTransitTypeSubway,
MWMRouterTransitTypeTrain,
MWMRouterTransitTypeLightRail,
MWMRouterTransitTypeMonorail
MWMRouterTransitTypeMonorail,
MWMRouterTransitTypeRuler
};

View file

@ -3,4 +3,5 @@ typedef NS_ENUM(NSUInteger, MWMRouterType) {
MWMRouterTypePedestrian,
MWMRouterTypePublicTransport,
MWMRouterTypeBicycle,
MWMRouterTypeRuler,
};

View file

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "ic_ruler_route.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View 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

View file

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "ic_ruler_route_highlighted.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -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

View file

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "ic_ruler_route_selected.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -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

View file

@ -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 */,

View file

@ -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)
{

View file

@ -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, ());

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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