[ios] display a list of downloaded categories

This commit is contained in:
Alexey Belousov 2018-06-16 03:27:10 +03:00 committed by Vlad Mihaylenko
parent 4856f9c5d0
commit 24ab5eefb0
25 changed files with 393 additions and 81 deletions

View file

@ -0,0 +1,33 @@
class CatalogCategoryCell: UITableViewCell {
@IBOutlet weak var visibleCheckmark: Checkmark! {
didSet {
visibleCheckmark.offTintColor = .blackHintText()
visibleCheckmark.onTintColor = .linkBlue()
}
}
@IBOutlet weak var titleLabel: UILabel! {
didSet {
titleLabel.font = .regular16()
titleLabel.textColor = .blackPrimaryText()
}
}
@IBOutlet weak var subtitleLabel: UILabel! {
didSet {
subtitleLabel.font = .regular14()
subtitleLabel.textColor = .blackSecondaryText()
}
}
@IBOutlet weak var moreButton: UIButton!
@IBAction func onVisibleChanged(_ sender: Checkmark) {
}
@IBAction func onMoreButton(_ sender: UIButton) {
}
func update(with category: MWMCatalogCategory) {
titleLabel.text = category.title
subtitleLabel.text = "\(category.bookmarksCount) places • by \(category.author ?? "")"
visibleCheckmark.isChecked = category.isVisible
}
}

View file

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="CatalogCategoryCell" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="60"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="320" height="59.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="TYb-q4-3hJ" customClass="Checkmark" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="56" height="60"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="gNZ-kZ-bfY"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="image" keyPath="offImage" value="radioBtnOff"/>
<userDefinedRuntimeAttribute type="image" keyPath="onImage" value="radioBtnOn"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onVisibleChanged:" destination="KGk-i7-Jjw" eventType="valueChanged" id="phf-eN-eSI"/>
</connections>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9gp-G7-fer">
<rect key="frame" x="56" y="8" width="208" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DlK-AV-gvk">
<rect key="frame" x="56" y="33" width="208" height="19"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Uym-iO-PUK">
<rect key="frame" x="264" y="0.0" width="56" height="60"/>
<constraints>
<constraint firstAttribute="width" constant="56" id="MHu-fs-l19"/>
</constraints>
<state key="normal" image="ic24PxMore"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="tintColorName" value="blackSecondaryText"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onMoreButton:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="SQV-hf-5f6"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="DlK-AV-gvk" firstAttribute="leading" secondItem="TYb-q4-3hJ" secondAttribute="trailing" id="6iy-4T-op1"/>
<constraint firstItem="Uym-iO-PUK" firstAttribute="leading" secondItem="DlK-AV-gvk" secondAttribute="trailing" id="C2c-q6-XLQ"/>
<constraint firstItem="TYb-q4-3hJ" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="KIN-eE-1dv"/>
<constraint firstAttribute="bottom" secondItem="TYb-q4-3hJ" secondAttribute="bottom" constant="-0.5" id="Mfy-Hf-GCo"/>
<constraint firstAttribute="bottom" secondItem="Uym-iO-PUK" secondAttribute="bottom" constant="-0.5" id="QfH-v8-SbY"/>
<constraint firstItem="Uym-iO-PUK" firstAttribute="leading" secondItem="9gp-G7-fer" secondAttribute="trailing" id="VOq-lS-OVx"/>
<constraint firstItem="9gp-G7-fer" firstAttribute="leading" secondItem="TYb-q4-3hJ" secondAttribute="trailing" id="Xme-W9-A4y"/>
<constraint firstAttribute="trailing" secondItem="Uym-iO-PUK" secondAttribute="trailing" id="bQT-gf-HGR"/>
<constraint firstItem="DlK-AV-gvk" firstAttribute="top" secondItem="9gp-G7-fer" secondAttribute="bottom" constant="4" id="bqJ-pJ-fN2"/>
<constraint firstItem="Uym-iO-PUK" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="hhn-Df-SPi"/>
<constraint firstItem="9gp-G7-fer" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="8" id="hs7-rh-zCp"/>
<constraint firstAttribute="bottom" secondItem="DlK-AV-gvk" secondAttribute="bottom" constant="8" id="kL6-qB-Ltr"/>
<constraint firstItem="TYb-q4-3hJ" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" id="tbN-ht-fVP"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
<connections>
<outlet property="moreButton" destination="Uym-iO-PUK" id="4r9-6m-ydT"/>
<outlet property="subtitleLabel" destination="DlK-AV-gvk" id="lLy-5A-oCH"/>
<outlet property="titleLabel" destination="9gp-G7-fer" id="Ubj-0i-YWi"/>
<outlet property="visibleCheckmark" destination="TYb-q4-3hJ" id="EdR-5o-6bz"/>
</connections>
</tableViewCell>
</objects>
<resources>
<image name="ic24PxMore" width="24" height="24"/>
<image name="radioBtnOff" width="22" height="22"/>
<image name="radioBtnOn" width="22" height="22"/>
</resources>
</document>

