mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 13:03:36 +00:00
[ios] WIP: Switching main/map buttons to SwiftUI
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
This commit is contained in:
@@ -29,6 +29,7 @@ static NSString *didChangeOutdoorMapStyle = @"didChangeOutdoorMapStyle";
|
|||||||
if (self) {
|
if (self) {
|
||||||
_observers = [NSHashTable weakObjectsHashTable];
|
_observers = [NSHashTable weakObjectsHashTable];
|
||||||
GetFramework().GetTrafficManager().SetStateListener([self](TrafficManager::TrafficState state) {
|
GetFramework().GetTrafficManager().SetStateListener([self](TrafficManager::TrafficState state) {
|
||||||
|
[NSNotificationCenter.defaultCenter postNotificationName:@"LayersChanged" object:nil];
|
||||||
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
||||||
if ([observer respondsToSelector:@selector(onTrafficStateUpdated)]) {
|
if ([observer respondsToSelector:@selector(onTrafficStateUpdated)]) {
|
||||||
[observer onTrafficStateUpdated];
|
[observer onTrafficStateUpdated];
|
||||||
@@ -36,6 +37,7 @@ static NSString *didChangeOutdoorMapStyle = @"didChangeOutdoorMapStyle";
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
GetFramework().GetTransitManager().SetStateListener([self](TransitReadManager::TransitSchemeState state) {
|
GetFramework().GetTransitManager().SetStateListener([self](TransitReadManager::TransitSchemeState state) {
|
||||||
|
[NSNotificationCenter.defaultCenter postNotificationName:@"LayersChanged" object:nil];
|
||||||
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
||||||
if ([observer respondsToSelector:@selector(onTransitStateUpdated)]) {
|
if ([observer respondsToSelector:@selector(onTransitStateUpdated)]) {
|
||||||
[observer onTransitStateUpdated];
|
[observer onTransitStateUpdated];
|
||||||
@@ -43,6 +45,7 @@ static NSString *didChangeOutdoorMapStyle = @"didChangeOutdoorMapStyle";
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
GetFramework().GetIsolinesManager().SetStateListener([self](IsolinesManager::IsolinesState state) {
|
GetFramework().GetIsolinesManager().SetStateListener([self](IsolinesManager::IsolinesState state) {
|
||||||
|
[NSNotificationCenter.defaultCenter postNotificationName:@"LayersChanged" object:nil];
|
||||||
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
||||||
if ([observer respondsToSelector:@selector(onIsoLinesStateUpdated)]) {
|
if ([observer respondsToSelector:@selector(onIsoLinesStateUpdated)]) {
|
||||||
[observer onIsoLinesStateUpdated];
|
[observer onIsoLinesStateUpdated];
|
||||||
@@ -50,6 +53,7 @@ static NSString *didChangeOutdoorMapStyle = @"didChangeOutdoorMapStyle";
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
[NSNotificationCenter.defaultCenter addObserverForName:didChangeOutdoorMapStyle object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) {
|
[NSNotificationCenter.defaultCenter addObserverForName:didChangeOutdoorMapStyle object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) {
|
||||||
|
[NSNotificationCenter.defaultCenter postNotificationName:@"LayersChanged" object:nil];
|
||||||
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
for (id<MWMMapOverlayManagerObserver> observer in self.observers) {
|
||||||
if ([observer respondsToSelector:@selector(onOutdoorStateUpdated)]) {
|
if ([observer respondsToSelector:@selector(onOutdoorStateUpdated)]) {
|
||||||
[observer onOutdoorStateUpdated];
|
[observer onOutdoorStateUpdated];
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#import <CoreApi/CoreApi.h>
|
#import <CoreApi/CoreApi.h>
|
||||||
|
|
||||||
|
#import "Controls.h"
|
||||||
#import "DeepLinkRouteStrategyAdapter.h"
|
#import "DeepLinkRouteStrategyAdapter.h"
|
||||||
#import "EAGLView.h"
|
#import "EAGLView.h"
|
||||||
#import "FirstSession.h"
|
#import "FirstSession.h"
|
||||||
|
|||||||
@@ -16,6 +16,13 @@ import UIKit
|
|||||||
routinOptionsBridgeController.view.backgroundColor = .systemGroupedBackground
|
routinOptionsBridgeController.view.backgroundColor = .systemGroupedBackground
|
||||||
return routinOptionsBridgeController
|
return routinOptionsBridgeController
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The `ControlsView` for presentation in an alert
|
||||||
|
@objc static func mapControls() -> UIViewController {
|
||||||
|
let controlsBridgeController = UIHostingController(rootView: ControlsView())
|
||||||
|
controlsBridgeController.view.backgroundColor = .clear
|
||||||
|
return controlsBridgeController
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
11
iphone/Maps/Bridging/Controls.h
Normal file
11
iphone/Maps/Bridging/Controls.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
NS_SWIFT_NAME(Controls)
|
||||||
|
@interface Controls : NSObject
|
||||||
|
|
||||||
|
+ (void)zoomIn;
|
||||||
|
+ (void)zoomOut;
|
||||||
|
+ (void)switchToNextPositionMode;
|
||||||
|
+ (NSString *)positionModeRawValue;
|
||||||
|
+ (Controls *)shared;
|
||||||
|
- (bool)hasMainButtons;
|
||||||
|
|
||||||
|
@end
|
||||||
75
iphone/Maps/Bridging/Controls.mm
Normal file
75
iphone/Maps/Bridging/Controls.mm
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#import "Controls.h"
|
||||||
|
#import "SwiftBridge.h"
|
||||||
|
|
||||||
|
#include <CoreApi/Framework.h>
|
||||||
|
|
||||||
|
@implementation Controls
|
||||||
|
|
||||||
|
static Controls *shared = nil;
|
||||||
|
|
||||||
|
+ (Controls *)shared
|
||||||
|
{
|
||||||
|
if (shared == nil)
|
||||||
|
{
|
||||||
|
shared = [[super allocWithZone:NULL] init];
|
||||||
|
}
|
||||||
|
|
||||||
|
return shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (id)allocWithZone:(NSZone *)zone
|
||||||
|
{
|
||||||
|
return [self shared];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)copyWithZone:(NSZone *)zone
|
||||||
|
{
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)init
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self != nil)
|
||||||
|
{
|
||||||
|
// Initialize instance variables here
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)zoomIn;
|
||||||
|
{
|
||||||
|
GetFramework().Scale(Framework::SCALE_MAG, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)zoomOut;
|
||||||
|
{
|
||||||
|
GetFramework().Scale(Framework::SCALE_MIN, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)positionModeRawValue;
|
||||||
|
{
|
||||||
|
location::EMyPositionMode mode = GetFramework().GetMyPositionMode();
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case location::EMyPositionMode::NotFollowNoPosition: return @"Locate";
|
||||||
|
case location::EMyPositionMode::NotFollow: return @"Locate";
|
||||||
|
case location::EMyPositionMode::PendingPosition: return @"Locating";
|
||||||
|
case location::EMyPositionMode::Follow: return @"Following";
|
||||||
|
case location::EMyPositionMode::FollowAndRotate: return @"FollowingAndRotated";
|
||||||
|
}
|
||||||
|
return @"Locate";
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)switchToNextPositionMode;
|
||||||
|
{
|
||||||
|
[MWMLocationManager enableLocationAlert];
|
||||||
|
GetFramework().SwitchMyPositionNextMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (bool)hasMainButtons;
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
12
iphone/Maps/Bridging/Controls.swift
Normal file
12
iphone/Maps/Bridging/Controls.swift
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
extension Controls {
|
||||||
|
@objc static let changeChangeTrackRecordingNotificationName: Notification.Name = Notification.Name(rawValue: "ChangeTrackRecording")
|
||||||
|
|
||||||
|
/// The notification name for switching position mode
|
||||||
|
@objc static let switchPositionModeNotificationName: Notification.Name = Notification.Name(rawValue: "SwitchPositionMode")
|
||||||
|
|
||||||
|
@objc static let changeVisibilityMainButtonsNotificationName: Notification.Name = Notification.Name(rawValue: "ChangeVisibilityMainButtons")
|
||||||
|
|
||||||
|
static var positionMode: MapPositionButton.Mode {
|
||||||
|
return MapPositionButton.Mode(rawValue: Controls.positionModeRawValue()) ?? .locate
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
#import "MWMNavigationDashboardManager.h"
|
#import "MWMNavigationDashboardManager.h"
|
||||||
|
|
||||||
@class MapViewController;
|
@class MapViewController;
|
||||||
@class BottomTabBarViewController;
|
|
||||||
@class TrackRecordingButtonViewController;
|
@class TrackRecordingButtonViewController;
|
||||||
@class SearchQuery;
|
@class SearchQuery;
|
||||||
|
|
||||||
@@ -26,7 +25,7 @@ typedef NS_ENUM(NSUInteger, TrackRecordingButtonState) {
|
|||||||
@property(nonatomic) MWMBottomMenuState menuState;
|
@property(nonatomic) MWMBottomMenuState menuState;
|
||||||
@property(nonatomic) MWMBottomMenuState menuRestoreState;
|
@property(nonatomic) MWMBottomMenuState menuRestoreState;
|
||||||
@property(nonatomic) BOOL isDirectionViewHidden;
|
@property(nonatomic) BOOL isDirectionViewHidden;
|
||||||
@property(nonatomic) BottomTabBarViewController * tabBarController;
|
@property(nonatomic) UIViewController * tabBarController;
|
||||||
@property(nonatomic) TrackRecordingButtonViewController * trackRecordingButton;
|
@property(nonatomic) TrackRecordingButtonViewController * trackRecordingButton;
|
||||||
|
|
||||||
- (instancetype)init __attribute__((unavailable("init is not available")));
|
- (instancetype)init __attribute__((unavailable("init is not available")));
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
|
|||||||
self.menuRestoreState = MWMBottomMenuStateInactive;
|
self.menuRestoreState = MWMBottomMenuStateInactive;
|
||||||
self.isAddingPlace = NO;
|
self.isAddingPlace = NO;
|
||||||
self.searchManager = controller.searchManager;
|
self.searchManager = controller.searchManager;
|
||||||
|
|
||||||
|
[self tabBarController];
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,13 +223,20 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
|
|||||||
return _trafficButton;
|
return _trafficButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BottomTabBarViewController *)tabBarController {
|
- (UIViewController *)tabBarController {
|
||||||
if (!_tabBarController) {
|
if (!_tabBarController) {
|
||||||
MapViewController * ownerController = _ownerController;
|
MapViewController * ownerController = _ownerController;
|
||||||
_tabBarController = [BottomTabBarBuilder buildWithMapViewController:ownerController controlsManager:self];
|
_tabBarController = [BridgeControllers mapControls];
|
||||||
[ownerController addChildViewController:_tabBarController];
|
[ownerController addChildViewController:_tabBarController];
|
||||||
UIView * tabBarViewSuperView = ownerController.controlsView;
|
UIView * tabBarViewSuperView = ownerController.controlsView;
|
||||||
[tabBarViewSuperView addSubview:_tabBarController.view];
|
[tabBarViewSuperView addSubview:_tabBarController.view];
|
||||||
|
_tabBarController.view.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
|
[NSLayoutConstraint activateConstraints:@[
|
||||||
|
[tabBarViewSuperView.topAnchor constraintEqualToAnchor:_tabBarController.view.topAnchor],
|
||||||
|
[tabBarViewSuperView.leadingAnchor constraintEqualToAnchor:_tabBarController.view.leadingAnchor],
|
||||||
|
[tabBarViewSuperView.bottomAnchor constraintEqualToAnchor:_tabBarController.view.bottomAnchor],
|
||||||
|
[tabBarViewSuperView.trailingAnchor constraintEqualToAnchor:_tabBarController.view.trailingAnchor]
|
||||||
|
]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return _tabBarController;
|
return _tabBarController;
|
||||||
@@ -289,7 +299,7 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
|
|||||||
MapViewController * ownerController = _ownerController;
|
MapViewController * ownerController = _ownerController;
|
||||||
switch (_menuState) {
|
switch (_menuState) {
|
||||||
case MWMBottomMenuStateActive:
|
case MWMBottomMenuStateActive:
|
||||||
_tabBarController.isHidden = NO;
|
_tabBarController.view.hidden = NO;
|
||||||
if (_menuController == nil) {
|
if (_menuController == nil) {
|
||||||
_menuController = [BottomMenuBuilder buildMenuWithMapViewController:ownerController
|
_menuController = [BottomMenuBuilder buildMenuWithMapViewController:ownerController
|
||||||
controlsManager:self
|
controlsManager:self
|
||||||
@@ -298,7 +308,7 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MWMBottomMenuStateLayers:
|
case MWMBottomMenuStateLayers:
|
||||||
_tabBarController.isHidden = NO;
|
_tabBarController.view.hidden = NO;
|
||||||
if (_menuController == nil) {
|
if (_menuController == nil) {
|
||||||
_menuController = [BottomMenuBuilder buildLayersWithMapViewController:ownerController
|
_menuController = [BottomMenuBuilder buildLayersWithMapViewController:ownerController
|
||||||
controlsManager:self
|
controlsManager:self
|
||||||
@@ -307,14 +317,14 @@ NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MWMBottomMenuStateInactive:
|
case MWMBottomMenuStateInactive:
|
||||||
_tabBarController.isHidden = NO;
|
_tabBarController.view.hidden = NO;
|
||||||
if (_menuController != nil) {
|
if (_menuController != nil) {
|
||||||
[_menuController dismissViewControllerAnimated:YES completion:nil];
|
[_menuController dismissViewControllerAnimated:YES completion:nil];
|
||||||
_menuController = nil;
|
_menuController = nil;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MWMBottomMenuStateHidden:
|
case MWMBottomMenuStateHidden:
|
||||||
_tabBarController.isHidden = YES;
|
_tabBarController.view.hidden = YES;
|
||||||
if (_menuController != nil) {
|
if (_menuController != nil) {
|
||||||
[_menuController dismissViewControllerAnimated:YES completion:nil];
|
[_menuController dismissViewControllerAnimated:YES completion:nil];
|
||||||
_menuController = nil;
|
_menuController = nil;
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||||
<device id="retina4_7" orientation="portrait">
|
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||||
<adaptation id="fullscreen"/>
|
|
||||||
</device>
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -18,12 +16,12 @@
|
|||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WVx-0E-RoH" customClass="MWMButton" propertyAccessControl="all">
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WVx-0E-RoH" customClass="MWMButton" propertyAccessControl="all">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
|
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
|
||||||
|
<viewLayoutGuide key="safeArea" id="iUc-A7-STp"/>
|
||||||
<accessibility key="accessibilityConfiguration" identifier="layers_button"/>
|
<accessibility key="accessibilityConfiguration" identifier="layers_button"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="56" id="24f-V4-Vuf"/>
|
<constraint firstAttribute="height" constant="56" id="24f-V4-Vuf"/>
|
||||||
<constraint firstAttribute="width" constant="56" id="hko-xz-hRz"/>
|
<constraint firstAttribute="width" constant="56" id="hko-xz-hRz"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<viewLayoutGuide key="safeArea" id="iUc-A7-STp"/>
|
|
||||||
<state key="normal" image="btn_traffic_on_light"/>
|
<state key="normal" image="btn_traffic_on_light"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="buttonTouchUpInside" destination="-1" eventType="touchUpInside" id="fKZ-g8-4ML"/>
|
<action selector="buttonTouchUpInside" destination="-1" eventType="touchUpInside" id="fKZ-g8-4ML"/>
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ NSString *const kNavigationControlViewXibName = @"NavigationControlView";
|
|||||||
[[MapViewController sharedController] updateStatusBarStyle];
|
[[MapViewController sharedController] updateStatusBarStyle];
|
||||||
// Restore bottom buttons only if they were not already hidden by tapping anywhere on an empty map.
|
// Restore bottom buttons only if they were not already hidden by tapping anywhere on an empty map.
|
||||||
if (!MWMMapViewControlsManager.manager.hidden)
|
if (!MWMMapViewControlsManager.manager.hidden)
|
||||||
BottomTabBarViewController.controller.isHidden = state != MWMNavigationDashboardStateHidden;
|
MWMMapViewControlsManager.manager.tabBarController.view.hidden = state != MWMNavigationDashboardStateHidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@synthesize routePreview = _routePreview;
|
@synthesize routePreview = _routePreview;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
- (void)performAction:(NSString *_Nonnull)action;
|
- (void)performAction:(NSString *_Nonnull)action;
|
||||||
|
|
||||||
- (void)openMenu;
|
|
||||||
- (void)openSettings;
|
- (void)openSettings;
|
||||||
- (void)openAbout;
|
- (void)openAbout;
|
||||||
- (void)openMapsDownloader:(MWMMapDownloaderMode)mode;
|
- (void)openMapsDownloader:(MWMMapDownloaderMode)mode;
|
||||||
|
|||||||
@@ -574,10 +574,6 @@ NSString *const kAboutSegue = @"Map2About";
|
|||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Open controllers
|
#pragma mark - Open controllers
|
||||||
- (void)openMenu {
|
|
||||||
[self.controlsManager.tabBarController onMenuButtonPressed:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)openSettings {
|
- (void)openSettings {
|
||||||
[self performSegueWithIdentifier:kSettingsSegue sender:nil];
|
[self performSegueWithIdentifier:kSettingsSegue sender:nil];
|
||||||
}
|
}
|
||||||
@@ -636,6 +632,7 @@ NSString *const kAboutSegue = @"Map2About";
|
|||||||
self.disableStandbyOnLocationStateMode = YES;
|
self.disableStandbyOnLocationStateMode = YES;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
[NSNotificationCenter.defaultCenter postNotificationName:Controls.switchPositionModeNotificationName object:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - MWMFrameworkDrapeObserver
|
#pragma mark - MWMFrameworkDrapeObserver
|
||||||
|
|||||||
@@ -299,10 +299,8 @@ void InitLocalizedStrings() {
|
|||||||
- (void)updateApplicationIconBadgeNumber {
|
- (void)updateApplicationIconBadgeNumber {
|
||||||
auto const number = [self badgeNumber];
|
auto const number = [self badgeNumber];
|
||||||
|
|
||||||
// Delay init because BottomTabBarViewController.controller is null here.
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
[UIApplication.sharedApplication setApplicationIconBadgeNumber:number];
|
[UIApplication.sharedApplication setApplicationIconBadgeNumber:number];
|
||||||
BottomTabBarViewController.controller.isApplicationBadgeHidden = (number == 0);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,8 +121,8 @@
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
case .menu:
|
case .menu:
|
||||||
MapsAppDelegate.theApp().mapViewController.openMenu()
|
// Not supported on iOS.
|
||||||
return true
|
return false
|
||||||
case .settings:
|
case .settings:
|
||||||
MapsAppDelegate.theApp().mapViewController.openSettings()
|
MapsAppDelegate.theApp().mapViewController.openSettings()
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -228,6 +228,7 @@ extension TrackRecordingManager: TrackRecordingObservable {
|
|||||||
|
|
||||||
@objc
|
@objc
|
||||||
private func notifyObservers() {
|
private func notifyObservers() {
|
||||||
|
NotificationCenter.default.post(name: Controls.changeChangeTrackRecordingNotificationName, object: nil)
|
||||||
observations.removeAll { $0.observer == nil }
|
observations.removeAll { $0.observer == nil }
|
||||||
observations.forEach {
|
observations.forEach {
|
||||||
$0.recordingStateDidChangeHandler?(recordingState, trackRecordingInfo, { self.trackRecordingElevationProfileData })
|
$0.recordingStateDidChangeHandler?(recordingState, trackRecordingInfo, { self.trackRecordingElevationProfileData })
|
||||||
|
|||||||
@@ -288,6 +288,10 @@
|
|||||||
"placepage_distance" = "Distance";
|
"placepage_distance" = "Distance";
|
||||||
"search_show_on_map" = "View on map";
|
"search_show_on_map" = "View on map";
|
||||||
|
|
||||||
|
/* Button title */
|
||||||
|
"zoom_in" = "Zoom In";
|
||||||
|
"zoom_out" = "Zoom Out";
|
||||||
|
|
||||||
/* Text in menu */
|
/* Text in menu */
|
||||||
"website" = "Website";
|
"website" = "Website";
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,10 @@
|
|||||||
27697F902E257EDA00FBD913 /* AboutCoMapsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27697F8F2E257ED800FBD913 /* AboutCoMapsView.swift */; };
|
27697F902E257EDA00FBD913 /* AboutCoMapsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27697F8F2E257ED800FBD913 /* AboutCoMapsView.swift */; };
|
||||||
27697F922E257EED00FBD913 /* ApoutOpenStreetMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27697F912E257EE600FBD913 /* ApoutOpenStreetMapView.swift */; };
|
27697F922E257EED00FBD913 /* ApoutOpenStreetMapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27697F912E257EE600FBD913 /* ApoutOpenStreetMapView.swift */; };
|
||||||
27768FDB2E20199A0086784A /* RoutingOptionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27768FD92E20199A0086784A /* RoutingOptionsView.swift */; };
|
27768FDB2E20199A0086784A /* RoutingOptionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27768FD92E20199A0086784A /* RoutingOptionsView.swift */; };
|
||||||
27768FE02E201BE60086784A /* LeftButtonType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27768FDF2E201BE60086784A /* LeftButtonType.swift */; };
|
|
||||||
279367562E1BE16300AA5C3D /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279367552E1BE16300AA5C3D /* Settings.swift */; };
|
279367562E1BE16300AA5C3D /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279367552E1BE16300AA5C3D /* Settings.swift */; };
|
||||||
2793675A2E1BE17300AA5C3D /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279367592E1BE17300AA5C3D /* SettingsView.swift */; };
|
2793675A2E1BE17300AA5C3D /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279367592E1BE17300AA5C3D /* SettingsView.swift */; };
|
||||||
|
279387C42E4C8EB7009FDF8B /* MapPositionButtonMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279387C12E4C8EB6009FDF8B /* MapPositionButtonMode.swift */; };
|
||||||
|
279387C62E4C918A009FDF8B /* Controls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 279387C52E4C9187009FDF8B /* Controls.swift */; };
|
||||||
27AF184C2E1D5B2D00CD41E2 /* SettingsNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF184B2E1D5A2700CD41E2 /* SettingsNavigationView.swift */; };
|
27AF184C2E1D5B2D00CD41E2 /* SettingsNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF184B2E1D5A2700CD41E2 /* SettingsNavigationView.swift */; };
|
||||||
27AF18502E1DB61600CD41E2 /* VoiceRoutingLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */; };
|
27AF18502E1DB61600CD41E2 /* VoiceRoutingLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */; };
|
||||||
27AF18522E1DB62000CD41E2 /* DistanceUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */; };
|
27AF18522E1DB62000CD41E2 /* DistanceUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */; };
|
||||||
@@ -40,6 +41,18 @@
|
|||||||
27AF18562E1DB63000CD41E2 /* PowerSavingMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */; };
|
27AF18562E1DB63000CD41E2 /* PowerSavingMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */; };
|
||||||
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18572E1DB63900CD41E2 /* Appearance.swift */; };
|
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18572E1DB63900CD41E2 /* Appearance.swift */; };
|
||||||
27AF185A2E1DB64500CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */; };
|
27AF185A2E1DB64500CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */; };
|
||||||
|
27BDA4862E4366AC00C478B8 /* MapLayerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4852E4366A600C478B8 /* MapLayerButton.swift */; };
|
||||||
|
27BDA4882E4366C600C478B8 /* MapPositionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4872E4366B600C478B8 /* MapPositionButton.swift */; };
|
||||||
|
27BDA48A2E4366F400C478B8 /* MainButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4892E4366EC00C478B8 /* MainButton.swift */; };
|
||||||
|
27BDA48C2E43670300C478B8 /* MapZoomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA48B2E4366FB00C478B8 /* MapZoomButton.swift */; };
|
||||||
|
27BDA4902E436A1B00C478B8 /* MapZoomButtonKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA48F2E436A1600C478B8 /* MapZoomButtonKind.swift */; };
|
||||||
|
27BDA4A22E436D1900C478B8 /* MainButtonType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4A12E436D1100C478B8 /* MainButtonType.swift */; };
|
||||||
|
27BDA4A62E437B5200C478B8 /* BottomTabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4A52E437B5200C478B8 /* BottomTabBarButton.swift */; };
|
||||||
|
27BDA4A82E437F9800C478B8 /* ControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4A72E437F8E00C478B8 /* ControlsView.swift */; };
|
||||||
|
27BDA4AA2E437FEF00C478B8 /* MapTrackRecordingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27BDA4A92E437FE400C478B8 /* MapTrackRecordingButton.swift */; };
|
||||||
|
27E5CAAD2E4B644100FA3597 /* FloatingButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27E5CAAA2E4B643A00FA3597 /* FloatingButtonStyle.swift */; };
|
||||||
|
27E5CAAF2E4B6CBC00FA3597 /* Controls.h in Sources */ = {isa = PBXBuildFile; fileRef = 27E5CAAE2E4B6CB800FA3597 /* Controls.h */; };
|
||||||
|
27E5CAB12E4B6D0300FA3597 /* Controls.mm in Sources */ = {isa = PBXBuildFile; fileRef = 27E5CAB02E4B6CFC00FA3597 /* Controls.mm */; };
|
||||||
3304306D21D4EAFB00317CA3 /* SearchCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */; };
|
3304306D21D4EAFB00317CA3 /* SearchCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */; };
|
||||||
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; };
|
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; };
|
||||||
337F98A621D37B7400C8AC27 /* SearchTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337F98A521D37B7400C8AC27 /* SearchTabViewController.swift */; };
|
337F98A621D37B7400C8AC27 /* SearchTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337F98A521D37B7400C8AC27 /* SearchTabViewController.swift */; };
|
||||||
@@ -115,7 +128,6 @@
|
|||||||
349A13831DEC138C00C7DB60 /* MWMMobileInternetAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A13801DEC138C00C7DB60 /* MWMMobileInternetAlert.m */; };
|
349A13831DEC138C00C7DB60 /* MWMMobileInternetAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A13801DEC138C00C7DB60 /* MWMMobileInternetAlert.m */; };
|
||||||
349A13851DEC138C00C7DB60 /* MWMMobileInternetAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349A13811DEC138C00C7DB60 /* MWMMobileInternetAlert.xib */; };
|
349A13851DEC138C00C7DB60 /* MWMMobileInternetAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349A13811DEC138C00C7DB60 /* MWMMobileInternetAlert.xib */; };
|
||||||
349D1AD51E2E325B004A2006 /* BottomMenuItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349D1AC61E2E325B004A2006 /* BottomMenuItemCell.xib */; };
|
349D1AD51E2E325B004A2006 /* BottomMenuItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349D1AC61E2E325B004A2006 /* BottomMenuItemCell.xib */; };
|
||||||
349D1AE11E2E325C004A2006 /* BottomTabBarViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349D1ACD1E2E325B004A2006 /* BottomTabBarViewController.xib */; };
|
|
||||||
349D1CE41E3F836900A878FD /* UIViewController+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1CE21E3F836900A878FD /* UIViewController+Hierarchy.swift */; };
|
349D1CE41E3F836900A878FD /* UIViewController+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1CE21E3F836900A878FD /* UIViewController+Hierarchy.swift */; };
|
||||||
34AB39C21D2BD8310021857D /* MWMStopButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB39C01D2BD8310021857D /* MWMStopButton.m */; };
|
34AB39C21D2BD8310021857D /* MWMStopButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB39C01D2BD8310021857D /* MWMStopButton.m */; };
|
||||||
34AB66051FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34AB65C51FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm */; };
|
34AB66051FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34AB65C51FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm */; };
|
||||||
@@ -326,11 +338,6 @@
|
|||||||
8C4FB9C72BEFEFF400D44877 /* CarPlayWindowScaleAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C4FB9C62BEFEFF400D44877 /* CarPlayWindowScaleAdjuster.swift */; };
|
8C4FB9C72BEFEFF400D44877 /* CarPlayWindowScaleAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C4FB9C62BEFEFF400D44877 /* CarPlayWindowScaleAdjuster.swift */; };
|
||||||
8CB13C3B2BF1276A004288F2 /* CarplayPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB13C3A2BF1276A004288F2 /* CarplayPlaceholderView.swift */; };
|
8CB13C3B2BF1276A004288F2 /* CarplayPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB13C3A2BF1276A004288F2 /* CarplayPlaceholderView.swift */; };
|
||||||
99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012846243F0D6900C72B10 /* UIViewController+alternative.swift */; };
|
99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012846243F0D6900C72B10 /* UIViewController+alternative.swift */; };
|
||||||
9901284F244732DB00C72B10 /* BottomTabBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012849244732DB00C72B10 /* BottomTabBarPresenter.swift */; };
|
|
||||||
99012851244732DB00C72B10 /* BottomTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9901284B244732DB00C72B10 /* BottomTabBarViewController.swift */; };
|
|
||||||
99012852244732DB00C72B10 /* BottomTabBarBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9901284C244732DB00C72B10 /* BottomTabBarBuilder.swift */; };
|
|
||||||
99012853244732DB00C72B10 /* BottomTabBarInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9901284D244732DB00C72B10 /* BottomTabBarInteractor.swift */; };
|
|
||||||
990128562449A82500C72B10 /* BottomTabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 990128552449A82400C72B10 /* BottomTabBarView.swift */; };
|
|
||||||
9917D17F2397B1D600A7E06E /* IPadModalPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9917D17E2397B1D600A7E06E /* IPadModalPresentationController.swift */; };
|
9917D17F2397B1D600A7E06E /* IPadModalPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9917D17E2397B1D600A7E06E /* IPadModalPresentationController.swift */; };
|
||||||
991FCA2423B11E61009AD684 /* BookmarksStyleSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991FCA2323B11E61009AD684 /* BookmarksStyleSheet.swift */; };
|
991FCA2423B11E61009AD684 /* BookmarksStyleSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 991FCA2323B11E61009AD684 /* BookmarksStyleSheet.swift */; };
|
||||||
993DF0B523F6B2EF00AC231A /* PlacePageTrackLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993DF0B423F6B2EF00AC231A /* PlacePageTrackLayout.swift */; };
|
993DF0B523F6B2EF00AC231A /* PlacePageTrackLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 993DF0B423F6B2EF00AC231A /* PlacePageTrackLayout.swift */; };
|
||||||
@@ -479,7 +486,6 @@
|
|||||||
ED2D74662D1435A600660FBF /* LiveActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742D2D14337500660FBF /* LiveActivityManager.swift */; };
|
ED2D74662D1435A600660FBF /* LiveActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED2D742D2D14337500660FBF /* LiveActivityManager.swift */; };
|
||||||
ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */; };
|
ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */; };
|
||||||
ED2E32912D10501700807A08 /* TrackRecordingButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED49D76F2CF0E3A8004AF27E /* TrackRecordingButtonViewController.swift */; };
|
ED2E32912D10501700807A08 /* TrackRecordingButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED49D76F2CF0E3A8004AF27E /* TrackRecordingButtonViewController.swift */; };
|
||||||
ED3EAC202B03C88100220A4A /* BottomTabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */; };
|
|
||||||
ED43B8BD2C12063500D07BAA /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */; };
|
ED43B8BD2C12063500D07BAA /* DocumentPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */; };
|
||||||
ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */; };
|
ED46DDCE2D098A0B007CACD6 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCD2D098A0B007CACD6 /* WidgetKit.framework */; };
|
||||||
ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */; };
|
ED46DDD02D098A0B007CACD6 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46DDCF2D098A0B007CACD6 /* SwiftUI.framework */; };
|
||||||
@@ -779,9 +785,10 @@
|
|||||||
27697F8F2E257ED800FBD913 /* AboutCoMapsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutCoMapsView.swift; sourceTree = "<group>"; };
|
27697F8F2E257ED800FBD913 /* AboutCoMapsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutCoMapsView.swift; sourceTree = "<group>"; };
|
||||||
27697F912E257EE600FBD913 /* ApoutOpenStreetMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApoutOpenStreetMapView.swift; sourceTree = "<group>"; };
|
27697F912E257EE600FBD913 /* ApoutOpenStreetMapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApoutOpenStreetMapView.swift; sourceTree = "<group>"; };
|
||||||
27768FD92E20199A0086784A /* RoutingOptionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutingOptionsView.swift; sourceTree = "<group>"; };
|
27768FD92E20199A0086784A /* RoutingOptionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoutingOptionsView.swift; sourceTree = "<group>"; };
|
||||||
27768FDF2E201BE60086784A /* LeftButtonType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeftButtonType.swift; sourceTree = "<group>"; };
|
|
||||||
279367552E1BE16300AA5C3D /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
|
279367552E1BE16300AA5C3D /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
|
||||||
279367592E1BE17300AA5C3D /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SettingsView.swift; path = UI/Settings/SettingsView.swift; sourceTree = SOURCE_ROOT; };
|
279367592E1BE17300AA5C3D /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SettingsView.swift; path = UI/Settings/SettingsView.swift; sourceTree = SOURCE_ROOT; };
|
||||||
|
279387C12E4C8EB6009FDF8B /* MapPositionButtonMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPositionButtonMode.swift; sourceTree = "<group>"; };
|
||||||
|
279387C52E4C9187009FDF8B /* Controls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Controls.swift; sourceTree = "<group>"; };
|
||||||
27AF184B2E1D5A2700CD41E2 /* SettingsNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsNavigationView.swift; sourceTree = "<group>"; };
|
27AF184B2E1D5A2700CD41E2 /* SettingsNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsNavigationView.swift; sourceTree = "<group>"; };
|
||||||
27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceRoutingLanguage.swift; sourceTree = "<group>"; };
|
27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceRoutingLanguage.swift; sourceTree = "<group>"; };
|
||||||
27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DistanceUnit.swift; sourceTree = "<group>"; };
|
27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DistanceUnit.swift; sourceTree = "<group>"; };
|
||||||
@@ -789,6 +796,18 @@
|
|||||||
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowerSavingMode.swift; sourceTree = "<group>"; };
|
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PowerSavingMode.swift; sourceTree = "<group>"; };
|
||||||
27AF18572E1DB63900CD41E2 /* Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Appearance.swift; sourceTree = "<group>"; };
|
27AF18572E1DB63900CD41E2 /* Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Appearance.swift; sourceTree = "<group>"; };
|
||||||
27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncingSpeedTrapsWhileVoiceRouting.swift; sourceTree = "<group>"; };
|
27AF18592E1DB64400CD41E2 /* AnnouncingSpeedTrapsWhileVoiceRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnnouncingSpeedTrapsWhileVoiceRouting.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4852E4366A600C478B8 /* MapLayerButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapLayerButton.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4872E4366B600C478B8 /* MapPositionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPositionButton.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4892E4366EC00C478B8 /* MainButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainButton.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA48B2E4366FB00C478B8 /* MapZoomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapZoomButton.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA48F2E436A1600C478B8 /* MapZoomButtonKind.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapZoomButtonKind.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4A12E436D1100C478B8 /* MainButtonType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainButtonType.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4A52E437B5200C478B8 /* BottomTabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarButton.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4A72E437F8E00C478B8 /* ControlsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsView.swift; sourceTree = "<group>"; };
|
||||||
|
27BDA4A92E437FE400C478B8 /* MapTrackRecordingButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapTrackRecordingButton.swift; sourceTree = "<group>"; };
|
||||||
|
27E5CAAA2E4B643A00FA3597 /* FloatingButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingButtonStyle.swift; sourceTree = "<group>"; };
|
||||||
|
27E5CAAE2E4B6CB800FA3597 /* Controls.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Controls.h; sourceTree = "<group>"; };
|
||||||
|
27E5CAB02E4B6CFC00FA3597 /* Controls.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Controls.mm; sourceTree = "<group>"; };
|
||||||
28A0AB4B0D9B1048005BE974 /* Maps_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Maps_Prefix.pch; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
28A0AB4B0D9B1048005BE974 /* Maps_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Maps_Prefix.pch; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||||
29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; indentWidth = 2; path = main.mm; sourceTree = "<group>"; tabWidth = 2; };
|
29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; indentWidth = 2; path = main.mm; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
30034C5C2B3F0B74005D961A /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
|
30034C5C2B3F0B74005D961A /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
@@ -929,7 +948,6 @@
|
|||||||
349A35781B53D4C9009677EE /* MWMCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; path = MWMCircularProgressView.h; sourceTree = "<group>"; tabWidth = 2; };
|
349A35781B53D4C9009677EE /* MWMCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; path = MWMCircularProgressView.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
349A35791B53D4C9009677EE /* MWMCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = MWMCircularProgressView.m; sourceTree = "<group>"; tabWidth = 2; };
|
349A35791B53D4C9009677EE /* MWMCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = MWMCircularProgressView.m; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
349D1AC61E2E325B004A2006 /* BottomMenuItemCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BottomMenuItemCell.xib; sourceTree = "<group>"; };
|
349D1AC61E2E325B004A2006 /* BottomMenuItemCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BottomMenuItemCell.xib; sourceTree = "<group>"; };
|
||||||
349D1ACD1E2E325B004A2006 /* BottomTabBarViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BottomTabBarViewController.xib; sourceTree = "<group>"; };
|
|
||||||
349D1CE21E3F836900A878FD /* UIViewController+Hierarchy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Hierarchy.swift"; sourceTree = "<group>"; };
|
349D1CE21E3F836900A878FD /* UIViewController+Hierarchy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Hierarchy.swift"; sourceTree = "<group>"; };
|
||||||
34AB39BF1D2BD8310021857D /* MWMStopButton.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; path = MWMStopButton.h; sourceTree = "<group>"; tabWidth = 2; };
|
34AB39BF1D2BD8310021857D /* MWMStopButton.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; path = MWMStopButton.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
34AB39C01D2BD8310021857D /* MWMStopButton.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = MWMStopButton.m; sourceTree = "<group>"; tabWidth = 2; };
|
34AB39C01D2BD8310021857D /* MWMStopButton.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = MWMStopButton.m; sourceTree = "<group>"; tabWidth = 2; };
|
||||||
@@ -1218,11 +1236,6 @@
|
|||||||
978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
|
978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
|
||||||
97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
|
97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
|
||||||
99012846243F0D6900C72B10 /* UIViewController+alternative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+alternative.swift"; sourceTree = "<group>"; };
|
99012846243F0D6900C72B10 /* UIViewController+alternative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+alternative.swift"; sourceTree = "<group>"; };
|
||||||
99012849244732DB00C72B10 /* BottomTabBarPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarPresenter.swift; sourceTree = "<group>"; };
|
|
||||||
9901284B244732DB00C72B10 /* BottomTabBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarViewController.swift; sourceTree = "<group>"; };
|
|
||||||
9901284C244732DB00C72B10 /* BottomTabBarBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarBuilder.swift; sourceTree = "<group>"; };
|
|
||||||
9901284D244732DB00C72B10 /* BottomTabBarInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarInteractor.swift; sourceTree = "<group>"; };
|
|
||||||
990128552449A82400C72B10 /* BottomTabBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarView.swift; sourceTree = "<group>"; };
|
|
||||||
9917D17E2397B1D600A7E06E /* IPadModalPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPadModalPresentationController.swift; sourceTree = "<group>"; };
|
9917D17E2397B1D600A7E06E /* IPadModalPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPadModalPresentationController.swift; sourceTree = "<group>"; };
|
||||||
991FCA2323B11E61009AD684 /* BookmarksStyleSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksStyleSheet.swift; sourceTree = "<group>"; };
|
991FCA2323B11E61009AD684 /* BookmarksStyleSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksStyleSheet.swift; sourceTree = "<group>"; };
|
||||||
993DF0B423F6B2EF00AC231A /* PlacePageTrackLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageTrackLayout.swift; sourceTree = "<group>"; };
|
993DF0B423F6B2EF00AC231A /* PlacePageTrackLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageTrackLayout.swift; sourceTree = "<group>"; };
|
||||||
@@ -1421,7 +1434,6 @@
|
|||||||
ED2D74352D14337500660FBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
ED2D74352D14337500660FBF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
ED2D74362D14337500660FBF /* CoMapsWidgetExtensionBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoMapsWidgetExtensionBundle.swift; sourceTree = "<group>"; };
|
ED2D74362D14337500660FBF /* CoMapsWidgetExtensionBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoMapsWidgetExtensionBundle.swift; sourceTree = "<group>"; };
|
||||||
ED2D745D2D1433DE00660FBF /* TrackRecordingActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingActivityManager.swift; sourceTree = "<group>"; };
|
ED2D745D2D1433DE00660FBF /* TrackRecordingActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingActivityManager.swift; sourceTree = "<group>"; };
|
||||||
ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomTabBarButton.swift; sourceTree = "<group>"; };
|
|
||||||
ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = "<group>"; };
|
ED43B8BC2C12063500D07BAA /* DocumentPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentPicker.swift; sourceTree = "<group>"; };
|
||||||
ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingButtonArea.swift; sourceTree = "<group>"; };
|
ED46DD922D06F804007CACD6 /* TrackRecordingButtonArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecordingButtonArea.swift; sourceTree = "<group>"; };
|
||||||
ED46DDCC2D098A0B007CACD6 /* CoMapsWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CoMapsWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
ED46DDCC2D098A0B007CACD6 /* CoMapsWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CoMapsWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
@@ -1904,6 +1916,9 @@
|
|||||||
27697F822E254A9900FBD913 /* EmbeddedSafariView.swift */,
|
27697F822E254A9900FBD913 /* EmbeddedSafariView.swift */,
|
||||||
27697F842E255B6300FBD913 /* EmbeddedSafariViewCoordinator.swift */,
|
27697F842E255B6300FBD913 /* EmbeddedSafariViewCoordinator.swift */,
|
||||||
27697F862E255B7C00FBD913 /* EmbeddedSafariViewContent.swift */,
|
27697F862E255B7C00FBD913 /* EmbeddedSafariViewContent.swift */,
|
||||||
|
27E5CAAE2E4B6CB800FA3597 /* Controls.h */,
|
||||||
|
27E5CAB02E4B6CFC00FA3597 /* Controls.mm */,
|
||||||
|
279387C52E4C9187009FDF8B /* Controls.swift */,
|
||||||
);
|
);
|
||||||
path = Bridging;
|
path = Bridging;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1963,7 +1978,6 @@
|
|||||||
2752B6CD2E3121D800887CC4 /* Language.swift */,
|
2752B6CD2E3121D800887CC4 /* Language.swift */,
|
||||||
2752B6C92E31197000887CC4 /* MapLanguage.swift */,
|
2752B6C92E31197000887CC4 /* MapLanguage.swift */,
|
||||||
27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */,
|
27AF184F2E1DB61500CD41E2 /* VoiceRoutingLanguage.swift */,
|
||||||
27768FDF2E201BE60086784A /* LeftButtonType.swift */,
|
|
||||||
27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */,
|
27AF18512E1DB61F00CD41E2 /* DistanceUnit.swift */,
|
||||||
27AF18532E1DB62600CD41E2 /* MobileDataPolicy.swift */,
|
27AF18532E1DB62600CD41E2 /* MobileDataPolicy.swift */,
|
||||||
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */,
|
27AF18552E1DB62F00CD41E2 /* PowerSavingMode.swift */,
|
||||||
@@ -1973,6 +1987,19 @@
|
|||||||
path = "Settings Types";
|
path = "Settings Types";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
27BDA4952E436C2D00C478B8 /* New Group */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
27BDA4852E4366A600C478B8 /* MapLayerButton.swift */,
|
||||||
|
27BDA4A92E437FE400C478B8 /* MapTrackRecordingButton.swift */,
|
||||||
|
27BDA4872E4366B600C478B8 /* MapPositionButton.swift */,
|
||||||
|
279387C12E4C8EB6009FDF8B /* MapPositionButtonMode.swift */,
|
||||||
|
27BDA48B2E4366FB00C478B8 /* MapZoomButton.swift */,
|
||||||
|
27BDA48F2E436A1600C478B8 /* MapZoomButtonKind.swift */,
|
||||||
|
);
|
||||||
|
path = "New Group";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
29B97314FDCFA39411CA2CEA /* Maps */ = {
|
29B97314FDCFA39411CA2CEA /* Maps */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -2505,8 +2532,8 @@
|
|||||||
children = (
|
children = (
|
||||||
99AAEA72244DA59E0039D110 /* Presentation */,
|
99AAEA72244DA59E0039D110 /* Presentation */,
|
||||||
998927312449E5ED00260CE2 /* Menu */,
|
998927312449E5ED00260CE2 /* Menu */,
|
||||||
99012848244732C200C72B10 /* TabBar */,
|
|
||||||
995F1610244F07F90060631D /* MWMBottomMenuState.h */,
|
995F1610244F07F90060631D /* MWMBottomMenuState.h */,
|
||||||
|
27BDA4A52E437B5200C478B8 /* BottomTabBarButton.swift */,
|
||||||
);
|
);
|
||||||
path = BottomMenu;
|
path = BottomMenu;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2847,20 +2874,6 @@
|
|||||||
name = "Custom Views";
|
name = "Custom Views";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
99012848244732C200C72B10 /* TabBar */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
99012849244732DB00C72B10 /* BottomTabBarPresenter.swift */,
|
|
||||||
9901284B244732DB00C72B10 /* BottomTabBarViewController.swift */,
|
|
||||||
9901284C244732DB00C72B10 /* BottomTabBarBuilder.swift */,
|
|
||||||
9901284D244732DB00C72B10 /* BottomTabBarInteractor.swift */,
|
|
||||||
349D1ACD1E2E325B004A2006 /* BottomTabBarViewController.xib */,
|
|
||||||
990128552449A82400C72B10 /* BottomTabBarView.swift */,
|
|
||||||
ED3EAC1F2B03C88100220A4A /* BottomTabBarButton.swift */,
|
|
||||||
);
|
|
||||||
path = TabBar;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
993DF0C223F6BD0600AC231A /* ElevationDetails */ = {
|
993DF0C223F6BD0600AC231A /* ElevationDetails */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -3583,6 +3596,11 @@
|
|||||||
F6E2FBFB1E097B9F0083EBEC /* UI */ = {
|
F6E2FBFB1E097B9F0083EBEC /* UI */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
27BDA4A72E437F8E00C478B8 /* ControlsView.swift */,
|
||||||
|
27BDA4892E4366EC00C478B8 /* MainButton.swift */,
|
||||||
|
27BDA4A12E436D1100C478B8 /* MainButtonType.swift */,
|
||||||
|
27BDA4952E436C2D00C478B8 /* New Group */,
|
||||||
|
27E5CAAA2E4B643A00FA3597 /* FloatingButtonStyle.swift */,
|
||||||
27768FDA2E20199A0086784A /* Routing */,
|
27768FDA2E20199A0086784A /* Routing */,
|
||||||
ED9857022C4ECFFC00694F6C /* MailComposer */,
|
ED9857022C4ECFFC00694F6C /* MailComposer */,
|
||||||
ED43B8B92C12061600D07BAA /* DocumentPicker */,
|
ED43B8B92C12061600D07BAA /* DocumentPicker */,
|
||||||
@@ -4209,7 +4227,6 @@
|
|||||||
4761BE2B252D3DB900EE2DE4 /* SubgroupCell.xib in Resources */,
|
4761BE2B252D3DB900EE2DE4 /* SubgroupCell.xib in Resources */,
|
||||||
99F9A0E72462CA1700AE21E0 /* DownloadAllView.xib in Resources */,
|
99F9A0E72462CA1700AE21E0 /* DownloadAllView.xib in Resources */,
|
||||||
349D1AD51E2E325B004A2006 /* BottomMenuItemCell.xib in Resources */,
|
349D1AD51E2E325B004A2006 /* BottomMenuItemCell.xib in Resources */,
|
||||||
349D1AE11E2E325C004A2006 /* BottomTabBarViewController.xib in Resources */,
|
|
||||||
34D3B01E1E389D05004100F9 /* MWMButtonCell.xib in Resources */,
|
34D3B01E1E389D05004100F9 /* MWMButtonCell.xib in Resources */,
|
||||||
9959C75624582DA2008FD4FD /* DirectionView.xib in Resources */,
|
9959C75624582DA2008FD4FD /* DirectionView.xib in Resources */,
|
||||||
6741A98B1BF340DE002C974C /* MWMCircularProgress.xib in Resources */,
|
6741A98B1BF340DE002C974C /* MWMCircularProgress.xib in Resources */,
|
||||||
@@ -4348,7 +4365,6 @@
|
|||||||
34845DB71E166084003D55B9 /* Common.swift in Sources */,
|
34845DB71E166084003D55B9 /* Common.swift in Sources */,
|
||||||
47F4F21323A6EC420022FD56 /* DownloadMapsViewController.swift in Sources */,
|
47F4F21323A6EC420022FD56 /* DownloadMapsViewController.swift in Sources */,
|
||||||
99A906F623FA9C010005872B /* InsetsLabelRenderer.swift in Sources */,
|
99A906F623FA9C010005872B /* InsetsLabelRenderer.swift in Sources */,
|
||||||
99012853244732DB00C72B10 /* BottomTabBarInteractor.swift in Sources */,
|
|
||||||
6741A9A31BF340DE002C974C /* main.mm in Sources */,
|
6741A9A31BF340DE002C974C /* main.mm in Sources */,
|
||||||
34D3B04F1E38A20C004100F9 /* Bundle+Init.swift in Sources */,
|
34D3B04F1E38A20C004100F9 /* Bundle+Init.swift in Sources */,
|
||||||
34AB666E1FC5AA330078E451 /* TransportTransitStepsCollectionView.swift in Sources */,
|
34AB666E1FC5AA330078E451 /* TransportTransitStepsCollectionView.swift in Sources */,
|
||||||
@@ -4422,6 +4438,8 @@
|
|||||||
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */,
|
3D15ACEE2155117000F725D5 /* MWMObjectsCategorySelectorDataSource.mm in Sources */,
|
||||||
9977E6A32480F9BF0073780C /* BottomMenuLayerButtonRenderer.swift in Sources */,
|
9977E6A32480F9BF0073780C /* BottomMenuLayerButtonRenderer.swift in Sources */,
|
||||||
272F1F392E0EE09000FA52EF /* ExistingProfileView.swift in Sources */,
|
272F1F392E0EE09000FA52EF /* ExistingProfileView.swift in Sources */,
|
||||||
|
27E5CAAD2E4B644100FA3597 /* FloatingButtonStyle.swift in Sources */,
|
||||||
|
27BDA4862E4366AC00C478B8 /* MapLayerButton.swift in Sources */,
|
||||||
3454D7D11E07F045004AF2AD /* UIImage+RGBAData.m in Sources */,
|
3454D7D11E07F045004AF2AD /* UIImage+RGBAData.m in Sources */,
|
||||||
6741A9B71BF340DE002C974C /* EAGLView.mm in Sources */,
|
6741A9B71BF340DE002C974C /* EAGLView.mm in Sources */,
|
||||||
6741A9B81BF340DE002C974C /* MapViewController.mm in Sources */,
|
6741A9B81BF340DE002C974C /* MapViewController.mm in Sources */,
|
||||||
@@ -4449,6 +4467,7 @@
|
|||||||
F6E2FEE51E097BA00083EBEC /* MWMSearchNoResults.m in Sources */,
|
F6E2FEE51E097BA00083EBEC /* MWMSearchNoResults.m in Sources */,
|
||||||
ED5E02142D8B17B600A5CC7B /* ModalPresentationStepsController.swift in Sources */,
|
ED5E02142D8B17B600A5CC7B /* ModalPresentationStepsController.swift in Sources */,
|
||||||
4715273524907F8200E91BBA /* BookmarkColorViewController.swift in Sources */,
|
4715273524907F8200E91BBA /* BookmarkColorViewController.swift in Sources */,
|
||||||
|
279387C62E4C918A009FDF8B /* Controls.swift in Sources */,
|
||||||
47E3C7292111E614008B3B27 /* FadeInAnimatedTransitioning.swift in Sources */,
|
47E3C7292111E614008B3B27 /* FadeInAnimatedTransitioning.swift in Sources */,
|
||||||
ED79A5D42BDF8D6100952D1F /* MetadataItem.swift in Sources */,
|
ED79A5D42BDF8D6100952D1F /* MetadataItem.swift in Sources */,
|
||||||
34AB667D1FC5AA330078E451 /* MWMRoutePreview.mm in Sources */,
|
34AB667D1FC5AA330078E451 /* MWMRoutePreview.mm in Sources */,
|
||||||
@@ -4472,6 +4491,7 @@
|
|||||||
F6E2FDA11E097BA00083EBEC /* MWMEditorAdditionalNamesTableViewController.mm in Sources */,
|
F6E2FDA11E097BA00083EBEC /* MWMEditorAdditionalNamesTableViewController.mm in Sources */,
|
||||||
4767CDA620AB1F6200BD8166 /* LeftAlignedIconButton.swift in Sources */,
|
4767CDA620AB1F6200BD8166 /* LeftAlignedIconButton.swift in Sources */,
|
||||||
3454D7D41E07F045004AF2AD /* UIImageView+Coloring.m in Sources */,
|
3454D7D41E07F045004AF2AD /* UIImageView+Coloring.m in Sources */,
|
||||||
|
27BDA4882E4366C600C478B8 /* MapPositionButton.swift in Sources */,
|
||||||
993DF11D23F6BDB100AC231A /* UIToolbarRenderer.swift in Sources */,
|
993DF11D23F6BDB100AC231A /* UIToolbarRenderer.swift in Sources */,
|
||||||
99A906E923F6F7030005872B /* WikiDescriptionViewController.swift in Sources */,
|
99A906E923F6F7030005872B /* WikiDescriptionViewController.swift in Sources */,
|
||||||
ED79A5D62BDF8D6100952D1F /* CloudDirectoryMonitor.swift in Sources */,
|
ED79A5D62BDF8D6100952D1F /* CloudDirectoryMonitor.swift in Sources */,
|
||||||
@@ -4505,6 +4525,7 @@
|
|||||||
99C9642B2428C0F700E41723 /* PlacePageHeaderViewController.swift in Sources */,
|
99C9642B2428C0F700E41723 /* PlacePageHeaderViewController.swift in Sources */,
|
||||||
F6FE3C391CC50FFD00A73196 /* MWMPlaceDoesntExistAlert.m in Sources */,
|
F6FE3C391CC50FFD00A73196 /* MWMPlaceDoesntExistAlert.m in Sources */,
|
||||||
F6E2FDFE1E097BA00083EBEC /* MWMOpeningHoursClosedSpanTableViewCell.mm in Sources */,
|
F6E2FDFE1E097BA00083EBEC /* MWMOpeningHoursClosedSpanTableViewCell.mm in Sources */,
|
||||||
|
27BDA4A62E437B5200C478B8 /* BottomTabBarButton.swift in Sources */,
|
||||||
34B846A12029DCC10081ECCD /* BMCCategoriesHeader.swift in Sources */,
|
34B846A12029DCC10081ECCD /* BMCCategoriesHeader.swift in Sources */,
|
||||||
99A906F123FA946E0005872B /* DifficultyViewRenderer.swift in Sources */,
|
99A906F123FA946E0005872B /* DifficultyViewRenderer.swift in Sources */,
|
||||||
F6E2FD5F1E097BA00083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m in Sources */,
|
F6E2FD5F1E097BA00083EBEC /* MWMMapDownloaderLargeCountryTableViewCell.m in Sources */,
|
||||||
@@ -4525,7 +4546,6 @@
|
|||||||
EDB71E002D8B0338004A6A7F /* ModalPresentationAnimator.swift in Sources */,
|
EDB71E002D8B0338004A6A7F /* ModalPresentationAnimator.swift in Sources */,
|
||||||
F6E2FD8C1E097BA00083EBEC /* MWMNoMapsView.m in Sources */,
|
F6E2FD8C1E097BA00083EBEC /* MWMNoMapsView.m in Sources */,
|
||||||
34D3B0361E389D05004100F9 /* MWMEditorSelectTableViewCell.m in Sources */,
|
34D3B0361E389D05004100F9 /* MWMEditorSelectTableViewCell.m in Sources */,
|
||||||
990128562449A82500C72B10 /* BottomTabBarView.swift in Sources */,
|
|
||||||
F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.m in Sources */,
|
F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.m in Sources */,
|
||||||
F6E2FE4F1E097BA00083EBEC /* MWMActionBarButton.m in Sources */,
|
F6E2FE4F1E097BA00083EBEC /* MWMActionBarButton.m in Sources */,
|
||||||
47F86CFF20C936FC00FEE291 /* TabView.swift in Sources */,
|
47F86CFF20C936FC00FEE291 /* TabView.swift in Sources */,
|
||||||
@@ -4554,9 +4574,9 @@
|
|||||||
34AB66081FC5AA320078E451 /* MWMNavigationDashboardManager.mm in Sources */,
|
34AB66081FC5AA320078E451 /* MWMNavigationDashboardManager.mm in Sources */,
|
||||||
3404F490202898CC0090E401 /* BMCModels.swift in Sources */,
|
3404F490202898CC0090E401 /* BMCModels.swift in Sources */,
|
||||||
F6E2FD561E097BA00083EBEC /* MWMMapDownloaderButtonTableViewCell.m in Sources */,
|
F6E2FD561E097BA00083EBEC /* MWMMapDownloaderButtonTableViewCell.m in Sources */,
|
||||||
9901284F244732DB00C72B10 /* BottomTabBarPresenter.swift in Sources */,
|
|
||||||
CDB4D5002231412900104869 /* MapTemplateBuilder.swift in Sources */,
|
CDB4D5002231412900104869 /* MapTemplateBuilder.swift in Sources */,
|
||||||
34AB66171FC5AA320078E451 /* MWMiPhoneRoutePreview.m in Sources */,
|
34AB66171FC5AA320078E451 /* MWMiPhoneRoutePreview.m in Sources */,
|
||||||
|
27BDA4A82E437F9800C478B8 /* ControlsView.swift in Sources */,
|
||||||
99A906EA23F6F7030005872B /* PlacePageInfoViewController.swift in Sources */,
|
99A906EA23F6F7030005872B /* PlacePageInfoViewController.swift in Sources */,
|
||||||
993DF11723F6BDB100AC231A /* UINavigationBarRenderer.swift in Sources */,
|
993DF11723F6BDB100AC231A /* UINavigationBarRenderer.swift in Sources */,
|
||||||
6741A9E71BF340DE002C974C /* MWMCircularProgressView.m in Sources */,
|
6741A9E71BF340DE002C974C /* MWMCircularProgressView.m in Sources */,
|
||||||
@@ -4607,8 +4627,9 @@
|
|||||||
34AB66111FC5AA320078E451 /* NavigationTurnsView.swift in Sources */,
|
34AB66111FC5AA320078E451 /* NavigationTurnsView.swift in Sources */,
|
||||||
475ED78624C7C7300063ADC7 /* ValueStepperViewRenderer.swift in Sources */,
|
475ED78624C7C7300063ADC7 /* ValueStepperViewRenderer.swift in Sources */,
|
||||||
3490D2E11CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */,
|
3490D2E11CE9DD2500D0B838 /* MWMSideButtonsView.mm in Sources */,
|
||||||
|
27BDA4AA2E437FEF00C478B8 /* MapTrackRecordingButton.swift in Sources */,
|
||||||
|
279387C42E4C8EB7009FDF8B /* MapPositionButtonMode.swift in Sources */,
|
||||||
47F4F21523A6F06F0022FD56 /* AvailableMapsDataSource.swift in Sources */,
|
47F4F21523A6F06F0022FD56 /* AvailableMapsDataSource.swift in Sources */,
|
||||||
99012852244732DB00C72B10 /* BottomTabBarBuilder.swift in Sources */,
|
|
||||||
99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */,
|
99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */,
|
||||||
995739062355CAC40019AEE7 /* ImageViewCrossDisolve.swift in Sources */,
|
995739062355CAC40019AEE7 /* ImageViewCrossDisolve.swift in Sources */,
|
||||||
ED83880F2D54DEB3002A0536 /* UIImage+FilledWithColor.swift in Sources */,
|
ED83880F2D54DEB3002A0536 /* UIImage+FilledWithColor.swift in Sources */,
|
||||||
@@ -4616,6 +4637,7 @@
|
|||||||
47A13CAD24BE9AA500027D4F /* DatePickerViewRenderer.swift in Sources */,
|
47A13CAD24BE9AA500027D4F /* DatePickerViewRenderer.swift in Sources */,
|
||||||
ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */,
|
ED2E328E2D10500900807A08 /* TrackRecordingButtonArea.swift in Sources */,
|
||||||
F6E2FE7C1E097BA00083EBEC /* MWMPlacePageOpeningHoursCell.mm in Sources */,
|
F6E2FE7C1E097BA00083EBEC /* MWMPlacePageOpeningHoursCell.mm in Sources */,
|
||||||
|
27BDA48C2E43670300C478B8 /* MapZoomButton.swift in Sources */,
|
||||||
340E1EFB1E2F614400CE49BF /* Storyboard.swift in Sources */,
|
340E1EFB1E2F614400CE49BF /* Storyboard.swift in Sources */,
|
||||||
34E776331F15FAC2003040B3 /* MWMPlacePageManagerHelper.mm in Sources */,
|
34E776331F15FAC2003040B3 /* MWMPlacePageManagerHelper.mm in Sources */,
|
||||||
462452E92BD052C0004C85E1 /* MWMEditorSegmentedTableViewCell.mm in Sources */,
|
462452E92BD052C0004C85E1 /* MWMEditorSegmentedTableViewCell.mm in Sources */,
|
||||||
@@ -4647,6 +4669,7 @@
|
|||||||
F6E2FE821E097BA00083EBEC /* MWMPlacePageOpeningHoursDayView.m in Sources */,
|
F6E2FE821E097BA00083EBEC /* MWMPlacePageOpeningHoursDayView.m in Sources */,
|
||||||
F6E2FD6B1E097BA00083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m in Sources */,
|
F6E2FD6B1E097BA00083EBEC /* MWMMapDownloaderSubplaceTableViewCell.m in Sources */,
|
||||||
CDCA27842245090900167D87 /* ListenerContainer.swift in Sources */,
|
CDCA27842245090900167D87 /* ListenerContainer.swift in Sources */,
|
||||||
|
27E5CAAF2E4B6CBC00FA3597 /* Controls.h in Sources */,
|
||||||
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */,
|
27AF18582E1DB63A00CD41E2 /* Appearance.swift in Sources */,
|
||||||
47E3C7252111E41B008B3B27 /* DimmedModalPresentationController.swift in Sources */,
|
47E3C7252111E41B008B3B27 /* DimmedModalPresentationController.swift in Sources */,
|
||||||
3472B5CB200F43EF00DC6CD5 /* BackgroundFetchScheduler.swift in Sources */,
|
3472B5CB200F43EF00DC6CD5 /* BackgroundFetchScheduler.swift in Sources */,
|
||||||
@@ -4725,12 +4748,12 @@
|
|||||||
270C9C282E16AB6F00ABA688 /* Profile.swift in Sources */,
|
270C9C282E16AB6F00ABA688 /* Profile.swift in Sources */,
|
||||||
ED9857082C4ED02D00694F6C /* MailComposer.swift in Sources */,
|
ED9857082C4ED02D00694F6C /* MailComposer.swift in Sources */,
|
||||||
99F8B4C623B644A6009FF0B4 /* MapStyleSheet.swift in Sources */,
|
99F8B4C623B644A6009FF0B4 /* MapStyleSheet.swift in Sources */,
|
||||||
99012851244732DB00C72B10 /* BottomTabBarViewController.swift in Sources */,
|
|
||||||
993DF10623F6BDB100AC231A /* UIColor+rgba.swift in Sources */,
|
993DF10623F6BDB100AC231A /* UIColor+rgba.swift in Sources */,
|
||||||
EDC3573B2B7B5029001AE9CA /* CALayer+SetCorner.swift in Sources */,
|
EDC3573B2B7B5029001AE9CA /* CALayer+SetCorner.swift in Sources */,
|
||||||
ED914AB22D35063A00973C45 /* TextColorStyleSheet.swift in Sources */,
|
ED914AB22D35063A00973C45 /* TextColorStyleSheet.swift in Sources */,
|
||||||
47E3C7332111F4D8008B3B27 /* CoverVerticalDismissalAnimator.swift in Sources */,
|
47E3C7332111F4D8008B3B27 /* CoverVerticalDismissalAnimator.swift in Sources */,
|
||||||
471AB99423ABA3BD00F56D49 /* SearchMapsDataSource.swift in Sources */,
|
471AB99423ABA3BD00F56D49 /* SearchMapsDataSource.swift in Sources */,
|
||||||
|
27BDA4A22E436D1900C478B8 /* MainButtonType.swift in Sources */,
|
||||||
47CA68F1250B54AF00671019 /* BookmarksListCell.swift in Sources */,
|
47CA68F1250B54AF00671019 /* BookmarksListCell.swift in Sources */,
|
||||||
471A7BC02481C82500A0D4C1 /* BookmarkTitleCell.swift in Sources */,
|
471A7BC02481C82500A0D4C1 /* BookmarkTitleCell.swift in Sources */,
|
||||||
47F67D1521CAB21B0069754E /* MWMImageCoder.m in Sources */,
|
47F67D1521CAB21B0069754E /* MWMImageCoder.m in Sources */,
|
||||||
@@ -4763,7 +4786,6 @@
|
|||||||
471A7BBE2481A3D000A0D4C1 /* EditBookmarkViewController.swift in Sources */,
|
471A7BBE2481A3D000A0D4C1 /* EditBookmarkViewController.swift in Sources */,
|
||||||
993DF0C923F6BD0600AC231A /* ElevationDetailsBuilder.swift in Sources */,
|
993DF0C923F6BD0600AC231A /* ElevationDetailsBuilder.swift in Sources */,
|
||||||
674A7E301C0DB10B003D48E1 /* MWMMapWidgets.mm in Sources */,
|
674A7E301C0DB10B003D48E1 /* MWMMapWidgets.mm in Sources */,
|
||||||
27768FE02E201BE60086784A /* LeftButtonType.swift in Sources */,
|
|
||||||
34AB66291FC5AA330078E451 /* RouteManagerViewController.swift in Sources */,
|
34AB66291FC5AA330078E451 /* RouteManagerViewController.swift in Sources */,
|
||||||
3404754D1E081A4600C92850 /* MWMKeyboard.m in Sources */,
|
3404754D1E081A4600C92850 /* MWMKeyboard.m in Sources */,
|
||||||
993DF10C23F6BDB100AC231A /* MWMTableViewCellRenderer.swift in Sources */,
|
993DF10C23F6BDB100AC231A /* MWMTableViewCellRenderer.swift in Sources */,
|
||||||
@@ -4773,11 +4795,12 @@
|
|||||||
47E3C7312111F4C2008B3B27 /* CoverVerticalPresentationAnimator.swift in Sources */,
|
47E3C7312111F4C2008B3B27 /* CoverVerticalPresentationAnimator.swift in Sources */,
|
||||||
99E2B0122368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift in Sources */,
|
99E2B0122368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift in Sources */,
|
||||||
F6D67CDC2062B9C00032FD38 /* BCCreateCategoryAlert.swift in Sources */,
|
F6D67CDC2062B9C00032FD38 /* BCCreateCategoryAlert.swift in Sources */,
|
||||||
|
27E5CAB12E4B6D0300FA3597 /* Controls.mm in Sources */,
|
||||||
F6E2FE2B1E097BA00083EBEC /* MWMStreetEditorEditTableViewCell.m in Sources */,
|
F6E2FE2B1E097BA00083EBEC /* MWMStreetEditorEditTableViewCell.m in Sources */,
|
||||||
34AB66891FC5AA330078E451 /* NavigationControlView.swift in Sources */,
|
34AB66891FC5AA330078E451 /* NavigationControlView.swift in Sources */,
|
||||||
|
27BDA48A2E4366F400C478B8 /* MainButton.swift in Sources */,
|
||||||
479EE94A2292FB03009DEBA6 /* ActivityIndicator.swift in Sources */,
|
479EE94A2292FB03009DEBA6 /* ActivityIndicator.swift in Sources */,
|
||||||
27697F872E255B8500FBD913 /* EmbeddedSafariViewContent.swift in Sources */,
|
27697F872E255B8500FBD913 /* EmbeddedSafariViewContent.swift in Sources */,
|
||||||
ED3EAC202B03C88100220A4A /* BottomTabBarButton.swift in Sources */,
|
|
||||||
47B9065321C7FA400079C85E /* MWMImageCache.m in Sources */,
|
47B9065321C7FA400079C85E /* MWMImageCache.m in Sources */,
|
||||||
F6FEA82E1C58F108007223CC /* MWMButton.m in Sources */,
|
F6FEA82E1C58F108007223CC /* MWMButton.m in Sources */,
|
||||||
34B924431DC8A29C0008D971 /* MWMMailViewController.m in Sources */,
|
34B924431DC8A29C0008D971 /* MWMMailViewController.m in Sources */,
|
||||||
@@ -4807,6 +4830,7 @@
|
|||||||
F6A2184A1CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
F6A2184A1CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
||||||
993DF10923F6BDB100AC231A /* IFonts.swift in Sources */,
|
993DF10923F6BDB100AC231A /* IFonts.swift in Sources */,
|
||||||
47699A0821F08E37009E6585 /* NSDate+TimeDistance.m in Sources */,
|
47699A0821F08E37009E6585 /* NSDate+TimeDistance.m in Sources */,
|
||||||
|
27BDA4902E436A1B00C478B8 /* MapZoomButtonKind.swift in Sources */,
|
||||||
34845DB31E165E24003D55B9 /* SearchNoResultsViewController.swift in Sources */,
|
34845DB31E165E24003D55B9 /* SearchNoResultsViewController.swift in Sources */,
|
||||||
47E3C72B2111E62A008B3B27 /* FadeOutAnimatedTransitioning.swift in Sources */,
|
47E3C72B2111E62A008B3B27 /* FadeOutAnimatedTransitioning.swift in Sources */,
|
||||||
471A7BC4248471BE00A0D4C1 /* BookmarkUIUtils.swift in Sources */,
|
471A7BC4248471BE00A0D4C1 /* BookmarkUIUtils.swift in Sources */,
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
extension Settings {
|
|
||||||
/// The type of the left bottom bar button
|
|
||||||
enum LeftButtonType: String, Codable, CaseIterable, Identifiable {
|
|
||||||
case hidden = "Hidden"
|
|
||||||
case addPlace = "AddPlace"
|
|
||||||
case recordTrack = "RecordTrack"
|
|
||||||
case settings = "Settings"
|
|
||||||
case help = "Help"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: Properties
|
|
||||||
|
|
||||||
/// The id
|
|
||||||
var id: Self { self }
|
|
||||||
|
|
||||||
|
|
||||||
/// The description text
|
|
||||||
var description: String {
|
|
||||||
switch self {
|
|
||||||
case .hidden:
|
|
||||||
return String(localized: "disabled")
|
|
||||||
case .addPlace:
|
|
||||||
return String(localized: "placepage_add_place_button")
|
|
||||||
case .recordTrack:
|
|
||||||
return String(localized: "start_track_recording")
|
|
||||||
case .settings:
|
|
||||||
return String(localized: "settings")
|
|
||||||
case .help:
|
|
||||||
return String(localized: "help")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// The image
|
|
||||||
var image: UIImage {
|
|
||||||
let configuration = UIImage.SymbolConfiguration(pointSize: 24, weight: .semibold)
|
|
||||||
switch self {
|
|
||||||
case .addPlace:
|
|
||||||
return UIImage(systemName: "plus", withConfiguration: configuration)!
|
|
||||||
case .recordTrack:
|
|
||||||
return UIImage(named: "track", in: nil, with: configuration)!
|
|
||||||
case .settings:
|
|
||||||
return UIImage(systemName: "gearshape.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 22, weight: .semibold))!
|
|
||||||
case .help:
|
|
||||||
return UIImage(systemName: "info.circle", withConfiguration: configuration)!
|
|
||||||
default:
|
|
||||||
return UIImage()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,7 @@ import AVFoundation
|
|||||||
|
|
||||||
|
|
||||||
/// Key for storing the type of action used for the bottom left main interface button in the user defaults
|
/// Key for storing the type of action used for the bottom left main interface button in the user defaults
|
||||||
static private let userDefaultsKeyLeftButtonType = "LeftButtonType"
|
static private let userDefaultsKeyLeftMainButtonKind = "LeftMainButtonKind"
|
||||||
|
|
||||||
|
|
||||||
/// Key for storing the map appearance in the user defaults
|
/// Key for storing the map appearance in the user defaults
|
||||||
@@ -52,16 +52,16 @@ import AVFoundation
|
|||||||
|
|
||||||
|
|
||||||
/// The type of action used for the bottom left main interface button
|
/// The type of action used for the bottom left main interface button
|
||||||
static var leftButtonType: LeftButtonType {
|
static var leftMainButtonKind: MainButton.Kind {
|
||||||
get {
|
get {
|
||||||
if let leftButtonTypeRawValue = UserDefaults.standard.string(forKey: userDefaultsKeyLeftButtonType), let leftButtonType = LeftButtonType(rawValue: leftButtonTypeRawValue) {
|
if let leftMainButtonKindRawValue = UserDefaults.standard.string(forKey: userDefaultsKeyLeftMainButtonKind), let leftMainButtonKind = MainButton.Kind(rawValue: leftMainButtonKindRawValue) {
|
||||||
return leftButtonType
|
return leftMainButtonKind
|
||||||
}
|
}
|
||||||
|
|
||||||
return .help
|
return .help
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
UserDefaults.standard.set(newValue.rawValue, forKey: userDefaultsKeyLeftButtonType)
|
UserDefaults.standard.set(newValue.rawValue, forKey: userDefaultsKeyLeftMainButtonKind)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,6 @@ final class TabBarArea: AvailableArea {
|
|||||||
let directions = ov.tabBarAreaAffectDirections
|
let directions = ov.tabBarAreaAffectDirections
|
||||||
addConstraints(otherView: ov, directions: directions)
|
addConstraints(otherView: ov, directions: directions)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func notifyObserver() {
|
|
||||||
BottomTabBarViewController.updateAvailableArea(areaFrame)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension UIView {
|
extension UIView {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
class BottomTabBarButton: MWMButton {
|
class BottomTabBarButton: MWMButton {
|
||||||
|
let kExtendedTabBarTappableMargin: CGFloat = -15
|
||||||
|
|
||||||
@objc override func applyTheme() {
|
@objc override func applyTheme() {
|
||||||
if styleName.isEmpty {
|
if styleName.isEmpty {
|
||||||
setStyle(.bottomTabBarButton)
|
setStyle(.bottomTabBarButton)
|
||||||
@@ -78,17 +78,17 @@ extension BottomMenuPresenter {
|
|||||||
case .layers:
|
case .layers:
|
||||||
return 1
|
return 1
|
||||||
case .items:
|
case .items:
|
||||||
let leftButtonType = Settings.leftButtonType
|
let leftMainButtonKind = Settings.leftMainButtonKind
|
||||||
menuCells = CellType.allCases.filter { cell in
|
menuCells = CellType.allCases.filter { cell in
|
||||||
if cell == .donate {
|
if cell == .donate {
|
||||||
return false
|
return false
|
||||||
} else if leftButtonType == .addPlace, cell == .addPlace {
|
} else if leftMainButtonKind == .addPlace, cell == .addPlace {
|
||||||
return false
|
return false
|
||||||
} else if leftButtonType == .recordTrack, cell == .recordTrack {
|
} else if leftMainButtonKind == .recordTrack, cell == .recordTrack {
|
||||||
return false
|
return false
|
||||||
} else if leftButtonType == .help, cell == .help {
|
} else if leftMainButtonKind == .help, cell == .help {
|
||||||
return false
|
return false
|
||||||
} else if leftButtonType == .settings, cell == .settings {
|
} else if leftMainButtonKind == .settings, cell == .settings {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
@objc class BottomTabBarBuilder: NSObject {
|
|
||||||
@objc static func build(mapViewController: MapViewController, controlsManager: MWMMapViewControlsManager) -> BottomTabBarViewController {
|
|
||||||
let viewController = BottomTabBarViewController(nibName: nil, bundle: nil)
|
|
||||||
let interactor = BottomTabBarInteractor(viewController: viewController,
|
|
||||||
mapViewController: mapViewController,
|
|
||||||
controlsManager: controlsManager)
|
|
||||||
let presenter = BottomTabBarPresenter(interactor: interactor)
|
|
||||||
|
|
||||||
interactor.presenter = presenter
|
|
||||||
viewController.presenter = presenter
|
|
||||||
|
|
||||||
return viewController
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
protocol BottomTabBarInteractorProtocol: AnyObject {
|
|
||||||
func openSearch()
|
|
||||||
func openLeftButton()
|
|
||||||
func openBookmarks()
|
|
||||||
func openMenu()
|
|
||||||
}
|
|
||||||
|
|
||||||
class BottomTabBarInteractor {
|
|
||||||
weak var presenter: BottomTabBarPresenterProtocol?
|
|
||||||
private weak var viewController: UIViewController?
|
|
||||||
private weak var mapViewController: MapViewController?
|
|
||||||
private weak var controlsManager: MWMMapViewControlsManager?
|
|
||||||
private let searchManager: SearchOnMapManager
|
|
||||||
|
|
||||||
init(viewController: UIViewController, mapViewController: MapViewController, controlsManager: MWMMapViewControlsManager) {
|
|
||||||
self.viewController = viewController
|
|
||||||
self.mapViewController = mapViewController
|
|
||||||
self.controlsManager = controlsManager
|
|
||||||
self.searchManager = mapViewController.searchManager
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension BottomTabBarInteractor: BottomTabBarInteractorProtocol {
|
|
||||||
func openSearch() {
|
|
||||||
searchManager.isSearching ? searchManager.close() : searchManager.startSearching(isRouting: false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func openLeftButton() {
|
|
||||||
switch Settings.leftButtonType {
|
|
||||||
case .addPlace:
|
|
||||||
if let delegate = controlsManager as? BottomMenuDelegate {
|
|
||||||
delegate.addPlace()
|
|
||||||
}
|
|
||||||
case .settings:
|
|
||||||
mapViewController?.openSettings()
|
|
||||||
case .recordTrack:
|
|
||||||
let mapViewController = MapViewController.shared()!
|
|
||||||
let trackRecorder: TrackRecordingManager = .shared
|
|
||||||
switch trackRecorder.recordingState {
|
|
||||||
case .active:
|
|
||||||
mapViewController.showTrackRecordingPlacePage()
|
|
||||||
case .inactive:
|
|
||||||
trackRecorder.start { result in
|
|
||||||
switch result {
|
|
||||||
case .success:
|
|
||||||
mapViewController.showTrackRecordingPlacePage()
|
|
||||||
case .failure:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
mapViewController?.openAbout()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func openBookmarks() {
|
|
||||||
mapViewController?.bookmarksCoordinator.open()
|
|
||||||
}
|
|
||||||
|
|
||||||
func openMenu() {
|
|
||||||
guard let state = controlsManager?.menuState else {
|
|
||||||
fatalError("ERROR: Failed to retrieve the current MapViewControlsManager's state.")
|
|
||||||
}
|
|
||||||
switch state {
|
|
||||||
case .inactive: controlsManager?.menuState = .active
|
|
||||||
case .active: controlsManager?.menuState = .inactive
|
|
||||||
case .hidden:
|
|
||||||
// When the current controls manager's state is hidden, accidental taps on the menu button during the hiding animation should be skipped.
|
|
||||||
break;
|
|
||||||
case .layers: fallthrough
|
|
||||||
@unknown default: fatalError("ERROR: Unexpected MapViewControlsManager's state: \(state)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
protocol BottomTabBarPresenterProtocol: AnyObject {
|
|
||||||
func configure()
|
|
||||||
func onLeftButtonPressed()
|
|
||||||
func onSearchButtonPressed()
|
|
||||||
func onBookmarksButtonPressed()
|
|
||||||
func onMenuButtonPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
class BottomTabBarPresenter: NSObject {
|
|
||||||
private let interactor: BottomTabBarInteractorProtocol
|
|
||||||
|
|
||||||
init(interactor: BottomTabBarInteractorProtocol) {
|
|
||||||
self.interactor = interactor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension BottomTabBarPresenter: BottomTabBarPresenterProtocol {
|
|
||||||
func configure() {
|
|
||||||
}
|
|
||||||
|
|
||||||
func onLeftButtonPressed() {
|
|
||||||
interactor.openLeftButton()
|
|
||||||
}
|
|
||||||
|
|
||||||
func onSearchButtonPressed() {
|
|
||||||
interactor.openSearch()
|
|
||||||
}
|
|
||||||
|
|
||||||
func onBookmarksButtonPressed() {
|
|
||||||
interactor.openBookmarks()
|
|
||||||
}
|
|
||||||
|
|
||||||
func onMenuButtonPressed() {
|
|
||||||
interactor.openMenu()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
let kExtendedTabBarTappableMargin: CGFloat = -15
|
|
||||||
|
|
||||||
final class BottomTabBarView: SolidTouchView {
|
|
||||||
|
|
||||||
@IBOutlet var mainButtonsView: ExtendedBottomTabBarContainerView!
|
|
||||||
|
|
||||||
override var placePageAreaAffectDirections: MWMAvailableAreaAffectDirections {
|
|
||||||
return alternative(iPhone: [], iPad: [.bottom])
|
|
||||||
}
|
|
||||||
|
|
||||||
override var widgetsAreaAffectDirections: MWMAvailableAreaAffectDirections {
|
|
||||||
return [.bottom]
|
|
||||||
}
|
|
||||||
|
|
||||||
override var sideButtonsAreaAffectDirections: MWMAvailableAreaAffectDirections {
|
|
||||||
return [.bottom]
|
|
||||||
}
|
|
||||||
|
|
||||||
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
|
|
||||||
return bounds.insetBy(dx: kExtendedTabBarTappableMargin, dy: kExtendedTabBarTappableMargin).contains(point)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final class ExtendedBottomTabBarContainerView: UIView {
|
|
||||||
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
|
|
||||||
return bounds.insetBy(dx: kExtendedTabBarTappableMargin, dy: kExtendedTabBarTappableMargin).contains(point)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
|
|
||||||
class BottomTabBarViewController: UIViewController {
|
|
||||||
var presenter: BottomTabBarPresenterProtocol!
|
|
||||||
|
|
||||||
@IBOutlet var leftButton: MWMButton?
|
|
||||||
@IBOutlet var searchButton: MWMButton?
|
|
||||||
@IBOutlet var searchConstraintWithLeftButton: NSLayoutConstraint?
|
|
||||||
@IBOutlet var searchConstraintWithoutLeftButton: NSLayoutConstraint?
|
|
||||||
@IBOutlet var bookmarksButton: MWMButton?
|
|
||||||
@IBOutlet var bookmarksConstraintWithLeftButton: NSLayoutConstraint?
|
|
||||||
@IBOutlet var bookmarksConstraintWithoutLeftButton: NSLayoutConstraint?
|
|
||||||
@IBOutlet var moreButton: MWMButton?
|
|
||||||
@IBOutlet var downloadBadge: UIView?
|
|
||||||
|
|
||||||
private var avaliableArea = CGRect.zero
|
|
||||||
@objc var isHidden: Bool = false {
|
|
||||||
didSet {
|
|
||||||
updateFrame(animated: true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@objc var isApplicationBadgeHidden: Bool = true {
|
|
||||||
didSet {
|
|
||||||
updateBadge()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var tabBarView: BottomTabBarView {
|
|
||||||
return view as! BottomTabBarView
|
|
||||||
}
|
|
||||||
@objc static var controller: BottomTabBarViewController? {
|
|
||||||
return MWMMapViewControlsManager.manager()?.tabBarController
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewDidLoad() {
|
|
||||||
super.viewDidLoad()
|
|
||||||
presenter.configure()
|
|
||||||
|
|
||||||
NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, object: nil, queue: nil) { _ in
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.updateLeftButton()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewWillAppear(_ animated: Bool) {
|
|
||||||
super.viewWillAppear(animated)
|
|
||||||
|
|
||||||
leftButton?.imageView?.contentMode = .scaleAspectFit
|
|
||||||
updateBadge()
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewWillLayoutSubviews() {
|
|
||||||
super.viewWillLayoutSubviews()
|
|
||||||
updateLeftButton()
|
|
||||||
}
|
|
||||||
|
|
||||||
static func updateAvailableArea(_ frame: CGRect) {
|
|
||||||
BottomTabBarViewController.controller?.updateAvailableArea(frame)
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func onSearchButtonPressed(_ sender: Any) {
|
|
||||||
presenter.onSearchButtonPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func onLeftButtonPressed(_ sender: Any) {
|
|
||||||
presenter.onLeftButtonPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func onBookmarksButtonPressed(_ sender: Any) {
|
|
||||||
presenter.onBookmarksButtonPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func onMenuButtonPressed(_ sender: Any) {
|
|
||||||
presenter.onMenuButtonPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func updateAvailableArea(_ frame:CGRect) {
|
|
||||||
avaliableArea = frame
|
|
||||||
updateFrame(animated: false)
|
|
||||||
self.view.layoutIfNeeded()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func updateFrame(animated: Bool) {
|
|
||||||
if avaliableArea == .zero {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let newFrame = CGRect(x: avaliableArea.minX,
|
|
||||||
y: isHidden ? avaliableArea.minY + avaliableArea.height : avaliableArea.minY,
|
|
||||||
width: avaliableArea.width,
|
|
||||||
height: avaliableArea.height)
|
|
||||||
let alpha:CGFloat = isHidden ? 0 : 1
|
|
||||||
if animated {
|
|
||||||
UIView.animate(withDuration: kDefaultAnimationDuration,
|
|
||||||
delay: 0,
|
|
||||||
options: [.beginFromCurrentState],
|
|
||||||
animations: {
|
|
||||||
self.view.frame = newFrame
|
|
||||||
self.view.alpha = alpha
|
|
||||||
}, completion: nil)
|
|
||||||
} else {
|
|
||||||
self.view.frame = newFrame
|
|
||||||
self.view.alpha = alpha
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func updateLeftButton() {
|
|
||||||
let leftButtonType = Settings.leftButtonType
|
|
||||||
if leftButtonType == .hidden {
|
|
||||||
leftButton?.isHidden = true
|
|
||||||
|
|
||||||
if let searchConstraintWithLeftButton, let searchConstraintWithoutLeftButton, let bookmarksConstraintWithLeftButton, let bookmarksConstraintWithoutLeftButton {
|
|
||||||
NSLayoutConstraint.activate([searchConstraintWithoutLeftButton, bookmarksConstraintWithoutLeftButton])
|
|
||||||
NSLayoutConstraint.deactivate([searchConstraintWithLeftButton, bookmarksConstraintWithLeftButton])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
leftButton?.isHidden = false
|
|
||||||
|
|
||||||
leftButton?.setTitle(nil, for: .normal)
|
|
||||||
leftButton?.setImage(leftButtonType.image, for: .normal)
|
|
||||||
leftButton?.accessibilityLabel = leftButtonType.description;
|
|
||||||
|
|
||||||
if let searchConstraintWithLeftButton, let searchConstraintWithoutLeftButton, let bookmarksConstraintWithLeftButton, let bookmarksConstraintWithoutLeftButton {
|
|
||||||
NSLayoutConstraint.activate([searchConstraintWithLeftButton, bookmarksConstraintWithLeftButton])
|
|
||||||
NSLayoutConstraint.deactivate([searchConstraintWithoutLeftButton, bookmarksConstraintWithoutLeftButton])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func updateBadge() {
|
|
||||||
downloadBadge?.isHidden = isApplicationBadgeHidden
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24128" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
|
||||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="iOS"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24063"/>
|
|
||||||
<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" customClass="BottomTabBarViewController" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<connections>
|
|
||||||
<outlet property="bookmarksButton" destination="dgG-ki-3tB" id="md5-3T-9tb"/>
|
|
||||||
<outlet property="bookmarksConstraintWithLeftButton" destination="Jc7-nc-elY" id="gW7-8e-E6m"/>
|
|
||||||
<outlet property="bookmarksConstraintWithoutLeftButton" destination="NRb-vj-MFg" id="C3Z-Ia-D6i"/>
|
|
||||||
<outlet property="downloadBadge" destination="uDI-ZC-4wx" id="fAf-cy-Ozn"/>
|
|
||||||
<outlet property="leftButton" destination="dzf-7Z-N6a" id="LMZ-H7-ftQ"/>
|
|
||||||
<outlet property="moreButton" destination="svD-yi-GrZ" id="kjk-ZW-nZN"/>
|
|
||||||
<outlet property="searchButton" destination="No0-ld-JX3" id="m5F-UT-j94"/>
|
|
||||||
<outlet property="searchConstraintWithLeftButton" destination="tDb-w1-ueQ" id="WaI-Xb-1bu"/>
|
|
||||||
<outlet property="searchConstraintWithoutLeftButton" destination="cQg-jW-uSD" id="cMy-EC-G07"/>
|
|
||||||
<outlet property="view" destination="zuH-WU-hiP" id="eoa-4I-wKs"/>
|
|
||||||
</connections>
|
|
||||||
</placeholder>
|
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
|
||||||
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="zuH-WU-hiP" customClass="BottomTabBarView" customModule="CoMaps" customModuleProvider="target" propertyAccessControl="none">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="373" height="84"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
|
||||||
<subviews>
|
|
||||||
<view opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vum-s3-PHx" userLabel="MainButtons" customClass="ExtendedBottomTabBarContainerView" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="373" height="48"/>
|
|
||||||
<subviews>
|
|
||||||
<button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dzf-7Z-N6a" userLabel="LeftButton" customClass="BottomTabBarButton" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="22.5" y="0.0" width="48" height="48"/>
|
|
||||||
<accessibility key="accessibilityConfiguration" identifier="helpButton"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" secondItem="dzf-7Z-N6a" secondAttribute="height" id="qNJ-0K-sK0"/>
|
|
||||||
</constraints>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="30"/>
|
|
||||||
<inset key="imageEdgeInsets" minX="9" minY="9" maxX="9" maxY="9"/>
|
|
||||||
<state key="normal" image="info.circle" catalog="system"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="onLeftButtonPressed:" destination="-1" eventType="touchUpInside" id="1gx-P2-sRJ"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="249" horizontalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="No0-ld-JX3" userLabel="Search" customClass="BottomTabBarButton" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="116" y="0.0" width="48" height="48"/>
|
|
||||||
<accessibility key="accessibilityConfiguration" identifier="searchButton"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" secondItem="No0-ld-JX3" secondAttribute="height" id="2bW-fc-Hsh"/>
|
|
||||||
</constraints>
|
|
||||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
||||||
<state key="normal" image="ic_menu_search"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="onSearchButtonPressed:" destination="-1" eventType="touchUpInside" id="0D5-RB-HBQ"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dgG-ki-3tB" userLabel="Bookmarks" customClass="BottomTabBarButton" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="209" y="0.0" width="48" height="48"/>
|
|
||||||
<accessibility key="accessibilityConfiguration" identifier="bookmarksButton"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" secondItem="dgG-ki-3tB" secondAttribute="height" id="o3b-it-lrV"/>
|
|
||||||
</constraints>
|
|
||||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
||||||
<state key="normal" image="ic_menu_bookmark_list"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="onBookmarksButtonPressed:" destination="-1" eventType="touchUpInside" id="9Z1-eg-xth"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="svD-yi-GrZ" userLabel="Menu" customClass="BottomTabBarButton" customModule="CoMaps" customModuleProvider="target">
|
|
||||||
<rect key="frame" x="302.5" y="0.0" width="48" height="48"/>
|
|
||||||
<accessibility key="accessibilityConfiguration" identifier="menuButton"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" secondItem="svD-yi-GrZ" secondAttribute="height" id="gmG-3a-Mqe"/>
|
|
||||||
</constraints>
|
|
||||||
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
|
|
||||||
<state key="normal" image="ic_menu"/>
|
|
||||||
<connections>
|
|
||||||
<action selector="onMenuButtonPressed:" destination="-1" eventType="touchUpInside" id="rzb-y4-nR1"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<view userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uDI-ZC-4wx" userLabel="DownloadBadge">
|
|
||||||
<rect key="frame" x="329.5" y="11" width="10" height="10"/>
|
|
||||||
<color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<accessibility key="accessibilityConfiguration">
|
|
||||||
<accessibilityTraits key="traits" notEnabled="YES"/>
|
|
||||||
</accessibility>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="10" id="tEP-Xi-qnU"/>
|
|
||||||
<constraint firstAttribute="height" constant="10" id="wNg-5Z-7AO"/>
|
|
||||||
</constraints>
|
|
||||||
<userDefinedRuntimeAttributes>
|
|
||||||
<userDefinedRuntimeAttribute type="string" keyPath="styleName" value="Badge"/>
|
|
||||||
</userDefinedRuntimeAttributes>
|
|
||||||
</view>
|
|
||||||
</subviews>
|
|
||||||
<accessibility key="accessibilityConfiguration" identifier="MainButtons"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="height" constant="48" id="69A-eu-uLp"/>
|
|
||||||
<constraint firstItem="No0-ld-JX3" firstAttribute="centerY" secondItem="vum-s3-PHx" secondAttribute="centerY" id="8nL-zT-Y7b"/>
|
|
||||||
<constraint firstItem="No0-ld-JX3" firstAttribute="height" secondItem="vum-s3-PHx" secondAttribute="height" id="9eR-I7-7at"/>
|
|
||||||
<constraint firstItem="svD-yi-GrZ" firstAttribute="height" secondItem="vum-s3-PHx" secondAttribute="height" id="Fde-um-JL6"/>
|
|
||||||
<constraint firstItem="dgG-ki-3tB" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" multiplier="1.25" id="Jc7-nc-elY"/>
|
|
||||||
<constraint firstItem="dgG-ki-3tB" firstAttribute="centerY" secondItem="vum-s3-PHx" secondAttribute="centerY" id="JjT-sc-hIY"/>
|
|
||||||
<constraint firstItem="dgG-ki-3tB" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" priority="900" id="NRb-vj-MFg"/>
|
|
||||||
<constraint firstItem="svD-yi-GrZ" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" multiplier="1.75" id="Q0b-gd-HwS"/>
|
|
||||||
<constraint firstItem="dgG-ki-3tB" firstAttribute="height" secondItem="vum-s3-PHx" secondAttribute="height" id="Rs8-Hl-CAc"/>
|
|
||||||
<constraint firstItem="uDI-ZC-4wx" firstAttribute="centerX" secondItem="svD-yi-GrZ" secondAttribute="centerX" constant="8" id="XNb-Ba-Hn7"/>
|
|
||||||
<constraint firstItem="dzf-7Z-N6a" firstAttribute="centerY" secondItem="vum-s3-PHx" secondAttribute="centerY" id="Zug-zY-KIX"/>
|
|
||||||
<constraint firstItem="No0-ld-JX3" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" multiplier="0.25" priority="900" id="cQg-jW-uSD"/>
|
|
||||||
<constraint firstItem="svD-yi-GrZ" firstAttribute="centerY" secondItem="vum-s3-PHx" secondAttribute="centerY" id="sja-hO-YY3"/>
|
|
||||||
<constraint firstItem="No0-ld-JX3" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" multiplier="0.75" id="tDb-w1-ueQ"/>
|
|
||||||
<constraint firstItem="dzf-7Z-N6a" firstAttribute="centerX" secondItem="vum-s3-PHx" secondAttribute="centerX" multiplier="0.25" id="u3G-gY-98J"/>
|
|
||||||
<constraint firstItem="dzf-7Z-N6a" firstAttribute="height" secondItem="vum-s3-PHx" secondAttribute="height" id="yTg-8g-H1p"/>
|
|
||||||
<constraint firstItem="uDI-ZC-4wx" firstAttribute="centerY" secondItem="svD-yi-GrZ" secondAttribute="centerY" constant="-8" id="yq3-ui-IaL"/>
|
|
||||||
</constraints>
|
|
||||||
<variation key="default">
|
|
||||||
<mask key="constraints">
|
|
||||||
<exclude reference="cQg-jW-uSD"/>
|
|
||||||
<exclude reference="NRb-vj-MFg"/>
|
|
||||||
</mask>
|
|
||||||
</variation>
|
|
||||||
</view>
|
|
||||||
</subviews>
|
|
||||||
<viewLayoutGuide key="safeArea" id="aaw-Hz-zma"/>
|
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="vum-s3-PHx" firstAttribute="top" secondItem="zuH-WU-hiP" secondAttribute="top" id="PQS-ro-25e"/>
|
|
||||||
<constraint firstItem="vum-s3-PHx" firstAttribute="leading" secondItem="zuH-WU-hiP" secondAttribute="leading" id="kza-JN-Dul"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="vum-s3-PHx" secondAttribute="trailing" id="sM6-P2-rN9"/>
|
|
||||||
</constraints>
|
|
||||||
<nil key="simulatedStatusBarMetrics"/>
|
|
||||||
<nil key="simulatedTopBarMetrics"/>
|
|
||||||
<nil key="simulatedBottomBarMetrics"/>
|
|
||||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
|
||||||
<connections>
|
|
||||||
<outlet property="mainButtonsView" destination="vum-s3-PHx" id="fBi-DA-orA"/>
|
|
||||||
</connections>
|
|
||||||
<point key="canvasLocation" x="72" y="254"/>
|
|
||||||
</view>
|
|
||||||
</objects>
|
|
||||||
<resources>
|
|
||||||
<image name="ic_menu" width="48" height="48"/>
|
|
||||||
<image name="ic_menu_bookmark_list" width="48" height="48"/>
|
|
||||||
<image name="ic_menu_search" width="48" height="48"/>
|
|
||||||
<image name="info.circle" catalog="system" width="128" height="123"/>
|
|
||||||
</resources>
|
|
||||||
</document>
|
|
||||||
144
iphone/Maps/UI/ControlsView.swift
Normal file
144
iphone/Maps/UI/ControlsView.swift
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for the interface button
|
||||||
|
struct ControlsView: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The dismiss action of the environment
|
||||||
|
@Environment(\.verticalSizeClass) private var verticalSizeClass
|
||||||
|
|
||||||
|
|
||||||
|
@State private var hasZoomButtons: Bool = true
|
||||||
|
|
||||||
|
|
||||||
|
@State private var leftMainButtonKind: MainButton.Kind = .hidden
|
||||||
|
|
||||||
|
|
||||||
|
@State private var hasMainButtons: Bool = true
|
||||||
|
|
||||||
|
|
||||||
|
/// The publisher to know when settings changed
|
||||||
|
private let settingsPublisher = NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification)
|
||||||
|
|
||||||
|
|
||||||
|
/// The publisher to know when settings changed
|
||||||
|
private let changeVisibilityMainButtonsPublisher = NotificationCenter.default.publisher(for: Controls.changeVisibilityMainButtonsNotificationName)
|
||||||
|
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
ZStack {
|
||||||
|
if verticalSizeClass != .compact {
|
||||||
|
VStack(alignment: .trailing) {
|
||||||
|
HStack {
|
||||||
|
MapLayerButton()
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
VStack {
|
||||||
|
MapTrackRecordingButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
VStack(spacing: 72) {
|
||||||
|
if hasZoomButtons {
|
||||||
|
VStack(spacing: 36) {
|
||||||
|
MapZoomButton(kind: .in)
|
||||||
|
|
||||||
|
MapZoomButton(kind: .out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MapPositionButton()
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
if hasMainButtons {
|
||||||
|
HStack {
|
||||||
|
if leftMainButtonKind != .hidden {
|
||||||
|
MainButton(kind: leftMainButtonKind)
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
MainButton(kind: .search)
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
MainButton(kind: .bookmarks)
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
MainButton(kind: .more)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding([.leading, .trailing], 10)
|
||||||
|
} else {
|
||||||
|
HStack {
|
||||||
|
VStack(alignment: .leading) {
|
||||||
|
MapLayerButton()
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
if hasMainButtons {
|
||||||
|
HStack(spacing: 32) {
|
||||||
|
if leftMainButtonKind != .hidden {
|
||||||
|
MainButton(kind: leftMainButtonKind)
|
||||||
|
}
|
||||||
|
|
||||||
|
MainButton(kind: .search)
|
||||||
|
|
||||||
|
MainButton(kind: .bookmarks)
|
||||||
|
|
||||||
|
MainButton(kind: .more)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
VStack(alignment: .trailing) {
|
||||||
|
VStack {
|
||||||
|
MapTrackRecordingButton()
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
if hasZoomButtons {
|
||||||
|
VStack(spacing: 36) {
|
||||||
|
MapZoomButton(kind: .in)
|
||||||
|
|
||||||
|
MapZoomButton(kind: .out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(minLength: 0)
|
||||||
|
|
||||||
|
MapPositionButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.top, 14)
|
||||||
|
.padding(.bottom, 2)
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
|
.onAppear {
|
||||||
|
hasZoomButtons = Settings.hasZoomButtons
|
||||||
|
leftMainButtonKind = Settings.leftMainButtonKind
|
||||||
|
hasMainButtons = Controls.shared().hasMainButtons()
|
||||||
|
}
|
||||||
|
.onReceive(settingsPublisher) { _ in
|
||||||
|
hasZoomButtons = Settings.hasZoomButtons
|
||||||
|
leftMainButtonKind = Settings.leftMainButtonKind
|
||||||
|
}
|
||||||
|
.onReceive(changeVisibilityMainButtonsPublisher) { _ in
|
||||||
|
hasMainButtons = Controls.shared().hasMainButtons()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
39
iphone/Maps/UI/FloatingButtonStyle.swift
Normal file
39
iphone/Maps/UI/FloatingButtonStyle.swift
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct FloatingButtonStyle: ButtonStyle {
|
||||||
|
/// If the button is round
|
||||||
|
var isRound: Bool = true
|
||||||
|
|
||||||
|
|
||||||
|
func makeBody(configuration: Configuration) -> some View {
|
||||||
|
configuration.label
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
.padding(10)
|
||||||
|
.aspectRatio(1, contentMode: .fill)
|
||||||
|
.background {
|
||||||
|
if isRound {
|
||||||
|
Circle()
|
||||||
|
.stroke(Color.white.opacity(0.7), lineWidth: 1)
|
||||||
|
.background {
|
||||||
|
Color.white.opacity(configuration.isPressed ? 0.7 : 0.8)
|
||||||
|
.clipShape(Circle())
|
||||||
|
}
|
||||||
|
.aspectRatio(1, contentMode: .fill)
|
||||||
|
.shadow(radius: 2)
|
||||||
|
} else {
|
||||||
|
RoundedRectangle(cornerRadius: 8)
|
||||||
|
.stroke(Color.white.opacity(0.7), lineWidth: 1)
|
||||||
|
.background {
|
||||||
|
Color.white.opacity(configuration.isPressed ? 0.7 : 0.8)
|
||||||
|
.clipShape(RoundedRectangle(cornerRadius: 8))
|
||||||
|
}
|
||||||
|
.aspectRatio(1, contentMode: .fill)
|
||||||
|
.shadow(radius: 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.font(.title2)
|
||||||
|
.foregroundStyle(configuration.role == .destructive ? Color(.BaseColors.red) : Color.secondary)
|
||||||
|
.scaleEffect(configuration.isPressed ? (isRound ? 0.96 : 0.98) : 1)
|
||||||
|
.animation(.smooth, value: configuration.isPressed)
|
||||||
|
}
|
||||||
|
}
|
||||||
79
iphone/Maps/UI/MainButton.swift
Normal file
79
iphone/Maps/UI/MainButton.swift
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for a main button
|
||||||
|
struct MainButton: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The kind
|
||||||
|
var kind: MainButton.Kind
|
||||||
|
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
if kind != .hidden {
|
||||||
|
Button {
|
||||||
|
if kind == .addPlace {
|
||||||
|
if let controlsManager = MWMMapViewControlsManager.manager() as? BottomMenuDelegate {
|
||||||
|
controlsManager.addPlace()
|
||||||
|
}
|
||||||
|
} else if kind == .recordTrack {
|
||||||
|
let trackRecorder: TrackRecordingManager = .shared
|
||||||
|
switch trackRecorder.recordingState {
|
||||||
|
case .active:
|
||||||
|
MapViewController.shared()?.showTrackRecordingPlacePage()
|
||||||
|
case .inactive:
|
||||||
|
trackRecorder.start { result in
|
||||||
|
switch result {
|
||||||
|
case .success:
|
||||||
|
MapViewController.shared()?.showTrackRecordingPlacePage()
|
||||||
|
case .failure:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if kind == .search {
|
||||||
|
if let searchManager = MapViewController.shared()?.searchManager {
|
||||||
|
if searchManager.isSearching {
|
||||||
|
searchManager.close()
|
||||||
|
} else {
|
||||||
|
searchManager.startSearching(isRouting: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if kind == .bookmarks {
|
||||||
|
MapViewController.shared()?.bookmarksCoordinator.open()
|
||||||
|
} else if kind == .settings {
|
||||||
|
MapViewController.shared()?.openSettings()
|
||||||
|
} else if kind == .help {
|
||||||
|
MapViewController.shared()?.openAbout()
|
||||||
|
} else if kind == .more {
|
||||||
|
if let controlsManager = MWMMapViewControlsManager.manager() {
|
||||||
|
if controlsManager.menuState == .active {
|
||||||
|
controlsManager.menuState = .inactive
|
||||||
|
} else if controlsManager.menuState == .inactive {
|
||||||
|
controlsManager.menuState = .active
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if kind == .layers {
|
||||||
|
if MapOverlayManager.trafficEnabled() || MapOverlayManager.transitEnabled() || MapOverlayManager.isoLinesEnabled() || MapOverlayManager.outdoorEnabled() {
|
||||||
|
MapOverlayManager.setTrafficEnabled(false)
|
||||||
|
MapOverlayManager.setTransitEnabled(false)
|
||||||
|
MapOverlayManager.setIsoLinesEnabled(false)
|
||||||
|
MapOverlayManager.setOutdoorEnabled(false)
|
||||||
|
} else {
|
||||||
|
MWMMapViewControlsManager.manager()?.menuState = .layers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label {
|
||||||
|
Text(kind.description)
|
||||||
|
} icon: {
|
||||||
|
if kind != .layers, let image = kind.image {
|
||||||
|
image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(FloatingButtonStyle(isRound: false))
|
||||||
|
.frame(minWidth: 44, idealWidth: 44, minHeight: 44, idealHeight: 44)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
81
iphone/Maps/UI/MainButtonType.swift
Normal file
81
iphone/Maps/UI/MainButtonType.swift
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
extension MainButton {
|
||||||
|
/// The type of the left bottom bar button
|
||||||
|
enum Kind: String, Codable, CaseIterable, Identifiable {
|
||||||
|
case hidden = "Hidden"
|
||||||
|
case addPlace = "AddPlace"
|
||||||
|
case recordTrack = "RecordTrack"
|
||||||
|
case search = "Search"
|
||||||
|
case bookmarks = "Bookmarks"
|
||||||
|
case settings = "Settings"
|
||||||
|
case help = "Help"
|
||||||
|
case more = "More"
|
||||||
|
case layers = "Layers"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The configurable cases
|
||||||
|
static var configurableCases: [MainButton.Kind] {
|
||||||
|
allCases.filter { kind in
|
||||||
|
return kind != .more && kind != .bookmarks && kind != .search
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// The id
|
||||||
|
var id: Self { self }
|
||||||
|
|
||||||
|
|
||||||
|
/// The description text
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .hidden:
|
||||||
|
return String(localized: "disabled")
|
||||||
|
case .addPlace:
|
||||||
|
return String(localized: "placepage_add_place_button")
|
||||||
|
case .recordTrack:
|
||||||
|
return String(localized: "start_track_recording")
|
||||||
|
case .search:
|
||||||
|
return String(localized: "search")
|
||||||
|
case .bookmarks:
|
||||||
|
return String(localized: "bookmarks")
|
||||||
|
case .settings:
|
||||||
|
return String(localized: "settings")
|
||||||
|
case .help:
|
||||||
|
return String(localized: "help")
|
||||||
|
case .more:
|
||||||
|
return String(localized: "placepage_more_button")
|
||||||
|
case .layers:
|
||||||
|
return String(localized: "layers_title")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// The image
|
||||||
|
var image: Image? {
|
||||||
|
switch self {
|
||||||
|
case .addPlace:
|
||||||
|
return Image(systemName: "plus")
|
||||||
|
case .recordTrack:
|
||||||
|
return Image(.MainButtons.LeftButton.recordTrack)
|
||||||
|
case .search:
|
||||||
|
return Image(systemName: "magnifyingglass")
|
||||||
|
case .bookmarks:
|
||||||
|
return Image(systemName: "list.star")
|
||||||
|
case .settings:
|
||||||
|
return Image(systemName: "gearshape.fill")
|
||||||
|
case .help:
|
||||||
|
return Image(systemName: "info.circle")
|
||||||
|
case .layers:
|
||||||
|
return Image(systemName: "square.stack.3d.up.fill")
|
||||||
|
case .more:
|
||||||
|
return Image(systemName: "ellipsis.circle")
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
iphone/Maps/UI/New Group/MapLayerButton.swift
Normal file
27
iphone/Maps/UI/New Group/MapLayerButton.swift
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for a map layer button
|
||||||
|
struct MapLayerButton: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
Group {
|
||||||
|
if Settings.leftMainButtonKind != .layers {
|
||||||
|
Button {
|
||||||
|
if MapOverlayManager.trafficEnabled() || MapOverlayManager.transitEnabled() || MapOverlayManager.isoLinesEnabled() || MapOverlayManager.outdoorEnabled() {
|
||||||
|
MapOverlayManager.setTrafficEnabled(false)
|
||||||
|
MapOverlayManager.setTransitEnabled(false)
|
||||||
|
MapOverlayManager.setIsoLinesEnabled(false)
|
||||||
|
MapOverlayManager.setOutdoorEnabled(false)
|
||||||
|
} else {
|
||||||
|
MWMMapViewControlsManager.manager()?.menuState = .layers
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label("Show Layers", systemImage: "square.stack.3d.up.fill")
|
||||||
|
}
|
||||||
|
.buttonStyle(FloatingButtonStyle())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
39
iphone/Maps/UI/New Group/MapPositionButton.swift
Normal file
39
iphone/Maps/UI/New Group/MapPositionButton.swift
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for a map position mode button
|
||||||
|
struct MapPositionButton: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The mode
|
||||||
|
@State private var mode: MapPositionButton.Mode = .locate
|
||||||
|
|
||||||
|
|
||||||
|
/// The publisher to know when to stop showing the Safari view for the login form
|
||||||
|
private let switchPositionModePublisher = NotificationCenter.default.publisher(for: Controls.switchPositionModeNotificationName)
|
||||||
|
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
Button {
|
||||||
|
Controls.switchToNextPositionMode()
|
||||||
|
} label: {
|
||||||
|
Label {
|
||||||
|
Text(mode.description)
|
||||||
|
} icon: {
|
||||||
|
if mode == .following || mode == .followingAndRotated {
|
||||||
|
mode.image
|
||||||
|
.foregroundStyle(Color.BaseColors.blue)
|
||||||
|
} else {
|
||||||
|
mode.image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(FloatingButtonStyle())
|
||||||
|
.onAppear {
|
||||||
|
mode = Controls.positionMode
|
||||||
|
}
|
||||||
|
.onReceive(switchPositionModePublisher) { _ in
|
||||||
|
mode = Controls.positionMode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
48
iphone/Maps/UI/New Group/MapPositionButtonMode.swift
Normal file
48
iphone/Maps/UI/New Group/MapPositionButtonMode.swift
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
extension MapPositionButton {
|
||||||
|
/// The mode of the map position button
|
||||||
|
enum Mode: String, Codable, CaseIterable, Identifiable {
|
||||||
|
case locate = "Locate"
|
||||||
|
case locating = "Locating"
|
||||||
|
case following = "Following"
|
||||||
|
case followingAndRotated = "FollowingAndRotated"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The id
|
||||||
|
var id: Self { self }
|
||||||
|
|
||||||
|
|
||||||
|
/// The description text
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .locate:
|
||||||
|
return String(localized: "Find own location")
|
||||||
|
case .locating:
|
||||||
|
return String(localized: "Finding own location...")
|
||||||
|
case .following:
|
||||||
|
return String(localized: "Rotate map towards own direction")
|
||||||
|
case .followingAndRotated:
|
||||||
|
return String(localized: "Rotate map towards North")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// The image
|
||||||
|
var image: Image {
|
||||||
|
switch self {
|
||||||
|
case .locate:
|
||||||
|
return Image(systemName: "location")
|
||||||
|
case .locating:
|
||||||
|
return Image(systemName: "progress.indicator")
|
||||||
|
case .following:
|
||||||
|
return Image(systemName: "location.fill")
|
||||||
|
case .followingAndRotated:
|
||||||
|
return Image(systemName: "location.north.line.fill")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
45
iphone/Maps/UI/New Group/MapTrackRecordingButton.swift
Normal file
45
iphone/Maps/UI/New Group/MapTrackRecordingButton.swift
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for a map track recording button
|
||||||
|
struct MapTrackRecordingButton: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The mode
|
||||||
|
@State private var isRecording: Bool = false
|
||||||
|
|
||||||
|
|
||||||
|
/// The publisher to know when to stop showing the Safari view for the login form
|
||||||
|
private let changeChangeTrackRecordingPublisher = NotificationCenter.default.publisher(for: Controls.changeChangeTrackRecordingNotificationName)
|
||||||
|
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
ZStack {
|
||||||
|
if isRecording {
|
||||||
|
Button(role: .destructive) {
|
||||||
|
if isRecording {
|
||||||
|
MapViewController.shared()?.showTrackRecordingPlacePage()
|
||||||
|
} else {
|
||||||
|
TrackRecordingManager.shared.start { result in
|
||||||
|
switch result {
|
||||||
|
case .success:
|
||||||
|
MapViewController.shared()?.showTrackRecordingPlacePage()
|
||||||
|
case .failure:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label("Show Track Recording", systemImage: "record.circle")
|
||||||
|
}
|
||||||
|
.buttonStyle(FloatingButtonStyle())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onAppear {
|
||||||
|
isRecording = (TrackRecordingManager.shared.recordingState == .active)
|
||||||
|
}
|
||||||
|
.onReceive(changeChangeTrackRecordingPublisher) { _ in
|
||||||
|
isRecording = (TrackRecordingManager.shared.recordingState == .active)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
iphone/Maps/UI/New Group/MapZoomButton.swift
Normal file
28
iphone/Maps/UI/New Group/MapZoomButton.swift
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
/// View for a map zoom button
|
||||||
|
struct MapZoomButton: View {
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The kind
|
||||||
|
var kind: MapZoomButton.Kind
|
||||||
|
|
||||||
|
|
||||||
|
/// The actual view
|
||||||
|
var body: some View {
|
||||||
|
Button {
|
||||||
|
if kind == .in {
|
||||||
|
Controls.zoomIn()
|
||||||
|
} else if kind == .out {
|
||||||
|
Controls.zoomOut()
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label {
|
||||||
|
Text(kind.description)
|
||||||
|
} icon: {
|
||||||
|
kind.image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(FloatingButtonStyle())
|
||||||
|
}
|
||||||
|
}
|
||||||
38
iphone/Maps/UI/New Group/MapZoomButtonKind.swift
Normal file
38
iphone/Maps/UI/New Group/MapZoomButtonKind.swift
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
extension MapZoomButton {
|
||||||
|
/// The type of the map zoom button
|
||||||
|
enum Kind: String, Codable, CaseIterable, Identifiable {
|
||||||
|
case `in` = "In"
|
||||||
|
case out = "Out"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// MARK: Properties
|
||||||
|
|
||||||
|
/// The id
|
||||||
|
var id: Self { self }
|
||||||
|
|
||||||
|
|
||||||
|
/// The description text
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .in:
|
||||||
|
return String(localized: "zoom_in")
|
||||||
|
case .out:
|
||||||
|
return String(localized: "zoom_out")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// The image
|
||||||
|
var image: Image {
|
||||||
|
switch self {
|
||||||
|
case .in:
|
||||||
|
return Image(systemName: "plus")
|
||||||
|
case .out:
|
||||||
|
return Image(systemName: "minus")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ struct SettingsView: View {
|
|||||||
|
|
||||||
|
|
||||||
/// The selected left button type
|
/// The selected left button type
|
||||||
@State private var selectedLeftButtonType: Settings.LeftButtonType = .help
|
@State private var selectedLeftMainButtonKind: MainButton.Kind = .help
|
||||||
|
|
||||||
|
|
||||||
/// If 3D buildings should be displayed
|
/// If 3D buildings should be displayed
|
||||||
@@ -112,9 +112,9 @@ struct SettingsView: View {
|
|||||||
Toggle("pref_zoom_title", isOn: $hasZoomButtons)
|
Toggle("pref_zoom_title", isOn: $hasZoomButtons)
|
||||||
.tint(.accent)
|
.tint(.accent)
|
||||||
|
|
||||||
Picker(selection: $selectedLeftButtonType) {
|
Picker(selection: $selectedLeftMainButtonKind) {
|
||||||
ForEach(Settings.LeftButtonType.allCases) { leftButtonType in
|
ForEach(MainButton.Kind.configurableCases) { leftMainButtonKind in
|
||||||
Text(leftButtonType.description)
|
Text(leftMainButtonKind.description)
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Text("pref_left_button_type")
|
Text("pref_left_button_type")
|
||||||
@@ -291,7 +291,7 @@ struct SettingsView: View {
|
|||||||
.onAppear {
|
.onAppear {
|
||||||
selectedDistanceUnit = Settings.distanceUnit
|
selectedDistanceUnit = Settings.distanceUnit
|
||||||
hasZoomButtons = Settings.hasZoomButtons
|
hasZoomButtons = Settings.hasZoomButtons
|
||||||
selectedLeftButtonType = Settings.leftButtonType
|
selectedLeftMainButtonKind = Settings.leftMainButtonKind
|
||||||
has3dBuildings = Settings.has3dBuildings
|
has3dBuildings = Settings.has3dBuildings
|
||||||
hasAutomaticDownload = Settings.hasAutomaticDownload
|
hasAutomaticDownload = Settings.hasAutomaticDownload
|
||||||
hasIncreasedFontsize = Settings.hasIncreasedFontsize
|
hasIncreasedFontsize = Settings.hasIncreasedFontsize
|
||||||
@@ -311,8 +311,8 @@ struct SettingsView: View {
|
|||||||
.onChange(of: hasZoomButtons) { changedHasZoomButtons in
|
.onChange(of: hasZoomButtons) { changedHasZoomButtons in
|
||||||
Settings.hasZoomButtons = changedHasZoomButtons
|
Settings.hasZoomButtons = changedHasZoomButtons
|
||||||
}
|
}
|
||||||
.onChange(of: selectedLeftButtonType) { changedSelectedLeftButtonType in
|
.onChange(of: selectedLeftMainButtonKind) { changedSelectedLeftMainButtonKind in
|
||||||
Settings.leftButtonType = changedSelectedLeftButtonType
|
Settings.leftMainButtonKind = changedSelectedLeftMainButtonKind
|
||||||
}
|
}
|
||||||
.onChange(of: has3dBuildings) { changedHas3dBuildings in
|
.onChange(of: has3dBuildings) { changedHas3dBuildings in
|
||||||
Settings.has3dBuildings = changedHas3dBuildings
|
Settings.has3dBuildings = changedHas3dBuildings
|
||||||
|
|||||||
Reference in New Issue
Block a user