Merge branch 'organicmaps:master' into master

This commit is contained in:
Markku Huotari 2024-11-24 17:07:11 +02:00 committed by GitHub
commit a326990268
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
135 changed files with 912 additions and 209 deletions

View file

@ -81,6 +81,17 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
}
env->ReleaseIntArrayElements(ranges.get(), rawArr, 0);
jni::TScopedLocalIntArrayRef descRanges(env, env->NewIntArray(
static_cast<jsize>(result.GetDescHighlightRangesCount() * 2)));
jint * rawArr2 = env->GetIntArrayElements(descRanges, nullptr);
for (size_t i = 0; i < result.GetDescHighlightRangesCount(); i++)
{
auto const & range = result.GetDescHighlightRange(i);
rawArr2[2 * i] = range.first;
rawArr2[2 * i + 1] = range.second;
}
env->ReleaseIntArrayElements(descRanges.get(), rawArr2, 0);
ms::LatLon ll = ms::LatLon::Zero();
if (result.HasPoint())
ll = mercator::ToLatLon(result.GetFeatureCenter());
@ -89,7 +100,7 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
{
jni::TScopedLocalRef name(env, jni::ToJavaString(env, result.GetString()));
jni::TScopedLocalRef suggest(env, jni::ToJavaString(env, result.GetSuggestionString()));
return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon, ranges.get());
return env->NewObject(g_resultClass, g_suggestConstructor, name.get(), suggest.get(), ll.m_lat, ll.m_lon, ranges.get(),descRanges.get());
}
platform::Distance distance;
@ -125,7 +136,7 @@ jobject ToJavaResult(Result const & result, search::ProductInfo const & productI
0/*static_cast<jint>(result.GetRankingInfo().m_popularity)*/));
return env->NewObject(g_resultClass, g_resultConstructor, name.get(), desc.get(), ll.m_lat, ll.m_lon,
ranges.get(), popularity.get());
ranges.get(), descRanges.get(), popularity.get());
}
jobjectArray BuildSearchResults(vector<search::ProductInfo> const & productInfo,
@ -232,9 +243,9 @@ extern "C"
g_resultClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult");
g_resultConstructor = jni::GetConstructorID(
env, g_resultClass,
"(Ljava/lang/String;Lapp/organicmaps/search/SearchResult$Description;DD[I"
"(Ljava/lang/String;Lapp/organicmaps/search/SearchResult$Description;DD[I[I"
"Lapp/organicmaps/search/Popularity;)V");
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I)V");
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I[I)V");
g_descriptionClass = jni::GetGlobalClassRef(env, "app/organicmaps/search/SearchResult$Description");
/*
Description(FeatureId featureId, String featureType, String region, Distance distance,

View file

@ -16,17 +16,12 @@ extern "C"
if (items.empty())
return;
auto const & pairBuilder = jni::PairBuilder::Instance(env);
auto const listAddMethod = jni::ListBuilder::Instance(env).m_add;
for (SearchRequest const & item : items)
{
using SLR = jni::TScopedLocalRef;
SLR pair(env, pairBuilder.Create(env, SLR(env, jni::ToJavaString(env, item.first)),
SLR(env, jni::ToJavaString(env, item.second))));
ASSERT(pair.get(), (jni::DescribeException()));
env->CallBooleanMethod(result, listAddMethod, pair.get());
jni::TScopedLocalRef str(env, jni::ToJavaString(env, item.second));
env->CallBooleanMethod(result, listAddMethod, str.get());
}
}

View file

@ -2,6 +2,10 @@ package app.organicmaps.search;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.StyleSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -138,7 +142,7 @@ class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchDataViewHol
formatOpeningHours(mResult);
UiUtils.setTextAndHideIfEmpty(mDescription, mResult.description.description);
UiUtils.setTextAndHideIfEmpty(mRegion, mResult.description.region);
mRegion.setText(mResult.getFormattedAddress(mRegion.getContext()));
UiUtils.setTextAndHideIfEmpty(mDistance, mResult.description.distance.toString(mFrame.getContext()));
}

View file

@ -19,12 +19,8 @@ public final class SearchRecents
public static void refresh()
{
final List<Pair<String, String>> pairs = new ArrayList<>();
nativeGetList(pairs);
sRecents.clear();
for (Pair<String, String> pair : pairs)
sRecents.add(pair.second);
nativeGetList(sRecents);
}
public static int getSize()
@ -39,7 +35,7 @@ public final class SearchRecents
public static boolean add(@NonNull String query, @NonNull Context context)
{
if (TextUtils.isEmpty(query) || sRecents.contains(query))
if (TextUtils.isEmpty(query))
return false;
nativeAdd(Language.getKeyboardLocale(context), query);
@ -53,7 +49,7 @@ public final class SearchRecents
sRecents.clear();
}
private static native void nativeGetList(List<Pair<String, String>> result);
private static native void nativeGetList(List<String> result);
private static native void nativeAdd(String locale, String query);
private static native void nativeClear();
}

View file

@ -32,7 +32,7 @@ public class SearchResult
public static final int OPEN_NOW_NO = 2;
public static final SearchResult EMPTY = new SearchResult("", "", 0, 0,
new int[] {});
new int[] {}, new int[] {});
// Used by JNI.
@Keep
@ -77,11 +77,12 @@ public class SearchResult
// Consecutive pairs of indexes (each pair contains : start index, length), specifying highlighted matches of original query in result
public final int[] highlightRanges;
public final int[] descHighlightRanges;
@NonNull
private final Popularity mPopularity;
public SearchResult(String name, String suggestion, double lat, double lon, int[] highlightRanges)
public SearchResult(String name, String suggestion, double lat, double lon, int[] highlightRanges, int[] descHighlightRanges)
{
this.name = name;
this.suggestion = suggestion;
@ -94,11 +95,12 @@ public class SearchResult
else
this.type = TYPE_SUGGEST;
this.highlightRanges = highlightRanges;
this.descHighlightRanges = descHighlightRanges;
mPopularity = Popularity.defaultInstance();
}
public SearchResult(String name, Description description, double lat, double lon, int[] highlightRanges,
@NonNull Popularity popularity)
int[] descHighlightRanges, @NonNull Popularity popularity)
{
this.type = TYPE_RESULT;
this.name = name;
@ -108,6 +110,7 @@ public class SearchResult
this.lon = lon;
this.description = description;
this.highlightRanges = highlightRanges;
this.descHighlightRanges = descHighlightRanges;
}
@NonNull
@ -119,26 +122,39 @@ public class SearchResult
return title;
}
public void formatText(SpannableStringBuilder builder, int[] ranges)
{
if (ranges != null)
{
final int size = ranges.length / 2;
int index = 0;
for (int i = 0; i < size; i++)
{
final int start = ranges[index++];
final int len = ranges[index++];
builder.setSpan(new StyleSpan(Typeface.BOLD), start, start + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
@NonNull
public Spannable getFormattedTitle(@NonNull Context context)
{
final String title = getTitle(context);
final SpannableStringBuilder builder = new SpannableStringBuilder(title);
if (highlightRanges != null)
{
final int size = highlightRanges.length / 2;
int index = 0;
for (int i = 0; i < size; i++)
{
final int start = highlightRanges[index++];
final int len = highlightRanges[index++];
builder.setSpan(new StyleSpan(Typeface.BOLD), start, start + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
formatText(builder, highlightRanges);
return builder;
}
public Spannable getFormattedAddress(@NonNull Context context)
{
final String address = description != null ? description.region : null;
final SpannableStringBuilder builder = new SpannableStringBuilder(address);
formatText(builder, descHighlightRanges);
return builder;
}
}

View file

@ -555,6 +555,7 @@
<string name="miles_per_hour">ميل/ساعة</string>
<string name="hour">س</string>
<string name="minute">د</string>
<string name="day">يوم</string>
<string name="placepage_more_button">المزيد</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">الصور والتعليقات والحجز</string>

View file

@ -542,6 +542,7 @@
<string name="miles_per_hour">mil/saat</string>
<string name="hour">saat</string>
<string name="minute">dəq</string>
<string name="day">gün</string>
<string name="placepage_more_button">Digər</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Şəkillər, rəylər, rezervasiya</string>

View file

@ -541,6 +541,7 @@
<string name="miles_per_hour">міль/г</string>
<string name="hour">г</string>
<string name="minute">хв</string>
<string name="day">д</string>
<string name="placepage_more_button">Яшчэ</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Фота, водгукі, браніраванне</string>

View file

@ -501,6 +501,7 @@
<string name="ft">фут</string>
<string name="hour">ч</string>
<string name="minute">мин</string>
<string name="day">д</string>
<string name="placepage_more_button">Още</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Снимки, отзиви, резервация</string>

View file

@ -542,6 +542,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Més</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, comentaris, reserves</string>

View file

@ -519,6 +519,7 @@
<string name="miles_per_hour">mil/h</string>
<string name="hour">hod</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Více</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotografie, recenze, rezervace</string>

View file

@ -511,6 +511,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">time</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Mere</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, anmeldelser, booking</string>

View file

@ -541,6 +541,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Mehr</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, bewertungen, buchung</string>

View file

@ -540,6 +540,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Más</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, opiniones, reservas</string>

View file

@ -534,6 +534,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">p</string>
<string name="placepage_more_button">Veel</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotod, arvustused, broneerimine</string>

View file

@ -540,6 +540,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">e</string>
<string name="placepage_more_button">Gehiago</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Argazkiak, iritziak, erreserba</string>

View file

@ -506,6 +506,7 @@
<string name="miles_per_hour">مایل بر ساعت (mph)</string>
<string name="hour">ساعت</string>
<string name="minute">دقیقه</string>
<string name="day">روز</string>
<string name="placepage_more_button">بیشتر</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">عکس ها، نظرات، رزرو</string>

View file

@ -540,6 +540,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">t</string>
<string name="minute">min</string>
<string name="day">pv</string>
<string name="placepage_more_button">Lisää</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Kuvat, arvostelut, varaus</string>

View file

@ -548,6 +548,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">j</string>
<string name="placepage_more_button">Plus</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Photos, commentaires, réservations</string>

View file

@ -407,6 +407,7 @@
<string name="km">किमी</string>
<string name="hour">घंटे</string>
<string name="minute">मिनट</string>
<string name="day">दिन</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">तस्वीरें, समीक्षाएँ, बुकिंग</string>
<!-- An explanation dialog shown when clicking on more_on_kayak link. -->

View file

@ -526,6 +526,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">ó</string>
<string name="minute">p</string>
<string name="day">nap</string>
<string name="placepage_more_button">Még</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fényképek, vélemények, foglalás</string>

View file

@ -514,6 +514,7 @@
<string name="miles_per_hour">mpj</string>
<string name="hour">j</string>
<string name="minute">mnt</string>
<string name="day">hr</string>
<string name="placepage_more_button">Lainnya</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Foto, ulasan, pemesanan</string>

View file

@ -526,6 +526,7 @@
<string name="mi">mi</string>
<string name="miles_per_hour">mph</string>
<string name="minute">min</string>
<string name="day">g</string>
<string name="placepage_more_button">Di più</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Foto, recensioni, prenotazioni</string>

View file

@ -537,6 +537,7 @@
<string name="miles_per_hour">מייל לשעה</string>
<string name="hour">ש׳</string>
<string name="minute">ד׳</string>
<string name="day">י</string>
<string name="placepage_more_button">עוד</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">תמונות, ביקורות, הזמנה</string>

View file

@ -545,6 +545,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">時間</string>
<string name="minute"></string>
<string name="day"></string>
<string name="placepage_more_button">さらに詳しく</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">写真、レビュー、予約</string>

View file

@ -512,6 +512,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">t</string>
<string name="minute">min</string>
<string name="day"></string>
<string name="placepage_more_button">자세히</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">사진, 리뷰, 예약</string>

View file

@ -510,6 +510,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">तास</string>
<string name="minute">मिनिट</string>
<string name="day">दि</string>
<string name="placepage_more_button">अधिक</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">फोटोपुनरावलोकनेबुकिंगबुकिंग</string>

View file

@ -539,6 +539,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">t</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Mer</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Bilder, anmeldelser, bestilling</string>

View file

@ -539,6 +539,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">u</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Meer</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Foto\'s, beoordelingen, boeken</string>

View file

@ -543,6 +543,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">godz</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Więcej</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Zdjęcia, opinie, rezerwacja</string>

View file

@ -493,6 +493,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">dia</string>
<string name="placepage_more_button">Mais</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, avaliações, reservas</string>

View file

@ -524,6 +524,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">dia</string>
<string name="placepage_more_button">Mais</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotos, comentários, reservas</string>

View file

@ -525,6 +525,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">z</string>
<string name="placepage_more_button">Mai mult</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotografii, comentarii, rezervări</string>

View file

@ -548,6 +548,7 @@
<string name="miles_per_hour">ми/ч</string>
<string name="hour">ч</string>
<string name="minute">мин</string>
<string name="day">д</string>
<string name="placepage_more_button">Ещё</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Фотографии, отзывы, бронирование</string>

View file

@ -541,6 +541,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">hod</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Viac</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotografie, recenzie, rezervácie</string>

View file

@ -511,6 +511,7 @@
<string name="miles_per_hour">mi/tim</string>
<string name="hour">tim</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">Mer</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Foton, recensioner, bokning</string>

View file

@ -515,6 +515,7 @@
<string name="miles_per_hour">ไมล์/ชม.</string>
<string name="hour">ชม.</string>
<string name="minute">น.</string>
<string name="day">วัน</string>
<string name="placepage_more_button">เพิ่มเติม</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">รูปภาพ รีวิว การจอง</string>

View file

@ -545,6 +545,7 @@
<string name="miles_per_hour">saatte mil</string>
<string name="hour">sa</string>
<string name="minute">dk</string>
<string name="day">g</string>
<string name="placepage_more_button">Diğer</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Fotoğraflar, yorumlar, rezervasyon</string>

View file

@ -545,6 +545,7 @@
<string name="miles_per_hour">ми/год</string>
<string name="hour">год</string>
<string name="minute">хв</string>
<string name="day">д</string>
<string name="placepage_more_button">Ще</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Фото, відгуки, бронювання</string>

View file

@ -513,6 +513,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">giờ</string>
<string name="minute">phút</string>
<string name="day">ngày</string>
<string name="placepage_more_button">Bổ sung</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Hình ảnh, đánh giá, đặt phòng</string>

View file

@ -553,6 +553,7 @@
<string name="miles_per_hour">英哩每小時</string>
<string name="hour">小時</string>
<string name="minute">分鐘</string>
<string name="day"></string>
<string name="placepage_more_button">更多</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">照片、評論、預訂</string>

View file

@ -553,6 +553,7 @@
<string name="miles_per_hour">英里每小时</string>
<string name="hour">小时</string>
<string name="minute">分钟</string>
<string name="day"></string>
<string name="placepage_more_button">更多</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">照片、评论、预订</string>

View file

@ -570,6 +570,7 @@
<string name="miles_per_hour">mph</string>
<string name="hour">h</string>
<string name="minute">min</string>
<string name="day">d</string>
<string name="placepage_more_button">More</string>
<!-- A referral link on the place page for some hotels -->
<string name="more_on_kayak">Photos, reviews, booking</string>

Binary file not shown.

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

View file

@ -1,17 +1,17 @@
#include "testing/testing.hpp"
#include "base/macros.hpp"
#include "base/stl_helpers.hpp"
#include <algorithm>
#include <deque>
#include <utility>
#include <map>
#include <vector>
namespace stl_helpers_tests
{
using namespace base;
namespace stl_helpers_test
{
class Int
{
public:
@ -326,4 +326,48 @@ UNIT_TEST(AccumulateIntervals)
CheckAccumulateIntervals(idTest, arr1, arr2, res);
}
}
UNIT_TEST(Map_EmplaceOrAssign)
{
{
std::map<std::string, std::string, std::less<>> theMap;
std::string_view key = "key";
std::string_view val1 = "value";
TEST(EmplaceOrAssign(theMap, key, val1).second, ());
TEST_EQUAL(theMap.find(key)->second, val1, ());
std::string_view val2 = "some_long_value";
TEST(!EmplaceOrAssign(theMap, key, val2).second, ());
TEST_EQUAL(theMap.find(key)->second, val2, ());
std::string_view val3 = "some_other_long_value";
TEST(!EmplaceOrAssign(theMap, key, std::string(val3)).second, ());
TEST_EQUAL(theMap.find(key)->second, val3, ());
}
{
class Obj
{
int m_v;
Obj(Obj const &) = delete;
Obj & operator=(Obj const &) = delete;
public:
Obj(int v) : m_v(v) {}
Obj(Obj &&) = default;
Obj & operator=(Obj &&) = default;
bool operator==(Obj const & o) const { return m_v == o.m_v; }
bool operator<(Obj const & o) const { return m_v < o.m_v; }
};
std::map<Obj, Obj> theMap;
TEST(EmplaceOrAssign(theMap, Obj(1), Obj(2)).second, ());
TEST(!EmplaceOrAssign(theMap, Obj(1), Obj(3)).second, ());
TEST(theMap.find(Obj(1))->second == Obj(3), ());
}
}
} // namespace stl_helpers_test

View file

@ -165,6 +165,18 @@ bool IsExist(Cont const & c, T const & t)
return std::find(std::cbegin(c), end, t) != end;
}
template <class MapT, class K, class V>
auto EmplaceOrAssign(MapT & theMap, K && k, V && v)
{
auto it = theMap.lower_bound(k);
if (it != theMap.end() && k == it->first)
{
it->second = std::forward<V>(v);
return std::make_pair(it, false);
}
return std::make_pair(theMap.emplace_hint(it, std::forward<K>(k), std::forward<V>(v)), true);
}
// Creates a comparer being able to compare two instances of class C
// (given by reference or pointer) by a field or const method of C.
// For example, to create comparer that is able to compare pairs of

View file

@ -9618,7 +9618,7 @@ cs:4bezpečnost
de:Polizeiwache|Polizei
fr:Poste de police|Commissariat
hi:3थाना
it:Posto di polizia
it:6Commissariato|5Questura|4Caserma|4Guardia|5Carabinieri
ja:1屯所|ポリス|交番|お巡りさん|おまわりさん|通報
ko:보안대
pl:Policja|komisariat|posterunek

View file

@ -1,5 +1,5 @@
{
"make_a_slight_right_turn":"Држите се десно.",
"make_a_slight_right_turn":"Скрените благо десно.",
"make_a_slight_right_turn_street":"NULL",
"make_a_slight_right_turn_street_verb":"NULL",
"make_a_right_turn":"Скрените десно.",
@ -12,7 +12,7 @@
"leave_the_roundabout":"Изађите из кружног тока.",
"leave_the_roundabout_street":"NULL",
"leave_the_roundabout_street_verb":"NULL",
"make_a_slight_left_turn":"Држите се лево.",
"make_a_slight_left_turn":"Скрените благо лево.",
"make_a_slight_left_turn_street":"NULL",
"make_a_slight_left_turn_street_verb":"NULL",
"make_a_left_turn":"Скрените лево.",
@ -24,8 +24,8 @@
"make_a_u_turn_street_verb":"NULL",
"go_straight":"Наставите право.",
"exit":"Излаз.",
"onto":"onto",
"take_exit_number":"Take exit",
"onto":"у улицу",
"take_exit_number":"Изађите на излаз",
"take_exit_number_street_verb":"NULL",
"destination":"Стижете на одредиште.",
"you_have_reached_the_destination":"Стигли сте.",
@ -103,5 +103,5 @@
"in_1_mile":"За једну миљу",
"in_1_5_miles":"За једну и по миљу",
"in_2_miles":"За две миље",
"unknown_camera":"Пажња, радар!"
"unknown_camera":"Пажња, прекршајна камера!"
}

View file

@ -31,7 +31,7 @@
ro = Păstrați la dreapta.
ru = Держитесь правее.
sk = Držte sa vpravo.
sr = Држите се десно.
sr = Скрените благо десно.
sv = Håll höger.
sw = Kaa kuria.
th = ชิดขวาไว้
@ -285,7 +285,7 @@
ro = Păstrați la stânga.
ru = Держитесь левее.
sk = Držte sa vľavo.
sr = Држите се лево.
sr = Скрените благо лево.
sv = Håll vänster.
sw = Kaa kushoto.
th = ชิดซ้ายไว้
@ -565,6 +565,7 @@
ro = pe
ru = на
sk = na
sr = у улицу
sv = in på
sw = kwenye
th = เข้าสู่
@ -607,6 +608,7 @@
ro = Ieșire pe
ru = Съезд на
sk = Výjazd na
sr = Изађите на излаз
sv = Utgång in på
sw = Kuondoka kwenye
th = ทางออก เข้าสู่
@ -3021,7 +3023,7 @@
ro = Cameră frontală
ru = Впереди камера
sk = Pozor, radar!
sr = Пажња, радар!
sr = Пажња, прекршајна камера!
sv = Kamera framför
sw = Kamera Mbele
th = มีกล้องอยู่ข้างหน้า

View file

@ -17940,6 +17940,50 @@
zh-Hans = 分钟
zh-Hant = 分鐘
[day]
tags = android,ios
en = d
af = d
ar = يوم
az = gün
be = д
bg = д
ca = d
cs = d
da = d
de = d
es = d
et = p
eu = e
fa = روز
fi = pv
fr = j
he = י
hi = दिन
hu = nap
id = hr
it = g
ja = 日
ko = 일
lt = d
lv = d
mr = दि
nb = d
nl = d
pl = d
pt = dia
pt-BR = dia
ro = z
ru = д
sk = d
sv = d
th = วัน
tr = g
uk = д
vi = ngày
zh-Hans = 天
zh-Hant = 天
[placepage_more_button]
tags = android,ios
en = More

View file

@ -272,6 +272,9 @@ UNIT_TEST(GlyphLoadingTest)
constexpr int fontSize = 27;
renderer.SetString("Muḩāfaz̧at", fontSize, "en");
RunTestLoop("Latin Extended", std::bind(&GlyphRenderer::RenderGlyphs, &renderer, _1));
renderer.SetString("Строка", fontSize, "ru");
RunTestLoop("ru", std::bind(&GlyphRenderer::RenderGlyphs, &renderer, _1));

View file

@ -19,8 +19,8 @@ struct SupportManager::Configuration
Version m_driverVersion;
};
char const * kSupportedAntialiasing = "Antialiasing";
static char const * kVulkanForbidden = "VulkanForbidden";
std::string_view kSupportedAntialiasing = "Antialiasing";
std::string_view constexpr kVulkanForbidden = "VulkanForbidden";
void SupportManager::Init(ref_ptr<GraphicsContext> context)
{

View file

@ -12,7 +12,7 @@
namespace dp
{
extern char const * kSupportedAntialiasing;
extern std::string_view kSupportedAntialiasing;
class SupportManager
{

View file

@ -18,8 +18,8 @@ using namespace std::placeholders;
namespace
{
std::string const kLocationStateMode = "LastLocationStateMode";
std::string const kLastEnterBackground = "LastEnterBackground";
std::string_view constexpr kLocationStateMode = "LastLocationStateMode";
std::string_view constexpr kLastEnterBackground = "LastEnterBackground";
}
DrapeEngine::DrapeEngine(Params && params)

View file

@ -49,11 +49,11 @@ ReadManager::ReadManager(ref_ptr<ThreadsCommutator> commutator, MapDataProvider
, m_trafficEnabled(trafficEnabled)
, m_isolinesEnabled(isolinesEnabled)
, m_modeChanged(false)
, m_mapLangIndex(StringUtf8Multilang::kDefaultCode)
, m_tasksPool(64, ReadMWMTaskFactory(m_model))
, m_counter(0)
, m_generationCounter(0)
, m_userMarksGenerationCounter(0)
, m_mapLangIndex(StringUtf8Multilang::kDefaultCode)
{
Start();
}

View file

@ -246,7 +246,7 @@ void EditorTest::GetFeatureTypeInfoTest()
auto const featuresAfter = editor.m_features.Get();
auto const fti = editor.GetFeatureTypeInfo(*featuresAfter, ft.GetID().m_mwmId, ft.GetID().m_index);
TEST_NOT_EQUAL(fti, 0, ());
TEST_NOT_EQUAL(fti, nullptr, ());
TEST_EQUAL(fti->m_object.GetID(), ft.GetID(), ());
});
}

View file

@ -1,23 +1,20 @@
#include "testing/testing.hpp"
#include "geometry/bounding_box.hpp"
#include "geometry/point2d.hpp"
using namespace m2;
namespace
namespace bounding_box_tests
{
UNIT_TEST(BoundingBox_Smoke)
{
{
BoundingBox bbox;
m2::BoundingBox bbox;
TEST(!bbox.HasPoint(0, 0), ());
TEST(!bbox.HasPoint(-1, 1), ());
}
{
BoundingBox bbox;
m2::BoundingBox bbox;
bbox.Add(0, 0);
TEST(bbox.HasPoint(0, 0), ());
@ -33,4 +30,4 @@ UNIT_TEST(BoundingBox_Smoke)
TEST(bbox.HasPoint(0.5, 0.5), ());
}
}
} // namespace
} // namespace bounding_box_tests

View file

@ -1,21 +1,18 @@
#include "testing/testing.hpp"
#include "geometry/diamond_box.hpp"
#include "geometry/point2d.hpp"
using namespace m2;
namespace
namespace diamond_box_tests
{
UNIT_TEST(DiamondBox_Smoke)
{
{
DiamondBox dbox;
m2::DiamondBox dbox;
TEST(!dbox.HasPoint(0, 0), ());
}
{
DiamondBox dbox;
m2::DiamondBox dbox;
dbox.Add(0, 0);
TEST(dbox.HasPoint(0, 0), ());
TEST(!dbox.HasPoint(0, 1), ());
@ -32,7 +29,7 @@ UNIT_TEST(DiamondBox_Smoke)
}
{
DiamondBox dbox;
m2::DiamondBox dbox;
dbox.Add(0, 1);
dbox.Add(0, -1);
@ -50,4 +47,4 @@ UNIT_TEST(DiamondBox_Smoke)
TEST(!dbox.HasPoint(-0.51, -0.51), ());
}
}
} // namespace
} // namespace diamond_box_tests

View file

@ -6,10 +6,9 @@
#include <iterator>
using namespace m2::robust;
namespace
namespace robust_test
{
using namespace m2::robust;
using P = m2::PointD;
template <typename TIt>
@ -29,7 +28,6 @@ bool InsideTriangle(P const & p, P const ps[])
{
return IsPointInsideTriangle(p, ps[0], ps[1], ps[2]);
}
} // namespace
UNIT_TEST(OrientedS_Smoke)
{
@ -170,3 +168,4 @@ UNIT_TEST(PolygonSelfIntersections_TangentSmoke)
CheckSelfIntersections(&arr[0], arr + ARRAY_SIZE(arr), false);
}
}
} // namespace robust_test

View file

@ -91,7 +91,9 @@
ED965B102CD67A470049E39E /* DistanceFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B092CD67A470049E39E /* DistanceFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
ED965B132CD67A9B0049E39E /* AltitudeFormatter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */; };
ED965B142CD67A9B0049E39E /* AltitudeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
ED965B162CD67ABA0049E39E /* DateTimeFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */; };
ED965B222CD8F5AA0049E39E /* DurationFormatter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */; };
ED965B232CD8F5AA0049E39E /* DurationFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED965B202CD8F5AA0049E39E /* DurationFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
ED965B2A2CDA1C440049E39E /* DateTimeFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */; };
EDC4E3512C5D222D009286A2 /* RecentlyDeletedCategory.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDC4E34E2C5D222D009286A2 /* RecentlyDeletedCategory.mm */; };
EDC4E3522C5D222D009286A2 /* RecentlyDeletedCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = EDC4E34F2C5D222D009286A2 /* RecentlyDeletedCategory.h */; settings = {ATTRIBUTES = (Public, ); }; };
EDC4E3532C5D222D009286A2 /* RecentlyDeletedCategory+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = EDC4E3502C5D222D009286A2 /* RecentlyDeletedCategory+Core.h */; };
@ -189,7 +191,9 @@
ED965B0A2CD67A470049E39E /* DistanceFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DistanceFormatter.mm; sourceTree = "<group>"; };
ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AltitudeFormatter.h; sourceTree = "<group>"; };
ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AltitudeFormatter.mm; sourceTree = "<group>"; };
ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimeFormatter.swift; sourceTree = "<group>"; };
ED965B202CD8F5AA0049E39E /* DurationFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DurationFormatter.h; sourceTree = "<group>"; };
ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DurationFormatter.mm; sourceTree = "<group>"; };
ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimeFormatter.swift; sourceTree = "<group>"; };
EDC4E34E2C5D222D009286A2 /* RecentlyDeletedCategory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RecentlyDeletedCategory.mm; sourceTree = "<group>"; };
EDC4E34F2C5D222D009286A2 /* RecentlyDeletedCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentlyDeletedCategory.h; sourceTree = "<group>"; };
EDC4E3502C5D222D009286A2 /* RecentlyDeletedCategory+Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RecentlyDeletedCategory+Core.h"; sourceTree = "<group>"; };
@ -434,11 +438,13 @@
ED965B0B2CD67A470049E39E /* Formatting */ = {
isa = PBXGroup;
children = (
ED965B152CD67ABA0049E39E /* DateTimeFormatter.swift */,
ED965B112CD67A9B0049E39E /* AltitudeFormatter.h */,
ED965B122CD67A9B0049E39E /* AltitudeFormatter.mm */,
ED965B092CD67A470049E39E /* DistanceFormatter.h */,
ED965B0A2CD67A470049E39E /* DistanceFormatter.mm */,
ED965B282CDA159C0049E39E /* DateTimeFormatter.swift */,
ED965B202CD8F5AA0049E39E /* DurationFormatter.h */,
ED965B212CD8F5AA0049E39E /* DurationFormatter.mm */,
);
path = Formatting;
sourceTree = "<group>";
@ -506,6 +512,7 @@
47942D9C237D927800DEFAE3 /* PlacePageBookmarkData.h in Headers */,
EDC4E3522C5D222D009286A2 /* RecentlyDeletedCategory.h in Headers */,
47942D72237CC40B00DEFAE3 /* OpeningHours.h in Headers */,
ED965B232CD8F5AA0049E39E /* DurationFormatter.h in Headers */,
ED0B1FF42CAAE3FF006E31A4 /* DeepLinkInAppFeatureHighlightData.h in Headers */,
47942D6B237CC3D600DEFAE3 /* PlacePageData.h in Headers */,
47D609DC234FE625008ECC47 /* MWMBookmarksObserver.h in Headers */,
@ -593,7 +600,6 @@
47942D88237CCA8800DEFAE3 /* PlacePagePreviewData.mm in Sources */,
47942D9D237D927800DEFAE3 /* PlacePageBookmarkData.mm in Sources */,
47942D86237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm in Sources */,
ED965B162CD67ABA0049E39E /* DateTimeFormatter.swift in Sources */,
9974CA2A23DF1968003FE824 /* ElevationProfileData.mm in Sources */,
47942D82237CC52A00DEFAE3 /* MWMOpeningHours.mm in Sources */,
ED965B132CD67A9B0049E39E /* AltitudeFormatter.mm in Sources */,
@ -616,12 +622,14 @@
472602A924092C5B00731135 /* MWMGeoUtil.mm in Sources */,
47F701F0238C86F000D18E95 /* PlacePageButtonsData.mm in Sources */,
9940622123EAC57900493D1A /* ElevationHeightPoint.m in Sources */,
ED965B2A2CDA1C440049E39E /* DateTimeFormatter.swift in Sources */,
47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */,
47E8163623B1889C008FD836 /* MWMStorage.mm in Sources */,
ED965B0D2CD67A470049E39E /* DistanceFormatter.mm in Sources */,
EDC4E3512C5D222D009286A2 /* RecentlyDeletedCategory.mm in Sources */,
47CA68DE2502022400671019 /* MWMBookmark.mm in Sources */,
9957FAE9237AE5B000855F48 /* Logger.mm in Sources */,
ED965B222CD8F5AA0049E39E /* DurationFormatter.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -694,8 +702,6 @@
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 6.0;
};
name = Debug;
};
@ -721,7 +727,6 @@
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_VERSION = 6.0;
};
name = Release;
};

View file

@ -30,6 +30,7 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[];
#import <CoreApi/RecentlyDeletedCategory.h>
#import "CoreApi/DistanceFormatter.h"
#import "CoreApi/AltitudeFormatter.h"
#import "CoreApi/DurationFormatter.h"
#pragma mark - Place Page

View file

@ -2,20 +2,8 @@ import Foundation
@objcMembers
public final class DateTimeFormatter: NSObject {
private static let timeFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.day, .hour, .minute]
formatter.unitsStyle = .short
formatter.maximumUnitCount = 2
formatter.zeroFormattingBehavior = .dropAll
return formatter
}()
private static let dateFormatter = DateFormatter()
public static func durationString(from timeInterval: TimeInterval) -> String {
timeFormatter.string(from: timeInterval) ?? ""
}
public static func dateString(from date: Date, dateStyle: DateFormatter.Style, timeStyle: DateFormatter.Style) -> String {
DateFormatter.localizedString(from: date, dateStyle: dateStyle, timeStyle: timeStyle)
}

View file

@ -0,0 +1,11 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface DurationFormatter: NSObject
+ (NSString *)durationStringFromTimeInterval:(NSTimeInterval)timeInterval NS_SWIFT_NAME(durationString(from:));
@end
NS_ASSUME_NONNULL_END

View file

@ -0,0 +1,12 @@
#import "DurationFormatter.h"
#include "platform/duration.hpp"
@implementation DurationFormatter
+ (NSString *)durationStringFromTimeInterval:(NSTimeInterval)timeInterval {
auto const duration = platform::Duration(static_cast<int>(timeInterval));
return [NSString stringWithCString:duration.GetPlatformLocalizedString().c_str() encoding:NSUTF8StringEncoding];
}
@end

View file

@ -7,7 +7,7 @@
#import <AudioToolbox/AudioServices.h>
#import <CoreApi/Framework.h>
#import <CoreApi/CoreApi-Swift.h>
#import <CoreApi/DurationFormatter.h>
#include "routing/following_info.hpp"
#include "routing/turns.hpp"
@ -142,7 +142,7 @@ NSArray<MWMRouterTransitStepInfo *> *buildRouteTransitSteps(NSArray<MWMRoutePoin
auto result = [[NSMutableAttributedString alloc] initWithString:@""];
if (self.showEta) {
NSString * eta = [DateTimeFormatter durationStringFrom:self.timeToTarget];
NSString * eta = [DurationFormatter durationStringFromTimeInterval:self.timeToTarget];
[result appendAttributedString:[[NSMutableAttributedString alloc] initWithString:eta attributes:primaryAttributes]];
[result appendAttributedString:MWMNavigationDashboardEntity.estimateDot];
}

View file

@ -136,7 +136,7 @@ final class NavigationControlView: SolidTouchView, MWMTextToSpeechObserver, MapO
]
if timePageControl.currentPage == 0 {
timeLabel.text = DateTimeFormatter.durationString(from: TimeInterval(info.timeToTarget))
timeLabel.text = DurationFormatter.durationString(from: TimeInterval(info.timeToTarget))
} else {
timeLabel.text = info.arrival
}

View file

@ -68,13 +68,17 @@ NSString *const kSettingsSegue = @"Map2Settings";
@interface MapViewController () <MWMFrameworkDrapeObserver,
MWMKeyboardObserver,
MWMBookmarksObserver>
MWMBookmarksObserver,
UIGestureRecognizerDelegate>
@property(nonatomic, readwrite) MWMMapViewControlsManager *controlsManager;
@property(nonatomic) BOOL disableStandbyOnLocationStateMode;
@property(nonatomic) UserTouchesAction userTouchesAction;
@property(nonatomic) CGPoint pointerLocation API_AVAILABLE(ios(14.0));
@property(nonatomic) CGFloat currentScale;
@property(nonatomic) CGFloat currentRotation;
@property(nonatomic, readwrite) MWMMapDownloadDialog *downloadDialog;
@ -317,6 +321,9 @@ NSString *const kSettingsSegue = @"Map2Settings";
- (void)viewDidLoad {
[super viewDidLoad];
if (@available(iOS 14.0, *))
[self setupTrackPadGestureRecognizers];
self.title = L(@"map");
// On iOS 10 (it was reproduced, it may be also on others), mapView can be uninitialized
@ -345,7 +352,7 @@ NSString *const kSettingsSegue = @"Map2Settings";
if ([MWMNavigationDashboardManager sharedManager].state == MWMNavigationDashboardStateHidden)
self.controlsManager.menuState = self.controlsManager.menuRestoreState;
// Added in https://github.com/organicmaps/organicmaps/pull/7333
// After all users migrate to OAuth2 we can remove next code
[self migrateOAuthCredentials];
@ -387,6 +394,33 @@ NSString *const kSettingsSegue = @"Map2Settings";
[MapsAppDelegate customizeAppearance];
}
- (void)setupTrackPadGestureRecognizers API_AVAILABLE(ios(14.0)) {
if (!NSProcessInfo.processInfo.isiOSAppOnMac)
return;
// Mouse zoom
UIPanGestureRecognizer * panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
panRecognizer.allowedScrollTypesMask = UIScrollTypeMaskAll;
panRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect)];
[self.view addGestureRecognizer:panRecognizer];
// Trackpad zoom
UIPinchGestureRecognizer * pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
pinchRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect)];
pinchRecognizer.delegate = self;
[self.view addGestureRecognizer:pinchRecognizer];
// Trackpad rotation
UIRotationGestureRecognizer * rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotation:)];
rotationRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirect | UITouchTypeDirect)];
rotationRecognizer.delegate = self;
[self.view addGestureRecognizer:rotationRecognizer];
// Pointer location
UIHoverGestureRecognizer * hoverRecognizer = [[UIHoverGestureRecognizer alloc] initWithTarget:self action:@selector(handlePointerHover:)];
hoverRecognizer.allowedTouchTypes = @[@(UITouchTypeIndirectPointer)];
[self.view addGestureRecognizer:hoverRecognizer];
}
- (void)showViralAlertIfNeeded {
NSUserDefaults *ud = NSUserDefaults.standardUserDefaults;
@ -755,4 +789,84 @@ NSString *const kSettingsSegue = @"Map2Settings";
}
}
// MARK: - Handle macOS trackpad gestures
- (void)handlePan:(UIPanGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
{
CGPoint translation = [recognizer translationInView:self.view];
if (translation.x == 0 && CGPointEqualToPoint(translation, CGPointZero))
return;
self.userTouchesAction = UserTouchesActionScale;
static const CGFloat kScaleFactor = 0.9;
const CGFloat factor = translation.y > 0 ? 1 / kScaleFactor : kScaleFactor;
GetFramework().Scale(factor, [self getZoomPoint], false);
[recognizer setTranslation:CGPointZero inView:self.view];
break;
}
case UIGestureRecognizerStateEnded:
self.userTouchesAction = UserTouchesActionNone;
break;
default:
break;
}
}
- (void)handlePinch:(UIPinchGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
self.currentScale = 1.0;
case UIGestureRecognizerStateChanged:
{
const CGFloat scale = [recognizer scale];
static const CGFloat kScaleDeltaMultiplier = 4.0; // map trackpad scale to the map scale
const CGFloat delta = scale - self.currentScale;
const CGFloat scaleFactor = 1 + delta * kScaleDeltaMultiplier;
GetFramework().Scale(scaleFactor, [self getZoomPoint], false);
self.currentScale = scale;
break;
}
case UIGestureRecognizerStateEnded:
self.userTouchesAction = UserTouchesActionNone;
break;
default:
break;
}
}
- (void)handleRotation:(UIRotationGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
{
self.userTouchesAction = UserTouchesActionDrag;
GetFramework().Rotate(self.currentRotation == 0 ? recognizer.rotation : self.currentRotation + recognizer.rotation, false);
break;
}
case UIGestureRecognizerStateEnded:
self.currentRotation += recognizer.rotation;
self.userTouchesAction = UserTouchesActionNone;
break;
default:
break;
}
}
- (void)handlePointerHover:(UIHoverGestureRecognizer *)recognizer API_AVAILABLE(ios(14.0)) {
self.pointerLocation = [recognizer locationInView:self.view];
}
- (m2::PointD)getZoomPoint API_AVAILABLE(ios(14.0)) {
const CGFloat scale = [UIScreen mainScreen].scale;
return m2::PointD(self.pointerLocation.x * scale, self.pointerLocation.y * scale);
}
// MARK: - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
@end

View file

@ -795,6 +795,8 @@
"minute" = "د";
"day" = "يوم";
"placepage_more_button" = "المزيد";
"book_button" = "حجز";

View file

@ -795,6 +795,8 @@
"minute" = "dəq";
"day" = "gün";
"placepage_more_button" = "Digər";
"book_button" = "Rezervasyon";

View file

@ -795,6 +795,8 @@
"minute" = "хв";
"day" = "д";
"placepage_more_button" = "Яшчэ";
"book_button" = "Забраніраваць";

View file

@ -795,6 +795,8 @@
"minute" = "мин";
"day" = "д";
"placepage_more_button" = "Още";
"book_button" = "Резервиране";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Més";
"book_button" = "Reserva";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Více";
"book_button" = "Rezervace";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Mere";
"book_button" = "Book";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Mehr";
"book_button" = "Buchen";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Περισσότερα";
"book_button" = "Κράτηση";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "More";
"book_button" = "Book";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "More";
"book_button" = "Book";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Más";
"book_button" = "Reservar";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Más";
"book_button" = "Reservar";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "p";
"placepage_more_button" = "Veel";
"book_button" = "Reserveeri";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "e";
"placepage_more_button" = "Gehiago";
"book_button" = "Erreserba";

View file

@ -795,6 +795,8 @@
"minute" = "دقیقه";
"day" = "روز";
"placepage_more_button" = "بیشتر";
"book_button" = "رزرو";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "pv";
"placepage_more_button" = "Lisää";
"book_button" = "Varaa";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "j";
"placepage_more_button" = "Plus";
"book_button" = "Réserver";

View file

@ -795,6 +795,8 @@
"minute" = "ד׳";
"day" = "י";
"placepage_more_button" = "עוד";
"book_button" = "הזמנה";

View file

@ -795,6 +795,8 @@
"minute" = "मिनट";
"day" = "दिन";
"placepage_more_button" = "More";
"book_button" = "Book";

View file

@ -795,6 +795,8 @@
"minute" = "p";
"day" = "nap";
"placepage_more_button" = "Még";
"book_button" = "Foglalás";

View file

@ -795,6 +795,8 @@
"minute" = "mnt";
"day" = "hr";
"placepage_more_button" = "Lainnya";
"book_button" = "Pesan";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "g";
"placepage_more_button" = "Di più";
"book_button" = "Prenota";

View file

@ -795,6 +795,8 @@
"minute" = "分";
"day" = "日";
"placepage_more_button" = "さらに詳しく";
"book_button" = "予約";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "일";
"placepage_more_button" = "자세히";
"book_button" = "예약";

View file

@ -795,6 +795,8 @@
"minute" = "मिनिट";
"day" = "दि";
"placepage_more_button" = "अधिक";
"book_button" = "पुस्तक";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Mer";
"book_button" = "Bestill";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Meer";
"book_button" = "Boek";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "d";
"placepage_more_button" = "Więcej";
"book_button" = "Zarezerwuj";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "dia";
"placepage_more_button" = "Mais";
"book_button" = "Reservar";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "dia";
"placepage_more_button" = "Mais";
"book_button" = "Reservas";

View file

@ -795,6 +795,8 @@
"minute" = "min";
"day" = "z";
"placepage_more_button" = "Mai mult";
"book_button" = "Rezervare";

Some files were not shown because too many files have changed in this diff Show more