View file

@ -0,0 +1,17 @@
class DownloadedBookmarksDataSource {
private var categories: [MWMCatalogCategory] = []
var categoriesCount: NSInteger {
get {
return categories.count
}
}
init() {
categories = MWMBookmarksManager.categoriesFromCatalog()
}
func category(at index: Int) -> MWMCatalogCategory {
return categories[index]
}
}

View file

@ -3,27 +3,43 @@ class DownloadedBookmarksViewController: UITableViewController {
@IBOutlet weak var topView: UIView!
@IBOutlet weak var bottomView: UIView!
let dataSource = DownloadedBookmarksDataSource()
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableHeaderView = topView
if dataSource.categoriesCount == 0 {
tableView.tableHeaderView = topView
}
tableView.tableFooterView = bottomView
tableView.registerNib(cell: CatalogCategoryCell.self)
tableView.registerNibForHeaderFooterView(BMCCategoriesHeader.self)
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 0
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
return dataSource.categoriesCount
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
let cell = tableView.dequeueReusableCell(cell: CatalogCategoryCell.self, indexPath: indexPath)
cell.update(with: dataSource.category(at: indexPath.row))
return cell
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 48
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = tableView.dequeueReusableHeaderFooterView(BMCCategoriesHeader.self)
headerView.isShowAll = true
headerView.delegate = self
return headerView
}
@IBAction func onDownloadBookmarks(_ sender: Any) {
if let url = MWMBookmarksManager.catalogFrontendUrl(),
@ -33,3 +49,19 @@ class DownloadedBookmarksViewController: UITableViewController {
}
}
}
extension DownloadedBookmarksViewController: BMCCategoryCellDelegate {
func visibilityAction(category: BMCCategory) {
}
func moreAction(category: BMCCategory, anchor: UIView) {
}
}
extension DownloadedBookmarksViewController: BMCCategoriesHeaderDelegate {
func visibilityAction(isShowAll: Bool) {
}
}

View file

@ -18,10 +18,10 @@
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="i5M-Pr-FkT">
<tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" bouncesZoom="NO" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<viewLayoutGuide key="safeArea" id="vLr-E1-eTs"/>
<connections>
<outlet property="dataSource" destination="-1" id="Tng-2m-Rnh"/>
@ -58,7 +58,7 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="mHu-Y0-fCQ" firstAttribute="bottom" secondItem="Yjf-3F-Ewf" secondAttribute="bottom" constant="16" id="9ps-Bp-5C5"/>
<constraint firstItem="Yjf-3F-Ewf" firstAttribute="leading" secondItem="mHu-Y0-fCQ" secondAttribute="leading" constant="16" id="LCM-df-yqM"/>
@ -96,7 +96,7 @@
</userDefinedRuntimeAttributes>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="1gY-vv-QfN" firstAttribute="trailing" secondItem="13b-uj-bGK" secondAttribute="trailing" id="24k-XV-fh7"/>
<constraint firstItem="13b-uj-bGK" firstAttribute="leading" secondItem="jiO-QA-gWD" secondAttribute="leading" constant="16" id="JLq-wb-chA"/>

View file

@ -0,0 +1,8 @@
#import "MWMCatalogCategory.h"
#include "Framework.h"
@interface MWMCatalogCategory (Convenience)
- (instancetype)initWithCategoryData:(kml::CategoryData &)categoryData bookmarksCount:(UInt64)count;
@end

View file

@ -0,0 +1,21 @@
#import "MWMCatalogCategory+Convenience.h"
@implementation MWMCatalogCategory (Convenience)
- (instancetype)initWithCategoryData:(kml::CategoryData &)categoryData bookmarksCount:(UInt64)count {
self = [self init];
if (self)
{
self.categoryId = categoryData.m_id;
self.title = @(kml::GetDefaultStr(categoryData.m_name).c_str());
self.bookmarksCount = count;
self.visible = categoryData.m_visible;
self.author = @(categoryData.m_authorName.c_str());
self.annotation = @(kml::GetDefaultStr(categoryData.m_annotation).c_str());
self.detailedAnnotation = @(kml::GetDefaultStr(categoryData.m_description).c_str());
}
return self;
}
@end

