mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-21 18:53:51 +00:00
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com> m Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
134 lines
3.9 KiB
Plaintext
134 lines
3.9 KiB
Plaintext
#import "MWMModeButtonViewController.h"
|
|
|
|
#import <CoreApi/MWMMapOverlayManager.h>
|
|
|
|
#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 () <MWMMapOverlayManagerObserver, ThemeListener>
|
|
|
|
@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<UIButton *>(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
|