forked from organicmaps/organicmaps
[ios] select tags screen
This commit is contained in:
parent
c0f21a6619
commit
669fee88da
19 changed files with 690 additions and 11 deletions
|
@ -6,6 +6,7 @@
|
|||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
|
@ -239,12 +240,211 @@
|
|||
<outlet property="getDirectLinkCell" destination="90b-ef-VUJ" id="L7h-0r-eSe"/>
|
||||
<outlet property="licenseAgreementTextView" destination="dsV-Vs-oCo" id="TtB-Uw-WGR"/>
|
||||
<outlet property="uploadAndPublishCell" destination="YW0-jq-Isw" id="84h-vp-JdM"/>
|
||||
<segue destination="xf5-2c-0zi" kind="show" identifier="chooseTags" id="up0-G8-BIG"/>
|
||||
</connections>
|
||||
</tableViewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="ylv-YU-ujs" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<exit id="wpS-8c-SPb" userLabel="Exit" sceneMemberID="exit"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="37.600000000000001" y="26.53673163418291"/>
|
||||
<point key="canvasLocation" x="-198" y="-26"/>
|
||||
</scene>
|
||||
<!--Sharing Tags View Controller-->
|
||||
<scene sceneID="fwI-5y-8lb">
|
||||
<objects>
|
||||
<viewController id="xf5-2c-0zi" customClass="SharingTagsViewController" customModule="maps_me" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="2YU-O5-UMg">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="7vG-MC-M3b">
|
||||
<rect key="frame" x="0.0" y="20" width="375" height="603"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KY2-7H-0bb">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="72"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please, select tags to help other travelers find your guide. This is mandatory." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tjK-HW-d6t">
|
||||
<rect key="frame" x="16" y="19.5" width="343" height="33.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="ugc_route_tags_desc"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1u2-6K-X3l">
|
||||
<rect key="frame" x="0.0" y="71" width="375" height="1"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.1213077910958904" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="1" id="dzg-PZ-65P"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="1u2-6K-X3l" secondAttribute="trailing" id="6eR-E7-9k1"/>
|
||||
<constraint firstItem="1u2-6K-X3l" firstAttribute="leading" secondItem="KY2-7H-0bb" secondAttribute="leading" id="Dnm-2Z-JFd"/>
|
||||
<constraint firstAttribute="bottom" secondItem="1u2-6K-X3l" secondAttribute="bottom" id="YG7-si-5Ym"/>
|
||||
<constraint firstItem="tjK-HW-d6t" firstAttribute="centerY" secondItem="KY2-7H-0bb" secondAttribute="centerY" id="bqB-Vx-Alm"/>
|
||||
<constraint firstAttribute="trailing" secondItem="tjK-HW-d6t" secondAttribute="trailing" constant="16" id="oQm-xP-glu"/>
|
||||
<constraint firstAttribute="height" constant="72" id="yUX-K5-ox2"/>
|
||||
<constraint firstItem="tjK-HW-d6t" firstAttribute="leading" secondItem="KY2-7H-0bb" secondAttribute="leading" constant="16" id="zc1-kY-C1U"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tUs-JB-h8i">
|
||||
<rect key="frame" x="0.0" y="72" width="375" height="105"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="RMh-DN-eFb">
|
||||
<rect key="frame" x="169.5" y="28" width="36" height="36"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="36" id="bQK-LD-adI"/>
|
||||
<constraint firstAttribute="height" constant="36" id="sdc-T6-uwb"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Loading tags..." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="27q-vH-fsJ">
|
||||
<rect key="frame" x="140" y="88" width="95.5" height="17"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="ugc_route_tags_progress_msg"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="27q-vH-fsJ" secondAttribute="bottom" id="1dw-3l-oFP"/>
|
||||
<constraint firstAttribute="height" constant="105" id="N8W-R4-NUP"/>
|
||||
<constraint firstItem="27q-vH-fsJ" firstAttribute="centerX" secondItem="tUs-JB-h8i" secondAttribute="centerX" id="ag2-lr-ixt"/>
|
||||
<constraint firstItem="RMh-DN-eFb" firstAttribute="centerX" secondItem="tUs-JB-h8i" secondAttribute="centerX" id="koB-sF-apQ"/>
|
||||
<constraint firstItem="27q-vH-fsJ" firstAttribute="top" secondItem="RMh-DN-eFb" secondAttribute="bottom" constant="24" id="rO2-nU-QwO"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="crb-Hn-y9s">
|
||||
<rect key="frame" x="0.0" y="177" width="375" height="426"/>
|
||||
<subviews>
|
||||
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="UZU-x1-VBd">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="426"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<viewLayoutGuide key="safeArea" id="AgH-PG-DAM"/>
|
||||
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="fbB-dB-9OF" customClass="TagsCollectionViewLayout" customModule="maps_me" customModuleProvider="target">
|
||||
<size key="itemSize" width="178" height="97"/>
|
||||
<size key="headerReferenceSize" width="50" height="24"/>
|
||||
<size key="footerReferenceSize" width="0.0" height="0.0"/>
|
||||
<inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
</collectionViewFlowLayout>
|
||||
<cells>
|
||||
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="TagCellIdentifier" id="eRf-Ch-nW5" customClass="TagCollectionViewCell" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="24" width="178" height="97"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
|
||||
<rect key="frame" x="0.0" y="0.0" width="178" height="97"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Cr7-i1-sBk">
|
||||
<rect key="frame" x="0.0" y="0.0" width="178" height="97"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="COH-Av-S0I">
|
||||
<rect key="frame" x="10" y="3" width="158" height="91"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="COH-Av-S0I" firstAttribute="top" secondItem="Cr7-i1-sBk" secondAttribute="top" constant="3" id="2fW-xG-VYr"/>
|
||||
<constraint firstItem="COH-Av-S0I" firstAttribute="leading" secondItem="Cr7-i1-sBk" secondAttribute="leading" constant="10" id="D92-2q-D9h"/>
|
||||
<constraint firstAttribute="bottom" secondItem="COH-Av-S0I" secondAttribute="bottom" constant="3" id="PEF-Xs-vOg"/>
|
||||
<constraint firstAttribute="trailing" secondItem="COH-Av-S0I" secondAttribute="trailing" constant="10" id="Vf1-eb-ha8"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
|
||||
<integer key="value" value="5"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="layer.borderWidth">
|
||||
<integer key="value" value="1"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</view>
|
||||
</subviews>
|
||||
</view>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="Cr7-i1-sBk" secondAttribute="trailing" id="3tY-EK-PYY"/>
|
||||
<constraint firstItem="Cr7-i1-sBk" firstAttribute="top" secondItem="eRf-Ch-nW5" secondAttribute="top" id="8pD-Sd-mJD"/>
|
||||
<constraint firstAttribute="bottom" secondItem="Cr7-i1-sBk" secondAttribute="bottom" id="QkN-eM-h5u"/>
|
||||
<constraint firstItem="Cr7-i1-sBk" firstAttribute="leading" secondItem="eRf-Ch-nW5" secondAttribute="leading" id="frs-Sr-1N0"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="containerView" destination="Cr7-i1-sBk" id="GsK-at-LOg"/>
|
||||
<outlet property="title" destination="COH-Av-S0I" id="LUF-GW-hZx"/>
|
||||
</connections>
|
||||
</collectionViewCell>
|
||||
</cells>
|
||||
<collectionReusableView key="sectionHeaderView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" reuseIdentifier="TagHeaderIdentifier" id="hXP-fc-7dB" customClass="TagSectionHeaderView" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SIGHTSEEING" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="W6H-nE-Qck">
|
||||
<rect key="frame" x="0.0" y="4.5" width="81" height="15"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="12"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.38" colorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="bottom" secondItem="W6H-nE-Qck" secondAttribute="bottom" constant="4.5" id="LKQ-m7-WEA"/>
|
||||
<constraint firstItem="W6H-nE-Qck" firstAttribute="leading" secondItem="hXP-fc-7dB" secondAttribute="leading" id="d7f-3h-5kl"/>
|
||||
<constraint firstItem="W6H-nE-Qck" firstAttribute="top" secondItem="hXP-fc-7dB" secondAttribute="top" constant="4.5" id="iWV-zZ-MWl"/>
|
||||
<constraint firstItem="W6H-nE-Qck" firstAttribute="centerY" secondItem="hXP-fc-7dB" secondAttribute="centerY" id="nGi-NO-wpI"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="title" destination="W6H-nE-Qck" id="B5d-tx-YaA"/>
|
||||
</connections>
|
||||
</collectionReusableView>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="xf5-2c-0zi" id="SWC-Tn-pBn"/>
|
||||
<outlet property="delegate" destination="xf5-2c-0zi" id="z8d-W0-R1U"/>
|
||||
</connections>
|
||||
</collectionView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="UZU-x1-VBd" secondAttribute="trailing" id="1hh-7K-CpC"/>
|
||||
<constraint firstItem="UZU-x1-VBd" firstAttribute="top" secondItem="crb-Hn-y9s" secondAttribute="top" id="lBd-Yh-hhM"/>
|
||||
<constraint firstAttribute="bottom" secondItem="UZU-x1-VBd" secondAttribute="bottom" id="lPF-Ls-O27"/>
|
||||
<constraint firstItem="UZU-x1-VBd" firstAttribute="leading" secondItem="crb-Hn-y9s" secondAttribute="leading" id="zfV-OM-0Zj"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</subviews>
|
||||
</stackView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="7vG-MC-M3b" firstAttribute="trailing" secondItem="0d6-uC-MKC" secondAttribute="trailing" id="5nm-34-MLD"/>
|
||||
<constraint firstItem="7vG-MC-M3b" firstAttribute="bottom" secondItem="0d6-uC-MKC" secondAttribute="bottom" id="CLT-ID-kGC"/>
|
||||
<constraint firstItem="7vG-MC-M3b" firstAttribute="top" secondItem="0d6-uC-MKC" secondAttribute="top" id="CdP-6O-62E"/>
|
||||
<constraint firstItem="7vG-MC-M3b" firstAttribute="leading" secondItem="0d6-uC-MKC" secondAttribute="leading" id="D5c-Nv-S6k"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="0d6-uC-MKC"/>
|
||||
</view>
|
||||
<toolbarItems/>
|
||||
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
|
||||
<connections>
|
||||
<outlet property="collectionView" destination="UZU-x1-VBd" id="o5u-kl-mKw"/>
|
||||
<outlet property="doneButton" destination="qY7-OC-33A" id="EoL-xY-8JM"/>
|
||||
<outlet property="loadingTagsView" destination="tUs-JB-h8i" id="Hhx-T9-H1Q"/>
|
||||
<outlet property="progressView" destination="RMh-DN-eFb" id="TwY-gF-3Rb"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="6gO-Q4-Me6" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
<barButtonItem systemItem="done" id="qY7-OC-33A">
|
||||
<connections>
|
||||
<action selector="onDone:" destination="xf5-2c-0zi" id="tIf-X0-pZ0"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="607" y="-27"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
|
|
|
@ -14,6 +14,8 @@ final class BookmarksSharingViewController: MWMTableViewController {
|
|||
@IBOutlet weak var uploadAndPublishCell: UploadActionCell!
|
||||
@IBOutlet weak var getDirectLinkCell: UploadActionCell!
|
||||
|
||||
let kTagsSegueIdentifier = "chooseTags"
|
||||
|
||||
@IBOutlet private weak var licenseAgreementTextView: UITextView! {
|
||||
didSet {
|
||||
let htmlString = String(coreFormat: L("ugc_routes_user_agreement"), arguments: [ViewModel.termsOfUseLink()])
|
||||
|
@ -80,8 +82,16 @@ final class BookmarksSharingViewController: MWMTableViewController {
|
|||
}
|
||||
|
||||
func uploadAndPublish() {
|
||||
performAfterValidation {
|
||||
//implementation
|
||||
performAfterValidation { [weak self] in
|
||||
self?.performSegue(withIdentifier: "chooseTags", sender: self)
|
||||
}
|
||||
}
|
||||
|
||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
||||
if segue.identifier == kTagsSegueIdentifier {
|
||||
if let vc = segue.destination as? SharingTagsViewController {
|
||||
vc.delegate = self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -99,7 +109,7 @@ final class BookmarksSharingViewController: MWMTableViewController {
|
|||
}, completion: { (url, error) in
|
||||
if error != nil {
|
||||
self?.getDirectLinkCell.cellState = .normal
|
||||
//handle errors
|
||||
//TODO: handle errors
|
||||
} else {
|
||||
self?.getDirectLinkCell.cellState = .completed
|
||||
self?.categoryUrl = url
|
||||
|
@ -110,12 +120,14 @@ final class BookmarksSharingViewController: MWMTableViewController {
|
|||
}
|
||||
|
||||
func performAfterValidation(action: @escaping MWMVoidBlock) {
|
||||
MWMFrameworkHelper.checkConnectionAndPerformAction { [unowned self] in
|
||||
self.signup(anchor: self.view, onComplete: { success in
|
||||
if (success) {
|
||||
action()
|
||||
}
|
||||
})
|
||||
MWMFrameworkHelper.checkConnectionAndPerformAction { [weak self] in
|
||||
if let self = self, let view = self.view {
|
||||
self.signup(anchor: view, onComplete: { success in
|
||||
if success {
|
||||
action()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -135,3 +147,14 @@ extension BookmarksSharingViewController: UploadActionCellDelegate {
|
|||
shareController?.present(inParentViewController: self, anchorView: nil)
|
||||
}
|
||||
}
|
||||
|
||||
extension BookmarksSharingViewController: SharingTagsViewControllerDelegate {
|
||||
func sharingTagsViewController(_ viewController: SharingTagsViewController, didSelect tags: [MWMTag]) {
|
||||
navigationController?.popViewController(animated: true)
|
||||
//proceed with selected tags
|
||||
}
|
||||
|
||||
func sharingTagsViewControllerDidCancel(_ viewController: SharingTagsViewController) {
|
||||
navigationController?.popViewController(animated: true)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
#import "MWMTag.h"
|
||||
#include "map/bookmark_catalog.hpp"
|
||||
|
||||
@interface MWMTag (Convenience)
|
||||
|
||||
- (instancetype)initWithTagData:(BookmarkCatalog::Tag const &)tagData;
|
||||
|
||||
@end
|
|
@ -0,0 +1,21 @@
|
|||
#import "MWMTag+Convenience.h"
|
||||
|
||||
@implementation MWMTag (Convenience)
|
||||
|
||||
- (instancetype)initWithTagData:(BookmarkCatalog::Tag const &)tagData
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
self.tagId = @(tagData.m_id.c_str());
|
||||
self.name = @(tagData.m_name.c_str());
|
||||
self.color = [UIColor colorWithRed:std::get<0>(tagData.m_color)
|
||||
green:std::get<1>(tagData.m_color)
|
||||
blue:std::get<2>(tagData.m_color)
|
||||
alpha:1.0];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
7
iphone/Maps/Bookmarks/Categories/Sharing/Tags/MWMTag.h
Normal file
7
iphone/Maps/Bookmarks/Categories/Sharing/Tags/MWMTag.h
Normal file
|
@ -0,0 +1,7 @@
|
|||
@interface MWMTag : NSObject
|
||||
|
||||
@property(copy, nonatomic) NSString * tagId;
|
||||
@property(copy, nonatomic) NSString * name;
|
||||
@property(nonatomic) UIColor * color;
|
||||
|
||||
@end
|
5
iphone/Maps/Bookmarks/Categories/Sharing/Tags/MWMTag.m
Normal file
5
iphone/Maps/Bookmarks/Categories/Sharing/Tags/MWMTag.m
Normal file
|
@ -0,0 +1,5 @@
|
|||
#import "MWMTag.h"
|
||||
|
||||
@implementation MWMTag
|
||||
|
||||
@end
|
|
@ -0,0 +1,8 @@
|
|||
#import "MWMTagGroup.h"
|
||||
#include "map/bookmark_catalog.hpp"
|
||||
|
||||
@interface MWMTagGroup (Convenience)
|
||||
|
||||
- (instancetype)initWithGroupData:(BookmarkCatalog::TagGroup const &)groupData;
|
||||
|
||||
@end
|
|
@ -0,0 +1,25 @@
|
|||
#import "MWMTagGroup+Convenience.h"
|
||||
#import "MWMTag+Convenience.h"
|
||||
|
||||
@implementation MWMTagGroup (Convenience)
|
||||
|
||||
- (instancetype)initWithGroupData:(BookmarkCatalog::TagGroup const &)groupData
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
self.name = [NSString stringWithUTF8String:groupData.m_name.c_str()];
|
||||
|
||||
NSMutableArray * tags = [NSMutableArray new];
|
||||
for (auto const & tagData : groupData.m_tags) {
|
||||
MWMTag * tagObj = [[MWMTag alloc] initWithTagData:tagData];
|
||||
[tags addObject:tagObj];
|
||||
}
|
||||
|
||||
self.tags = tags;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,9 @@
|
|||
#import "MWMTag.h"
|
||||
|
||||
@interface MWMTagGroup : NSObject
|
||||
|
||||
@property (copy, nonatomic) NSString * name;
|
||||
@property (copy, nonatomic) NSArray<MWMTag *> * tags;
|
||||
|
||||
@end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#import "MWMTagGroup.h"
|
||||
|
||||
@implementation MWMTagGroup
|
||||
|
||||
@end
|
|
@ -0,0 +1,109 @@
|
|||
protocol SharingTagsViewControllerDelegate: AnyObject {
|
||||
func sharingTagsViewController(_ viewController: SharingTagsViewController, didSelect tags: [MWMTag])
|
||||
func sharingTagsViewControllerDidCancel(_ viewController: SharingTagsViewController)
|
||||
}
|
||||
|
||||
final class SharingTagsViewController: MWMViewController {
|
||||
|
||||
@IBOutlet private weak var loadingTagsView: UIView!
|
||||
@IBOutlet private weak var progressView: UIView!
|
||||
@IBOutlet private weak var collectionView: UICollectionView!
|
||||
@IBOutlet private weak var doneButton: UIBarButtonItem!
|
||||
|
||||
private lazy var progress: MWMCircularProgress = {
|
||||
return MWMCircularProgress(parentView: progressView)
|
||||
}()
|
||||
|
||||
let dataSource = TagsDataSource()
|
||||
weak var delegate: SharingTagsViewControllerDelegate?
|
||||
|
||||
let kTagCellIdentifier = "TagCellIdentifier"
|
||||
let kTagHeaderIdentifier = "TagHeaderIdentifier"
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
title = L("ugc_route_tags_screen_label")
|
||||
|
||||
doneButton.isEnabled = false
|
||||
navigationItem.rightBarButtonItem = doneButton
|
||||
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
|
||||
target: self,
|
||||
action: #selector(onCancel))
|
||||
|
||||
collectionView.allowsMultipleSelection = true
|
||||
collectionView.contentInset = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
|
||||
|
||||
progress.state = .spinner
|
||||
dataSource.loadTags { success in
|
||||
self.progress.state = .completed
|
||||
self.loadingTagsView.isHidden = true
|
||||
if success {
|
||||
self.collectionView.reloadData()
|
||||
} else {
|
||||
//TODO: handle errors
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func onDone(_ sender: Any) {
|
||||
guard let selectedItemsIndexes = collectionView.indexPathsForSelectedItems,
|
||||
!selectedItemsIndexes.isEmpty else {
|
||||
assert(false, "Done button should be disabled if there are no selected tags")
|
||||
return
|
||||
}
|
||||
|
||||
delegate?.sharingTagsViewController(self, didSelect: dataSource.tags(for: selectedItemsIndexes))
|
||||
}
|
||||
|
||||
@objc func onCancel() {
|
||||
delegate?.sharingTagsViewControllerDidCancel(self)
|
||||
}
|
||||
}
|
||||
|
||||
extension SharingTagsViewController: UICollectionViewDataSource, UICollectionViewDelegate {
|
||||
|
||||
func numberOfSections(in collectionView: UICollectionView) -> Int {
|
||||
return dataSource.tagGroupsCount
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||
return dataSource.tagsCount(in: section)
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: kTagCellIdentifier,for: indexPath) as! TagCollectionViewCell
|
||||
cell.update(with: dataSource.tag(in: indexPath.section, at: indexPath.item))
|
||||
|
||||
//we need to do this because of bug - ios 12 doesnt apply layout to cells until scrolling
|
||||
if #available(iOS 12.0, *) {
|
||||
cell.layoutIfNeeded()
|
||||
}
|
||||
|
||||
return cell
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView,
|
||||
viewForSupplementaryElementOfKind kind: String,
|
||||
at indexPath: IndexPath) -> UICollectionReusableView {
|
||||
let supplementaryView = collectionView.dequeueReusableSupplementaryView(ofKind: kind,
|
||||
withReuseIdentifier: kTagHeaderIdentifier,
|
||||
for: indexPath) as! TagSectionHeaderView
|
||||
supplementaryView.update(with: dataSource.tagGroup(at: indexPath.section))
|
||||
return supplementaryView
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView,
|
||||
didSelectItemAt indexPath: IndexPath) {
|
||||
doneButton.isEnabled = true
|
||||
}
|
||||
|
||||
func collectionView(_ collectionView: UICollectionView,
|
||||
didDeselectItemAt indexPath: IndexPath) {
|
||||
if let selectedItemsIndexes = collectionView.indexPathsForSelectedItems {
|
||||
doneButton.isEnabled = !selectedItemsIndexes.isEmpty
|
||||
} else {
|
||||
doneButton.isEnabled = false
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
final class TagCollectionViewCell: UICollectionViewCell {
|
||||
|
||||
@IBOutlet private weak var title: UILabel!
|
||||
@IBOutlet weak var containerView: UIView!
|
||||
|
||||
var color: UIColor? {
|
||||
didSet {
|
||||
title.textColor = color
|
||||
containerView.layer.borderColor = color?.cgColor
|
||||
}
|
||||
}
|
||||
|
||||
override var isSelected: Bool{
|
||||
didSet {
|
||||
containerView.backgroundColor = isSelected ? color : .white()
|
||||
title.textColor = isSelected ? .whitePrimaryText() : color
|
||||
}
|
||||
}
|
||||
|
||||
func update(with tag: MWMTag) {
|
||||
title.text = tag.name
|
||||
color = tag.color
|
||||
}
|
||||
|
||||
override func prepareForReuse() {
|
||||
super.prepareForReuse()
|
||||
title.text = nil
|
||||
color = nil
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
final class TagSectionHeaderView: UICollectionReusableView {
|
||||
|
||||
@IBOutlet weak var title: UILabel!
|
||||
|
||||
func update(with group: MWMTagGroup) {
|
||||
title.text = group.name.uppercased()
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
final class TagsCollectionViewLayout: UICollectionViewLayout {
|
||||
|
||||
private var headersCache: [IndexPath : UICollectionViewLayoutAttributes] = [:]
|
||||
private var cellsCache: [IndexPath : UICollectionViewLayoutAttributes] = [:]
|
||||
fileprivate var contentHeight: CGFloat = 0
|
||||
|
||||
fileprivate var contentWidth: CGFloat {
|
||||
guard let collectionView = collectionView else {
|
||||
return 0
|
||||
}
|
||||
|
||||
let insets = collectionView.contentInset
|
||||
return collectionView.bounds.width - (insets.left + insets.right)
|
||||
}
|
||||
|
||||
override var collectionViewContentSize: CGSize {
|
||||
return CGSize(width: contentWidth, height: contentHeight)
|
||||
}
|
||||
|
||||
var itemHeight: CGFloat = 50
|
||||
var itemWidth: CGFloat = 50
|
||||
var lineSpacing: CGFloat = 10
|
||||
var elementsSpacing: CGFloat = 10
|
||||
|
||||
override func prepare() {
|
||||
super.prepare()
|
||||
|
||||
guard let collectionView = collectionView else {
|
||||
return
|
||||
}
|
||||
|
||||
var xOffset: CGFloat = 0
|
||||
var yOffset: CGFloat = 0
|
||||
contentHeight = 0
|
||||
var lastItemHeight: CGFloat = 0
|
||||
|
||||
for section in 0 ..< collectionView.numberOfSections {
|
||||
yOffset += (section == 0) ? 0 : lastItemHeight + 2 * lineSpacing
|
||||
let indexPath = IndexPath(item: 0, section: section)
|
||||
|
||||
let headerSize = headersCache[indexPath]?.size ?? CGSize(width: contentWidth, height: itemHeight)
|
||||
let frame = CGRect(x: 0, y: yOffset, width: headerSize.width, height: headerSize.height)
|
||||
let attr = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, with: indexPath)
|
||||
attr.frame = frame
|
||||
headersCache[indexPath] = attr
|
||||
|
||||
yOffset += headerSize.height + lineSpacing
|
||||
xOffset = 0
|
||||
|
||||
for item in 0 ..< collectionView.numberOfItems(inSection: section) {
|
||||
let indexPath = IndexPath(item: item, section: section)
|
||||
let itemSize = cellsCache[indexPath]?.size ?? CGSize(width: itemWidth, height: itemHeight)
|
||||
|
||||
if xOffset + itemSize.width > contentWidth {
|
||||
xOffset = 0
|
||||
yOffset = yOffset + lineSpacing + lastItemHeight
|
||||
}
|
||||
|
||||
let frame = CGRect(x: xOffset, y: yOffset, width: itemSize.width, height: itemSize.height)
|
||||
let attr = UICollectionViewLayoutAttributes(forCellWith: indexPath)
|
||||
attr.frame = frame
|
||||
cellsCache[indexPath] = attr
|
||||
|
||||
xOffset += itemSize.width + elementsSpacing
|
||||
lastItemHeight = itemSize.height
|
||||
|
||||
contentHeight = max(contentHeight, frame.maxY)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
|
||||
var visibleLayoutAttributes = [UICollectionViewLayoutAttributes]()
|
||||
|
||||
for (_, attributes) in headersCache {
|
||||
if attributes.frame.intersects(rect) {
|
||||
visibleLayoutAttributes.append(attributes)
|
||||
}
|
||||
}
|
||||
|
||||
for (_, attributes) in cellsCache {
|
||||
if attributes.frame.intersects(rect) {
|
||||
visibleLayoutAttributes.append(attributes)
|
||||
}
|
||||
}
|
||||
|
||||
return visibleLayoutAttributes
|
||||
}
|
||||
|
||||
override public func shouldInvalidateLayout(forPreferredLayoutAttributes preferredAttributes: UICollectionViewLayoutAttributes,
|
||||
withOriginalAttributes originalAttributes: UICollectionViewLayoutAttributes) -> Bool {
|
||||
//dont validate layout if original width already equals to contentWidth - it's the best deal we can offer to cell
|
||||
if preferredAttributes.size.height != originalAttributes.size.height ||
|
||||
(preferredAttributes.size.width != originalAttributes.size.width && originalAttributes.size.width < contentWidth) {
|
||||
if preferredAttributes.representedElementKind == UICollectionElementKindSectionHeader {
|
||||
headersCache[originalAttributes.indexPath]?.size = preferredAttributes.size
|
||||
} else {
|
||||
cellsCache[originalAttributes.indexPath]?.size = CGSize(width: min(preferredAttributes.size.width, contentWidth),
|
||||
height: preferredAttributes.size.height)
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
final class TagsDataSource: NSObject {
|
||||
|
||||
private var tagGroups: [MWMTagGroup] = []
|
||||
|
||||
func loadTags(onComplete: @escaping (Bool) -> Void) {
|
||||
MWMBookmarksManager.shared().loadTags { tags in
|
||||
if let tags = tags {
|
||||
self.tagGroups = tags
|
||||
}
|
||||
onComplete(!self.tagGroups.isEmpty)
|
||||
}
|
||||
}
|
||||
|
||||
var tagGroupsCount: NSInteger {
|
||||
get {
|
||||
return tagGroups.count
|
||||
}
|
||||
}
|
||||
|
||||
func tagGroup(at index: Int) -> MWMTagGroup {
|
||||
return tagGroups[index]
|
||||
}
|
||||
|
||||
func tagsCount(in groupIndex: Int) -> Int {
|
||||
return tagGroups[groupIndex].tags.count
|
||||
}
|
||||
|
||||
func tag(in groupIndex: Int, at index: Int) -> MWMTag {
|
||||
return tagGroups[groupIndex].tags[index]
|
||||
}
|
||||
|
||||
func tags(for indexPaths: [IndexPath]) -> [MWMTag] {
|
||||
return indexPaths.map { self.tag(in: $0.section, at: $0.item) }
|
||||
}
|
||||
}
|
|
@ -79,4 +79,5 @@
|
|||
#import "MWMEye.h"
|
||||
#import "MWMPurchaseManager.h"
|
||||
#import "MWMPurchaseValidation.h"
|
||||
|
||||
#import "MWMTag.h"
|
||||
#import "MWMTagGroup.h"
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
#import "MWMCatalogCommon.h"
|
||||
|
||||
@class MWMCatalogCategory;
|
||||
@class MWMTagGroup;
|
||||
|
||||
typedef void (^LoadTagsCompletionBlock)(NSArray<MWMTagGroup *> * tags);
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
@interface MWMBookmarksManager : NSObject
|
||||
|
@ -65,6 +68,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
- (BOOL)isCategoryDownloading:(NSString *)itemId;
|
||||
- (BOOL)hasCategoryDownloaded:(NSString *)itemId;
|
||||
|
||||
- (void)loadTags:(LoadTagsCompletionBlock)completionBlock;
|
||||
|
||||
- (void)uploadAndGetDirectLinkCategoryWithId:(MWMMarkGroupID)itemId
|
||||
progress:(ProgressBlock)progress
|
||||
completion:(UploadCompletionBlock)completion;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
#import "MWMBookmarksManager.h"
|
||||
#import "AppInfo.h"
|
||||
#import "MWMCatalogCategory+Convenience.h"
|
||||
#import "MWMTag+Convenience.h"
|
||||
#import "MWMTagGroup+Convenience.h"
|
||||
#import "MWMCatalogObserver.h"
|
||||
#import "Statistics.h"
|
||||
#import "SwiftBridge.h"
|
||||
|
@ -603,6 +606,26 @@ NSString * const CloudErrorToString(Cloud::SynchronizationResult result)
|
|||
return self.bm.GetCatalog().HasDownloaded(itemId.UTF8String);
|
||||
}
|
||||
|
||||
- (void)loadTags:(LoadTagsCompletionBlock)completionBlock {
|
||||
auto onTagsCompletion = [completionBlock](bool success, BookmarkCatalog::TagGroups const & tagGroups)
|
||||
{
|
||||
if (success)
|
||||
{
|
||||
NSMutableArray * groups = [NSMutableArray new];
|
||||
for (auto const & groupData : tagGroups)
|
||||
{
|
||||
MWMTagGroup * tagGroup = [[MWMTagGroup alloc] initWithGroupData:groupData];
|
||||
[groups addObject:tagGroup];
|
||||
}
|
||||
|
||||
completionBlock([groups copy]);
|
||||
} else
|
||||
completionBlock(nil);
|
||||
};
|
||||
|
||||
self.bm.GetCatalog().RequestTagGroups([[AppInfo sharedInfo] languageId].UTF8String, std::move(onTagsCompletion));
|
||||
}
|
||||
|
||||
#pragma mark - Helpers
|
||||
|
||||
- (void)loopObservers:(void (^)(id<MWMBookmarksObserver> observer))block
|
||||
|
|
|
@ -11,10 +11,19 @@
|
|||
1DFA2F6A20D3B57400FB2C66 /* UIColor+PartnerColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DFA2F6920D3B57400FB2C66 /* UIColor+PartnerColor.mm */; };
|
||||
33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; };
|
||||
33046836219C5A4E0041F3A8 /* CategorySettings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 33046835219C5A4E0041F3A8 /* CategorySettings.storyboard */; };
|
||||
331630D12191D74B00BB91A9 /* TagSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331630D02191D74B00BB91A9 /* TagSectionHeaderView.swift */; };
|
||||
3358607E217632A2006D11F2 /* BookmarksSharingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3358607D217632A2006D11F2 /* BookmarksSharingViewController.swift */; };
|
||||
33B19C65218B46C100B323A7 /* SharingTagsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33B19C64218B46C100B323A7 /* SharingTagsViewController.swift */; };
|
||||
33B19C67218B481700B323A7 /* TagCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33B19C66218B481700B323A7 /* TagCollectionViewCell.swift */; };
|
||||
33BCD61621777A7400CA30B4 /* BookmarksSharingFlow.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 33BCD61521777A7400CA30B4 /* BookmarksSharingFlow.storyboard */; };
|
||||
33BCDF8B218C976D00EF5B74 /* TagsCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33BCDF8A218C976D00EF5B74 /* TagsCollectionViewLayout.swift */; };
|
||||
33C558E3217F6CF100299E70 /* UploadActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33C558E2217F6CF100299E70 /* UploadActionCell.swift */; };
|
||||
33E905462180C40900868CAC /* UIViewController+Authorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E905452180C40900868CAC /* UIViewController+Authorization.swift */; };
|
||||
33F8BA4121998BEB00ECA8EE /* MWMTag.m in Sources */ = {isa = PBXBuildFile; fileRef = 33F8BA4021998BEB00ECA8EE /* MWMTag.m */; };
|
||||
33F8BA4421998BFA00ECA8EE /* MWMTagGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 33F8BA4321998BFA00ECA8EE /* MWMTagGroup.m */; };
|
||||
33F8BA472199A91900ECA8EE /* MWMTag+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = 33F8BA462199A91900ECA8EE /* MWMTag+Convenience.mm */; };
|
||||
33F8BA4A2199AA1300ECA8EE /* MWMTagGroup+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = 33F8BA492199AA1300ECA8EE /* MWMTagGroup+Convenience.mm */; };
|
||||
33F8BA4E2199AB9500ECA8EE /* TagsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33F8BA4D2199AB9500ECA8EE /* TagsDataSource.swift */; };
|
||||
3404163C1E7BDFE000E2B6D6 /* PhotosViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3404163A1E7BDFE000E2B6D6 /* PhotosViewController.swift */; };
|
||||
340416441E7BED3900E2B6D6 /* PhotosTransitionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340416421E7BED3900E2B6D6 /* PhotosTransitionAnimator.swift */; };
|
||||
340416481E7BF28E00E2B6D6 /* UIView+Snapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 340416461E7BF28E00E2B6D6 /* UIView+Snapshot.swift */; };
|
||||
|
@ -786,10 +795,23 @@
|
|||
29B97316FDCFA39411CA2CEA /* main.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = main.mm; sourceTree = "<group>"; };
|
||||
33046831219C57180041F3A8 /* CategorySettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategorySettingsViewController.swift; sourceTree = "<group>"; };
|
||||
33046835219C5A4E0041F3A8 /* CategorySettings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CategorySettings.storyboard; sourceTree = "<group>"; };
|
||||
331630D02191D74B00BB91A9 /* TagSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagSectionHeaderView.swift; sourceTree = "<group>"; };
|
||||
3358607D217632A2006D11F2 /* BookmarksSharingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSharingViewController.swift; sourceTree = "<group>"; };
|
||||
33B19C64218B46C100B323A7 /* SharingTagsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharingTagsViewController.swift; sourceTree = "<group>"; };
|
||||
33B19C66218B481700B323A7 /* TagCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagCollectionViewCell.swift; sourceTree = "<group>"; };
|
||||
33BCD61521777A7400CA30B4 /* BookmarksSharingFlow.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BookmarksSharingFlow.storyboard; sourceTree = "<group>"; };
|
||||
33BCDF8A218C976D00EF5B74 /* TagsCollectionViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsCollectionViewLayout.swift; sourceTree = "<group>"; };
|
||||
33C558E2217F6CF100299E70 /* UploadActionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadActionCell.swift; sourceTree = "<group>"; };
|
||||
33E905452180C40900868CAC /* UIViewController+Authorization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Authorization.swift"; sourceTree = "<group>"; };
|
||||
33F8BA3F21998BEB00ECA8EE /* MWMTag.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMTag.h; sourceTree = "<group>"; };
|
||||
33F8BA4021998BEB00ECA8EE /* MWMTag.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MWMTag.m; sourceTree = "<group>"; };
|
||||
33F8BA4221998BFA00ECA8EE /* MWMTagGroup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMTagGroup.h; sourceTree = "<group>"; };
|
||||
33F8BA4321998BFA00ECA8EE /* MWMTagGroup.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MWMTagGroup.m; sourceTree = "<group>"; };
|
||||
33F8BA452199A91900ECA8EE /* MWMTag+Convenience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMTag+Convenience.h"; sourceTree = "<group>"; };
|
||||
33F8BA462199A91900ECA8EE /* MWMTag+Convenience.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMTag+Convenience.mm"; sourceTree = "<group>"; };
|
||||
33F8BA482199AA1300ECA8EE /* MWMTagGroup+Convenience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMTagGroup+Convenience.h"; sourceTree = "<group>"; };
|
||||
33F8BA492199AA1300ECA8EE /* MWMTagGroup+Convenience.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMTagGroup+Convenience.mm"; sourceTree = "<group>"; };
|
||||
33F8BA4D2199AB9500ECA8EE /* TagsDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsDataSource.swift; sourceTree = "<group>"; };
|
||||
3404163A1E7BDFE000E2B6D6 /* PhotosViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotosViewController.swift; sourceTree = "<group>"; };
|
||||
340416421E7BED3900E2B6D6 /* PhotosTransitionAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotosTransitionAnimator.swift; sourceTree = "<group>"; };
|
||||
340416461E7BF28E00E2B6D6 /* UIView+Snapshot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Snapshot.swift"; sourceTree = "<group>"; };
|
||||
|
@ -2171,10 +2193,31 @@
|
|||
3358607D217632A2006D11F2 /* BookmarksSharingViewController.swift */,
|
||||
33BCD61521777A7400CA30B4 /* BookmarksSharingFlow.storyboard */,
|
||||
33C558E2217F6CF100299E70 /* UploadActionCell.swift */,
|
||||
33F8BA3B2199858B00ECA8EE /* Tags */,
|
||||
);
|
||||
path = Sharing;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
33F8BA3B2199858B00ECA8EE /* Tags */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
33B19C64218B46C100B323A7 /* SharingTagsViewController.swift */,
|
||||
331630D02191D74B00BB91A9 /* TagSectionHeaderView.swift */,
|
||||
33BCDF8A218C976D00EF5B74 /* TagsCollectionViewLayout.swift */,
|
||||
33B19C66218B481700B323A7 /* TagCollectionViewCell.swift */,
|
||||
33F8BA3F21998BEB00ECA8EE /* MWMTag.h */,
|
||||
33F8BA4021998BEB00ECA8EE /* MWMTag.m */,
|
||||
33F8BA452199A91900ECA8EE /* MWMTag+Convenience.h */,
|
||||
33F8BA462199A91900ECA8EE /* MWMTag+Convenience.mm */,
|
||||
33F8BA4221998BFA00ECA8EE /* MWMTagGroup.h */,
|
||||
33F8BA4321998BFA00ECA8EE /* MWMTagGroup.m */,
|
||||
33F8BA482199AA1300ECA8EE /* MWMTagGroup+Convenience.h */,
|
||||
33F8BA492199AA1300ECA8EE /* MWMTagGroup+Convenience.mm */,
|
||||
33F8BA4D2199AB9500ECA8EE /* TagsDataSource.swift */,
|
||||
);
|
||||
path = Tags;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
340416391E7BDFB800E2B6D6 /* Photos */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -4882,6 +4925,7 @@
|
|||
34845DAF1E1649F6003D55B9 /* DownloaderNoResultsEmbedViewController.swift in Sources */,
|
||||
474C9F632141896800369009 /* MWMEye.mm in Sources */,
|
||||
F6791B141C43DF0B007A8A6E /* MWMStartButton.mm in Sources */,
|
||||
33F8BA4421998BFA00ECA8EE /* MWMTagGroup.m in Sources */,
|
||||
F6E2FEDF1E097BA00083EBEC /* MWMSearchManager+Layout.mm in Sources */,
|
||||
F64D9CA01C899C350063FA30 /* MWMEditorViralAlert.mm in Sources */,
|
||||
34AC8FD11EFC02C000E7F910 /* MWMRoutePoint.mm in Sources */,
|
||||
|
@ -4896,10 +4940,12 @@
|
|||
34AB66051FC5AA320078E451 /* MWMNavigationDashboardManager+Entity.mm in Sources */,
|
||||
34ABA6171C2D185C00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm in Sources */,
|
||||
B33D21AF20DAF9F000BAD749 /* Toast.swift in Sources */,
|
||||
33B19C67218B481700B323A7 /* TagCollectionViewCell.swift in Sources */,
|
||||
6741A9D41BF340DE002C974C /* MWMAlertViewController.mm in Sources */,
|
||||
F6E2FECD1E097BA00083EBEC /* MWMSearchFilterTransitioningManager.mm in Sources */,
|
||||
34D3B0181E389D05004100F9 /* EditorAdditionalNamePlaceholderTableViewCell.swift in Sources */,
|
||||
346DB8281E5C4F6700E3123E /* GalleryCell.swift in Sources */,
|
||||
33F8BA4121998BEB00ECA8EE /* MWMTag.m in Sources */,
|
||||
F6EBB26F1FD7E33300B69B6A /* DiscoveryNoResultsCell.swift in Sources */,
|
||||
47D0026721999DA900F651A2 /* PendingTransactionsHandler.swift in Sources */,
|
||||
F6E2FF121E097BA00083EBEC /* MWMSearchHistoryRequestCell.mm in Sources */,
|
||||
|
@ -5049,9 +5095,11 @@
|
|||
34FE5A6F1F18F30F00BCA729 /* TrafficButtonArea.swift in Sources */,
|
||||
F6E2FF691E097BA00083EBEC /* MWMUnitsController.mm in Sources */,
|
||||
6741AA031BF340DE002C974C /* MWMActivityViewController.mm in Sources */,
|
||||
33F8BA472199A91900ECA8EE /* MWMTag+Convenience.mm in Sources */,
|
||||
F6E2FE9D1E097BA00083EBEC /* MWMiPhonePlacePageLayoutImpl.mm in Sources */,
|
||||
34AB668C1FC5AA330078E451 /* NavigationStreetNameView.swift in Sources */,
|
||||
3454D7C81E07F045004AF2AD /* UIButton+RuntimeAttributes.mm in Sources */,
|
||||
33F8BA4A2199AA1300ECA8EE /* MWMTagGroup+Convenience.mm in Sources */,
|
||||
3488B0131E9D0AEC0068AFD8 /* AdBanner.swift in Sources */,
|
||||
3404755F1E081A4600C92850 /* MWMLocationPredictor.mm in Sources */,
|
||||
F6E2FE041E097BA00083EBEC /* MWMOpeningHoursDaysSelectorTableViewCell.mm in Sources */,
|
||||
|
@ -5071,6 +5119,7 @@
|
|||
F6E2FF4E1E097BA00083EBEC /* MWMAboutController.mm in Sources */,
|
||||
34F407381E9E1AFF00E57AC0 /* FacebookBanner.swift in Sources */,
|
||||
34F5E0D41E3F254800B1C415 /* UIView+Hierarchy.swift in Sources */,
|
||||
33BCDF8B218C976D00EF5B74 /* TagsCollectionViewLayout.swift in Sources */,
|
||||
6741AA0B1BF340DE002C974C /* MWMMapViewControlsManager.mm in Sources */,
|
||||
F6E2FED91E097BA00083EBEC /* MWMSearchContentView.mm in Sources */,
|
||||
F6E2FD891E097BA00083EBEC /* MWMMapDownloaderViewController.mm in Sources */,
|
||||
|
@ -5119,8 +5168,10 @@
|
|||
47E3C7332111F4D8008B3B27 /* CoverVerticalDismissalAnimator.swift in Sources */,
|
||||
34AB661A1FC5AA330078E451 /* MWMTaxiCollectionLayout.mm in Sources */,
|
||||
345C2F8A1F86361B009DB8B4 /* MWMUGCViewModel.mm in Sources */,
|
||||
33F8BA4E2199AB9500ECA8EE /* TagsDataSource.swift in Sources */,
|
||||
34AB66861FC5AA330078E451 /* MWMNavigationInfoView.mm in Sources */,
|
||||
34C9BD051C6DB693000DC38D /* MWMViewController.mm in Sources */,
|
||||
331630D12191D74B00BB91A9 /* TagSectionHeaderView.swift in Sources */,
|
||||
F6E2FDA41E097BA00083EBEC /* MWMCuisineEditorViewController.mm in Sources */,
|
||||
3454D7CB1E07F045004AF2AD /* UIColor+MapsMeColor.mm in Sources */,
|
||||
34B127EA1FBDD410008713D9 /* MWMRouterTransitStepInfo.mm in Sources */,
|
||||
|
@ -5152,6 +5203,7 @@
|
|||
47800D1D20BEEE2E00072F42 /* TermsOfUseController.swift in Sources */,
|
||||
674A7E301C0DB10B003D48E1 /* MWMMapWidgets.mm in Sources */,
|
||||
34AB66291FC5AA330078E451 /* RouteManagerViewController.swift in Sources */,
|
||||
33B19C65218B46C100B323A7 /* SharingTagsViewController.swift in Sources */,
|
||||
3404754D1E081A4600C92850 /* MWMKeyboard.mm in Sources */,
|
||||
3457C4261F680F1900028233 /* String+BoundingRect.swift in Sources */,
|
||||
34EF94291C05A6F30050B714 /* MWMSegue.mm in Sources */,
|
||||
|
|
Loading…
Add table
Reference in a new issue