View file

@ -0,0 +1,14 @@
#import <Foundation/Foundation.h>
@interface MWMCatalogCategory : NSObject
@property (nonatomic) MWMMarkGroupID categoryId;
@property (copy, nonatomic) NSString * title;
@property (copy, nonatomic) NSString * author;
@property (copy, nonatomic) NSString * annotation;
@property (copy, nonatomic) NSString * detailedAnnotation;
@property (nonatomic) NSInteger bookmarksCount;
@property (nonatomic, getter=isVisible) BOOL visible;
@end

View file

@ -0,0 +1,5 @@
#import "MWMCatalogCategory.h"
@implementation MWMCatalogCategory
@end

View file

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="BMCActionsCreateCell" customModule="maps_me" customModuleProvider="target" propertyAccessControl="all">
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="KGk-i7-Jjw" customClass="BMCActionsCreateCell" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
@ -43,7 +43,6 @@
<constraint firstItem="2jJ-Pu-pjy" firstAttribute="centerY" secondItem="YDi-5J-vFD" secondAttribute="centerY" id="h3L-zB-b66"/>
<constraint firstItem="paw-km-zXg" firstAttribute="leading" secondItem="YDi-5J-vFD" secondAttribute="leading" constant="16" id="hTc-Pj-9Kf"/>
<constraint firstItem="2jJ-Pu-pjy" firstAttribute="leading" secondItem="paw-km-zXg" secondAttribute="trailing" constant="16" id="maj-Zr-I2l"/>
<constraint firstAttribute="height" constant="44" id="rhS-LZ-kol"/>
</constraints>
</view>
</subviews>

View file

