forked from organicmaps/organicmaps
[ios] Added filters support to search UI.
This commit is contained in:
parent
4bfa0df2f3
commit
c02df8c0a7
35 changed files with 1294 additions and 392 deletions
|
@ -420,6 +420,7 @@ typedef NS_ENUM(NSUInteger, MWMBottomMenuViewCell) {
|
|||
[Statistics logEvent:kStatMenu withParameters:@{kStatButton : kStatBookmarks}];
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"bookmarks"];
|
||||
self.state = self.restoreState;
|
||||
[self.delegate closeInfoScreens];
|
||||
[self.controller openBookmarks];
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#import "MWMRoutePreview.h"
|
||||
#import "MWMRouter.h"
|
||||
#import "MWMSearchManager.h"
|
||||
#import "MWMSearchView.h"
|
||||
#import "MWMSideButtons.h"
|
||||
#import "MWMTaxiPreviewDataSource.h"
|
||||
#import "MapViewController.h"
|
||||
|
@ -119,7 +118,6 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
// Workaround needs for setting correct left bound while landscape place page is open.
|
||||
self.navigationManager.leftBound = 0;
|
||||
[self.placePageManager willRotateToInterfaceOrientation:toInterfaceOrientation];
|
||||
[self.searchManager willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
|
||||
}
|
||||
|
||||
- (void)viewWillTransitionToSize:(CGSize)size
|
||||
|
@ -302,7 +300,8 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
UIView * ownerView = self.ownerController.view;
|
||||
for (UIView * view in views)
|
||||
[ownerView addSubview:view];
|
||||
[ownerView bringSubviewToFront:self.searchManager.view];
|
||||
for (UIView * view in self.searchManager.topViews)
|
||||
[ownerView bringSubviewToFront:view];
|
||||
if (IPAD)
|
||||
{
|
||||
[ownerView bringSubviewToFront:self.menuController.view];
|
||||
|
@ -331,7 +330,9 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
{
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
self.searchManager.view.alpha = bound > 0 ? 0. : 1.;
|
||||
CGFloat const alpha = bound > 0 ? 0. : 1.;
|
||||
for (UIView * view in self.searchManager.topViews)
|
||||
view.alpha = alpha;
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
self.searchManager.state = MWMSearchManagerStateHidden;
|
||||
|
@ -475,7 +476,7 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
- (MWMSearchManager *)searchManager
|
||||
{
|
||||
if (!_searchManager)
|
||||
_searchManager = [[MWMSearchManager alloc] initWithParentView:self.ownerController.view];
|
||||
_searchManager = [[MWMSearchManager alloc] init];
|
||||
return _searchManager;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#import "MWMSearchTableViewController.h"
|
||||
|
||||
@interface MWMSearchChangeModeView : UIView
|
||||
|
||||
- (void)updateForState:(MWMSearchManagerState)state;
|
||||
|
||||
@end
|
|
@ -0,0 +1,99 @@
|
|||
#import "MWMSearchChangeModeView.h"
|
||||
#import "MWMButton.h"
|
||||
#import "MWMSearch.h"
|
||||
#import "UIButton+RuntimeAttributes.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
|
||||
extern NSString * const kSearchStateWillChangeNotification;
|
||||
extern NSString * const kSearchStateKey;
|
||||
|
||||
@interface MWMSearchChangeModeView ()<MWMSearchObserver>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIButton * changeModeButton;
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIButton * filterButton;
|
||||
@property(weak, nonatomic) IBOutlet MWMButton * cancelFilterButton;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * filterButtoniPadX;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchChangeModeView
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[super awakeFromNib];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(searchStateWillChange:)
|
||||
name:kSearchStateWillChangeNotification
|
||||
object:nil];
|
||||
[MWMSearch addObserver:self];
|
||||
self.filterButtoniPadX.priority = IPAD ? UILayoutPriorityDefaultHigh : UILayoutPriorityDefaultLow;
|
||||
}
|
||||
|
||||
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
|
||||
- (void)updateForState:(MWMSearchManagerState)state
|
||||
{
|
||||
UIButton * changeModeButton = self.changeModeButton;
|
||||
if (IPAD)
|
||||
{
|
||||
changeModeButton.hidden = YES;
|
||||
return;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case MWMSearchManagerStateTableSearch:
|
||||
self.backgroundColor = [UIColor pressBackground];
|
||||
[changeModeButton setTitle:L(@"search_on_map") forState:UIControlStateNormal];
|
||||
break;
|
||||
case MWMSearchManagerStateMapSearch:
|
||||
self.backgroundColor = [UIColor white];
|
||||
[changeModeButton setTitle:L(@"search_in_table") forState:UIControlStateNormal];
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)updateFilterButtons:(BOOL)isFilterResults
|
||||
{
|
||||
BOOL const hasFilter = [MWMSearch hasFilter];
|
||||
BOOL const hide = !(isFilterResults || hasFilter);
|
||||
self.filterButton.hidden = hide;
|
||||
self.cancelFilterButton.hidden = hide;
|
||||
if (hide)
|
||||
return;
|
||||
if (hasFilter)
|
||||
{
|
||||
[self.filterButton setBackgroundColorName:@"linkBlue"];
|
||||
[self.filterButton setBackgroundHighlightedColorName:@"linkBlueHighlighted"];
|
||||
[self.filterButton setTitleColor:[UIColor white] forState:UIControlStateNormal];
|
||||
[self.cancelFilterButton setImage:[UIImage imageNamed:@"ic_clear_filters"]
|
||||
forState:UIControlStateNormal];
|
||||
self.cancelFilterButton.coloring = MWMButtonColoringWhite;
|
||||
[self bringSubviewToFront:self.cancelFilterButton];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self.filterButton setBackgroundColorName:@"clearColor"];
|
||||
[self.filterButton setBackgroundHighlightedColorName:@"clearColor"];
|
||||
[self.filterButton setTitleColor:[UIColor linkBlue] forState:UIControlStateNormal];
|
||||
[self.cancelFilterButton setImage:[UIImage imageNamed:@"ic_filter"]
|
||||
forState:UIControlStateNormal];
|
||||
self.cancelFilterButton.coloring = MWMButtonColoringBlue;
|
||||
[self sendSubviewToBack:self.cancelFilterButton];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - MWMSearchObserver
|
||||
|
||||
- (void)onSearchStarted { [self updateFilterButtons:[MWMSearch isHotelResults]]; }
|
||||
- (void)onSearchCompleted { [self updateFilterButtons:[MWMSearch isHotelResults]]; }
|
||||
#pragma mark - Notifications
|
||||
|
||||
- (void)searchStateWillChange:(NSNotification *)notification
|
||||
{
|
||||
MWMSearchManagerState const state =
|
||||
MWMSearchManagerState([[notification userInfo][kSearchStateKey] unsignedIntegerValue]);
|
||||
[self updateForState:state];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,3 +1,3 @@
|
|||
@interface MWMSearchContentView : UIView
|
||||
@interface MWMSearchContentView : SolidTouchView
|
||||
|
||||
@end
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#import "MWMSearchManager.h"
|
||||
|
||||
@interface MWMSearchManager (Filter)
|
||||
|
||||
- (void)clearFilter;
|
||||
|
||||
@end
|
|
@ -0,0 +1,134 @@
|
|||
#import "MWMSearch.h"
|
||||
#import "MWMSearchFilterTransitioningDelegate.h"
|
||||
#import "MWMSearchFilterViewController.h"
|
||||
#import "MWMSearchManager+Filter.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
#import "UIFont+MapsMeFonts.h"
|
||||
|
||||
@interface MWMSearchManager ()<UIPopoverPresentationControllerDelegate>
|
||||
|
||||
@property(weak, nonatomic, readonly) UIViewController * ownerController;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * actionBarViewFilterButton;
|
||||
|
||||
@property(nonatomic) MWMSearchFilterTransitioningDelegate * filterTransitioningDelegate;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchManager (Filter)
|
||||
|
||||
- (IBAction)updateFilter
|
||||
{
|
||||
MWMSearchFilterViewController * filter = [MWMSearch getFilter];
|
||||
UINavigationController * navController =
|
||||
[[UINavigationController alloc] initWithRootViewController:filter];
|
||||
UIViewController * ownerController = self.ownerController;
|
||||
|
||||
if (IPAD)
|
||||
{
|
||||
navController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
UIPopoverPresentationController * popover = navController.popoverPresentationController;
|
||||
popover.sourceView = self.actionBarViewFilterButton;
|
||||
popover.sourceRect = self.actionBarViewFilterButton.bounds;
|
||||
popover.permittedArrowDirections = UIPopoverArrowDirectionLeft;
|
||||
popover.delegate = self;
|
||||
}
|
||||
else
|
||||
{
|
||||
navController.modalPresentationStyle = UIModalPresentationCustom;
|
||||
self.filterTransitioningDelegate = [[MWMSearchFilterTransitioningDelegate alloc] init];
|
||||
ownerController.transitioningDelegate = self.filterTransitioningDelegate;
|
||||
navController.transitioningDelegate = self.filterTransitioningDelegate;
|
||||
}
|
||||
|
||||
[self configNavigationBar:navController.navigationBar];
|
||||
[self configNavigationItem:navController.topViewController.navigationItem];
|
||||
|
||||
[ownerController presentViewController:navController animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (IBAction)clearFilter { [MWMSearch clearFilter]; }
|
||||
- (void)configNavigationBar:(UINavigationBar *)navBar
|
||||
{
|
||||
UIColor * white = [UIColor white];
|
||||
navBar.tintColor = white;
|
||||
navBar.barTintColor = white;
|
||||
[navBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
|
||||
navBar.shadowImage = [UIImage imageWithColor:[UIColor fadeBackground]];
|
||||
navBar.titleTextAttributes = @{
|
||||
NSForegroundColorAttributeName : [UIColor blackPrimaryText],
|
||||
NSFontAttributeName : [UIFont regular17]
|
||||
};
|
||||
navBar.translucent = NO;
|
||||
}
|
||||
|
||||
- (void)configNavigationItem:(UINavigationItem *)navItem
|
||||
{
|
||||
UIFont * regular17 = [UIFont regular17];
|
||||
|
||||
UIColor * linkBlue = [UIColor linkBlue];
|
||||
UIColor * linkBlueHighlighted = [UIColor linkBlueHighlighted];
|
||||
UIColor * lightGrayColor = [UIColor lightGrayColor];
|
||||
|
||||
navItem.title = L(@"filters");
|
||||
navItem.rightBarButtonItem =
|
||||
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
|
||||
target:self
|
||||
action:@selector(doneAction)];
|
||||
[navItem.rightBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : linkBlue,
|
||||
NSFontAttributeName : regular17
|
||||
}
|
||||
forState:UIControlStateNormal];
|
||||
[navItem.rightBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : linkBlueHighlighted,
|
||||
}
|
||||
forState:UIControlStateHighlighted];
|
||||
[navItem.rightBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : lightGrayColor,
|
||||
}
|
||||
forState:UIControlStateDisabled];
|
||||
|
||||
navItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:L(@"reset")
|
||||
style:UIBarButtonItemStylePlain
|
||||
target:self
|
||||
action:@selector(resetAction)];
|
||||
[navItem.leftBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : linkBlue,
|
||||
NSFontAttributeName : regular17
|
||||
}
|
||||
forState:UIControlStateNormal];
|
||||
[navItem.leftBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : linkBlueHighlighted,
|
||||
}
|
||||
forState:UIControlStateHighlighted];
|
||||
|
||||
[navItem.leftBarButtonItem setTitleTextAttributes:@{
|
||||
NSForegroundColorAttributeName : lightGrayColor,
|
||||
}
|
||||
forState:UIControlStateDisabled];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (void)doneAction
|
||||
{
|
||||
[MWMSearch update];
|
||||
[self.ownerController dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)resetAction
|
||||
{
|
||||
[self clearFilter];
|
||||
[self.ownerController dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
#pragma mark - UIPopoverPresentationControllerDelegate
|
||||
|
||||
- (BOOL)popoverPresentationControllerShouldDismissPopover:
|
||||
(UIPopoverPresentationController *)popoverPresentationController
|
||||
{
|
||||
[MWMSearch update];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,7 @@
|
|||
#import "MWMSearchManager.h"
|
||||
|
||||
@interface MWMSearchManager (Layout)
|
||||
|
||||
- (void)layoutTopViews;
|
||||
|
||||
@end
|
|
@ -0,0 +1,149 @@
|
|||
#import "Common.h"
|
||||
#import "MWMSearchManager+Layout.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
CGFloat const kWidthForiPad = 320.0;
|
||||
} // namespace
|
||||
|
||||
@interface MWMSearchManager ()
|
||||
|
||||
@property(nonatomic) IBOutlet UIView * searchBarView;
|
||||
@property(nonatomic) IBOutlet UIView * actionBarView;
|
||||
@property(nonatomic) IBOutlet UIView * contentView;
|
||||
|
||||
@property(nonatomic) NSLayoutConstraint * actionBarViewBottom;
|
||||
|
||||
@property(weak, nonatomic, readonly) UIViewController * ownerController;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchManager (Layout)
|
||||
|
||||
- (void)layoutTopViews
|
||||
{
|
||||
UIView * searchBarView = self.searchBarView;
|
||||
UIView * actionBarView = self.actionBarView;
|
||||
UIView * contentView = self.contentView;
|
||||
UIView * parentView = self.ownerController.view;
|
||||
|
||||
searchBarView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
actionBarView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
contentView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
NSLayoutConstraint * searchBarViewTop =
|
||||
[NSLayoutConstraint constraintWithItem:searchBarView
|
||||
attribute:NSLayoutAttributeTop
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeTop
|
||||
multiplier:1
|
||||
constant:statusBarHeight()];
|
||||
NSLayoutConstraint * searchBarViewLeft =
|
||||
[NSLayoutConstraint constraintWithItem:searchBarView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
multiplier:1
|
||||
constant:0];
|
||||
NSLayoutConstraint * actionBarViewTop =
|
||||
[NSLayoutConstraint constraintWithItem:actionBarView
|
||||
attribute:NSLayoutAttributeTop
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:searchBarView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
multiplier:1
|
||||
constant:0];
|
||||
actionBarViewTop.priority = UILayoutPriorityDefaultLow + 10;
|
||||
NSLayoutConstraint * actionBarViewLeft =
|
||||
[NSLayoutConstraint constraintWithItem:actionBarView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
multiplier:1
|
||||
constant:0];
|
||||
NSLayoutConstraint * actionBarViewWidth =
|
||||
[NSLayoutConstraint constraintWithItem:actionBarView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:searchBarView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:1
|
||||
constant:0];
|
||||
self.actionBarViewBottom = [NSLayoutConstraint constraintWithItem:actionBarView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
multiplier:1
|
||||
constant:0];
|
||||
self.actionBarViewBottom.priority = UILayoutPriorityDefaultLow;
|
||||
|
||||
NSLayoutConstraint * contentViewTop =
|
||||
[NSLayoutConstraint constraintWithItem:contentView
|
||||
attribute:NSLayoutAttributeTop
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:actionBarView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
multiplier:1
|
||||
constant:0];
|
||||
contentViewTop.priority = UILayoutPriorityDefaultLow;
|
||||
NSLayoutConstraint * contentViewBottom =
|
||||
[NSLayoutConstraint constraintWithItem:contentView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeBottom
|
||||
multiplier:1
|
||||
constant:0];
|
||||
contentViewBottom.priority = UILayoutPriorityDefaultLow + 10;
|
||||
NSLayoutConstraint * contentViewLeft =
|
||||
[NSLayoutConstraint constraintWithItem:contentView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeLeft
|
||||
multiplier:1
|
||||
constant:0];
|
||||
NSLayoutConstraint * contentViewWidth =
|
||||
[NSLayoutConstraint constraintWithItem:contentView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:searchBarView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
multiplier:1
|
||||
constant:0];
|
||||
|
||||
[parentView addConstraints:@[
|
||||
searchBarViewTop, searchBarViewLeft, actionBarViewTop, actionBarViewLeft, actionBarViewWidth,
|
||||
self.actionBarViewBottom, contentViewTop, contentViewLeft, contentViewWidth, contentViewBottom
|
||||
]];
|
||||
|
||||
if (IPAD)
|
||||
{
|
||||
NSLayoutConstraint * searchBarViewWidth =
|
||||
[NSLayoutConstraint constraintWithItem:searchBarView
|
||||
attribute:NSLayoutAttributeWidth
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:nil
|
||||
attribute:NSLayoutAttributeNotAnAttribute
|
||||
multiplier:1
|
||||
constant:kWidthForiPad];
|
||||
[parentView addConstraint:searchBarViewWidth];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLayoutConstraint * searchBarViewRight =
|
||||
[NSLayoutConstraint constraintWithItem:searchBarView
|
||||
attribute:NSLayoutAttributeRight
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:parentView
|
||||
attribute:NSLayoutAttributeRight
|
||||
multiplier:1
|
||||
constant:0];
|
||||
[parentView addConstraint:searchBarViewRight];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,7 +1,6 @@
|
|||
#import "MWMAlertViewController.h"
|
||||
#import "MWMMapDownloaderTypes.h"
|
||||
#import "MWMSearchTextField.h"
|
||||
#import "MWMSearchView.h"
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MWMSearchManagerState)
|
||||
{
|
||||
|
@ -17,10 +16,7 @@ typedef NS_ENUM(NSUInteger, MWMSearchManagerState)
|
|||
|
||||
@property (nonatomic) MWMSearchManagerState state;
|
||||
|
||||
@property (nonnull, nonatomic, readonly) UIView * view;
|
||||
|
||||
- (nullable instancetype)init __attribute__((unavailable("init is not available")));
|
||||
- (nullable instancetype)initWithParentView:(nonnull UIView *)view;
|
||||
@property(nonatomic) IBOutletCollection(UIView) NSArray * topViews;
|
||||
|
||||
- (void)mwm_refreshUI;
|
||||
|
||||
|
@ -28,8 +24,6 @@ typedef NS_ENUM(NSUInteger, MWMSearchManagerState)
|
|||
|
||||
#pragma mark - Layout
|
||||
|
||||
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
|
||||
duration:(NSTimeInterval)duration;
|
||||
- (void)viewWillTransitionToSize:(CGSize)size
|
||||
withTransitionCoordinator:(nonnull id<UIViewControllerTransitionCoordinator>)coordinator;
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#import "MWMSearchManager.h"
|
||||
#import "Common.h"
|
||||
#import "MWMConsole.h"
|
||||
#import "MWMFrameworkListener.h"
|
||||
#import "MWMLocationManager.h"
|
||||
|
@ -6,11 +7,18 @@
|
|||
#import "MWMNoMapsViewController.h"
|
||||
#import "MWMRouter.h"
|
||||
#import "MWMSearch.h"
|
||||
#import "MWMSearchChangeModeView.h"
|
||||
#import "MWMSearchFilterTransitioningDelegate.h"
|
||||
#import "MWMSearchManager+Filter.h"
|
||||
#import "MWMSearchManager+Layout.h"
|
||||
#import "MWMSearchTabButtonsView.h"
|
||||
#import "MWMSearchTabbedViewController.h"
|
||||
#import "MWMSearchTableViewController.h"
|
||||
#import "MapViewController.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "Statistics.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
#import "UIFont+MapsMeFonts.h"
|
||||
|
||||
#import "3party/Alohalytics/src/alohalytics_objc.h"
|
||||
|
||||
|
@ -24,13 +32,37 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
extern NSString * const kSearchStateWillChangeNotification = @"SearchStateWillChangeNotification";
|
||||
extern NSString * const kSearchStateKey = @"SearchStateKey";
|
||||
|
||||
namespace
|
||||
{
|
||||
typedef NS_ENUM(NSUInteger, MWMSearchManagerActionBarState) {
|
||||
MWMSearchManagerActionBarStateHidden,
|
||||
MWMSearchManagerActionBarStateTabBar,
|
||||
MWMSearchManagerActionBarStateModeFilter
|
||||
};
|
||||
} // namespace
|
||||
|
||||
@interface MWMSearchManager ()<MWMSearchTableViewProtocol, MWMSearchTabbedViewProtocol,
|
||||
MWMSearchTabButtonsViewProtocol, UITextFieldDelegate,
|
||||
MWMFrameworkStorageObserver>
|
||||
MWMFrameworkStorageObserver, MWMSearchObserver>
|
||||
|
||||
@property(weak, nonatomic) UIView * parentView;
|
||||
@property(nonatomic) IBOutlet MWMSearchView * rootView;
|
||||
@property(weak, nonatomic) IBOutlet UIView * contentView;
|
||||
@property(weak, nonatomic, readonly) UIViewController * ownerController;
|
||||
|
||||
@property(nonatomic) IBOutlet UIView * searchBarView;
|
||||
|
||||
@property(nonatomic) IBOutlet UIView * actionBarView;
|
||||
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * actionBarViewHeight;
|
||||
@property(nonatomic) MWMSearchManagerActionBarState actionBarState;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * actionBarViewFilterButton;
|
||||
@property(nonatomic) IBOutlet UIView * tabBarView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * tabBarViewHeight;
|
||||
@property(nonatomic) IBOutlet MWMSearchChangeModeView * changeModeView;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * changeModeViewHeight;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * filterButton;
|
||||
|
||||
@property(nonatomic) IBOutlet UIView * contentView;
|
||||
|
||||
@property(nonatomic) NSLayoutConstraint * actionBarViewBottom;
|
||||
|
||||
@property(nonatomic) IBOutletCollection(MWMSearchTabButtonsView) NSArray * tabButtons;
|
||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint * scrollIndicatorOffset;
|
||||
|
@ -41,34 +73,40 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
@property(nonatomic) MWMSearchTableViewController * tableViewController;
|
||||
@property(nonatomic) MWMNoMapsViewController * noMapsController;
|
||||
|
||||
@property(nonatomic) MWMSearchFilterTransitioningDelegate * filterTransitioningDelegate;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchManager
|
||||
|
||||
- (nullable instancetype)initWithParentView:(nonnull UIView *)view
|
||||
- (nullable instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
[NSBundle.mainBundle loadNibNamed:@"MWMSearchView" owner:self options:nil];
|
||||
self.parentView = view;
|
||||
self.state = MWMSearchManagerStateHidden;
|
||||
[MWMSearch addObserver:self];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)mwm_refreshUI
|
||||
{
|
||||
[self.rootView mwm_refreshUI];
|
||||
if (self.state == MWMSearchManagerStateHidden)
|
||||
return;
|
||||
[self.searchBarView mwm_refreshUI];
|
||||
[self.actionBarView mwm_refreshUI];
|
||||
[self.contentView mwm_refreshUI];
|
||||
[self.tabBarView mwm_refreshUI];
|
||||
[self.tabbedController mwm_refreshUI];
|
||||
[self.tableViewController mwm_refreshUI];
|
||||
[self.noMapsController mwm_refreshUI];
|
||||
if ([MWMSearch hasFilter])
|
||||
[[MWMSearch getFilter] mwm_refreshUI];
|
||||
}
|
||||
|
||||
- (void)beginSearch
|
||||
{
|
||||
if (self.state == MWMSearchManagerStateDefault)
|
||||
if (self.state != MWMSearchManagerStateHidden)
|
||||
self.state = MWMSearchManagerStateTableSearch;
|
||||
}
|
||||
|
||||
|
@ -77,26 +115,22 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
if (self.state != MWMSearchManagerStateHidden)
|
||||
self.state = MWMSearchManagerStateDefault;
|
||||
self.searchTextField.text = @"";
|
||||
[self clearFilter];
|
||||
[MWMSearch clear];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
|
||||
{
|
||||
if (self.state == MWMSearchManagerStateMapSearch)
|
||||
self.state = MWMSearchManagerStateTableSearch;
|
||||
}
|
||||
|
||||
- (IBAction)textFieldDidEndEditing:(UITextField *)textField
|
||||
{
|
||||
if (textField.text.length == 0 && self.state != MWMSearchManagerStateHidden)
|
||||
if (textField.text.length == 0)
|
||||
[self endSearch];
|
||||
}
|
||||
|
||||
- (IBAction)textFieldTextDidChange:(UITextField *)textField
|
||||
{
|
||||
NSString * text = textField.text;
|
||||
[self clearFilter];
|
||||
if (text.length > 0)
|
||||
{
|
||||
if ([MWMConsole performCommand:text])
|
||||
|
@ -134,13 +168,6 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
|
||||
#pragma mark - Layout
|
||||
|
||||
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
|
||||
duration:(NSTimeInterval)duration
|
||||
{
|
||||
[self.navigationController willRotateToInterfaceOrientation:toInterfaceOrientation
|
||||
duration:duration];
|
||||
}
|
||||
|
||||
- (void)viewWillTransitionToSize:(CGSize)size
|
||||
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
|
||||
{
|
||||
|
@ -149,11 +176,15 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(nonnull UITextField *)textField
|
||||
- (void)textFieldDidBeginEditing:(UITextField *)textField
|
||||
{
|
||||
BOOL const isEmpty = (textField.text.length == 0);
|
||||
self.state = isEmpty ? MWMSearchManagerStateDefault : MWMSearchManagerStateTableSearch;
|
||||
}
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField
|
||||
{
|
||||
[textField resignFirstResponder];
|
||||
if (textField.text.length != 0)
|
||||
self.state = MWMSearchManagerStateMapSearch;
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
@ -231,8 +262,6 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
- (void)updateTopController
|
||||
{
|
||||
UIViewController * selfTopVC = self.topController;
|
||||
self.rootView.tabBarIsVisible =
|
||||
self.state == MWMSearchManagerStateDefault && [selfTopVC isEqual:self.tabbedController];
|
||||
if ([selfTopVC isEqual:self.navigationController.topViewController])
|
||||
return;
|
||||
NSMutableArray * viewControllers = [self.navigationController.viewControllers mutableCopy];
|
||||
|
@ -244,48 +273,102 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
{
|
||||
[self endSearch];
|
||||
[self.tabbedController resetSelectedTab];
|
||||
self.tableViewController = nil;
|
||||
self.noMapsController = nil;
|
||||
self.rootView.isVisible = NO;
|
||||
|
||||
[self viewHidden:YES];
|
||||
}
|
||||
|
||||
- (void)changeToDefaultState
|
||||
{
|
||||
self.view.alpha = 1.;
|
||||
[self updateTopController];
|
||||
[self.navigationController popToRootViewControllerAnimated:NO];
|
||||
[self.parentView addSubview:self.rootView];
|
||||
self.rootView.compact = NO;
|
||||
self.rootView.isVisible = YES;
|
||||
|
||||
self.actionBarState = MWMSearchManagerActionBarStateTabBar;
|
||||
[self animateConstraints:^{
|
||||
self.actionBarViewBottom.priority = UILayoutPriorityDefaultLow;
|
||||
}];
|
||||
[self viewHidden:NO];
|
||||
|
||||
if (self.topController != self.noMapsController)
|
||||
[self.searchTextField becomeFirstResponder];
|
||||
}
|
||||
|
||||
- (void)changeToTableSearchState
|
||||
{
|
||||
[self changeToDefaultState];
|
||||
self.rootView.compact = NO;
|
||||
self.rootView.tabBarIsVisible = NO;
|
||||
[self updateTopController];
|
||||
[self.navigationController popToRootViewControllerAnimated:NO];
|
||||
|
||||
self.actionBarState = MWMSearchManagerActionBarStateHidden;
|
||||
[self animateConstraints:^{
|
||||
self.actionBarViewBottom.priority = UILayoutPriorityDefaultLow;
|
||||
}];
|
||||
[self viewHidden:NO];
|
||||
[MWMSearch setSearchOnMap:NO];
|
||||
[self.tableViewController reloadData];
|
||||
|
||||
if (![self.navigationController.viewControllers containsObject:self.tableViewController])
|
||||
[self.navigationController pushViewController:self.tableViewController animated:NO];
|
||||
}
|
||||
|
||||
- (void)changeToMapSearchState
|
||||
{
|
||||
[self changeToDefaultState];
|
||||
[self updateTopController];
|
||||
[self.navigationController popToRootViewControllerAnimated:NO];
|
||||
|
||||
self.actionBarState = MWMSearchManagerActionBarStateModeFilter;
|
||||
[self animateConstraints:^{
|
||||
self.actionBarViewBottom.priority = UILayoutPriorityDefaultHigh;
|
||||
}];
|
||||
[self viewHidden:NO];
|
||||
[MWMSearch setSearchOnMap:YES];
|
||||
[self.tableViewController reloadData];
|
||||
|
||||
GetFramework().DeactivateMapSelection(true);
|
||||
[self.searchTextField resignFirstResponder];
|
||||
self.rootView.compact = YES;
|
||||
[MWMSearch setSearchOnMap:YES];
|
||||
|
||||
if ([MWMNavigationDashboardManager manager].state == MWMNavigationDashboardStateNavigation)
|
||||
{
|
||||
self.searchTextField.text = @"";
|
||||
[self.tabbedController resetSelectedTab];
|
||||
self.tableViewController = nil;
|
||||
self.noMapsController = nil;
|
||||
self.rootView.isVisible = NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)animateConstraints:(TMWMVoidBlock)block
|
||||
{
|
||||
UIView * parentView = self.ownerController.view;
|
||||
[parentView layoutIfNeeded];
|
||||
block();
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
[parentView layoutIfNeeded];
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - MWMSearchObserver
|
||||
|
||||
- (void)onSearchCompleted
|
||||
{
|
||||
if (self.state != MWMSearchManagerStateTableSearch)
|
||||
return;
|
||||
[self animateConstraints:^{
|
||||
BOOL hideActionBar = false;
|
||||
if (IPAD)
|
||||
hideActionBar = !([MWMSearch isHotelResults] || [MWMSearch hasFilter]);
|
||||
else
|
||||
hideActionBar = ([MWMSearch suggestionsCount] != 0);
|
||||
self.actionBarState = hideActionBar ? MWMSearchManagerActionBarStateHidden
|
||||
: MWMSearchManagerActionBarStateModeFilter;
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Filters
|
||||
|
||||
- (IBAction)changeMode
|
||||
{
|
||||
switch (self.state)
|
||||
{
|
||||
case MWMSearchManagerStateTableSearch: self.state = MWMSearchManagerStateMapSearch; break;
|
||||
case MWMSearchManagerStateMapSearch: self.state = MWMSearchManagerStateTableSearch;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -305,31 +388,23 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
|
||||
- (UIViewController *)topController
|
||||
{
|
||||
if (self.state == MWMSearchManagerStateHidden ||
|
||||
GetFramework().GetStorage().HaveDownloadedCountries())
|
||||
[MWMFrameworkListener removeObserver:self];
|
||||
[MWMSearch removeObserver:self.tableViewController];
|
||||
self.noMapsController = nil;
|
||||
switch (self.state)
|
||||
{
|
||||
return self.tabbedController;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!self.noMapsController)
|
||||
{
|
||||
UIStoryboard * storyboard =
|
||||
[UIStoryboard storyboardWithName:@"Mapsme" bundle:[NSBundle mainBundle]];
|
||||
self.noMapsController =
|
||||
[storyboard instantiateViewControllerWithIdentifier:@"MWMNoMapsViewController"];
|
||||
}
|
||||
return self.noMapsController;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setNoMapsController:(MWMNoMapsViewController *)noMapsController
|
||||
{
|
||||
_noMapsController = noMapsController;
|
||||
if (noMapsController)
|
||||
case MWMSearchManagerStateHidden: return self.tabbedController;
|
||||
case MWMSearchManagerStateDefault:
|
||||
if (GetFramework().GetStorage().HaveDownloadedCountries())
|
||||
return self.tabbedController;
|
||||
self.noMapsController = [MWMNoMapsViewController controller];
|
||||
[MWMFrameworkListener addObserver:self];
|
||||
else
|
||||
[MWMFrameworkListener removeObserver:self];
|
||||
return self.noMapsController;
|
||||
case MWMSearchManagerStateTableSearch:
|
||||
[MWMSearch addObserver:self.tableViewController];
|
||||
return self.tableViewController;
|
||||
case MWMSearchManagerStateMapSearch: return self.tableViewController;
|
||||
}
|
||||
}
|
||||
|
||||
- (MWMSearchTabbedViewController *)tabbedController
|
||||
|
@ -399,5 +474,79 @@ extern NSString * const kSearchStateKey = @"SearchStateKey";
|
|||
[[MWMMapViewControlsManager manager] searchViewDidEnterState:state];
|
||||
}
|
||||
|
||||
- (UIView *)view { return self.rootView; }
|
||||
- (void)viewHidden:(BOOL)hidden
|
||||
{
|
||||
UIView * searchBarView = self.searchBarView;
|
||||
UIView * actionBarView = self.actionBarView;
|
||||
UIView * contentView = self.contentView;
|
||||
UIView * parentView = self.ownerController.view;
|
||||
|
||||
if (hidden)
|
||||
{
|
||||
[[MWMMapViewControlsManager manager] searchFrameUpdated:{}];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (searchBarView.superview == parentView)
|
||||
return;
|
||||
[parentView addSubview:searchBarView];
|
||||
[parentView addSubview:actionBarView];
|
||||
[parentView addSubview:contentView];
|
||||
[self layoutTopViews];
|
||||
[[MWMMapViewControlsManager manager] searchFrameUpdated:self.searchBarView.frame];
|
||||
}
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration
|
||||
animations:^{
|
||||
CGFloat const alpha = hidden ? 0 : 1;
|
||||
searchBarView.alpha = alpha;
|
||||
actionBarView.alpha = alpha;
|
||||
contentView.alpha = alpha;
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
if (!hidden)
|
||||
return;
|
||||
[searchBarView removeFromSuperview];
|
||||
[actionBarView removeFromSuperview];
|
||||
[contentView removeFromSuperview];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)setChangeModeView:(MWMSearchChangeModeView *)changeModeView
|
||||
{
|
||||
_changeModeView = changeModeView;
|
||||
[changeModeView updateForState:self.state];
|
||||
}
|
||||
|
||||
- (void)setActionBarState:(MWMSearchManagerActionBarState)actionBarState
|
||||
{
|
||||
if (_actionBarState == actionBarState)
|
||||
return;
|
||||
_actionBarState = actionBarState;
|
||||
switch (actionBarState)
|
||||
{
|
||||
case MWMSearchManagerActionBarStateHidden:
|
||||
self.tabBarView.hidden = YES;
|
||||
self.changeModeView.hidden = YES;
|
||||
self.actionBarViewHeight.priority = UILayoutPriorityDefaultHigh;
|
||||
self.tabBarViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
self.changeModeViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
break;
|
||||
case MWMSearchManagerActionBarStateTabBar:
|
||||
self.tabBarView.hidden = NO;
|
||||
self.changeModeView.hidden = YES;
|
||||
self.actionBarViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
self.tabBarViewHeight.priority = UILayoutPriorityDefaultHigh;
|
||||
self.changeModeViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
break;
|
||||
case MWMSearchManagerActionBarStateModeFilter:
|
||||
self.tabBarView.hidden = YES;
|
||||
self.changeModeView.hidden = NO;
|
||||
self.actionBarViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
self.tabBarViewHeight.priority = UILayoutPriorityDefaultLow;
|
||||
self.changeModeViewHeight.priority = UILayoutPriorityDefaultHigh;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (UIViewController *)ownerController { return [MapViewController controller]; }
|
||||
@end
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
|
||||
@class MWMSearchTabButtonsView;
|
||||
|
||||
@protocol MWMSearchViewProtocol <NSObject>
|
||||
|
||||
- (void)searchFrameUpdated:(CGRect)frame;
|
||||
|
||||
@end
|
||||
|
||||
@interface MWMSearchView : SolidTouchView
|
||||
|
||||
@property (nonatomic) BOOL isVisible;
|
||||
|
||||
@property (nonatomic) BOOL tabBarIsVisible;
|
||||
@property (nonatomic) BOOL compact;
|
||||
|
||||
@end
|
|
@ -1,147 +0,0 @@
|
|||
#import "MWMSearchView.h"
|
||||
#import "Common.h"
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
#import "MWMSearchTabButtonsView.h"
|
||||
|
||||
static CGFloat constexpr kWidthForiPad = 320.0;
|
||||
|
||||
@interface MWMSearchView ()
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView * searchBar;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView * infoWrapper;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIView * tabBar;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint * tabBarTopOffset;
|
||||
@property (weak, nonatomic) IBOutlet NSLayoutConstraint * tabBarHeight;
|
||||
|
||||
@property (nonatomic) CGFloat correctMinX;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchView
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
[super awakeFromNib];
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleHeight;
|
||||
self.correctMinX = -kWidthForiPad;
|
||||
CALayer * sl = self.layer;
|
||||
CALayer * sbl = self.searchBar.layer;
|
||||
CALayer * tbl = self.tabBar.layer;
|
||||
CGFloat const scale = UIScreen.mainScreen.scale;
|
||||
sl.shouldRasterize = sbl.shouldRasterize = tbl.shouldRasterize = YES;
|
||||
sl.rasterizationScale = sbl.rasterizationScale = tbl.rasterizationScale = scale;
|
||||
}
|
||||
|
||||
- (void)mwm_refreshUI
|
||||
{
|
||||
[self.searchBar mwm_refreshUI];
|
||||
[self.infoWrapper mwm_refreshUI];
|
||||
}
|
||||
|
||||
- (void)setFrame:(CGRect)frame
|
||||
{
|
||||
BOOL const equal = CGRectEqualToRect(super.frame, frame);
|
||||
super.frame = frame;
|
||||
if (!equal && self.superview && self.isVisible && (IPAD || self.compact))
|
||||
[[MWMMapViewControlsManager manager] searchFrameUpdated:frame];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
if (IPAD)
|
||||
{
|
||||
self.frame = {{self.correctMinX, 0.0}, {kWidthForiPad, self.superview.height}};
|
||||
}
|
||||
else
|
||||
{
|
||||
self.frame = self.superview.bounds;
|
||||
if (self.compact)
|
||||
self.height = self.searchBar.minY + self.searchBar.height;
|
||||
}
|
||||
if (self.tabBarIsVisible)
|
||||
self.tabBar.hidden = NO;
|
||||
CGFloat const tabBarHeight = self.height > self.width ? 64.0 : 44.0;
|
||||
self.tabBarHeight.constant = tabBarHeight;
|
||||
self.tabBarTopOffset.constant = self.tabBarIsVisible ? 0.0 : -tabBarHeight;
|
||||
self.searchBar.layer.shadowRadius = self.tabBarIsVisible ? 0.0 : 2.0;
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration animations:^
|
||||
{
|
||||
[self.tabBar.subviews enumerateObjectsUsingBlock:^(MWMSearchTabButtonsView * btn, NSUInteger idx, BOOL *stop)
|
||||
{
|
||||
[btn setNeedsLayout];
|
||||
}];
|
||||
if (!self.tabBarIsVisible)
|
||||
self.tabBar.hidden = YES;
|
||||
[self.tabBar layoutIfNeeded];
|
||||
}];
|
||||
[super layoutSubviews];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setIsVisible:(BOOL)isVisible
|
||||
{
|
||||
if (_isVisible == isVisible)
|
||||
return;
|
||||
_isVisible = isVisible;
|
||||
self.minY = 0.0;
|
||||
self.height = self.superview.height;
|
||||
if (IPAD)
|
||||
{
|
||||
if (isVisible)
|
||||
self.hidden = NO;
|
||||
self.correctMinX = self.minX = isVisible ? -kWidthForiPad : 0.0;
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration animations:^
|
||||
{
|
||||
self.correctMinX = self.minX = isVisible ? 0.0: -kWidthForiPad;
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
if (!isVisible)
|
||||
{
|
||||
self.hidden = YES;
|
||||
[self removeFromSuperview];
|
||||
}
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.hidden = !isVisible;
|
||||
if (!isVisible)
|
||||
[self removeFromSuperview];
|
||||
}
|
||||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (void)setTabBarIsVisible:(BOOL)tabBarIsVisible
|
||||
{
|
||||
if (_tabBarIsVisible == tabBarIsVisible)
|
||||
return;
|
||||
_tabBarIsVisible = tabBarIsVisible;
|
||||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (void)setCompact:(BOOL)compact
|
||||
{
|
||||
if (IPAD)
|
||||
return;
|
||||
_compact = compact;
|
||||
if (!compact)
|
||||
self.infoWrapper.hidden = NO;
|
||||
[UIView animateWithDuration:kDefaultAnimationDuration animations:^
|
||||
{
|
||||
self.infoWrapper.alpha = compact ? 0.0 : 1.0;
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
if (compact)
|
||||
self.infoWrapper.hidden = YES;
|
||||
self.autoresizingMask = compact ? UIViewAutoresizingFlexibleWidth : UIViewAutoresizingFlexibleHeight;
|
||||
[self setNeedsLayout];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,10 +1,5 @@
|
|||
#import "MWMSearchNoResults.h"
|
||||
|
||||
@interface MWMSearchTableView : UIView
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UITableView * tableView;
|
||||
|
||||
- (void)addNoResultsView:(MWMSearchNoResults *)view;
|
||||
- (void)removeNoResultsView;
|
||||
- (void)hideNoResultsView:(BOOL)hide;
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#import "MWMSearchTableView.h"
|
||||
#import "MWMKeyboard.h"
|
||||
#import "MWMSearchNoResults.h"
|
||||
|
||||
@interface MWMSearchTableView ()<MWMKeyboardObserver>
|
||||
|
||||
|
@ -7,6 +8,7 @@
|
|||
|
||||
@property(weak, nonatomic) IBOutlet UIView * noResultsContainer;
|
||||
@property(weak, nonatomic) IBOutlet UIView * noResultsWrapper;
|
||||
@property(nonatomic) MWMSearchNoResults * noResultsView;
|
||||
|
||||
@end
|
||||
|
||||
|
@ -21,18 +23,19 @@
|
|||
[MWMKeyboard addObserver:self];
|
||||
}
|
||||
|
||||
- (void)addNoResultsView:(MWMSearchNoResults *)view
|
||||
- (void)hideNoResultsView:(BOOL)hide
|
||||
{
|
||||
[self removeNoResultsView];
|
||||
self.noResultsContainer.hidden = NO;
|
||||
[self.noResultsWrapper addSubview:view];
|
||||
[self onKeyboardAnimation];
|
||||
}
|
||||
|
||||
- (void)removeNoResultsView
|
||||
{
|
||||
self.noResultsContainer.hidden = YES;
|
||||
[self.noResultsWrapper.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
|
||||
if (hide)
|
||||
{
|
||||
self.noResultsContainer.hidden = YES;
|
||||
[self.noResultsView removeFromSuperview];
|
||||
}
|
||||
else
|
||||
{
|
||||
self.noResultsContainer.hidden = NO;
|
||||
[self.noResultsWrapper addSubview:self.noResultsView];
|
||||
[self onKeyboardAnimation];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - MWMKeyboard
|
||||
|
@ -53,4 +56,16 @@
|
|||
if (self.superview)
|
||||
[self layoutIfNeeded];
|
||||
}
|
||||
|
||||
- (MWMSearchNoResults *)noResultsView
|
||||
{
|
||||
if (!_noResultsView)
|
||||
{
|
||||
_noResultsView = [MWMSearchNoResults viewWithImage:[UIImage imageNamed:@"img_search_not_found"]
|
||||
title:nil
|
||||
text:L(@"search_not_found_query")];
|
||||
}
|
||||
return _noResultsView;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#import "MWMSearch.h"
|
||||
#import "MWMSearchManager.h"
|
||||
#import "MWMSearchTabbedViewProtocol.h"
|
||||
#import "MWMSearchTextField.h"
|
||||
|
@ -8,7 +9,7 @@
|
|||
namespace search
|
||||
{
|
||||
class Result;
|
||||
}
|
||||
} // search
|
||||
|
||||
@protocol MWMSearchTableViewProtocol<MWMSearchTabbedViewProtocol>
|
||||
|
||||
|
@ -20,9 +21,11 @@ class Result;
|
|||
|
||||
@end
|
||||
|
||||
@interface MWMSearchTableViewController : MWMViewController
|
||||
@interface MWMSearchTableViewController : MWMViewController<MWMSearchObserver>
|
||||
|
||||
- (nonnull instancetype)init __attribute__((unavailable("init is not available")));
|
||||
- (nonnull instancetype)initWithDelegate:(nonnull id<MWMSearchTableViewProtocol>)delegate;
|
||||
|
||||
- (void)reloadData;
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#import "MWMSearchTableViewController.h"
|
||||
#import "MWMLocationManager.h"
|
||||
#import "MWMSearch.h"
|
||||
#import "MWMSearchChangeModeView.h"
|
||||
#import "MWMSearchCommonCell.h"
|
||||
#import "MWMSearchShowOnMapCell.h"
|
||||
#import "MWMSearchSuggestionCell.h"
|
||||
|
@ -8,14 +8,13 @@
|
|||
#import "Macros.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "Statistics.h"
|
||||
#import "ToastView.h"
|
||||
|
||||
static NSString * const kTableShowOnMapCell = @"MWMSearchShowOnMapCell";
|
||||
static NSString * const kTableSuggestionCell = @"MWMSearchSuggestionCell";
|
||||
static NSString * const kTableCommonCell = @"MWMSearchCommonCell";
|
||||
|
||||
namespace
|
||||
{
|
||||
typedef NS_ENUM(NSUInteger, MWMSearchTableCellType) {
|
||||
MWMSearchTableCellTypeOnMap,
|
||||
MWMSearchTableCellTypeSuggestion,
|
||||
MWMSearchTableCellTypeCommon
|
||||
};
|
||||
|
@ -24,19 +23,17 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
{
|
||||
switch (type)
|
||||
{
|
||||
case MWMSearchTableCellTypeOnMap: return kTableShowOnMapCell;
|
||||
case MWMSearchTableCellTypeSuggestion: return kTableSuggestionCell;
|
||||
case MWMSearchTableCellTypeCommon: return kTableCommonCell;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@interface MWMSearchTableViewController ()<UITableViewDataSource, UITableViewDelegate,
|
||||
MWMSearchObserver>
|
||||
@interface MWMSearchTableViewController ()<UITableViewDataSource, UITableViewDelegate>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UITableView * tableView;
|
||||
|
||||
@property(nonatomic) MWMSearchCommonCell * commonSizingCell;
|
||||
@property(nonatomic) MWMSearchNoResults * noResultsView;
|
||||
|
||||
@property(weak, nonatomic) id<MWMSearchTableViewProtocol> delegate;
|
||||
|
||||
|
@ -61,64 +58,37 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
- (void)viewWillAppear:(BOOL)animated
|
||||
{
|
||||
[super viewWillAppear:animated];
|
||||
[MWMSearch addObserver:self];
|
||||
[self.tableView reloadData];
|
||||
}
|
||||
|
||||
- (void)viewWillDisappear:(BOOL)animated
|
||||
{
|
||||
[super viewWillDisappear:animated];
|
||||
[MWMSearch removeObserver:self];
|
||||
self.tableView.hidden = NO;
|
||||
[(MWMSearchTableView *)self.view hideNoResultsView:YES];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
- (void)mwm_refreshUI { [self.view mwm_refreshUI]; }
|
||||
- (void)setupTableView
|
||||
{
|
||||
[self.tableView registerNib:[UINib nibWithNibName:kTableShowOnMapCell bundle:nil]
|
||||
forCellReuseIdentifier:kTableShowOnMapCell];
|
||||
[self.tableView registerNib:[UINib nibWithNibName:kTableSuggestionCell bundle:nil]
|
||||
forCellReuseIdentifier:kTableSuggestionCell];
|
||||
[self.tableView registerNib:[UINib nibWithNibName:kTableCommonCell bundle:nil]
|
||||
forCellReuseIdentifier:kTableCommonCell];
|
||||
UITableView * tableView = self.tableView;
|
||||
[tableView registerNib:[UINib nibWithNibName:kTableSuggestionCell bundle:nil]
|
||||
forCellReuseIdentifier:kTableSuggestionCell];
|
||||
[tableView registerNib:[UINib nibWithNibName:kTableCommonCell bundle:nil]
|
||||
forCellReuseIdentifier:kTableCommonCell];
|
||||
}
|
||||
|
||||
- (MWMSearchTableCellType)cellTypeForIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
size_t const numSuggests = [MWMSearch suggestionsCount];
|
||||
if (numSuggests > 0)
|
||||
{
|
||||
return indexPath.row < numSuggests ? MWMSearchTableCellTypeSuggestion
|
||||
: MWMSearchTableCellTypeCommon;
|
||||
}
|
||||
else
|
||||
{
|
||||
MWMRoutingPlaneMode const m = MapsAppDelegate.theApp.routingPlaneMode;
|
||||
if (IPAD || m == MWMRoutingPlaneModeSearchSource || m == MWMRoutingPlaneModeSearchDestination)
|
||||
return MWMSearchTableCellTypeCommon;
|
||||
else
|
||||
return indexPath.row == 0 ? MWMSearchTableCellTypeOnMap : MWMSearchTableCellTypeCommon;
|
||||
}
|
||||
if (numSuggests > 0 && indexPath.row < numSuggests)
|
||||
return MWMSearchTableCellTypeSuggestion;
|
||||
return MWMSearchTableCellTypeCommon;
|
||||
}
|
||||
|
||||
- (search::Result const &)searchResultForIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
MWMSearchTableCellType firstCellType =
|
||||
[self cellTypeForIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
NSUInteger const searchPosition =
|
||||
indexPath.row - (firstCellType == MWMSearchTableCellTypeOnMap ? 1 : 0);
|
||||
return [MWMSearch resultAtIndex:searchPosition];
|
||||
return [MWMSearch resultAtIndex:indexPath.row];
|
||||
}
|
||||
|
||||
- (void)reloadData { [self.tableView reloadData]; }
|
||||
#pragma mark - Layout
|
||||
|
||||
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
|
||||
duration:(NSTimeInterval)duration
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self onSearchResultsUpdated];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)viewWillTransitionToSize:(CGSize)size
|
||||
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
|
||||
{
|
||||
|
@ -133,10 +103,7 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
MWMSearchTableCellType firstCellType =
|
||||
[self cellTypeForIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
||||
BOOL const showOnMap = firstCellType == MWMSearchTableCellTypeOnMap;
|
||||
return [MWMSearch resultsCount] + (showOnMap ? 1 : 0);
|
||||
return [MWMSearch resultsCount];
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView
|
||||
|
@ -163,7 +130,6 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
{
|
||||
switch ([self cellTypeForIndexPath:indexPath])
|
||||
{
|
||||
case MWMSearchTableCellTypeOnMap: return MWMSearchShowOnMapCell.cellHeight;
|
||||
case MWMSearchTableCellTypeSuggestion: return MWMSearchSuggestionCell.cellHeight;
|
||||
case MWMSearchTableCellTypeCommon: return MWMSearchCommonCell.defaultCellHeight;
|
||||
}
|
||||
|
@ -174,7 +140,6 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
MWMSearchTableCellType const cellType = [self cellTypeForIndexPath:indexPath];
|
||||
switch (cellType)
|
||||
{
|
||||
case MWMSearchTableCellTypeOnMap: return MWMSearchShowOnMapCell.cellHeight;
|
||||
case MWMSearchTableCellTypeSuggestion: return MWMSearchSuggestionCell.cellHeight;
|
||||
case MWMSearchTableCellTypeCommon:
|
||||
[self.commonSizingCell config:[self searchResultForIndexPath:indexPath] forHeight:YES];
|
||||
|
@ -188,7 +153,6 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
{
|
||||
switch ([self cellTypeForIndexPath:indexPath])
|
||||
{
|
||||
case MWMSearchTableCellTypeOnMap: break;
|
||||
case MWMSearchTableCellTypeSuggestion:
|
||||
[self configSuggestionCell:(MWMSearchSuggestionCell *)cell
|
||||
result:[self searchResultForIndexPath:indexPath]
|
||||
|
@ -204,28 +168,19 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
{
|
||||
MWMSearchTableCellType cellType = [self cellTypeForIndexPath:indexPath];
|
||||
id<MWMSearchTableViewProtocol> delegate = self.delegate;
|
||||
if (cellType == MWMSearchTableCellTypeOnMap)
|
||||
search::Result const & result = [self searchResultForIndexPath:indexPath];
|
||||
if (cellType == MWMSearchTableCellTypeSuggestion)
|
||||
{
|
||||
MWMSearchTextField * textField = delegate.searchTextField;
|
||||
[MWMSearch saveQuery:textField.text forInputLocale:textField.textInputMode.primaryLanguage];
|
||||
delegate.state = MWMSearchManagerStateMapSearch;
|
||||
NSString * suggestionString = @(result.GetSuggestionString());
|
||||
[Statistics logEvent:kStatEventName(kStatSearch, kStatSelectResult)
|
||||
withParameters:@{kStatValue : suggestionString, kStatScreen : kStatSearch}];
|
||||
[delegate searchText:suggestionString forInputLocale:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
search::Result const & result = [self searchResultForIndexPath:indexPath];
|
||||
if (cellType == MWMSearchTableCellTypeSuggestion)
|
||||
{
|
||||
NSString * suggestionString = @(result.GetSuggestionString());
|
||||
[Statistics logEvent:kStatEventName(kStatSearch, kStatSelectResult)
|
||||
withParameters:@{kStatValue : suggestionString, kStatScreen : kStatSearch}];
|
||||
[delegate searchText:suggestionString forInputLocale:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
MWMSearchTextField * textField = delegate.searchTextField;
|
||||
[MWMSearch saveQuery:textField.text forInputLocale:textField.textInputMode.primaryLanguage];
|
||||
[delegate processSearchWithResult:result];
|
||||
}
|
||||
MWMSearchTextField * textField = delegate.searchTextField;
|
||||
[MWMSearch saveQuery:textField.text forInputLocale:textField.textInputMode.primaryLanguage];
|
||||
[delegate processSearchWithResult:result];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,19 +188,9 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
|
||||
- (void)onSearchCompleted
|
||||
{
|
||||
MWMSearchTableView * view = (MWMSearchTableView *)self.view;
|
||||
if ([MWMSearch resultsCount] == 0)
|
||||
{
|
||||
view.tableView.hidden = YES;
|
||||
[view addNoResultsView:self.noResultsView];
|
||||
if ([MWMSearch isSearchOnMap])
|
||||
[[[ToastView alloc] initWithMessage:L(@"search_not_found_query")] show];
|
||||
}
|
||||
else
|
||||
{
|
||||
view.tableView.hidden = NO;
|
||||
[view removeNoResultsView];
|
||||
}
|
||||
BOOL const noResults = [MWMSearch resultsCount] == 0;
|
||||
self.tableView.hidden = noResults;
|
||||
[(MWMSearchTableView *)self.view hideNoResultsView:!noResults];
|
||||
}
|
||||
|
||||
- (void)onSearchResultsUpdated
|
||||
|
@ -254,7 +199,7 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
return;
|
||||
|
||||
self.commonSizingCell = nil;
|
||||
[self.tableView reloadData];
|
||||
[self reloadData];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
@ -266,15 +211,4 @@ NSString * identifierForType(MWMSearchTableCellType type)
|
|||
return _commonSizingCell;
|
||||
}
|
||||
|
||||
- (MWMSearchNoResults *)noResultsView
|
||||
{
|
||||
if (!_noResultsView)
|
||||
{
|
||||
_noResultsView = [MWMSearchNoResults viewWithImage:[UIImage imageNamed:@"img_search_not_found"]
|
||||
title:nil
|
||||
text:L(@"search_not_found_query")];
|
||||
}
|
||||
return _noResultsView;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -2,4 +2,6 @@
|
|||
|
||||
@interface MWMNoMapsViewController : MWMViewController
|
||||
|
||||
+ (MWMNoMapsViewController *)controller;
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,8 +1,15 @@
|
|||
#import "MWMNoMapsViewController.h"
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
#import "UIViewController+Navigation.h"
|
||||
|
||||
@implementation MWMNoMapsViewController
|
||||
|
||||
+ (MWMNoMapsViewController *)controller
|
||||
{
|
||||
return
|
||||
[[UIViewController mainStoryboard] instantiateViewControllerWithIdentifier:[self className]];
|
||||
}
|
||||
|
||||
- (IBAction)downloadMaps
|
||||
{
|
||||
[[MWMMapViewControlsManager manager] actionDownloadMaps:mwm::DownloaderMode::Available];
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
@interface MWMSearchFilterPresentationController : UIPresentationController
|
||||
|
||||
@end
|
|
@ -0,0 +1,133 @@
|
|||
#import "MWMSearchFilterPresentationController.h"
|
||||
#import "MWMSearch.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
CGFloat const kiPhonePortraitHeightPercentage = 0.7;
|
||||
|
||||
CGPoint originForParentSize(CGSize size)
|
||||
{
|
||||
if (size.width > size.height)
|
||||
return {};
|
||||
return {0, size.height * (1 - kiPhonePortraitHeightPercentage)};
|
||||
}
|
||||
|
||||
CGSize sizeForParentSize(CGSize size)
|
||||
{
|
||||
if (size.width > size.height)
|
||||
return size;
|
||||
return {size.width, size.height * kiPhonePortraitHeightPercentage};
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@interface MWMSearchFilterPresentationController ()
|
||||
|
||||
@property(nonatomic) UIView * chromeView;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchFilterPresentationController
|
||||
|
||||
- (instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController
|
||||
presentingViewController:(UIViewController *)presentingViewController
|
||||
{
|
||||
self = [super initWithPresentedViewController:presentedViewController
|
||||
presentingViewController:presentingViewController];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_chromeView = [[UIView alloc] initWithFrame:{}];
|
||||
_chromeView.backgroundColor = [UIColor blackStatusBarBackground];
|
||||
_chromeView.alpha = 0;
|
||||
|
||||
auto rec =
|
||||
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(chromeViewTapped:)];
|
||||
[_chromeView addGestureRecognizer:rec];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - Gesture recognizers
|
||||
|
||||
- (void)chromeViewTapped:(UIGestureRecognizer *)gesture
|
||||
{
|
||||
if (gesture.state != UIGestureRecognizerStateEnded)
|
||||
return;
|
||||
[MWMSearch update];
|
||||
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
|
||||
}
|
||||
|
||||
#pragma mark - Layout
|
||||
|
||||
- (CGRect)frameOfPresentedViewInContainerView
|
||||
{
|
||||
auto const size = self.containerView.bounds.size;
|
||||
return {originForParentSize(size), sizeForParentSize(size)};
|
||||
}
|
||||
|
||||
- (CGSize)sizeForChildContentContainer:(id<UIContentContainer>)container
|
||||
withParentContainerSize:(CGSize)parentSize
|
||||
{
|
||||
return sizeForParentSize(parentSize);
|
||||
}
|
||||
|
||||
- (void)containerViewWillLayoutSubviews
|
||||
{
|
||||
self.chromeView.frame = self.containerView.bounds;
|
||||
self.presentedView.frame = [self frameOfPresentedViewInContainerView];
|
||||
}
|
||||
|
||||
#pragma mark - Style
|
||||
|
||||
- (BOOL)shouldPresentInFullscreen { return YES; }
|
||||
- (UIModalPresentationStyle)adaptivePresentationStyle { return UIModalPresentationFullScreen; }
|
||||
#pragma mark - Presentation
|
||||
|
||||
- (void)presentationTransitionWillBegin
|
||||
{
|
||||
UIView * chromeView = self.chromeView;
|
||||
UIView * containerView = self.containerView;
|
||||
|
||||
chromeView.frame = containerView.bounds;
|
||||
chromeView.alpha = 0;
|
||||
|
||||
[containerView insertSubview:chromeView atIndex:0];
|
||||
|
||||
id<UIViewControllerTransitionCoordinator> coordinator =
|
||||
self.presentedViewController.transitionCoordinator;
|
||||
if (coordinator)
|
||||
{
|
||||
[coordinator
|
||||
animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
||||
chromeView.alpha = 1;
|
||||
}
|
||||
completion:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
chromeView.alpha = 1;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dismissalTransitionWillBegin
|
||||
{
|
||||
UIView * chromeView = self.chromeView;
|
||||
id<UIViewControllerTransitionCoordinator> coordinator =
|
||||
self.presentedViewController.transitionCoordinator;
|
||||
if (coordinator)
|
||||
{
|
||||
[coordinator
|
||||
animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
|
||||
chromeView.alpha = 0;
|
||||
}
|
||||
completion:nil];
|
||||
}
|
||||
else
|
||||
{
|
||||
chromeView.alpha = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,5 @@
|
|||
@interface MWMSearchFilterTransitioning : NSObject<UIViewControllerAnimatedTransitioning>
|
||||
|
||||
@property(nonatomic) BOOL isPresentation;
|
||||
|
||||
@end
|
|
@ -0,0 +1,63 @@
|
|||
#import "MWMSearchFilterTransitioning.h"
|
||||
#import "Common.h"
|
||||
|
||||
@implementation MWMSearchFilterTransitioning
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
_isPresentation = NO;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
|
||||
{
|
||||
return kDefaultAnimationDuration;
|
||||
}
|
||||
|
||||
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
|
||||
{
|
||||
UIViewController * fromVC =
|
||||
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
|
||||
UIViewController * toVC =
|
||||
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
|
||||
|
||||
if (!toVC || !fromVC)
|
||||
return;
|
||||
|
||||
UIView * fromView = fromVC.view;
|
||||
UIView * toView = toVC.view;
|
||||
UIView * containerView = [transitionContext containerView];
|
||||
|
||||
if (self.isPresentation)
|
||||
[containerView addSubview:toView];
|
||||
|
||||
UIViewController * animatingVC = self.isPresentation ? toVC : fromVC;
|
||||
UIView * animatingView = animatingVC.view;
|
||||
|
||||
CGRect const finalFrameForVC = [transitionContext finalFrameForViewController:animatingVC];
|
||||
CGRect initialFrameForVC = finalFrameForVC;
|
||||
initialFrameForVC.origin.y += initialFrameForVC.size.height;
|
||||
|
||||
CGRect const initialFrame = self.isPresentation ? initialFrameForVC : finalFrameForVC;
|
||||
CGRect const finalFrame = self.isPresentation ? finalFrameForVC : initialFrameForVC;
|
||||
|
||||
animatingView.frame = initialFrame;
|
||||
|
||||
[UIView animateWithDuration:[self transitionDuration:transitionContext]
|
||||
delay:0
|
||||
usingSpringWithDamping:300
|
||||
initialSpringVelocity:5.0
|
||||
options:UIViewAnimationOptionAllowUserInteraction
|
||||
animations:^{
|
||||
animatingView.frame = finalFrame;
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
if (!self.isPresentation)
|
||||
[fromView removeFromSuperview];
|
||||
[transitionContext completeTransition:YES];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,3 @@
|
|||
@interface MWMSearchFilterTransitioningDelegate : NSObject<UIViewControllerTransitioningDelegate>
|
||||
|
||||
@end
|
|
@ -0,0 +1,34 @@
|
|||
#import "MWMSearchFilterTransitioningDelegate.h"
|
||||
#import "MWMSearchFilterPresentationController.h"
|
||||
#import "MWMSearchFilterTransitioning.h"
|
||||
|
||||
@implementation MWMSearchFilterTransitioningDelegate
|
||||
|
||||
- (UIPresentationController *)
|
||||
presentationControllerForPresentedViewController:(UIViewController *)presented
|
||||
presentingViewController:(UIViewController *)presenting
|
||||
sourceViewController:(UIViewController *)source
|
||||
{
|
||||
return [[MWMSearchFilterPresentationController alloc] initWithPresentedViewController:presented
|
||||
presentingViewController:presenting];
|
||||
}
|
||||
|
||||
- (id<UIViewControllerAnimatedTransitioning>)
|
||||
animationControllerForPresentedController:(UIViewController *)presented
|
||||
presentingController:(UIViewController *)presenting
|
||||
sourceController:(UIViewController *)source
|
||||
{
|
||||
auto animationController = [[MWMSearchFilterTransitioning alloc] init];
|
||||
animationController.isPresentation = YES;
|
||||
return animationController;
|
||||
}
|
||||
|
||||
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:
|
||||
(UIViewController *)dismissed
|
||||
{
|
||||
auto animationController = [[MWMSearchFilterTransitioning alloc] init];
|
||||
animationController.isPresentation = NO;
|
||||
return animationController;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,11 @@
|
|||
#import "MWMTableViewController.h"
|
||||
|
||||
#include "search/hotels_filter.hpp"
|
||||
|
||||
@interface MWMSearchFilterViewController : MWMTableViewController
|
||||
|
||||
+ (MWMSearchFilterViewController *)controller;
|
||||
|
||||
- (shared_ptr<search::hotels_filter::Rule>)rules;
|
||||
|
||||
@end
|
|
@ -0,0 +1,20 @@
|
|||
#import "MWMSearchFilterViewController_Protected.h"
|
||||
|
||||
@implementation MWMSearchFilterViewController
|
||||
|
||||
+ (MWMSearchFilterViewController *)controller
|
||||
{
|
||||
// Must be implemented in subclasses.
|
||||
[self doesNotRecognizeSelector:_cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (MWMSearchFilterViewController *)controllerWithIdentifier:(NSString *)identifier
|
||||
{
|
||||
auto storyboard = [UIStoryboard storyboardWithName:@"MWMSearchFilters" bundle:nil];
|
||||
return [storyboard instantiateViewControllerWithIdentifier:identifier];
|
||||
}
|
||||
|
||||
- (void)mwm_refreshUI { [self.view mwm_refreshUI]; }
|
||||
- (shared_ptr<search::hotels_filter::Rule>)rules { return nullptr; }
|
||||
@end
|
|
@ -0,0 +1,7 @@
|
|||
#import "MWMSearchFilterViewController.h"
|
||||
|
||||
@interface MWMSearchFilterViewController (Protected)
|
||||
|
||||
+ (MWMSearchFilterViewController *)controllerWithIdentifier:(NSString *)identifier;
|
||||
|
||||
@end
|
|
@ -0,0 +1,5 @@
|
|||
#import "MWMSearchFilterViewController.h"
|
||||
|
||||
@interface MWMSearchHotelsFilterViewController : MWMSearchFilterViewController
|
||||
|
||||
@end
|
|
@ -0,0 +1,152 @@
|
|||
#import "MWMSearchHotelsFilterViewController.h"
|
||||
#import "MWMSearchFilterViewController_Protected.h"
|
||||
#import "UIColor+MapsMeColor.h"
|
||||
#import "UIFont+MapsMeFonts.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
NSAttributedString * makeString(NSString * primaryText, NSDictionary * primaryAttrs,
|
||||
NSString * secondaryText, NSDictionary * secondaryAttrs)
|
||||
{
|
||||
auto str = [[NSMutableAttributedString alloc] initWithString:primaryText attributes:primaryAttrs];
|
||||
if (secondaryText.length != 0)
|
||||
{
|
||||
auto secText = [NSString stringWithFormat:@"\n%@", secondaryText];
|
||||
auto secStr = [[NSAttributedString alloc] initWithString:secText attributes:secondaryAttrs];
|
||||
[str appendAttributedString:secStr];
|
||||
}
|
||||
return str.copy;
|
||||
}
|
||||
|
||||
void configButton(UIButton * button, NSString * primaryText, NSString * secondaryText)
|
||||
{
|
||||
UIFont * regular17 = [UIFont regular17];
|
||||
UIFont * regular10 = [UIFont regular10];
|
||||
|
||||
UIColor * white = [UIColor white];
|
||||
|
||||
UIImage * linkBlueImage = [UIImage imageWithColor:[UIColor linkBlue]];
|
||||
|
||||
[button setBackgroundImage:[UIImage imageWithColor:white] forState:UIControlStateNormal];
|
||||
[button setBackgroundImage:linkBlueImage forState:UIControlStateSelected];
|
||||
[button setBackgroundImage:linkBlueImage
|
||||
forState:UIControlStateSelected | UIControlStateHighlighted];
|
||||
|
||||
NSDictionary * primarySelected =
|
||||
@{NSFontAttributeName : regular17, NSForegroundColorAttributeName : white};
|
||||
NSDictionary * secondarySelected =
|
||||
@{NSFontAttributeName : regular10, NSForegroundColorAttributeName : white};
|
||||
NSAttributedString * titleSelected =
|
||||
makeString(primaryText, primarySelected, secondaryText, secondarySelected);
|
||||
[button setAttributedTitle:titleSelected forState:UIControlStateSelected];
|
||||
[button setAttributedTitle:titleSelected
|
||||
forState:UIControlStateSelected | UIControlStateHighlighted];
|
||||
|
||||
NSDictionary * primaryNormal = @{
|
||||
NSFontAttributeName : regular17,
|
||||
NSForegroundColorAttributeName : [UIColor blackPrimaryText]
|
||||
};
|
||||
NSDictionary * secondaryNormal = @{
|
||||
NSFontAttributeName : regular10,
|
||||
NSForegroundColorAttributeName : [UIColor blackSecondaryText]
|
||||
};
|
||||
NSAttributedString * titleNormal =
|
||||
makeString(primaryText, primaryNormal, secondaryText, secondaryNormal);
|
||||
[button setAttributedTitle:titleNormal forState:UIControlStateNormal];
|
||||
|
||||
button.titleLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@interface MWMSearchHotelsFilterViewController ()
|
||||
|
||||
@property(nonatomic) IBOutletCollection(UIButton) NSArray * ratings;
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIButton * ratingAny;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * rating7;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * rating8;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * rating9;
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UIButton * price1;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * price2;
|
||||
@property(weak, nonatomic) IBOutlet UIButton * price3;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearchHotelsFilterViewController
|
||||
|
||||
+ (MWMSearchHotelsFilterViewController *)controller
|
||||
{
|
||||
NSString * identifier = [MWMSearchHotelsFilterViewController className];
|
||||
return static_cast<MWMSearchHotelsFilterViewController *>(
|
||||
[self controllerWithIdentifier:identifier]);
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
configButton(self.ratingAny, L(@"any"), nil);
|
||||
configButton(self.rating7, L(@"7.0+"), L(@"good"));
|
||||
configButton(self.rating8, L(@"8.0+"), L(@"very_good"));
|
||||
configButton(self.rating9, L(@"9.0+"), L(@"excellent"));
|
||||
|
||||
configButton(self.price1, L(@"$"), nil);
|
||||
configButton(self.price2, L(@"$$"), nil);
|
||||
configButton(self.price3, L(@"$$$"), nil);
|
||||
|
||||
[self changeRating:self.ratingAny];
|
||||
|
||||
self.price1.selected = NO;
|
||||
self.price2.selected = NO;
|
||||
self.price3.selected = NO;
|
||||
}
|
||||
|
||||
- (shared_ptr<search::hotels_filter::Rule>)rules
|
||||
{
|
||||
using namespace search::hotels_filter;
|
||||
shared_ptr<Rule> ratingRule;
|
||||
if (self.rating7.selected)
|
||||
ratingRule = Ge<Rating>(7.0);
|
||||
else if (self.rating8.selected)
|
||||
ratingRule = Ge<Rating>(8.0);
|
||||
else if (self.rating9.selected)
|
||||
ratingRule = Ge<Rating>(9.0);
|
||||
|
||||
shared_ptr<Rule> priceRule;
|
||||
if (self.price1.selected)
|
||||
priceRule = Or(priceRule, Eq<PriceRate>(1));
|
||||
if (self.price2.selected)
|
||||
priceRule = Or(priceRule, Eq<PriceRate>(2));
|
||||
if (self.price3.selected)
|
||||
priceRule = Or(priceRule, Eq<PriceRate>(3));
|
||||
|
||||
if (!ratingRule && !priceRule)
|
||||
return nullptr;
|
||||
|
||||
return And(ratingRule, priceRule);
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)changeRating:(UIButton *)sender
|
||||
{
|
||||
for (UIButton * button in self.ratings)
|
||||
button.selected = NO;
|
||||
sender.selected = YES;
|
||||
}
|
||||
|
||||
- (IBAction)priceChange:(UIButton *)sender { sender.selected = !sender.selected; }
|
||||
#pragma mark - UITableViewDataSource
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
|
||||
{
|
||||
switch (section)
|
||||
{
|
||||
case 0: return L(@"rating");
|
||||
case 1: return L(@"price_category");
|
||||
default: return nil;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,3 +1,4 @@
|
|||
#import "MWMSearchFilterViewController.h"
|
||||
#import "MWMSearchObserver.h"
|
||||
|
||||
#include "search/result.hpp"
|
||||
|
@ -13,6 +14,7 @@
|
|||
+ (void)showResult:(search::Result const &)result;
|
||||
|
||||
+ (search::Result &)resultAtIndex:(NSUInteger)index;
|
||||
+ (void)update;
|
||||
+ (void)clear;
|
||||
|
||||
+ (BOOL)isSearchOnMap;
|
||||
|
@ -21,6 +23,12 @@
|
|||
+ (NSUInteger)suggestionsCount;
|
||||
+ (NSUInteger)resultsCount;
|
||||
|
||||
+ (BOOL)isHotelResults;
|
||||
|
||||
+ (BOOL)hasFilter;
|
||||
+ (MWMSearchFilterViewController *)getFilter;
|
||||
+ (void)clearFilter;
|
||||
|
||||
- (instancetype)init __attribute__((unavailable("unavailable")));
|
||||
- (instancetype)copy __attribute__((unavailable("unavailable")));
|
||||
- (instancetype)copyWithZone:(NSZone *)zone __attribute__((unavailable("unavailable")));
|
||||
|
|
|
@ -2,10 +2,13 @@
|
|||
#import <Crashlytics/Crashlytics.h>
|
||||
#import "Common.h"
|
||||
#import "MWMLocationManager.h"
|
||||
#import "MWMSearchHotelsFilterViewController.h"
|
||||
#import "ToastView.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
#include "search/everywhere_search_params.hpp"
|
||||
#include "search/hotels_classifier.hpp"
|
||||
#include "search/query_saver.hpp"
|
||||
#include "search/viewport_search_params.hpp"
|
||||
|
||||
|
@ -21,13 +24,14 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
@property(nonatomic) BOOL searchOnMap;
|
||||
|
||||
@property(nonatomic) BOOL textChanged;
|
||||
@property(nonatomic) BOOL everywhereSearchActive;
|
||||
@property(nonatomic) BOOL viewportSearchActive;
|
||||
|
||||
@property(nonatomic) TObservers * observers;
|
||||
|
||||
@property(nonatomic) NSTimeInterval lastSearchTimestamp;
|
||||
|
||||
@property(nonatomic) BOOL isHotelResults;
|
||||
@property(nonatomic) MWMSearchFilterViewController * filter;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSearch
|
||||
|
@ -35,6 +39,7 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
search::EverywhereSearchParams m_everywhereParams;
|
||||
search::ViewportSearchParams m_viewportParams;
|
||||
search::Results m_results;
|
||||
string m_filterQuery;
|
||||
}
|
||||
|
||||
#pragma mark - Instance
|
||||
|
@ -71,7 +76,7 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
return;
|
||||
if (results.IsEndMarker())
|
||||
{
|
||||
self.everywhereSearchActive = NO;
|
||||
[self checkIsHotelResults:results];
|
||||
[self onSearchCompleted];
|
||||
}
|
||||
else
|
||||
|
@ -89,52 +94,63 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
if (!self)
|
||||
return;
|
||||
if (IPAD)
|
||||
{
|
||||
GetFramework().SearchEverywhere(self->m_everywhereParams);
|
||||
self.everywhereSearchActive = YES;
|
||||
}
|
||||
self.viewportSearchActive = YES;
|
||||
[self onSearchStarted];
|
||||
};
|
||||
}
|
||||
{
|
||||
__weak auto weakSelf = self;
|
||||
m_viewportParams.m_onCompleted = [weakSelf](search::Results const & results) {
|
||||
// TODO (@igrechuhin): do something useful with |results|.
|
||||
__strong auto self = weakSelf;
|
||||
if (!self)
|
||||
return;
|
||||
self.viewportSearchActive = NO;
|
||||
if (results.IsEndedNormal())
|
||||
[self checkIsHotelResults:results];
|
||||
[self onSearchCompleted];
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
- (void)checkIsHotelResults:(search::Results const &)results
|
||||
{
|
||||
self.isHotelResults = search::HotelsClassifier::IsHotelResults(results);
|
||||
m_filterQuery = m_everywhereParams.m_query;
|
||||
}
|
||||
|
||||
- (void)updateFilters
|
||||
{
|
||||
shared_ptr<search::hotels_filter::Rule> hotelsRules;
|
||||
|
||||
if (self.filter)
|
||||
{
|
||||
hotelsRules = [self.filter rules];
|
||||
if (!hotelsRules)
|
||||
self.filter = nil;
|
||||
}
|
||||
|
||||
m_viewportParams.m_hotelsFilter = hotelsRules;
|
||||
m_everywhereParams.m_hotelsFilter = hotelsRules;
|
||||
}
|
||||
|
||||
- (void)update
|
||||
{
|
||||
[MWMSearch clear];
|
||||
if (m_everywhereParams.m_query.empty())
|
||||
return;
|
||||
[self updateCallbacks];
|
||||
[self updateFilters];
|
||||
auto & f = GetFramework();
|
||||
if (IPAD)
|
||||
{
|
||||
f.SearchEverywhere(m_everywhereParams);
|
||||
f.SearchInViewport(m_viewportParams);
|
||||
|
||||
self.everywhereSearchActive = YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (self.searchOnMap)
|
||||
{
|
||||
f.SearchInViewport(m_viewportParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
f.SearchEverywhere(m_everywhereParams);
|
||||
self.everywhereSearchActive = YES;
|
||||
}
|
||||
}
|
||||
[self onSearchStarted];
|
||||
}
|
||||
|
@ -185,31 +201,62 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
}
|
||||
|
||||
+ (void)showResult:(search::Result const &)result { GetFramework().ShowSearchResult(result); }
|
||||
|
||||
+ (search::Result &)resultAtIndex:(NSUInteger)index
|
||||
{
|
||||
return [MWMSearch manager]->m_results.GetResult(index);
|
||||
}
|
||||
|
||||
+ (void)update { [[MWMSearch manager] update]; }
|
||||
|
||||
+ (void)clear
|
||||
{
|
||||
GetFramework().CancelAllSearches();
|
||||
MWMSearch * manager = [MWMSearch manager];
|
||||
manager->m_results.Clear();
|
||||
if (manager->m_filterQuery != manager->m_everywhereParams.m_query)
|
||||
manager.isHotelResults = NO;
|
||||
manager.suggestionsCount = 0;
|
||||
[manager onSearchResultsUpdated];
|
||||
}
|
||||
|
||||
+ (BOOL)isSearchOnMap { return [MWMSearch manager].searchOnMap; }
|
||||
|
||||
+ (void)setSearchOnMap:(BOOL)searchOnMap
|
||||
{
|
||||
MWMSearch * manager = [MWMSearch manager];
|
||||
if (manager.searchOnMap == searchOnMap)
|
||||
return;
|
||||
manager.searchOnMap = searchOnMap;
|
||||
if (!IPAD)
|
||||
[manager update];
|
||||
}
|
||||
|
||||
+ (NSUInteger)suggestionsCount { return [MWMSearch manager].suggestionsCount; }
|
||||
|
||||
+ (NSUInteger)resultsCount { return [MWMSearch manager]->m_results.GetCount(); }
|
||||
|
||||
+ (BOOL)isHotelResults { return [MWMSearch manager].isHotelResults; }
|
||||
|
||||
#pragma mark - Filters
|
||||
|
||||
+ (BOOL)hasFilter { return [[MWMSearch manager].filter rules] != nullptr; }
|
||||
|
||||
+ (MWMSearchFilterViewController *)getFilter
|
||||
{
|
||||
MWMSearch * manager = [MWMSearch manager];
|
||||
if (!manager.filter && manager.isHotelResults)
|
||||
manager.filter = [MWMSearchHotelsFilterViewController controller];
|
||||
return manager.filter;
|
||||
}
|
||||
|
||||
+ (void)clearFilter
|
||||
{
|
||||
MWMSearch * manager = [MWMSearch manager];
|
||||
manager.filter = nil;
|
||||
[manager update];
|
||||
}
|
||||
|
||||
#pragma mark - Notifications
|
||||
|
||||
- (void)onSearchStarted
|
||||
|
@ -223,9 +270,8 @@ using TObservers = NSHashTable<__kindof TObserver>;
|
|||
|
||||
- (void)onSearchCompleted
|
||||
{
|
||||
if (self.everywhereSearchActive || self.viewportSearchActive)
|
||||
return;
|
||||
|
||||
if (self.searchOnMap && m_results.GetCount() == 0)
|
||||
[[[ToastView alloc] initWithMessage:L(@"search_not_found_query")] show];
|
||||
for (TObserver observer in self.observers)
|
||||
{
|
||||
if ([observer respondsToSelector:@selector(onSearchCompleted)])
|
||||
|
|
|
@ -6,6 +6,6 @@
|
|||
- (UIBarButtonItem *)buttonWithImage:(UIImage *)image action:(SEL)action;
|
||||
- (NSArray<UIBarButtonItem *> *)alignedNavBarButtonItems:(NSArray<UIBarButtonItem *> *)items;
|
||||
|
||||
@property (nonatomic, readonly) UIStoryboard * mainStoryboard;
|
||||
+ (UIStoryboard *)mainStoryboard;
|
||||
|
||||
@end
|
||||
|
|
|
@ -45,5 +45,5 @@ CGFloat constexpr kButtonExtraWidth = 16.0;
|
|||
}
|
||||
|
||||
- (void)backTap { [self.navigationController popViewControllerAnimated:YES]; }
|
||||
- (UIStoryboard *)mainStoryboard { return [UIStoryboard storyboardWithName:@"Mapsme" bundle:nil]; }
|
||||
+ (UIStoryboard *)mainStoryboard { return [UIStoryboard storyboardWithName:@"Mapsme" bundle:nil]; }
|
||||
@end
|
||||
|
|
|
@ -78,6 +78,20 @@
|
|||
341F99F21C6B4288001C67B8 /* MWMMapDownloaderSearchDataSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 341F99F01C6B4288001C67B8 /* MWMMapDownloaderSearchDataSource.mm */; };
|
||||
34201E091DC0DC7300D24118 /* libpartners_api.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DDB4BC31DAB98F000F4D021 /* libpartners_api.a */; };
|
||||
34201E0C1DC0E33100D24118 /* libtracking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34201E0B1DC0E33100D24118 /* libtracking.a */; };
|
||||
34257D0D1DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D031DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm */; };
|
||||
34257D0E1DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D031DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm */; };
|
||||
34257D0F1DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 34257D041DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard */; };
|
||||
34257D101DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 34257D041DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard */; };
|
||||
34257D111DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D061DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm */; };
|
||||
34257D121DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D061DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm */; };
|
||||
34257D131DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D081DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm */; };
|
||||
34257D141DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D081DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm */; };
|
||||
34257D151DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D0A1DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm */; };
|
||||
34257D161DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D0A1DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm */; };
|
||||
34257D171DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D0C1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm */; };
|
||||
34257D181DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D0C1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm */; };
|
||||
34257D1B1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D1A1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm */; };
|
||||
34257D1C1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34257D1A1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm */; };
|
||||
342AD76F1B53D30C00E0B997 /* UIButton+RuntimeAttributes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 342AD76E1B53D30C00E0B997 /* UIButton+RuntimeAttributes.mm */; };
|
||||
342AD7721B53D32F00E0B997 /* UIView+RuntimeAttributes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 342AD7711B53D32F00E0B997 /* UIView+RuntimeAttributes.mm */; };
|
||||
342AF0E01BE24E9A0016F3AE /* MWMMapDownloaderViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 342AF0DF1BE24E9A0016F3AE /* MWMMapDownloaderViewController.mm */; };
|
||||
|
@ -293,6 +307,10 @@
|
|||
34BAB6E91BB2DA0C00DB941B /* MWMBottomMenuLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BAB6E81BB2DA0C00DB941B /* MWMBottomMenuLayout.mm */; };
|
||||
34BAB6ED1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BAB6EB1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewCell.mm */; };
|
||||
34BAB6EE1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewPortraitCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BAB6EC1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewPortraitCell.xib */; };
|
||||
34BBB71E1DD07A4B0002E025 /* MWMSearchManager+Filter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BBB71D1DD07A4B0002E025 /* MWMSearchManager+Filter.mm */; };
|
||||
34BBB71F1DD07A4B0002E025 /* MWMSearchManager+Filter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BBB71D1DD07A4B0002E025 /* MWMSearchManager+Filter.mm */; };
|
||||
34BBB7231DD0853B0002E025 /* MWMSearchManager+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BBB7221DD0853B0002E025 /* MWMSearchManager+Layout.mm */; };
|
||||
34BBB7241DD0853B0002E025 /* MWMSearchManager+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BBB7221DD0853B0002E025 /* MWMSearchManager+Layout.mm */; };
|
||||
34BC1E561C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */; };
|
||||
34BC1E571C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */; };
|
||||
34BC72241B0DECAE0012A34B /* MWMMapViewControlsManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC72111B0DECAE0012A34B /* MWMMapViewControlsManager.mm */; };
|
||||
|
@ -329,7 +347,6 @@
|
|||
34CE8A681C7740E100F4351A /* MWMStorage.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34CE8A661C7740E100F4351A /* MWMStorage.mm */; };
|
||||
34CFFE8B1B7DE6FD009D0C9F /* MWMSearchManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34CFFE8A1B7DE6FD009D0C9F /* MWMSearchManager.mm */; };
|
||||
34CFFE8D1B7DE71C009D0C9F /* MWMSearchView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34CFFE8C1B7DE71C009D0C9F /* MWMSearchView.xib */; };
|
||||
34CFFE901B7DE83D009D0C9F /* MWMSearchView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34CFFE8F1B7DE83D009D0C9F /* MWMSearchView.mm */; };
|
||||
34D15BA81BD8F93C00C8BCBE /* AddSetTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34D15BA61BD8F93C00C8BCBE /* AddSetTableViewCell.mm */; };
|
||||
34D15BA91BD8F93C00C8BCBE /* AddSetTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34D15BA71BD8F93C00C8BCBE /* AddSetTableViewCell.xib */; };
|
||||
34D37E171CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34D37E161CD2373C001DEFC3 /* MWMMapDownloaderCellHeader.mm */; };
|
||||
|
@ -574,7 +591,6 @@
|
|||
6741AA2B1BF340DE002C974C /* CircleView.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED48BBB917C2B1E2003E7E92 /* CircleView.mm */; };
|
||||
6741AA2C1BF340DE002C974C /* MWMSearchBookmarksManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 340E10621B949D1900D975D5 /* MWMSearchBookmarksManager.mm */; };
|
||||
6741AA2D1BF340DE002C974C /* AddSetTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34D15BA61BD8F93C00C8BCBE /* AddSetTableViewCell.mm */; };
|
||||
6741AA2E1BF340DE002C974C /* MWMSearchView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34CFFE8F1B7DE83D009D0C9F /* MWMSearchView.mm */; };
|
||||
6741AA2F1BF340DE002C974C /* MWMPlacePageEntity.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6FE2C141B04A44E009814AA /* MWMPlacePageEntity.mm */; };
|
||||
6741AA301BF340DE002C974C /* MWMSearchTextField.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34B82AB11B8344E300180497 /* MWMSearchTextField.mm */; };
|
||||
6741AA321BF340DE002C974C /* FBSDKLoginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34570A401B13229300E6D4FD /* FBSDKLoginKit.framework */; settings = {ATTRIBUTES = (Required, ); }; };
|
||||
|
@ -1003,6 +1019,19 @@
|
|||
341F99EF1C6B4288001C67B8 /* MWMMapDownloaderSearchDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderSearchDataSource.h; sourceTree = "<group>"; };
|
||||
341F99F01C6B4288001C67B8 /* MWMMapDownloaderSearchDataSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderSearchDataSource.mm; sourceTree = "<group>"; };
|
||||
34201E0B1DC0E33100D24118 /* libtracking.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtracking.a; path = "../../../omim-xcode-build/Debug/libtracking.a"; sourceTree = "<group>"; };
|
||||
34257D021DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterPresentationController.h; sourceTree = "<group>"; };
|
||||
34257D031DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterPresentationController.mm; sourceTree = "<group>"; };
|
||||
34257D041DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = MWMSearchFilters.storyboard; sourceTree = "<group>"; };
|
||||
34257D051DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterTransitioning.h; sourceTree = "<group>"; };
|
||||
34257D061DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterTransitioning.mm; sourceTree = "<group>"; };
|
||||
34257D071DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterTransitioningDelegate.h; sourceTree = "<group>"; };
|
||||
34257D081DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterTransitioningDelegate.mm; sourceTree = "<group>"; };
|
||||
34257D091DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterViewController.h; sourceTree = "<group>"; };
|
||||
34257D0A1DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterViewController.mm; sourceTree = "<group>"; };
|
||||
34257D0B1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchHotelsFilterViewController.h; sourceTree = "<group>"; };
|
||||
34257D0C1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchHotelsFilterViewController.mm; sourceTree = "<group>"; };
|
||||
34257D191DC9FD9400DC5BB9 /* MWMSearchChangeModeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchChangeModeView.h; sourceTree = "<group>"; };
|
||||
34257D1A1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchChangeModeView.mm; sourceTree = "<group>"; };
|
||||
342AD76D1B53D30C00E0B997 /* UIButton+RuntimeAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+RuntimeAttributes.h"; sourceTree = "<group>"; };
|
||||
342AD76E1B53D30C00E0B997 /* UIButton+RuntimeAttributes.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "UIButton+RuntimeAttributes.mm"; sourceTree = "<group>"; };
|
||||
342AD7701B53D32F00E0B997 /* UIView+RuntimeAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+RuntimeAttributes.h"; sourceTree = "<group>"; };
|
||||
|
@ -1140,6 +1169,7 @@
|
|||
348C26041D701B9F00813924 /* MWMHelpController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMHelpController.mm; sourceTree = "<group>"; };
|
||||
348D1DF91C525B8300860465 /* MWMTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMTypes.h; sourceTree = "<group>"; };
|
||||
348E57981B0F49D8000FA02A /* maps.me dbg.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "maps.me dbg.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
348E836B1DD0B5FE009A4B2D /* MWMSearchFilterViewController_Protected.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterViewController_Protected.h; sourceTree = "<group>"; };
|
||||
3490D2D91CE9DD2500D0B838 /* MWMSideButtons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSideButtons.h; sourceTree = "<group>"; };
|
||||
3490D2DA1CE9DD2500D0B838 /* MWMSideButtons.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSideButtons.mm; sourceTree = "<group>"; };
|
||||
3490D2DB1CE9DD2500D0B838 /* MWMSideButtonsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSideButtonsView.h; sourceTree = "<group>"; };
|
||||
|
@ -1251,6 +1281,10 @@
|
|||
34BAB6EA1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMBottomMenuCollectionViewCell.h; sourceTree = "<group>"; };
|
||||
34BAB6EB1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMBottomMenuCollectionViewCell.mm; sourceTree = "<group>"; };
|
||||
34BAB6EC1BB2DFCE00DB941B /* MWMBottomMenuCollectionViewPortraitCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMBottomMenuCollectionViewPortraitCell.xib; sourceTree = "<group>"; };
|
||||
34BBB71C1DD07A4B0002E025 /* MWMSearchManager+Filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MWMSearchManager+Filter.h"; sourceTree = "<group>"; };
|
||||
34BBB71D1DD07A4B0002E025 /* MWMSearchManager+Filter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMSearchManager+Filter.mm"; sourceTree = "<group>"; };
|
||||
34BBB7211DD0853B0002E025 /* MWMSearchManager+Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MWMSearchManager+Layout.h"; sourceTree = "<group>"; };
|
||||
34BBB7221DD0853B0002E025 /* MWMSearchManager+Layout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMSearchManager+Layout.mm"; sourceTree = "<group>"; };
|
||||
34BC1E551C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursCommon.mm; sourceTree = "<group>"; };
|
||||
34BC72101B0DECAE0012A34B /* MWMMapViewControlsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapViewControlsManager.h; sourceTree = "<group>"; };
|
||||
34BC72111B0DECAE0012A34B /* MWMMapViewControlsManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMMapViewControlsManager.mm; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||
|
@ -1292,8 +1326,6 @@
|
|||
34CFFE891B7DE6FD009D0C9F /* MWMSearchManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchManager.h; sourceTree = "<group>"; };
|
||||
34CFFE8A1B7DE6FD009D0C9F /* MWMSearchManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMSearchManager.mm; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||
34CFFE8C1B7DE71C009D0C9F /* MWMSearchView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMSearchView.xib; sourceTree = "<group>"; };
|
||||
34CFFE8E1B7DE83D009D0C9F /* MWMSearchView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchView.h; sourceTree = "<group>"; };
|
||||
34CFFE8F1B7DE83D009D0C9F /* MWMSearchView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchView.mm; sourceTree = "<group>"; };
|
||||
34D15BA51BD8F93C00C8BCBE /* AddSetTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddSetTableViewCell.h; sourceTree = "<group>"; };
|
||||
34D15BA61BD8F93C00C8BCBE /* AddSetTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AddSetTableViewCell.mm; sourceTree = "<group>"; };
|
||||
34D15BA71BD8F93C00C8BCBE /* AddSetTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AddSetTableViewCell.xib; sourceTree = "<group>"; };
|
||||
|
@ -2087,6 +2119,25 @@
|
|||
path = DataSources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
34257D011DC9FB0D00DC5BB9 /* Filters */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
34257D021DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.h */,
|
||||
34257D031DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm */,
|
||||
34257D041DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard */,
|
||||
34257D051DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.h */,
|
||||
34257D061DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm */,
|
||||
34257D071DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.h */,
|
||||
34257D081DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm */,
|
||||
34257D091DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.h */,
|
||||
348E836B1DD0B5FE009A4B2D /* MWMSearchFilterViewController_Protected.h */,
|
||||
34257D0A1DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm */,
|
||||
34257D0B1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.h */,
|
||||
34257D0C1DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm */,
|
||||
);
|
||||
path = Filters;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
342AF0DD1BE24E7C0016F3AE /* MapDownloader */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -2106,6 +2157,7 @@
|
|||
3436FE7F1D366CA0005CD87B /* Search */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
34257D011DC9FB0D00DC5BB9 /* Filters */,
|
||||
3436FE801D366CDD005CD87B /* MWMSearch.h */,
|
||||
3436FE811D366CDD005CD87B /* MWMSearch.mm */,
|
||||
347D5CA11D376B9F00FA28DD /* MWMSearchObserver.h */,
|
||||
|
@ -2556,9 +2608,11 @@
|
|||
34CC4C051B81F38E00E44C1F /* TabbedView */,
|
||||
34CFFE891B7DE6FD009D0C9F /* MWMSearchManager.h */,
|
||||
34CFFE8A1B7DE6FD009D0C9F /* MWMSearchManager.mm */,
|
||||
34BBB71C1DD07A4B0002E025 /* MWMSearchManager+Filter.h */,
|
||||
34BBB71D1DD07A4B0002E025 /* MWMSearchManager+Filter.mm */,
|
||||
34BBB7211DD0853B0002E025 /* MWMSearchManager+Layout.h */,
|
||||
34BBB7221DD0853B0002E025 /* MWMSearchManager+Layout.mm */,
|
||||
34CFFE8C1B7DE71C009D0C9F /* MWMSearchView.xib */,
|
||||
34CFFE8E1B7DE83D009D0C9F /* MWMSearchView.h */,
|
||||
34CFFE8F1B7DE83D009D0C9F /* MWMSearchView.mm */,
|
||||
3438CDFA1B862F5C0051AA78 /* MWMSearchContentView.h */,
|
||||
3438CDFB1B862F5C0051AA78 /* MWMSearchContentView.mm */,
|
||||
34B82AB01B8344E300180497 /* MWMSearchTextField.h */,
|
||||
|
@ -2566,6 +2620,8 @@
|
|||
348868E91D8721650069BBA3 /* MWMSearchNoResults.h */,
|
||||
348868EA1D8721650069BBA3 /* MWMSearchNoResults.mm */,
|
||||
348868ED1D8721800069BBA3 /* MWMSearchNoResults.xib */,
|
||||
34257D191DC9FD9400DC5BB9 /* MWMSearchChangeModeView.h */,
|
||||
34257D1A1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm */,
|
||||
);
|
||||
path = Search;
|
||||
sourceTree = "<group>";
|
||||
|
@ -3674,6 +3730,7 @@
|
|||
347FD8691C60B2CE002FB65E /* MWMOpeningHoursAddClosedTableViewCell.xib in Resources */,
|
||||
F607C1871C032A8800B53A87 /* resources-hdpi_clear in Resources */,
|
||||
F6CB21641AEFC42800FB8963 /* MWMPlacePageActionBar.xib in Resources */,
|
||||
34257D0F1DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard in Resources */,
|
||||
34F45E901B96E8B100AC93F8 /* MWMSearchTabButtonsView.xib in Resources */,
|
||||
F64F4B6F1B46A5380081A24A /* MWMDownloaderDialogCell.xib in Resources */,
|
||||
3485C0131B85C20E00F7712D /* MWMSearchTableViewController.xib in Resources */,
|
||||
|
@ -3833,6 +3890,7 @@
|
|||
F64D9CA31C899C760063FA30 /* MWMEditorViralAlert.xib in Resources */,
|
||||
6741A9931BF340DE002C974C /* MWMSearchTabButtonsView.xib in Resources */,
|
||||
6741A9951BF340DE002C974C /* MWMDownloaderDialogCell.xib in Resources */,
|
||||
34257D101DC9FB0D00DC5BB9 /* MWMSearchFilters.storyboard in Resources */,
|
||||
6741A9961BF340DE002C974C /* MWMSearchTableViewController.xib in Resources */,
|
||||
F6BD1D241CA412E40047B8E8 /* MWMOsmAuthAlert.xib in Resources */,
|
||||
6741A9981BF340DE002C974C /* resources-xhdpi_clear in Resources */,
|
||||
|
@ -3943,6 +4001,7 @@
|
|||
34B82ADE1B84A4A000180497 /* MWMSearchCommonCell.mm in Sources */,
|
||||
F66A8FA81B09F052001B9C97 /* MWMiPhoneLandscapePlacePage.mm in Sources */,
|
||||
974386DD19373EA400FD5659 /* ToastView.mm in Sources */,
|
||||
34BBB71E1DD07A4B0002E025 /* MWMSearchManager+Filter.mm in Sources */,
|
||||
F6C9343C1AE4F94A00DDC624 /* MWMAnimator.mm in Sources */,
|
||||
347FD8771C60B2CE002FB65E /* MWMOpeningHoursDaysSelectorTableViewCell.mm in Sources */,
|
||||
342EE4111C43DAA7009F6A49 /* MWMAuthorizationWebViewLoginViewController.mm in Sources */,
|
||||
|
@ -3958,6 +4017,7 @@
|
|||
34ABA6161C2D185C00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm in Sources */,
|
||||
34E0EECE1CC51B1D008E4919 /* MWMMapDownloaderButtonTableViewCell.mm in Sources */,
|
||||
3492CC121C6DF00E0057D8E8 /* (null) in Sources */,
|
||||
34257D111DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm in Sources */,
|
||||
34A759CF1DC795140078C3AE /* MWMWhatsNewNightModeController.mm in Sources */,
|
||||
F6BBF2C61B4FFB72000CF8E2 /* MWMLocationAlert.mm in Sources */,
|
||||
F66A8FB01B09F268001B9C97 /* MWMPlacePage.mm in Sources */,
|
||||
|
@ -3985,6 +4045,7 @@
|
|||
34F8ADD91B97229A004184CC /* MWMSearchTableView.mm in Sources */,
|
||||
F653CE1C1C7361DA00A453F1 /* MWMObjectsCategorySelectorController.mm in Sources */,
|
||||
3436FE821D366CDD005CD87B /* MWMSearch.mm in Sources */,
|
||||
34257D171DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm in Sources */,
|
||||
B08AA8DA1A26299A00810B1C /* TimeUtils.mm in Sources */,
|
||||
F6CB216D1AF13EBD00FB8963 /* MWMPlacePageBookmarkCell.mm in Sources */,
|
||||
F653D4231AE9398700282659 /* MWMPlacePageViewManager.mm in Sources */,
|
||||
|
@ -4027,6 +4088,7 @@
|
|||
F6D4A73A1CC1267E00BD4E5B /* MWMNoteCell.mm in Sources */,
|
||||
F6588E2F1B15D2BC00EE1E58 /* MWMBookmarkColorViewController.mm in Sources */,
|
||||
F68FCB851DA7BBA6007CC7D7 /* MWMTaxiPreviewDataSource.mm in Sources */,
|
||||
34257D151DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm in Sources */,
|
||||
34BC1E561C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */,
|
||||
F653CE161C71F60200A453F1 /* MWMAddPlaceNavigationBar.mm in Sources */,
|
||||
A32B6D4D1A14980500E54A65 /* iosOGLContextFactory.mm in Sources */,
|
||||
|
@ -4034,6 +4096,7 @@
|
|||
34B104221D6EE45700C8B577 /* MWMUnitsController.mm in Sources */,
|
||||
347FD8671C60B2CE002FB65E /* MWMOpeningHoursAddClosedTableViewCell.mm in Sources */,
|
||||
FA054612155C465E001F4E37 /* SelectSetVC.mm in Sources */,
|
||||
34257D0D1DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm in Sources */,
|
||||
FAA614B8155F16950031C345 /* AddSetVC.mm in Sources */,
|
||||
34ABA6301C2D58F300FE1BEC /* MWMInputEmailValidator.mm in Sources */,
|
||||
34CC4C121B82120700E44C1F /* MWMSearchTabbedViewLayout.mm in Sources */,
|
||||
|
@ -4066,6 +4129,7 @@
|
|||
348868F31D87DFB70069BBA3 /* MWMKeyboard.mm in Sources */,
|
||||
978F9242183B660F000D6C7C /* SelectableCell.mm in Sources */,
|
||||
34ABA6241C2D551900FE1BEC /* MWMInputValidatorFactory.mm in Sources */,
|
||||
34257D1B1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm in Sources */,
|
||||
34B82AE21B84AC5E00180497 /* MWMSearchCategoriesManager.mm in Sources */,
|
||||
34CE8A671C7740E100F4351A /* MWMStorage.mm in Sources */,
|
||||
F6F7787A1DABC6D800B603E7 /* MWMTaxiCollectionLayout.mm in Sources */,
|
||||
|
@ -4086,6 +4150,7 @@
|
|||
3491E7CB1C06F1F10042FE24 /* MWMPlacePageButtonCell.mm in Sources */,
|
||||
348C26051D701B9F00813924 /* MWMHelpController.mm in Sources */,
|
||||
348868EB1D8721650069BBA3 /* MWMSearchNoResults.mm in Sources */,
|
||||
34BBB7231DD0853B0002E025 /* MWMSearchManager+Layout.mm in Sources */,
|
||||
341F99D91C6B1165001C67B8 /* MWMMapDownloaderPlaceTableViewCell.mm in Sources */,
|
||||
34A759D01DC795140078C3AE /* MWMWhatsNewProfileBookingController.mm in Sources */,
|
||||
345FD7E71CEC7D8400F58045 /* MWMEditorAdditionalNamesHeader.mm in Sources */,
|
||||
|
@ -4093,6 +4158,7 @@
|
|||
347FD86F1C60B2CE002FB65E /* MWMOpeningHoursAllDayTableViewCell.mm in Sources */,
|
||||
F6ED13541B1643900095C6DE /* MWMDirectionView.mm in Sources */,
|
||||
3400A6811CA29D7D003DA0EC /* NSString+Categories.mm in Sources */,
|
||||
34257D131DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm in Sources */,
|
||||
F63774EA1B59376F00BCF54D /* MWMRoutingDisclaimerAlert.mm in Sources */,
|
||||
34E273211C737A4100463965 /* MWMMigrationViewController.mm in Sources */,
|
||||
F64F19A31AB81A00006EAF7E /* MWMDownloadTransitMapAlert.mm in Sources */,
|
||||
|
@ -4119,7 +4185,6 @@
|
|||
34A759CA1DC795140078C3AE /* MWMWelcomeController.mm in Sources */,
|
||||
34D15BA81BD8F93C00C8BCBE /* AddSetTableViewCell.mm in Sources */,
|
||||
F6A218491CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
||||
34CFFE901B7DE83D009D0C9F /* MWMSearchView.mm in Sources */,
|
||||
F62F1D951C3281F1006CF38E /* UIImageView+Coloring.mm in Sources */,
|
||||
F6FE2C151B04A44E009814AA /* MWMPlacePageEntity.mm in Sources */,
|
||||
34B82AB21B8344E300180497 /* MWMSearchTextField.mm in Sources */,
|
||||
|
@ -4191,6 +4256,7 @@
|
|||
6741A9CA1BF340DE002C974C /* MWMAnimator.mm in Sources */,
|
||||
3499C6871D51D3A700A1048A /* UIButton+Orientation.mm in Sources */,
|
||||
6741A9CB1BF340DE002C974C /* MWMSearchContentView.mm in Sources */,
|
||||
34BBB71F1DD07A4B0002E025 /* MWMSearchManager+Filter.mm in Sources */,
|
||||
347FD8781C60B2CE002FB65E /* MWMOpeningHoursDaysSelectorTableViewCell.mm in Sources */,
|
||||
34A759D91DC795D10078C3AE /* MWMWhatsNewUberController.mm in Sources */,
|
||||
342EE4121C43DAA7009F6A49 /* MWMAuthorizationWebViewLoginViewController.mm in Sources */,
|
||||
|
@ -4206,6 +4272,7 @@
|
|||
6741A9CF1BF340DE002C974C /* MWMLocationAlert.mm in Sources */,
|
||||
34ABA62D1C2D57D500FE1BEC /* MWMInputPasswordValidator.mm in Sources */,
|
||||
F6D1A0B21D76E33D0070A015 /* MWMPlacePageData.mm in Sources */,
|
||||
34257D121DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioning.mm in Sources */,
|
||||
34ABA6171C2D185C00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm in Sources */,
|
||||
6741A9D01BF340DE002C974C /* MWMPlacePage.mm in Sources */,
|
||||
3492CC131C6DF00F0057D8E8 /* (null) in Sources */,
|
||||
|
@ -4233,6 +4300,7 @@
|
|||
34A759E41DC797CE0078C3AE /* MWMPageControllerDataSource.mm in Sources */,
|
||||
6741A9E01BF340DE002C974C /* MWMDownloaderDialogHeader.mm in Sources */,
|
||||
6741A9E11BF340DE002C974C /* MWMSearchTableView.mm in Sources */,
|
||||
34257D181DC9FB0D00DC5BB9 /* MWMSearchHotelsFilterViewController.mm in Sources */,
|
||||
6741A9E31BF340DE002C974C /* TimeUtils.mm in Sources */,
|
||||
341F99EE1C6B28A7001C67B8 /* MWMMapDownloaderExtendedDataSource.mm in Sources */,
|
||||
3436FE831D366CDD005CD87B /* MWMSearch.mm in Sources */,
|
||||
|
@ -4275,6 +4343,7 @@
|
|||
F6E2B00E1D9E944600793C36 /* MWMPPView.mm in Sources */,
|
||||
34BC1E571C2ADBD3009BBF51 /* MWMOpeningHoursCommon.mm in Sources */,
|
||||
F6381BF61CD12045004CA943 /* LocaleTranslator.mm in Sources */,
|
||||
34257D161DC9FB0D00DC5BB9 /* MWMSearchFilterViewController.mm in Sources */,
|
||||
F6D4A73B1CC1267E00BD4E5B /* MWMNoteCell.mm in Sources */,
|
||||
F68FCB861DA7BBA6007CC7D7 /* MWMTaxiPreviewDataSource.mm in Sources */,
|
||||
347FD8681C60B2CE002FB65E /* MWMOpeningHoursAddClosedTableViewCell.mm in Sources */,
|
||||
|
@ -4282,6 +4351,7 @@
|
|||
6741AA011BF340DE002C974C /* MWMSearchTabbedViewLayout.mm in Sources */,
|
||||
349C3AED1D33A933002AC7A9 /* MWMNavigationInfoView.mm in Sources */,
|
||||
34B104231D6EE45700C8B577 /* MWMUnitsController.mm in Sources */,
|
||||
34257D0E1DC9FB0D00DC5BB9 /* MWMSearchFilterPresentationController.mm in Sources */,
|
||||
6741AA021BF340DE002C974C /* BookmarksRootVC.mm in Sources */,
|
||||
6741AA031BF340DE002C974C /* MWMActivityViewController.mm in Sources */,
|
||||
34DDD5341BFDB0B600407F2F /* MWMMapDownloaderViewController.mm in Sources */,
|
||||
|
@ -4314,6 +4384,7 @@
|
|||
6741AA131BF340DE002C974C /* UIColor+MapsMeColor.mm in Sources */,
|
||||
34ABA6251C2D551900FE1BEC /* MWMInputValidatorFactory.mm in Sources */,
|
||||
348868F41D87DFB70069BBA3 /* MWMKeyboard.mm in Sources */,
|
||||
34257D1C1DC9FD9400DC5BB9 /* MWMSearchChangeModeView.mm in Sources */,
|
||||
F639883C1CF70FE500226B6B /* MWMActionBarButton.mm in Sources */,
|
||||
34CE8A681C7740E100F4351A /* MWMStorage.mm in Sources */,
|
||||
6741AA141BF340DE002C974C /* MWMMultilineLabel.mm in Sources */,
|
||||
|
@ -4334,6 +4405,7 @@
|
|||
6741AA1D1BF340DE002C974C /* MWMDownloadTransitMapAlert.mm in Sources */,
|
||||
341F99DA1C6B1165001C67B8 /* MWMMapDownloaderPlaceTableViewCell.mm in Sources */,
|
||||
341F99D61C6B1165001C67B8 /* MWMMapDownloaderLargeCountryTableViewCell.mm in Sources */,
|
||||
34BBB7241DD0853B0002E025 /* MWMSearchManager+Layout.mm in Sources */,
|
||||
348C26061D701B9F00813924 /* MWMHelpController.mm in Sources */,
|
||||
348868EC1D8721650069BBA3 /* MWMSearchNoResults.mm in Sources */,
|
||||
6741AA1E1BF340DE002C974C /* LinkCell.mm in Sources */,
|
||||
|
@ -4341,6 +4413,7 @@
|
|||
347FD8701C60B2CE002FB65E /* MWMOpeningHoursAllDayTableViewCell.mm in Sources */,
|
||||
6741AA1F1BF340DE002C974C /* MWMSearchBookmarksCell.mm in Sources */,
|
||||
34E273221C737A4100463965 /* MWMMigrationViewController.mm in Sources */,
|
||||
34257D141DC9FB0D00DC5BB9 /* MWMSearchFilterTransitioningDelegate.mm in Sources */,
|
||||
3400A6821CA29D7D003DA0EC /* NSString+Categories.mm in Sources */,
|
||||
341F99E91C6B119E001C67B8 /* MWMMapDownloaderDefaultDataSource.mm in Sources */,
|
||||
6741AA221BF340DE002C974C /* MWMNavigationView.mm in Sources */,
|
||||
|
@ -4368,7 +4441,6 @@
|
|||
6741AA2C1BF340DE002C974C /* MWMSearchBookmarksManager.mm in Sources */,
|
||||
F6A2184A1CA3F26800BE2CC6 /* MWMEditorViralActivityItem.mm in Sources */,
|
||||
6741AA2D1BF340DE002C974C /* AddSetTableViewCell.mm in Sources */,
|
||||
6741AA2E1BF340DE002C974C /* MWMSearchView.mm in Sources */,
|
||||
6741AA2F1BF340DE002C974C /* MWMPlacePageEntity.mm in Sources */,
|
||||
34A759E31DC797CB0078C3AE /* MWMPageController.mm in Sources */,
|
||||
6741AA301BF340DE002C974C /* MWMSearchTextField.mm in Sources */,
|
||||
|
|
Loading…
Add table
Reference in a new issue