From 35736074f2feba9cbef1b5570d27033877322716 Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Fri, 1 Dec 2023 15:42:01 +0400 Subject: [PATCH] [ios] feat: add the outdoor style button into the layers selection Signed-off-by: Kiryl Kaveryn --- .../CoreApi/Framework/MWMFrameworkHelper.mm | 13 ++++- .../CoreApi/Traffic/MWMMapOverlayManager.h | 9 ++++ .../CoreApi/Traffic/MWMMapOverlayManager.mm | 49 +++++++++++++++++++ .../MWMTrafficButtonViewController.mm | 16 ++++-- .../Menu/Cells/BottomMenuLayersCell.swift | 21 +++++++- .../Menu/Cells/BottomMenuLayersCell.xib | 46 +++++++++++++---- 6 files changed, 139 insertions(+), 15 deletions(-) diff --git a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm index 6ae5e8988a..2f1190a324 100644 --- a/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm +++ b/iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm @@ -30,14 +30,23 @@ auto &f = GetFramework(); auto const style = f.GetMapStyle(); + auto const isOutdoor = ^BOOL(MapStyle style) { + switch (style) { + case MapStyleOutdoorsClear: + case MapStyleOutdoorsDark: + return YES; + default: + return NO; + } + }(style); auto const newStyle = ^MapStyle(MWMTheme theme) { switch (theme) { case MWMThemeDay: - return MapStyleClear; + return isOutdoor ? MapStyleOutdoorsClear : MapStyleClear; case MWMThemeVehicleDay: return MapStyleVehicleClear; case MWMThemeNight: - return MapStyleDark; + return isOutdoor ? MapStyleOutdoorsDark : MapStyleDark; case MWMThemeVehicleNight: return MapStyleVehicleDark; case MWMThemeAuto: diff --git a/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.h b/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.h index 0e39043aa3..fef6239d51 100644 --- a/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.h +++ b/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.h @@ -24,6 +24,11 @@ typedef NS_ENUM(NSUInteger, MWMMapOverlayIsolinesState) { MWMMapOverlayIsolinesStateNoData, } NS_SWIFT_NAME(MapOverlayTransitState); +typedef NS_ENUM(NSUInteger, MWMMapOverlayOutdoorState) { + MWMMapOverlayOutdoorStateDisabled, + MWMMapOverlayOutdoorStateEnabled, +} NS_SWIFT_NAME(MapOverlayOutdoorState); + NS_SWIFT_NAME(MapOverlayManagerObserver) @protocol MWMMapOverlayManagerObserver @@ -31,6 +36,7 @@ NS_SWIFT_NAME(MapOverlayManagerObserver) - (void)onTrafficStateUpdated; - (void)onTransitStateUpdated; - (void)onIsoLinesStateUpdated; +- (void)onOutdoorStateUpdated; @end @@ -43,14 +49,17 @@ NS_SWIFT_NAME(MapOverlayManager) + (MWMMapOverlayTrafficState)trafficState; + (MWMMapOverlayTransitState)transitState; + (MWMMapOverlayIsolinesState)isolinesState; ++ (MWMMapOverlayOutdoorState)outdoorState; + (BOOL)trafficEnabled; + (BOOL)transitEnabled; + (BOOL)isoLinesEnabled; + (BOOL)isolinesVisible; ++ (BOOL)outdoorEnabled; + (void)setTrafficEnabled:(BOOL)enable; + (void)setTransitEnabled:(BOOL)enable; + (void)setIsoLinesEnabled:(BOOL)enable; ++ (void)setOutdoorEnabled:(BOOL)enable; @end diff --git a/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.mm b/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.mm index 2588c128ee..ceaf5cac6a 100644 --- a/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.mm +++ b/iphone/CoreApi/CoreApi/Traffic/MWMMapOverlayManager.mm @@ -3,6 +3,7 @@ #include "Framework.h" static NSString *kGuidesWasShown = @"guidesWasShown"; +static NSString *didChangeOutdoorMapStyle = @"didChangeOutdoorMapStyle"; @interface MWMMapOverlayManager () @@ -48,6 +49,13 @@ static NSString *kGuidesWasShown = @"guidesWasShown"; } } }); + [NSNotificationCenter.defaultCenter addObserverForName:didChangeOutdoorMapStyle object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) { + for (id observer in self.observers) { + if ([observer respondsToSelector:@selector(onOutdoorStateUpdated)]) { + [observer onOutdoorStateUpdated]; + } + } + }]; } return self; } @@ -109,6 +117,16 @@ static NSString *kGuidesWasShown = @"guidesWasShown"; } } ++ (MWMMapOverlayOutdoorState)outdoorState { + switch (GetFramework().GetMapStyle()) { + case MapStyleOutdoorsClear: + case MapStyleOutdoorsDark: + return MWMMapOverlayOutdoorStateEnabled; + default: + return MWMMapOverlayOutdoorStateDisabled; + } +} + + (BOOL)trafficEnabled { return self.trafficState != MWMMapOverlayTrafficStateDisabled; } @@ -125,6 +143,10 @@ static NSString *kGuidesWasShown = @"guidesWasShown"; return GetFramework().GetIsolinesManager().IsVisible(); } ++ (BOOL)outdoorEnabled { + return self.outdoorState != MWMMapOverlayOutdoorStateDisabled; +} + + (void)setTrafficEnabled:(BOOL)enable { if (enable) { [self setTransitEnabled:false]; @@ -140,6 +162,7 @@ static NSString *kGuidesWasShown = @"guidesWasShown"; if (enable) { [self setTrafficEnabled:!enable]; [self setIsoLinesEnabled:false]; + [self setOutdoorEnabled:false]; } auto &f = GetFramework(); @@ -158,4 +181,30 @@ static NSString *kGuidesWasShown = @"guidesWasShown"; f.SaveIsolinesEnabled(enable); } ++ (void)setOutdoorEnabled:(BOOL)enable { + if (enable) { + [self setTransitEnabled:false]; + [self setTrafficEnabled:false]; + } + + auto &f = GetFramework(); + switch (f.GetMapStyle()) { + case MapStyleClear: + case MapStyleVehicleClear: + case MapStyleOutdoorsClear: + f.SetMapStyle(enable ? MapStyleOutdoorsClear : MapStyleClear); + break; + case MapStyleDark: + case MapStyleVehicleDark: + case MapStyleOutdoorsDark: + f.SetMapStyle(enable ? MapStyleOutdoorsDark : MapStyleDark); + break; + default: + break; + } + + // TODO: - Observing for the selected/deselected state of the Outdoor style should be implemented not by NSNotificationCenter but the same way as for IsoLines with 'GetFramework().GetIsolinesManager().SetStateListener'. + [NSNotificationCenter.defaultCenter postNotificationName:didChangeOutdoorMapStyle object:nil]; +} + @end diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm index 71e539bf90..96a4b76e1d 100644 --- a/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm +++ b/iphone/Maps/Classes/CustomViews/MapViewControls/TrafficButton/MWMTrafficButtonViewController.mm @@ -161,18 +161,25 @@ NSArray *imagesWithName(NSString *name) { } else if ([MWMMapOverlayManager isoLinesEnabled]) { btn.imageName = @"btn_isoMap_on"; [self handleIsolinesState:[MWMMapOverlayManager isolinesState]]; + } else if ([MWMMapOverlayManager outdoorEnabled]) { + btn.imageName = @"btn_isoMap_on"; } else { btn.imageName = @"btn_layers"; } } - (IBAction)buttonTouchUpInside { - if ([MWMMapOverlayManager trafficEnabled]) { + BOOL needsToDisableMapLayer = + [MWMMapOverlayManager trafficEnabled] || + [MWMMapOverlayManager transitEnabled] || + [MWMMapOverlayManager isoLinesEnabled] || + [MWMMapOverlayManager outdoorEnabled]; + + if (needsToDisableMapLayer) { [MWMMapOverlayManager setTrafficEnabled:NO]; - } else if ([MWMMapOverlayManager transitEnabled]) { [MWMMapOverlayManager setTransitEnabled:NO]; - } else if ([MWMMapOverlayManager isoLinesEnabled]) { [MWMMapOverlayManager setIsoLinesEnabled:NO]; + [MWMMapOverlayManager setOutdoorEnabled:NO]; } else { MWMMapViewControlsManager.manager.menuState = MWMBottomMenuStateLayers; } @@ -197,5 +204,8 @@ NSArray *imagesWithName(NSString *name) { - (void)onIsoLinesStateUpdated { [self applyTheme]; } +- (void)onOutdoorStateUpdated { + [self applyTheme]; +} @end diff --git a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.swift b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.swift index 16cba5f23b..8c0da8028b 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.swift +++ b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.swift @@ -16,7 +16,12 @@ class BottomMenuLayersCell: UITableViewCell { updateIsoLinesButton() } } - + @IBOutlet private var outdoorButton: BottomMenuLayerButton! { + didSet { + updateOutdoorButton() + } + } + var onClose: (()->())? override func awakeFromNib() { @@ -48,6 +53,11 @@ class BottomMenuLayersCell: UITableViewCell { let enabled = MapOverlayManager.isoLinesEnabled() isoLinesButton.setStyleAndApply(enabled ? "MenuButtonEnabled" : "MenuButtonDisabled") } + + private func updateOutdoorButton() { + let enabled = MapOverlayManager.outdoorEnabled() + outdoorButton.setStyleAndApply(enabled ? "MenuButtonEnabled" : "MenuButtonDisabled") + } @IBAction func onCloseButtonPressed(_ sender: Any) { onClose?() @@ -67,6 +77,11 @@ class BottomMenuLayersCell: UITableViewCell { let enable = !MapOverlayManager.isoLinesEnabled() MapOverlayManager.setIsoLinesEnabled(enable) } + + @IBAction func onOutdoorButton(_ sender: Any) { + let enable = !MapOverlayManager.outdoorEnabled() + MapOverlayManager.setOutdoorEnabled(enable) + } } extension BottomMenuLayersCell: MapOverlayManagerObserver { @@ -81,4 +96,8 @@ extension BottomMenuLayersCell: MapOverlayManagerObserver { func onIsoLinesStateUpdated() { updateIsoLinesButton() } + + func onOutdoorStateUpdated() { + updateOutdoorButton() + } } diff --git a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.xib b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.xib index 07e6fed5b6..1052658ab2 100644 --- a/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.xib +++ b/iphone/Maps/UI/BottomMenu/Menu/Cells/BottomMenuLayersCell.xib @@ -1,16 +1,16 @@ - + - + - + @@ -20,8 +20,8 @@ - - - + + + + + + + + + + + + + + + + + + + @@ -91,8 +118,8 @@ - - + + @@ -163,6 +190,7 @@ +