@ -15,6 +15,7 @@ final class BMCViewController: MWMViewController {
BMCActionsCreateCell.self,
BMCNotificationsCell.self,
])
tableView.registerNibForHeaderFooterView(BMCCategoriesHeader.self)
}
}
@ -24,12 +25,6 @@ final class BMCViewController: MWMViewController {
}
}
@IBOutlet private var categoriesHeader: BMCCategoriesHeader! {
didSet {
categoriesHeader.delegate = self
}
}
@IBOutlet private var actionsHeader: UIView!
@IBOutlet private var notificationsHeader: BMCNotificationsHeader!
@ -249,7 +244,9 @@ extension BMCViewController: UITableViewDelegate {
switch viewModel.sectionType(section: section) {
case .permissions: return permissionsHeader
case .categories:
let categoriesHeader = tableView.dequeueReusableHeaderFooterView(BMCCategoriesHeader.self)
categoriesHeader.isShowAll = viewModel.areAllCategoriesInvisible()
categoriesHeader.delegate = self
return categoriesHeader
case .actions: return actionsHeader
case .notifications: return notificationsHeader
@ -292,6 +289,7 @@ extension BMCViewController: BMCPermissionsCellDelegate {
extension BMCViewController: BMCCategoryCellDelegate {
func visibilityAction(category: BMCCategory) {
viewModel.updateCategoryVisibility(category: category)
let categoriesHeader = tableView.headerView(forSection: viewModel.sectionIndex(section: .categories)) as! BMCCategoriesHeader
categoriesHeader.isShowAll = viewModel.areAllCategoriesInvisible()
}
@ -320,6 +318,7 @@ extension BMCViewController: BMCPermissionsHeaderDelegate {
extension BMCViewController: BMCCategoriesHeaderDelegate {
func visibilityAction(isShowAll: Bool) {
viewModel.updateAllCategoriesVisibility(isShowAll: isShowAll)
let categoriesHeader = tableView.headerView(forSection: viewModel.sectionIndex(section: .categories)) as! BMCCategoriesHeader
categoriesHeader.isShowAll = viewModel.areAllCategoriesInvisible()
}
}

View file

@ -13,7 +13,6 @@
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="BMCViewController" customModule="maps_me" customModuleProvider="target">
<connections>
<outlet property="actionsHeader" destination="DhR-7O-ccQ" id="PPD-Ov-b69"/>
<outlet property="categoriesHeader" destination="7vF-P7-dID" id="ITV-Gt-Hq9"/>
<outlet property="notificationsHeader" destination="G0o-Op-zPp" id="PUK-3H-1q3"/>
<outlet property="permissionsHeader" destination="JS4-5h-4t1" id="SNP-yf-fbK"/>
<outlet property="tableView" destination="2ia-hi-UhQ" id="qJG-eV-PoF"/>
@ -108,53 +107,6 @@
</connections>
<point key="canvasLocation" x="482.5" y="-256"/>
</view>
<view contentMode="scaleToFill" id="7vF-P7-dID" customClass="BMCCategoriesHeader" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sv4-Wg-K1m">
<rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1W2-mD-BVK">
<rect key="frame" x="16" y="13" width="42" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JVu-ay-TFe">
<rect key="frame" x="361" y="0.0" width="14" height="48"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="14" maxY="0.0"/>
<connections>
<action selector="buttonAction" destination="7vF-P7-dID" eventType="touchUpInside" id="lct-Zb-Kp2"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="JVu-ay-TFe" firstAttribute="top" secondItem="sv4-Wg-K1m" secondAttribute="top" id="2Q9-Di-gao"/>
<constraint firstAttribute="trailing" secondItem="JVu-ay-TFe" secondAttribute="trailing" id="KIx-2a-nNg"/>
<constraint firstItem="1W2-mD-BVK" firstAttribute="centerY" secondItem="sv4-Wg-K1m" secondAttribute="centerY" id="OAv-W6-rZH"/>
<constraint firstAttribute="bottom" secondItem="JVu-ay-TFe" secondAttribute="bottom" id="TkC-ge-8MO"/>
<constraint firstItem="1W2-mD-BVK" firstAttribute="leading" secondItem="sv4-Wg-K1m" secondAttribute="leading" constant="16" id="cad-o8-xir"/>
<constraint firstItem="JVu-ay-TFe" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1W2-mD-BVK" secondAttribute="trailing" constant="4" id="gDO-lh-aI1"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="sv4-Wg-K1m" firstAttribute="leading" secondItem="8ge-Sy-Y71" secondAttribute="leading" id="5Lw-3V-bwA"/>
<constraint firstItem="8ge-Sy-Y71" firstAttribute="bottom" secondItem="sv4-Wg-K1m" secondAttribute="bottom" id="Sn0-II-lrv"/>
<constraint firstItem="8ge-Sy-Y71" firstAttribute="trailing" secondItem="sv4-Wg-K1m" secondAttribute="trailing" id="TX6-c7-3GF"/>
<constraint firstItem="sv4-Wg-K1m" firstAttribute="top" secondItem="8ge-Sy-Y71" secondAttribute="top" id="fpS-lQ-tKT"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="8ge-Sy-Y71"/>
<connections>
<outlet property="button" destination="JVu-ay-TFe" id="NvE-E2-iLL"/>
<outlet property="label" destination="1W2-mD-BVK" id="OxC-ur-rcv"/>
</connections>
<point key="canvasLocation" x="483" y="-148"/>
</view>
<view contentMode="scaleToFill" id="DhR-7O-ccQ">
<rect key="frame" x="0.0" y="0.0" width="375" height="24"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

View file

@ -2,7 +2,7 @@ protocol BMCCategoriesHeaderDelegate {
func visibilityAction(isShowAll: Bool)
}
final class BMCCategoriesHeader: UIView {
final class BMCCategoriesHeader: UITableViewHeaderFooterView {
@IBOutlet private weak var label: UILabel! {
didSet {
label.font = .bold14()
@ -27,9 +27,9 @@ final class BMCCategoriesHeader: UIView {
}
}
var delegate: BMCCategoriesHeaderDelegate!
var delegate: BMCCategoriesHeaderDelegate?
@IBAction private func buttonAction() {
delegate.visibilityAction(isShowAll: isShowAll)
delegate?.visibilityAction(isShowAll: isShowAll)
}
}

View file

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="hpL-he-7N6" customClass="BMCCategoriesHeader" customModule="maps_me" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qNi-Yh-Bat">
<rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PGC-cy-M2K">
<rect key="frame" x="16" y="13" width="42" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3hn-pU-MI1">
<rect key="frame" x="302" y="0.0" width="73" height="48"/>
<inset key="contentEdgeInsets" minX="0.0" minY="0.0" maxX="14" maxY="0.0"/>
<state key="normal" title="Show All"/>
<connections>
<action selector="buttonAction" destination="hpL-he-7N6" eventType="touchUpInside" id="mQo-HU-GKM"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="PGC-cy-M2K" firstAttribute="leading" secondItem="qNi-Yh-Bat" secondAttribute="leading" constant="16" id="2OC-uL-Mgr"/>
<constraint firstItem="PGC-cy-M2K" firstAttribute="centerY" secondItem="qNi-Yh-Bat" secondAttribute="centerY" id="44v-Uo-bj7"/>
<constraint firstAttribute="trailing" secondItem="3hn-pU-MI1" secondAttribute="trailing" id="HNq-6x-QDD"/>
<constraint firstAttribute="bottom" secondItem="3hn-pU-MI1" secondAttribute="bottom" id="VCh-vb-yPn"/>
<constraint firstItem="3hn-pU-MI1" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="PGC-cy-M2K" secondAttribute="trailing" constant="4" id="hGm-gr-ABM"/>
<constraint firstItem="3hn-pU-MI1" firstAttribute="top" secondItem="qNi-Yh-Bat" secondAttribute="top" id="thZ-ah-uC2"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="aw1-gI-QsW" firstAttribute="trailing" secondItem="qNi-Yh-Bat" secondAttribute="trailing" id="4t4-Hg-Xce"/>
<constraint firstItem="aw1-gI-QsW" firstAttribute="bottom" secondItem="qNi-Yh-Bat" secondAttribute="bottom" id="Ptg-FC-sav"/>
<constraint firstItem="qNi-Yh-Bat" firstAttribute="leading" secondItem="aw1-gI-QsW" secondAttribute="leading" id="XuM-Ot-YqM"/>
<constraint firstItem="qNi-Yh-Bat" firstAttribute="top" secondItem="aw1-gI-QsW" secondAttribute="top" id="cp0-ul-dGE"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="aw1-gI-QsW"/>
<connections>
<outlet property="button" destination="3hn-pU-MI1" id="aAd-Ov-dIM"/>
<outlet property="label" destination="PGC-cy-M2K" id="D2m-ae-X57"/>
</connections>
<point key="canvasLocation" x="483" y="-148"/>
</view>
</objects>
</document>

View file

@ -36,20 +36,20 @@ final class BMCCategoryCell: MWMTableViewCell {
}
}
private var delegate: BMCCategoryCellDelegate!
private var delegate: BMCCategoryCellDelegate?
func config(category: BMCCategory, delegate: BMCCategoryCellDelegate) -> UITableViewCell {
func config(category: BMCCategory, delegate: BMCCategoryCellDelegate?) -> UITableViewCell {
self.category = category
self.delegate = delegate
return self
}
@IBAction private func visibilityAction() {
delegate.visibilityAction(category: category)
delegate?.visibilityAction(category: category)
}
@IBAction private func moreAction() {
delegate.moreAction(category: category, anchor: more)
delegate?.moreAction(category: category, anchor: more)
}
}

View file

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>

View file

@ -15,7 +15,7 @@ final class BMCPermissionsCell: MWMTableViewCell {
button.setTitleColor(UIColor.whitePrimaryText(), for: .normal)
button.setTitleColor(UIColor.whitePrimaryTextHighlighted(), for: .highlighted)
button.setBackgroundColor(.linkBlue(), for: .normal)
button.titleLabel?.font = .regular14()
button.titleLabel?.font = .medium14()
button.layer.cornerRadius = 6
button.clipsToBounds = true
}

View file

@ -74,3 +74,4 @@
#import "UIFont+MapsMeFonts.h"
#import "UIViewController+Navigation.h"
#import "WebViewController.h"
#import "MWMCatalogCategory.h"

View file

@ -10,6 +10,8 @@
- (NSString *)backgroundHighlightedColorName;
- (void)setBackgroundSelectedColorName:(NSString *)colorName;
- (NSString *)backgroundSelectedColorName;
- (void)setTintColorName:(NSString *)colorName;
- (NSString *)tintColorName;
- (void)setBackgroundColor:(UIColor *)color forState:(UIControlState)state;

View file

@ -72,6 +72,18 @@
return objc_getAssociatedObject(self, @selector(backgroundSelectedColorName));
}
- (void)setTintColorName:(NSString *)colorName
{
objc_setAssociatedObject(self, @selector(tintColorName), colorName,
OBJC_ASSOCIATION_COPY_NONATOMIC);
[self setTintColor:[UIColor colorWithName:colorName]];
}
- (NSString *)tintColorName
{
return objc_getAssociatedObject(self, @selector(tintColorName));
}
- (void)setBackgroundColor:(UIColor *)color forState:(UIControlState)state
{
[self setBackgroundColor:UIColor.clearColor];

View file

@ -30,4 +30,12 @@ extension UITableView {
func dequeueReusableCell<Cell>(cell: Cell.Type, indexPath: IndexPath) -> Cell where Cell: UITableViewCell {
return dequeueReusableCell(withIdentifier: toString(cell), for: indexPath) as! Cell
}
func registerNibForHeaderFooterView<View>(_ view: View.Type) where View: UIView {
register(UINib(view), forHeaderFooterViewReuseIdentifier: toString(view))
}
func dequeueReusableHeaderFooterView<View>(_ view: View.Type) -> View where View: UIView {
return dequeueReusableHeaderFooterView(withIdentifier: toString(view)) as! View
}
}

View file

@ -73,9 +73,9 @@ class Checkmark: UIControl {
switch contentHorizontalAlignment {
case .right: fallthrough
case .trailing:
left = bounds.width - imageView.width
left = floor(bounds.width - imageView.width)
case .center:
left = floor(bounds.width - width) / 2
left = floor((bounds.width - width) / 2)
case .fill:
width = bounds.width
default:
@ -86,9 +86,9 @@ class Checkmark: UIControl {
case .top:
top = 0
case .bottom:
top = bounds.height - height
top = floor(bounds.height - height)
case .center:
top = floor(bounds.height - height) / 2
top = floor((bounds.height - height) / 2)
case .fill:
height = bounds.height
}

View file

@ -1,6 +1,8 @@
#import "MWMBookmarksObserver.h"
#import "MWMTypes.h"
@class MWMCatalogCategory;
@interface MWMBookmarksManager : NSObject
+ (void)addObserver:(id<MWMBookmarksObserver>)observer;
@ -48,6 +50,8 @@
+ (void)downloadItemWithId:(NSString * _Nonnull)itemId
name:(NSString * _Nonnull)name
completion:(void (^_Nullable)(NSError * _Nullable error))completion;
+ (BOOL)isCategoryFromCatalog:(MWMMarkGroupID)groupId;
+ (NSArray<MWMCatalogCategory *> * _Nonnull)categoriesFromCatalog;
- (instancetype)init __attribute__((unavailable("call +manager instead")));
- (instancetype)copy __attribute__((unavailable("call +manager instead")));

View file

@ -1,4 +1,5 @@
#import "MWMBookmarksManager.h"
#import "MWMCatalogCategory+Convenience.h"
#import "Statistics.h"
#import "SwiftBridge.h"
@ -543,4 +544,25 @@ NSString * const CloudErrorToString(Cloud::SynchronizationResult result)
GetFramework().GetBookmarkManager().DownloadFromCatalogAndImport(itemId.UTF8String, name.UTF8String);
}
+ (BOOL)isCategoryFromCatalog:(MWMMarkGroupID)groupId {
return GetFramework().GetBookmarkManager().IsCategoryFromCatalog(groupId);
}
+ (NSArray<MWMCatalogCategory *> *)categoriesFromCatalog {
NSMutableArray * result = [NSMutableArray array];
MWMGroupIDCollection categoryIds = [self groupsIdList];
[categoryIds enumerateObjectsUsingBlock:^(NSNumber * categoryId, NSUInteger idx, BOOL * stop) {
MWMMarkGroupID catId = categoryId.unsignedIntValue;
if ([self isCategoryFromCatalog:catId])
{
kml::CategoryData categoryData = GetFramework().GetBookmarkManager().GetCategoryData(categoryId.unsignedIntValue);
UInt64 bookmarksCount = [self getCategoryMarksCount:catId] + [self getCategoryTracksCount:catId];
MWMCatalogCategory *category = [[MWMCatalogCategory alloc] initWithCategoryData:categoryData
bookmarksCount:bookmarksCount];
[result addObject:category];
}
}];
return [result copy];
}
@end

View file

@ -468,6 +468,12 @@
B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32FE73E20D2844600EF7446 /* DownloadedBookmarksViewController.swift */; };
B32FE74120D2844600EF7446 /* DownloadedBookmarksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B32FE73F20D2844600EF7446 /* DownloadedBookmarksViewController.xib */; };
B32FE74320D2B09600EF7446 /* CatalogWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32FE74220D2B09600EF7446 /* CatalogWebViewController.swift */; };
B366130420D5D9BC00E7DC3E /* MWMCatalogCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = B366130320D5D9BC00E7DC3E /* MWMCatalogCategory.m */; };
B366130720D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = B366130620D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm */; };
B366130A20D5E2E000E7DC3E /* CatalogCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B366130820D5E2E000E7DC3E /* CatalogCategoryCell.swift */; };
B366130B20D5E2E000E7DC3E /* CatalogCategoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B366130920D5E2E000E7DC3E /* CatalogCategoryCell.xib */; };
B3E3B4FD20D463B700DA8C13 /* BMCCategoriesHeader.xib in Resources */ = {isa = PBXBuildFile; fileRef = B3E3B4FC20D463B700DA8C13 /* BMCCategoriesHeader.xib */; };
B3E3B50220D485FA00DA8C13 /* DownloadedBookmarksDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3E3B50120D485FA00DA8C13 /* DownloadedBookmarksDataSource.swift */; };
BB25B1A71FB32767007276FA /* transit_colors.txt in Resources */ = {isa = PBXBuildFile; fileRef = BB25B1A51FB32767007276FA /* transit_colors.txt */; };
BB7626B61E85599C0031D71C /* icudt57l.dat in Resources */ = {isa = PBXBuildFile; fileRef = BB7626B41E8559980031D71C /* icudt57l.dat */; };
EBDA7B7820B370B40054165B /* GoogleMobileAds.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBDA7B7320B3576D0054165B /* GoogleMobileAds.framework */; };
@ -1387,6 +1393,14 @@
B32FE73E20D2844600EF7446 /* DownloadedBookmarksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedBookmarksViewController.swift; sourceTree = "<group>"; };
B32FE73F20D2844600EF7446 /* DownloadedBookmarksViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DownloadedBookmarksViewController.xib; sourceTree = "<group>"; };
B32FE74220D2B09600EF7446 /* CatalogWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogWebViewController.swift; sourceTree = "<group>"; };
B366130220D5D9BC00E7DC3E /* MWMCatalogCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMCatalogCategory.h; sourceTree = "<group>"; };
B366130320D5D9BC00E7DC3E /* MWMCatalogCategory.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MWMCatalogCategory.m; sourceTree = "<group>"; };
B366130520D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMCatalogCategory+Convenience.h"; sourceTree = "<group>"; };
B366130620D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMCatalogCategory+Convenience.mm"; sourceTree = "<group>"; };
B366130820D5E2E000E7DC3E /* CatalogCategoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogCategoryCell.swift; sourceTree = "<group>"; };
B366130920D5E2E000E7DC3E /* CatalogCategoryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CatalogCategoryCell.xib; sourceTree = "<group>"; };
B3E3B4FC20D463B700DA8C13 /* BMCCategoriesHeader.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BMCCategoriesHeader.xib; sourceTree = "<group>"; };
B3E3B50120D485FA00DA8C13 /* DownloadedBookmarksDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedBookmarksDataSource.swift; sourceTree = "<group>"; };
BB25B1A51FB32767007276FA /* transit_colors.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = transit_colors.txt; path = ../../data/transit_colors.txt; sourceTree = "<group>"; };
BB7626B41E8559980031D71C /* icudt57l.dat */ = {isa = PBXFileReference; lastKnownFileType = file; name = icudt57l.dat; path = ../../data/icudt57l.dat; sourceTree = "<group>"; };
EBDA7B7320B3576D0054165B /* GoogleMobileAds.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GoogleMobileAds.framework; path = MoPubSDK/AdNetworkSupport/AdMob/SDK/GoogleMobileAds.framework; sourceTree = "<group>"; };
@ -2343,6 +2357,7 @@
isa = PBXGroup;
children = (
34B846A02029DCC10081ECCD /* BMCCategoriesHeader.swift */,
B3E3B4FC20D463B700DA8C13 /* BMCCategoriesHeader.xib */,
3404F4972028A20D0090E401 /* BMCCategoryCell.swift */,
3404F4982028A20D0090E401 /* BMCCategoryCell.xib */,
);
@ -3136,6 +3151,13 @@
B32FE73E20D2844600EF7446 /* DownloadedBookmarksViewController.swift */,
B32FE73F20D2844600EF7446 /* DownloadedBookmarksViewController.xib */,
B32FE74220D2B09600EF7446 /* CatalogWebViewController.swift */,
B3E3B50120D485FA00DA8C13 /* DownloadedBookmarksDataSource.swift */,
B366130220D5D9BC00E7DC3E /* MWMCatalogCategory.h */,
B366130320D5D9BC00E7DC3E /* MWMCatalogCategory.m */,
B366130520D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.h */,
B366130620D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm */,
B366130820D5E2E000E7DC3E /* CatalogCategoryCell.swift */,
B366130920D5E2E000E7DC3E /* CatalogCategoryCell.xib */,
);
path = Catalog;
sourceTree = "<group>";
@ -4261,6 +4283,7 @@
6741A9991BF340DE002C974C /* MWMAlertViewController.xib in Resources */,
6741A9881BF340DE002C974C /* MWMAPIBarView.xib in Resources */,
F6E2FE641E097BA00083EBEC /* MWMBookmarkCell.xib in Resources */,
B366130B20D5E2E000E7DC3E /* CatalogCategoryCell.xib in Resources */,
34EE25A61EFA6AD400F870AB /* ViatorElement.xib in Resources */,
F6E2FD951E097BA00083EBEC /* MWMBookmarkColorViewController.xib in Resources */,
F6E2FD9B1E097BA00083EBEC /* MWMBookmarkTitleCell.xib in Resources */,
@ -4349,6 +4372,7 @@
F6E2FEA61E097BA00083EBEC /* MWMPPView.xib in Resources */,
6741A9811BF340DE002C974C /* MWMRateAlert.xib in Resources */,
6741A9601BF340DE002C974C /* MWMRoutingDisclaimerAlert.xib in Resources */,
B3E3B4FD20D463B700DA8C13 /* BMCCategoriesHeader.xib in Resources */,
F6E2FF001E097BA00083EBEC /* MWMSearchCategoryCell.xib in Resources */,
F6E2FF331E097BA00083EBEC /* MWMSearchCommonCell.xib in Resources */,
F6E2FF061E097BA00083EBEC /* MWMSearchHistoryClearCell.xib in Resources */,
@ -4518,6 +4542,7 @@
3467CEB2202C6EEE00D3C670 /* BMCNotificationsHeader.swift in Sources */,
34F4072F1E9E1AFF00E57AC0 /* BannersCache.swift in Sources */,
34D3B0211E389D05004100F9 /* MWMEditorAddAdditionalNameTableViewCell.mm in Sources */,
B366130420D5D9BC00E7DC3E /* MWMCatalogCategory.m in Sources */,
3486B51E1E27AD590069C126 /* MWMFrameworkHelper.mm in Sources */,
F6E2FE491E097BA00083EBEC /* MWMPlacePageData.mm in Sources */,
348F8A531F863B6100060C2A /* UGCReview.swift in Sources */,
@ -4573,6 +4598,7 @@
34D3B0301E389D05004100F9 /* MWMEditorCategoryCell.mm in Sources */,
F653CE191C71F62700A453F1 /* MWMAddPlaceNavigationBar.mm in Sources */,
340475621E081A4600C92850 /* MWMNetworkPolicy.mm in Sources */,
B366130720D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm in Sources */,
F6E2FEE51E097BA00083EBEC /* MWMSearchNoResults.mm in Sources */,
F6E2FF631E097BA00083EBEC /* MWMTTSLanguageViewController.mm in Sources */,
342EE4121C43DAA7009F6A49 /* MWMAuthorizationWebViewLoginViewController.mm in Sources */,
@ -4610,6 +4636,7 @@
34BBD6581F826F810070CA50 /* AuthorizationTransitioningManager.swift in Sources */,
F6558DA21E642CC0002203AE /* MWMFacilitiesController.mm in Sources */,
34AB664A1FC5AA330078E451 /* RouteManageriPadPresentationController.swift in Sources */,
B366130A20D5E2E000E7DC3E /* CatalogCategoryCell.swift in Sources */,
349D1ACF1E2E325B004A2006 /* MWMBottomMenuCollectionViewCell.mm in Sources */,
F6E2FF451E097BA00083EBEC /* SettingsTableViewLinkCell.swift in Sources */,
34C9BD0A1C6DBCDA000DC38D /* MWMNavigationController.mm in Sources */,
@ -4642,6 +4669,7 @@
3454D7E01E07F045004AF2AD /* UITextField+RuntimeAttributes.mm in Sources */,
347BFA901F27909200E5531F /* MenuArea.swift in Sources */,
343E75981E5B1EE20041226A /* MWMCollectionViewController.mm in Sources */,
B3E3B50220D485FA00DA8C13 /* DownloadedBookmarksDataSource.swift in Sources */,
F6E2FEFA1E097BA00083EBEC /* MWMSearchCategoriesManager.mm in Sources */,
34E776141F14B17F003040B3 /* AvailableArea.swift in Sources */,
34AB66081FC5AA320078E451 /* MWMNavigationDashboardManager.mm in Sources */,