#import "MWMModeButtonViewController.h" #import #import "MWMAlertViewController.h" #import "MWMButton.h" #import "MWMMapViewControlsCommon.h" #import "MWMMapViewControlsManager.h" #import "MapViewController.h" #import "SwiftBridge.h" #import "base/assert.hpp" namespace { CGFloat const kTopOffset = 6; } // namespace @interface MWMMapViewControlsManager () @property(nonatomic) MWMModeButtonViewController *modeButton; @end @interface MWMModeButtonViewController () @property(nonatomic) NSLayoutConstraint *topOffset; @property(nonatomic) NSLayoutConstraint *leftOffset; @property(nonatomic) CGRect availableArea; @end @implementation MWMModeButtonViewController + (MWMModeButtonViewController *)controller { return [MWMMapViewControlsManager manager].modeButton; } - (instancetype)init { self = [super init]; if (self) { MapViewController *ovc = [MapViewController sharedController]; [ovc addChildViewController:self]; [ovc.controlsView addSubview:self.view]; [self configLayout]; [self applyTheme]; [StyleManager.shared addListener:self]; [MWMMapOverlayManager addObserver:self]; } return self; } - (void)dealloc { [StyleManager.shared removeListener:self]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [Toast hideAll]; } - (void)configLayout { UIView *sv = self.view; UIView *ov = sv.superview; self.topOffset = [sv.topAnchor constraintEqualToAnchor:ov.topAnchor constant:kTopOffset]; self.topOffset.active = YES; self.leftOffset = [sv.leadingAnchor constraintEqualToAnchor:ov.leadingAnchor constant:kViewControlsOffsetToBounds]; self.leftOffset.active = YES; } - (void)setHidden:(BOOL)hidden { _hidden = hidden; [self refreshLayout]; } - (void)refreshLayout { dispatch_async(dispatch_get_main_queue(), ^{ auto const availableArea = self.availableArea; auto const fitInAvailableArea = CGRectGetMaxY(self.view.frame) < CGRectGetMaxY(availableArea) + kTopOffset; auto const shouldHide = self.hidden || !fitInAvailableArea; auto const leftOffset = shouldHide ? -self.view.width : availableArea.origin.x + kViewControlsOffsetToBounds; self.topOffset.constant = availableArea.origin.y + kTopOffset; self.leftOffset.constant = leftOffset; self.view.alpha = shouldHide ? 0 : 1; }); } - (void)applyTheme { UIButton *btn = static_cast(self.view); NSString * postfix = [UIColor isNightMode] ? @"dark" : @"light"; [btn setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@_%@", @"btn_bg", postfix]] forState:UIControlStateNormal]; [btn setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@_highlighted_%@", @"btn_bg", postfix]] forState:UIControlStateHighlighted]; [btn setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@_%@", @"btn_bg", postfix]] forState:UIControlStateSelected]; NSString *imageName = @"map"; switch ([MWMMapOverlayManager mapMode]) { case MWMMapModeHiking: imageName = @"hiking"; break; case MWMMapModeCycling: imageName = @"cycling"; break; case MWMMapModeDriving: imageName = @"driving"; break; case MWMMapModePublicTransport: imageName = @"publictransport"; break; default: break; } [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; btn.tintColor = [UIColor iconOpaqueGrayTint]; } - (IBAction)buttonTouchUpInside { MWMMapViewControlsManager.manager.menuState = MWMBottomMenuStateLayers; } + (void)updateAvailableArea:(CGRect)frame { auto controller = [self controller]; if (CGRectEqualToRect(controller.availableArea, frame)) return; controller.availableArea = frame; [controller refreshLayout]; } #pragma mark - MWMMapOverlayManagerObserver - (void)onMapModeUpdated { [self applyTheme]; } @end