From aa6991531ebdae1361a37ca07102bc795c8897fa Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 15:22:45 +0200 Subject: [PATCH 01/24] Implemented BuildNumber screen with transition from navigation wheel. --- Nynja.xcodeproj/project.pbxproj | 72 +++++++++++++++ Nynja/BuildNumberItemsFactory.swift | 18 ++++ Nynja/Extensions/Bundle+Keys.swift | 31 +++++++ .../BuildNumber/BuildNumberProtocols.swift | 56 ++++++++++++ .../Interactor/BuildNumberInteractor.swift | 13 +++ .../Presenter/BuildNumberPresenter.swift | 27 ++++++ .../View/BuildNumberViewController.swift | 85 ++++++++++++++++++ .../BuildNumberViewControllerLayout.swift | 32 +++++++ .../WireFrame/BuildNumberWireFrame.swift | 31 +++++++ Nynja/Modules/Main/MainProtocols.swift | 2 + .../Main/Presenter/MainPresenter.swift | 4 + .../Main/View/MainNavigationItem.swift | 1 + .../Main/View/MainViewControllerNav.swift | 5 ++ .../Modules/Main/View/NavigateProtocol.swift | 1 + .../Main/WireFrame/MainWireframe.swift | 6 ++ Nynja/OptionsItemsFactory.swift | 9 +- .../Assets.xcassets/Logo/Contents.json | 6 ++ .../auth_light_logo.imageset/Contents.json | 0 .../auth_light_logo@2x.png | Bin .../auth_light_logo@3x.png | Bin .../dark_logo.imageset/Contents.json | 0 .../dark_logo.imageset/dark_logo@2x.png | Bin .../dark_logo.imageset/dark_logo@3x.png | Bin .../Logo/ic_logo.imageset/Contents.json | 15 ++++ .../Logo/ic_logo.imageset/ic_logo.pdf | Bin 0 -> 4846 bytes .../light_logo.imageset/Contents.json | 0 .../light_logo.imageset/light_logo@2x.png | Bin .../light_logo.imageset/light_logo@3x.png | Bin .../logo-1.imageset/Contents.json | 0 .../logo-1.imageset/logo.png | Bin .../logo-1.imageset/logo@2x.png | Bin .../logo-1.imageset/logo@3x.png | Bin .../{ => Logo}/logo.imageset/Contents.json | 0 .../{ => Logo}/logo.imageset/logo@2x.png | Bin .../{ => Logo}/logo.imageset/logo@3x.png | Bin Nynja/Resources/en.lproj/Localizable.strings | 6 ++ 36 files changed, 419 insertions(+), 1 deletion(-) create mode 100644 Nynja/BuildNumberItemsFactory.swift create mode 100644 Nynja/Extensions/Bundle+Keys.swift create mode 100644 Nynja/Modules/BuildNumber/BuildNumberProtocols.swift create mode 100644 Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift create mode 100644 Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift create mode 100644 Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift create mode 100644 Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift create mode 100644 Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift create mode 100644 Nynja/Resources/Assets.xcassets/Logo/Contents.json rename Nynja/Resources/Assets.xcassets/{ => Logo}/auth_light_logo.imageset/Contents.json (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/auth_light_logo.imageset/auth_light_logo@2x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/auth_light_logo.imageset/auth_light_logo@3x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/dark_logo.imageset/Contents.json (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/dark_logo.imageset/dark_logo@2x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/dark_logo.imageset/dark_logo@3x.png (100%) create mode 100644 Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/Contents.json create mode 100644 Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/ic_logo.pdf rename Nynja/Resources/Assets.xcassets/{ => Logo}/light_logo.imageset/Contents.json (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/light_logo.imageset/light_logo@2x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/light_logo.imageset/light_logo@3x.png (100%) rename Nynja/Resources/Assets.xcassets/{New Folder => Logo}/logo-1.imageset/Contents.json (100%) rename Nynja/Resources/Assets.xcassets/{New Folder => Logo}/logo-1.imageset/logo.png (100%) rename Nynja/Resources/Assets.xcassets/{New Folder => Logo}/logo-1.imageset/logo@2x.png (100%) rename Nynja/Resources/Assets.xcassets/{New Folder => Logo}/logo-1.imageset/logo@3x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/logo.imageset/Contents.json (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/logo.imageset/logo@2x.png (100%) rename Nynja/Resources/Assets.xcassets/{ => Logo}/logo.imageset/logo@3x.png (100%) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 9dc9df4e9..c251f6845 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -775,6 +775,14 @@ 855EF421202CC6F800541BE3 /* GetExtendedStarsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */; }; 855EF423202CC85300541BE3 /* MQTTServiceStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */; }; 855EF425202CCADB00541BE3 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; + 85788C3C204422FB003600C9 /* BuildNumberProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C3B204422FB003600C9 /* BuildNumberProtocols.swift */; }; + 85788C422044237B003600C9 /* BuildNumberViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C412044237B003600C9 /* BuildNumberViewController.swift */; }; + 85788C4420442385003600C9 /* BuildNumberPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4320442385003600C9 /* BuildNumberPresenter.swift */; }; + 85788C4620442392003600C9 /* BuildNumberInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4520442392003600C9 /* BuildNumberInteractor.swift */; }; + 85788C48204423A4003600C9 /* BuildNumberWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C47204423A4003600C9 /* BuildNumberWireFrame.swift */; }; + 85788C4A20442887003600C9 /* Bundle+Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4920442887003600C9 /* Bundle+Keys.swift */; }; + 85788C4C20443366003600C9 /* BuildNumberViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4B20443366003600C9 /* BuildNumberViewControllerLayout.swift */; }; + 85788C4E20443DD2003600C9 /* BuildNumberItemsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; @@ -1745,6 +1753,14 @@ 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTServiceStars.swift; sourceTree = ""; }; 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStarHandler.swift; sourceTree = ""; }; + 85788C3B204422FB003600C9 /* BuildNumberProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberProtocols.swift; sourceTree = ""; }; + 85788C412044237B003600C9 /* BuildNumberViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberViewController.swift; sourceTree = ""; }; + 85788C4320442385003600C9 /* BuildNumberPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberPresenter.swift; sourceTree = ""; }; + 85788C4520442392003600C9 /* BuildNumberInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberInteractor.swift; sourceTree = ""; }; + 85788C47204423A4003600C9 /* BuildNumberWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberWireFrame.swift; sourceTree = ""; }; + 85788C4920442887003600C9 /* Bundle+Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Keys.swift"; sourceTree = ""; }; + 85788C4B20443366003600C9 /* BuildNumberViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberViewControllerLayout.swift; sourceTree = ""; }; + 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberItemsFactory.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; @@ -3655,6 +3671,7 @@ E61C394BD0E94E3DCF853D4F /* ScheduleMessage */, 975DB2471671357A9EEBF65B /* TimeZoneSelector */, E1BF3560A2E8EE8B02A9A9FB /* DateTimePicker */, + 85788C3A20442263003600C9 /* BuildNumber */, ); path = Modules; sourceTree = ""; @@ -3751,6 +3768,7 @@ children = ( 4B1D7E002029C4BE00703228 /* OptionsItemsFactory.swift */, 4B1D7DFD2029C41C00703228 /* AboutItemsFactory.swift */, + 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */, ); name = Options; sourceTree = ""; @@ -4382,6 +4400,51 @@ path = Models; sourceTree = ""; }; + 85788C3A20442263003600C9 /* BuildNumber */ = { + isa = PBXGroup; + children = ( + 85788C3B204422FB003600C9 /* BuildNumberProtocols.swift */, + 85788C3D2044230B003600C9 /* View */, + 85788C3E20442312003600C9 /* Presenter */, + 85788C3F2044235F003600C9 /* Interactor */, + 85788C4020442365003600C9 /* WireFrame */, + ); + path = BuildNumber; + sourceTree = ""; + }; + 85788C3D2044230B003600C9 /* View */ = { + isa = PBXGroup; + children = ( + 85788C412044237B003600C9 /* BuildNumberViewController.swift */, + 85788C4B20443366003600C9 /* BuildNumberViewControllerLayout.swift */, + ); + path = View; + sourceTree = ""; + }; + 85788C3E20442312003600C9 /* Presenter */ = { + isa = PBXGroup; + children = ( + 85788C4320442385003600C9 /* BuildNumberPresenter.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 85788C3F2044235F003600C9 /* Interactor */ = { + isa = PBXGroup; + children = ( + 85788C4520442392003600C9 /* BuildNumberInteractor.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 85788C4020442365003600C9 /* WireFrame */ = { + isa = PBXGroup; + children = ( + 85788C47204423A4003600C9 /* BuildNumberWireFrame.swift */, + ); + path = WireFrame; + sourceTree = ""; + }; 85801C4020342A3E00CC364C /* BottomActions */ = { isa = PBXGroup; children = ( @@ -5790,6 +5853,7 @@ E77FBDDC1FFE828400BDB255 /* AVURLAsset+Duration.swift */, 002FFCE0202DE8BE003CCB26 /* Date+Extension.swift */, B79D8BCE2020C35300184D5D /* UIEdgeInsets+Adjust.swift */, + 85788C4920442887003600C9 /* Bundle+Keys.swift */, ); path = Extensions; sourceTree = ""; @@ -6816,6 +6880,7 @@ 3A1EB9A51F3A848A00658E93 /* HistoryHandler.swift in Sources */, 2683F763203F36B10003181A /* ConnectionSubscriberService.swift in Sources */, 850FC5F42032F4CE00832D87 /* ForwardTargets.swift in Sources */, + 85788C422044237B003600C9 /* BuildNumberViewController.swift in Sources */, 26B32B791FE1724A00888A0A /* ContextMenu.swift in Sources */, 26D35AB81FD0EFA800A5D513 /* AudioRecorderHelper.swift in Sources */, 005B0B202029ABC2000D6416 /* TimeZoneItemView.swift in Sources */, @@ -6949,6 +7014,7 @@ 3A8045D61F60C93D00AED866 /* MQTTServiceChat.swift in Sources */, 3A8045D41F60C8E200AED866 /* MQTTServiceAuth.swift in Sources */, 32868DED1F3317C00028B260 /* ChatListTableDS.swift in Sources */, + 85788C4A20442887003600C9 /* Bundle+Keys.swift in Sources */, 2652D6161FA82EFE005E62C7 /* EditProfileVCLayout.swift in Sources */, E70189BB1F9107AD00CA7005 /* ProximitySensorManager.swift in Sources */, E7C36C2F1FC438C800740630 /* StorageService+Profile.swift in Sources */, @@ -7006,9 +7072,11 @@ 26035BBF1F9A741C00003850 /* operation_Spec.swift in Sources */, 26035B881F9A740A00003850 /* Index.swift in Sources */, 850FC611203312FA00832D87 /* ForwardSelectorViewControllerLayout.swift in Sources */, + 85788C4E20443DD2003600C9 /* BuildNumberItemsFactory.swift in Sources */, B1B8ED3EDB12866323C9EE74 /* QRCodeGeneratorInteractor.swift in Sources */, 4B06D3242028B209003B275B /* WCBaseItemsFactory.swift in Sources */, 005A877F2034C22200372B03 /* JobExtension.swift in Sources */, + 85788C4420442385003600C9 /* BuildNumberPresenter.swift in Sources */, 3AE0A84D1F20321A008A04F3 /* WheelItemView.swift in Sources */, E70A8D681FE84E7B008B0BD0 /* SendingStatus.swift in Sources */, E7F2CFE21F5EEF1E00806E43 /* PermissionManager.swift in Sources */, @@ -7338,6 +7406,7 @@ E7302A971FC8642F002892F8 /* MucTable.swift in Sources */, 0008E9072031E88A003E316E /* Job.swift in Sources */, 26441A141F9FC78B00E724B5 /* ArrayExtension.swift in Sources */, + 85788C4620442392003600C9 /* BuildNumberInteractor.swift in Sources */, 6B3D349607A18D5650BF47E6 /* SplashInteractor.swift in Sources */, 26035BB51F9A741C00003850 /* io_Spec.swift in Sources */, E7E6E3DE1FB2F37900401D9E /* ParticipantsDelegate.swift in Sources */, @@ -7357,6 +7426,7 @@ E7F35F0B1F8628590073B4AC /* ContactHeaderViewLayout.swift in Sources */, E791178E1F97A31D00462D68 /* ProfileViewControllerLayout.swift in Sources */, 26F47052201B7248005D3192 /* ReturnToCallView.swift in Sources */, + 85788C3C204422FB003600C9 /* BuildNumberProtocols.swift in Sources */, 73BFE52F809536A538E6A55E /* ImagePreviewViewController.swift in Sources */, 3A8045D31F60C8E200AED866 /* MQTTServiceProfile.swift in Sources */, F28F1B12B94FA382AD522B48 /* ImagePreviewPresenter.swift in Sources */, @@ -7365,6 +7435,7 @@ 0008E9282036F480003E316E /* ScheduledMessage.swift in Sources */, 26E7D04C1FCB8A72001C69B7 /* UIImageView+SetImage.swift in Sources */, 0008E92220347A7B003E316E /* DBJob.swift in Sources */, + 85788C4C20443366003600C9 /* BuildNumberViewControllerLayout.swift in Sources */, DDDA12EC6C743547BC91276F /* ImagePreviewWireframe.swift in Sources */, 26035BB21F9A741C00003850 /* Friend_Spec.swift in Sources */, 26035B8B1F9A740A00003850 /* iterator.swift in Sources */, @@ -7530,6 +7601,7 @@ AB8501A3A8E471294BB618E6 /* DateTimePickerProtocols.swift in Sources */, CA6AA942773DEBE97BDCFDD6 /* DateTimePickerViewController.swift in Sources */, 24AC9EAFA26353C7B95B60BF /* DateTimePickerPresenter.swift in Sources */, + 85788C48204423A4003600C9 /* BuildNumberWireFrame.swift in Sources */, 5894F4C605B66B55F21D406E /* DateTimePickerInteractor.swift in Sources */, E3E22BD2755EAE3DBBCE2E9D /* DateTimePickerWireframe.swift in Sources */, 850FC5F22032F33900832D87 /* ForwardSelectorViewController.swift in Sources */, diff --git a/Nynja/BuildNumberItemsFactory.swift b/Nynja/BuildNumberItemsFactory.swift new file mode 100644 index 000000000..4b13ac431 --- /dev/null +++ b/Nynja/BuildNumberItemsFactory.swift @@ -0,0 +1,18 @@ +// +// BuildNumberItemsFactory.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +class BuildNumberItemsFactory: OptionsItemsFactory { + + // MARK: - Second lvl + + override var buildNumber: ImageActionItemModel { + let item = super.buildNumber + item.state = .highlighted + return item + } +} diff --git a/Nynja/Extensions/Bundle+Keys.swift b/Nynja/Extensions/Bundle+Keys.swift new file mode 100644 index 000000000..255e4c48f --- /dev/null +++ b/Nynja/Extensions/Bundle+Keys.swift @@ -0,0 +1,31 @@ +// +// Bundle+Keys.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +extension Bundle { + + public var bundleIdentifier: String { + return object(forInfoDictionaryKey: kCFBundleIdentifierKey as String) as! String + } + + /// Project bundle name + public var bundleName: String { + return object(forInfoDictionaryKey: kCFBundleNameKey as String) as! String + } + + /// App name which displaying in Springboard + public var displayName: String { + let displayName = object(forInfoDictionaryKey: "CFBundleDisplayName") as? String + return displayName ?? self.bundleName + } + + public var buildVersion: String? { + return object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String + } +} diff --git a/Nynja/Modules/BuildNumber/BuildNumberProtocols.swift b/Nynja/Modules/BuildNumber/BuildNumberProtocols.swift new file mode 100644 index 000000000..5eb9c19a7 --- /dev/null +++ b/Nynja/Modules/BuildNumber/BuildNumberProtocols.swift @@ -0,0 +1,56 @@ +// +// BuildNumberProtocols.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +protocol BuildNumberWireFrameProtocol: class { + + func presentBuildNumber(navigation: UINavigationController) + + /** + * Add here your methods for communication PRESENTER -> WIREFRAME + */ +} + +protocol BuildNumberViewProtocol: class { + + var presenter: BuildNumberPresenterProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> VIEW + */ + func setupBuildNumber(_ buildNumber: String) +} + +protocol BuildNumberPresenterProtocol: AnyObject, BasePresenterProtocol { + + var view: BuildNumberViewProtocol! { get set } + var interactor: BuildNumberInteractorInputProtocol! { get set } + var wireFrame: BuildNumberWireFrameProtocol! { get set } + + /** + * Add here your methods for communication VIEW -> PRESENTER + */ + func showed() +} + +protocol BuildNumberInteractorOutputProtocol: class { + + /** + * Add here your methods for communication INTERACTOR -> PRESENTER + */ +} + +protocol BuildNumberInteractorInputProtocol: class { + + var presenter: BuildNumberInteractorOutputProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> INTERACTOR + */ +} diff --git a/Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift b/Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift new file mode 100644 index 000000000..b5a18e39b --- /dev/null +++ b/Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift @@ -0,0 +1,13 @@ +// +// BuildNumberInteractor.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +class BuildNumberInteractor: BuildNumberInteractorInputProtocol { + weak var presenter: BuildNumberInteractorOutputProtocol! +} diff --git a/Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift b/Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift new file mode 100644 index 000000000..9177cdd72 --- /dev/null +++ b/Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift @@ -0,0 +1,27 @@ +// +// BuildNumberPresenter.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +class BuildNumberPresenter: BasePresenter, BuildNumberPresenterProtocol, BuildNumberInteractorOutputProtocol { + + override var itemsFactory: WCItemsFactory? { + return BuildNumberItemsFactory() + } + + weak var view: BuildNumberViewProtocol! + var interactor: BuildNumberInteractorInputProtocol! + var wireFrame: BuildNumberWireFrameProtocol! + + func showed() { + if let buildNumber = Bundle.main.buildVersion { + let displayString = String(format: "build number version".localized, buildNumber) + view.setupBuildNumber(displayString) + } + } +} diff --git a/Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift b/Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift new file mode 100644 index 000000000..d0d45476a --- /dev/null +++ b/Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift @@ -0,0 +1,85 @@ +// +// BuildNumberViewController.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +class BuildNumberViewController: BaseVC, BuildNumberViewProtocol { + + var presenter: BuildNumberPresenterProtocol! { + didSet { + _presenter = presenter + } + } + + // MARK: - Views + + private lazy var logoImageView: UIImageView = { + let imageView = UIImageView() + imageView.image = #imageLiteral(resourceName: "icon") + self.view.addSubview(imageView) + + imageView.snp.makeConstraints { maker in + maker.centerX.equalToSuperview() + maker.centerY.equalToSuperview().offset(-Constraints.logoImageView.centerOffset.adjustedByWidth) + maker.width.equalTo(Constraints.logoImageView.width.adjustedByWidth) + maker.height.equalTo(Constraints.logoImageView.height.adjustedByWidth) + } + return imageView + }() + + private lazy var textLogoImageView: UIImageView = { + let imageView = UIImageView() + imageView.image = #imageLiteral(resourceName: "ic_logo") + self.view.addSubview(imageView) + + imageView.snp.makeConstraints { maker in + maker.centerX.equalToSuperview() + maker.top.equalTo(logoImageView.snp.bottom).offset(Constraints.textLogoImageView.topOffset.adjustedByWidth) + maker.width.equalTo(Constraints.textLogoImageView.width.adjustedByWidth) + maker.height.equalTo(Constraints.textLogoImageView.height.adjustedByWidth) + } + return imageView + }() + + private lazy var buildLabel: UILabel = { + let width = Constraints.buildLabel.width.adjustedByWidth + let height = Constraints.buildLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), + color: Constants.colors.white.getColor(), + fontName: Constants.fonts.medium) + label.numberOfLines = 0 + label.textAlignment = .center + + self.view.addSubview(label) + + label.snp.makeConstraints { maker in + maker.height.equalTo(height) + + let inset = Constraints.buildLabel.horizontalInset.adjustedByWidth + maker.left.equalToSuperview().offset(inset) + maker.right.equalToSuperview().inset(inset) + maker.top.equalTo(textLogoImageView.snp.bottom).offset(Constraints.buildLabel.topOffset.adjustedByWidth) + } + return label + }() + + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + self.screenTitle = "build number title".localized + presenter.showed() + } + + func setupBuildNumber(_ buildNumber: String) { + self.buildLabel.text = buildNumber + } +} diff --git a/Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift b/Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift new file mode 100644 index 000000000..04c9fa5ac --- /dev/null +++ b/Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift @@ -0,0 +1,32 @@ +// +// BuildNumberViewControllerLayout.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +extension BuildNumberViewController { + + enum Constraints { + enum logoImageView { + static let centerOffset: CGFloat = 97 + static let width: CGFloat = 214 + static let height: CGFloat = 202 + } + enum textLogoImageView { + static let topOffset: CGFloat = 16 + static let width: CGFloat = 273 + static let height: CGFloat = 38 + } + enum buildLabel { + static let topOffset: CGFloat = 64 + static let width: CGFloat = 222 + static let height: CGFloat = 22 + static let horizontalInset: CGFloat = 16 + } + } + +} diff --git a/Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift b/Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift new file mode 100644 index 000000000..251a1ebf8 --- /dev/null +++ b/Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift @@ -0,0 +1,31 @@ +// +// BuildNumberWireFrame.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +class BuildNumberWireFrame: BuildNumberWireFrameProtocol { + + weak var navigation : UINavigationController? + + func presentBuildNumber(navigation: UINavigationController) { + let view = BuildNumberViewController() + let presenter = BuildNumberPresenter() + let interactor = BuildNumberInteractor() + + self.navigation = navigation + + // Connecting + view.presenter = presenter + presenter.view = view + presenter.wireFrame = self + presenter.interactor = interactor + interactor.presenter = presenter + navigation.pushViewController(view as UIViewController, animated: false) + + } +} diff --git a/Nynja/Modules/Main/MainProtocols.swift b/Nynja/Modules/Main/MainProtocols.swift index e01170bf2..99b659c21 100644 --- a/Nynja/Modules/Main/MainProtocols.swift +++ b/Nynja/Modules/Main/MainProtocols.swift @@ -52,6 +52,7 @@ protocol MainWireFrameProtocol: class { func getContact() -> String? func viewShowed() func showMessages(contact: Contact, callVC: CallViewProtocol, isVideo: Bool) + func showBuildNumber() func logout() func hideReturnToCallView() func returnToCall() @@ -142,6 +143,7 @@ protocol MainPresenterProtocol: class { func openScheduleMessageScreen(text : String?, audioUrl : URL?) func returnToCall() func about() + func showBuildNumber() func openMapView() func deleteAccount() diff --git a/Nynja/Modules/Main/Presenter/MainPresenter.swift b/Nynja/Modules/Main/Presenter/MainPresenter.swift index 70daeae55..da3cd9da1 100644 --- a/Nynja/Modules/Main/Presenter/MainPresenter.swift +++ b/Nynja/Modules/Main/Presenter/MainPresenter.swift @@ -179,6 +179,10 @@ class MainPresenter: MainPresenterProtocol, MainInteractorOutputProtocol { self.wireFrame.showSplash() } + func showBuildNumber() { + self.wireFrame.showBuildNumber() + } + func showContactsToShare() { self.wireFrame.showContactsToShare() } diff --git a/Nynja/Modules/Main/View/MainNavigationItem.swift b/Nynja/Modules/Main/View/MainNavigationItem.swift index 5e9fe95ee..6bf707db2 100644 --- a/Nynja/Modules/Main/View/MainNavigationItem.swift +++ b/Nynja/Modules/Main/View/MainNavigationItem.swift @@ -83,6 +83,7 @@ enum MainNavigationItem: String { case options = "Setting" case logOut = "LOG OUT" case about = "About" + case buildNumber = "Build Number" case deleteAccount = "Delete Account" // Location subsection diff --git a/Nynja/Modules/Main/View/MainViewControllerNav.swift b/Nynja/Modules/Main/View/MainViewControllerNav.swift index 2bdfffcac..503387ecb 100644 --- a/Nynja/Modules/Main/View/MainViewControllerNav.swift +++ b/Nynja/Modules/Main/View/MainViewControllerNav.swift @@ -354,6 +354,11 @@ extension MainViewController: NavigateProtocol { closeWheel(indexPath: indexPath) } + func showBuildNumber(indexPath: IndexPath?) { + presenter.showBuildNumber() + closeWheel(indexPath: indexPath) + } + func deleteAccount(indexPath: IndexPath?) { presenter.deleteAccount() closeWheel(indexPath: indexPath) diff --git a/Nynja/Modules/Main/View/NavigateProtocol.swift b/Nynja/Modules/Main/View/NavigateProtocol.swift index b3e9db399..4f7dc015c 100644 --- a/Nynja/Modules/Main/View/NavigateProtocol.swift +++ b/Nynja/Modules/Main/View/NavigateProtocol.swift @@ -75,6 +75,7 @@ protocol SecondLevelNavigateProtocol: class { // MARK: - Options func logout(indexPath: IndexPath?) + func showBuildNumber(indexPath: IndexPath?) func showAbout(indexPath: IndexPath?) func deleteAccount(indexPath: IndexPath?) } diff --git a/Nynja/Modules/Main/WireFrame/MainWireframe.swift b/Nynja/Modules/Main/WireFrame/MainWireframe.swift index 44bbda701..f13f2c650 100644 --- a/Nynja/Modules/Main/WireFrame/MainWireframe.swift +++ b/Nynja/Modules/Main/WireFrame/MainWireframe.swift @@ -450,6 +450,12 @@ class MainWireFrame: MainWireFrameProtocol, VoxServiceDelegate { } } + func showBuildNumber() { + if let navigation = contentNavigation { + BuildNumberWireFrame().presentBuildNumber(navigation: navigation) + } + } + // MARK: Edit Profile diff --git a/Nynja/OptionsItemsFactory.swift b/Nynja/OptionsItemsFactory.swift index bd8ba7904..726928554 100644 --- a/Nynja/OptionsItemsFactory.swift +++ b/Nynja/OptionsItemsFactory.swift @@ -20,7 +20,7 @@ class OptionsItemsFactory: WCBaseItemsFactory { // MARK: - Second lvl override var secondLevelItems: ItemModels { - return [logout, about, deleteAccount] + return [logout, about, buildNumber, deleteAccount] } @@ -33,6 +33,13 @@ class OptionsItemsFactory: WCBaseItemsFactory { return item } + var buildNumber: ImageActionItemModel { + let item = ImageActionItemModel(navItem: .buildNumber, action: { [weak navigateDelegate] (item, indexPath) in + navigateDelegate?.showBuildNumber(indexPath: indexPath) + }) + return item + } + var logout: ImageActionItemModel { let item = ImageActionItemModel(navItem: .logOut, action: { [weak navigateDelegate] (item, indexPath) in navigateDelegate?.logout(indexPath: indexPath) diff --git a/Nynja/Resources/Assets.xcassets/Logo/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Nynja/Resources/Assets.xcassets/Logo/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/Contents.json similarity index 100% rename from Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/Contents.json rename to Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/Contents.json diff --git a/Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/auth_light_logo@2x.png b/Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/auth_light_logo@2x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/auth_light_logo@2x.png rename to Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/auth_light_logo@2x.png diff --git a/Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/auth_light_logo@3x.png b/Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/auth_light_logo@3x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/auth_light_logo.imageset/auth_light_logo@3x.png rename to Nynja/Resources/Assets.xcassets/Logo/auth_light_logo.imageset/auth_light_logo@3x.png diff --git a/Nynja/Resources/Assets.xcassets/dark_logo.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/Contents.json similarity index 100% rename from Nynja/Resources/Assets.xcassets/dark_logo.imageset/Contents.json rename to Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/Contents.json diff --git a/Nynja/Resources/Assets.xcassets/dark_logo.imageset/dark_logo@2x.png b/Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/dark_logo@2x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/dark_logo.imageset/dark_logo@2x.png rename to Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/dark_logo@2x.png diff --git a/Nynja/Resources/Assets.xcassets/dark_logo.imageset/dark_logo@3x.png b/Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/dark_logo@3x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/dark_logo.imageset/dark_logo@3x.png rename to Nynja/Resources/Assets.xcassets/Logo/dark_logo.imageset/dark_logo@3x.png diff --git a/Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/Contents.json new file mode 100644 index 000000000..f81faf189 --- /dev/null +++ b/Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_logo.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/ic_logo.pdf b/Nynja/Resources/Assets.xcassets/Logo/ic_logo.imageset/ic_logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7456f3e41f0146a0ac71814910b62891dac0dea7 GIT binary patch literal 4846 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 F{sROcXJY^W literal 0 HcmV?d00001 diff --git a/Nynja/Resources/Assets.xcassets/light_logo.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/Contents.json similarity index 100% rename from Nynja/Resources/Assets.xcassets/light_logo.imageset/Contents.json rename to Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/Contents.json diff --git a/Nynja/Resources/Assets.xcassets/light_logo.imageset/light_logo@2x.png b/Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/light_logo@2x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/light_logo.imageset/light_logo@2x.png rename to Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/light_logo@2x.png diff --git a/Nynja/Resources/Assets.xcassets/light_logo.imageset/light_logo@3x.png b/Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/light_logo@3x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/light_logo.imageset/light_logo@3x.png rename to Nynja/Resources/Assets.xcassets/Logo/light_logo.imageset/light_logo@3x.png diff --git a/Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/Contents.json similarity index 100% rename from Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/Contents.json rename to Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/Contents.json diff --git a/Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo.png b/Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo.png rename to Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo.png diff --git a/Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo@2x.png b/Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo@2x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo@2x.png rename to Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo@2x.png diff --git a/Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo@3x.png b/Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo@3x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/New Folder/logo-1.imageset/logo@3x.png rename to Nynja/Resources/Assets.xcassets/Logo/logo-1.imageset/logo@3x.png diff --git a/Nynja/Resources/Assets.xcassets/logo.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/Logo/logo.imageset/Contents.json similarity index 100% rename from Nynja/Resources/Assets.xcassets/logo.imageset/Contents.json rename to Nynja/Resources/Assets.xcassets/Logo/logo.imageset/Contents.json diff --git a/Nynja/Resources/Assets.xcassets/logo.imageset/logo@2x.png b/Nynja/Resources/Assets.xcassets/Logo/logo.imageset/logo@2x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/logo.imageset/logo@2x.png rename to Nynja/Resources/Assets.xcassets/Logo/logo.imageset/logo@2x.png diff --git a/Nynja/Resources/Assets.xcassets/logo.imageset/logo@3x.png b/Nynja/Resources/Assets.xcassets/Logo/logo.imageset/logo@3x.png similarity index 100% rename from Nynja/Resources/Assets.xcassets/logo.imageset/logo@3x.png rename to Nynja/Resources/Assets.xcassets/Logo/logo.imageset/logo@3x.png diff --git a/Nynja/Resources/en.lproj/Localizable.strings b/Nynja/Resources/en.lproj/Localizable.strings index bbdbbed23..7ac5e03f3 100644 --- a/Nynja/Resources/en.lproj/Localizable.strings +++ b/Nynja/Resources/en.lproj/Localizable.strings @@ -385,3 +385,9 @@ "am" = "AM"; "pm" = "PM"; + + +//MARK: Build Number + +"build number title" = "BUILD NUMBER"; +"build number version" = "NYNJA FOR iOS V%@"; -- GitLab From b5b23b6cce6047acc7889995849ae978dce02d6a Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 16:39:13 +0200 Subject: [PATCH 02/24] Added base empty VIPER skeleton of WheelPositionPicker module. --- Nynja.xcodeproj/project.pbxproj | 232 +++++++++++------- .../WheelPositionPickerInteractor.swift | 14 ++ .../WheelPositionPickerPresenter.swift | 21 ++ .../WheelPositionPickerViewController.swift | 25 ++ .../WheelPositionPickerProtocols.swift | 54 ++++ .../WheelPositionPickerWireFrame.swift | 34 +++ 6 files changed, 294 insertions(+), 86 deletions(-) create mode 100644 Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift create mode 100644 Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift create mode 100644 Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift create mode 100644 Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift create mode 100644 Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 13f343155..0f0fa1a90 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -194,7 +194,7 @@ 26035BCE1F9A741C00003850 /* writer_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26035B2A1F9A73C200003850 /* writer_Spec.swift */; }; 260552A61F9E1CD100D68DE6 /* SearchHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260552A51F9E1CD100D68DE6 /* SearchHandler.swift */; }; 26060C961FFDCF4000E5C6F3 /* NSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26060C951FFDCF4000E5C6F3 /* NSLog.swift */; }; - 2607270A203C598F00290545 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 2607270A203C598F00290545 /* (null) in Sources */ = {isa = PBXBuildFile; }; 2617AE711FD87BC800759269 /* DrawableAudioWaveform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2617AE701FD87BC800759269 /* DrawableAudioWaveform.swift */; }; 261F2E2E200EB0AD007D0813 /* RepliesVC+CellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261F2E2D200EB0AD007D0813 /* RepliesVC+CellDelegate.swift */; }; 262D43872033417F002F1E45 /* FriendExtansion+BERT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262D43862033417F002F1E45 /* FriendExtansion+BERT.swift */; }; @@ -409,14 +409,14 @@ 358DE87E1F9D342600B558A3 /* ServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 358DE87D1F9D342600B558A3 /* ServiceManager.swift */; }; 359E343F1F55FA0F002F5F3E /* 1-second-of-silence.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 359E343E1F55FA0F002F5F3E /* 1-second-of-silence.mp3 */; }; 359EB22C1F9A137200147437 /* ChatListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359EB22B1F9A137200147437 /* ChatListVC.swift */; }; - 359EB2301F9A16AB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2311F9A16B200147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2301F9A16AB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2311F9A16B200147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2321F9A16BC00147437 /* StringAtom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A36E5231F4C6A0F001427DF /* StringAtom.swift */; }; - 359EB2331F9A16C300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2341F9A16CF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2331F9A16C300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2341F9A16CF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2351F9A16D800147437 /* CountryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1D03001F0B27D0005F5F18 /* CountryModel.swift */; }; - 359EB2371F9A170E00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2381F9A171400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2371F9A170E00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2381F9A171400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB23A1F9A18B400147437 /* MQTTService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8045CD1F60C8E200AED866 /* MQTTService.swift */; }; 359EB23B1F9A1BC700147437 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1C87431F6103820029B0BC /* ReachabilityService.swift */; }; 359EB23C1F9A1BD800147437 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1C87411F6101A50029B0BC /* Reachability.swift */; }; @@ -424,41 +424,41 @@ 359EB23F1F9A1CCA00147437 /* HandleService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1DC7381EF151C8006A8E9F /* HandleService.swift */; }; 359EB2401F9A1CCE00147437 /* IoHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1DC73E1EF15B65006A8E9F /* IoHandler.swift */; }; 359EB2441F9A1CFE00147437 /* Bert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A768DE51ECB3E8D00108F7C /* Bert.swift */; }; - 359EB2451F9A1D2600147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2461F9A1D3200147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2471F9A1D6100147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2481F9A1D6D00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2491F9A1D7900147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24A1F9A1D8700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24B1F9A1D9A00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24C1F9A1DAA00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24D1F9A1DBB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24E1F9A1DCC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2511F9A1DDF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2521F9A1E0700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2531F9A1E1300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2541F9A1E2000147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2551F9A1E2C00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2561F9A1E3800147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2451F9A1D2600147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2461F9A1D3200147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2471F9A1D6100147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2481F9A1D6D00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2491F9A1D7900147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24A1F9A1D8700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24B1F9A1D9A00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24C1F9A1DAA00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24D1F9A1DBB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24E1F9A1DCC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24F1F9A1DCF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2501F9A1DDC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2511F9A1DDF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2521F9A1E0700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2531F9A1E1300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2541F9A1E2000147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2551F9A1E2C00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2561F9A1E3800147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2571F9A1E5000147437 /* BaseMQTTModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A62B7D71F4CB9D100F45B51 /* BaseMQTTModel.swift */; }; - 359EB2581F9A1E7400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2591F9A1E8B00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25A1F9A1E9100147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25B1F9A1E9700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25C1F9A1E9D00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25D1F9A1EA500147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25E1F9A1EAD00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25F1F9A1EB400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2601F9A1EBC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2611F9A1EC300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2621F9A1ECF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2631F9A1ED600147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2641F9A1EDB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB26E1F9A200300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB26F1F9A200700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2711F9A203800147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2581F9A1E7400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2591F9A1E8B00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25A1F9A1E9100147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25B1F9A1E9700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25C1F9A1E9D00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25D1F9A1EA500147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25E1F9A1EAD00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25F1F9A1EB400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2601F9A1EBC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2611F9A1EC300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2621F9A1ECF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2631F9A1ED600147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2641F9A1EDB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB26E1F9A200300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB26F1F9A200700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2711F9A203800147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2751F9A284F00147437 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8218831EDEEEB100337B05 /* Constants.swift */; }; 359EB2761F9A285C00147437 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8218871EDF102D00337B05 /* Color.swift */; }; 359EB27B1F9A28C500147437 /* MessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359EB27A1F9A28C500147437 /* MessageHandler.swift */; }; @@ -667,7 +667,7 @@ 4BAB9CE22035CAF500385520 /* ScheduleContentType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE12035CAF500385520 /* ScheduleContentType.swift */; }; 4BAB9CE42035CB0A00385520 /* ScheduleTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE32035CB0A00385520 /* ScheduleTarget.swift */; }; 4BAB9CE62035CB3800385520 /* ScheduleDisplayInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE52035CB3800385520 /* ScheduleDisplayInfo.swift */; }; - 4BB634BB203C33EA006581C4 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 4BB634BB203C33EA006581C4 /* (null) in Sources */ = {isa = PBXBuildFile; }; 4BD50B8920333F3B005FFF06 /* MessageForwardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD50B8820333F3B005FFF06 /* MessageForwardView.swift */; }; 4BD53BF4202C8BCA00569C1A /* AVURLAsset+Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = E77FBDDC1FFE828400BDB255 /* AVURLAsset+Duration.swift */; }; 4BDC7E5F203454D300BCD381 /* MessageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC7E5E203454D300BCD381 /* MessageContainerView.swift */; }; @@ -771,6 +771,11 @@ 855EF421202CC6F800541BE3 /* GetExtendedStarsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */; }; 855EF423202CC85300541BE3 /* MQTTServiceStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */; }; 855EF425202CCADB00541BE3 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; + 85788C5120444F2E003600C9 /* WheelPositionPickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */; }; + 85788C57204450AE003600C9 /* WheelPositionPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */; }; + 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; + 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; + 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; @@ -1737,6 +1742,11 @@ 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTServiceStars.swift; sourceTree = ""; }; 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStarHandler.swift; sourceTree = ""; }; + 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerProtocols.swift; sourceTree = ""; }; + 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewController.swift; sourceTree = ""; }; + 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; + 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; + 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; @@ -3643,6 +3653,7 @@ 91732B7DCE35ABC02702095D /* GroupStorage */, 115A968821FB24FA3C58A6D5 /* SelectCountry */, 80CA53AB5B009455E0ECDC30 /* AddContactByUsername */, + 85788C4F20444EF1003600C9 /* WheelPositionPicker */, 4188F5659F19255180FB387D /* MapSearch */, E61C394BD0E94E3DCF853D4F /* ScheduleMessage */, 975DB2471671357A9EEBF65B /* TimeZoneSelector */, @@ -4362,6 +4373,50 @@ path = Models; sourceTree = ""; }; + 85788C4F20444EF1003600C9 /* WheelPositionPicker */ = { + isa = PBXGroup; + children = ( + 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */, + 85788C5220445064003600C9 /* View */, + 85788C542044506E003600C9 /* Presenter */, + 85788C5320445069003600C9 /* Interactor */, + 85788C5520445073003600C9 /* WireFrame */, + ); + path = WheelPositionPicker; + sourceTree = ""; + }; + 85788C5220445064003600C9 /* View */ = { + isa = PBXGroup; + children = ( + 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */, + ); + path = View; + sourceTree = ""; + }; + 85788C5320445069003600C9 /* Interactor */ = { + isa = PBXGroup; + children = ( + 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 85788C542044506E003600C9 /* Presenter */ = { + isa = PBXGroup; + children = ( + 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 85788C5520445073003600C9 /* WireFrame */ = { + isa = PBXGroup; + children = ( + 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */, + ); + path = WireFrame; + sourceTree = ""; + }; 85801C4020342A3E00CC364C /* BottomActions */ = { isa = PBXGroup; children = ( @@ -6401,7 +6456,7 @@ 265AEA191FE9B1C600AC4806 /* MemberHandler.swift in Sources */, 269848CC200EA0ED00590D6F /* StarModels.swift in Sources */, 005887012032070C00FE2E89 /* userTask_Spec.swift in Sources */, - 359EB2301F9A16AB00147437 /* BuildFile in Sources */, + 359EB2301F9A16AB00147437 /* (null) in Sources */, 35B1AB921FA348C100E65233 /* Service.swift in Sources */, 2648B1511FEAA8BA007F2AAE /* IdGenerator.swift in Sources */, 359EB23F1F9A1CCA00147437 /* HandleService.swift in Sources */, @@ -6411,9 +6466,9 @@ 35B1AB9F1FA349FD00E65233 /* Star.swift in Sources */, 35B1AB8B1FA3457100E65233 /* Contact.swift in Sources */, 35B1ABA31FA34A2B00E65233 /* io_Spec.swift in Sources */, - 359EB2711F9A203800147437 /* BuildFile in Sources */, + 359EB2711F9A203800147437 /* (null) in Sources */, 359EB2441F9A1CFE00147437 /* Bert.swift in Sources */, - 359EB25C1F9A1E9D00147437 /* BuildFile in Sources */, + 359EB25C1F9A1E9D00147437 /* (null) in Sources */, 35B1ABA51FA34A4B00E65233 /* ok2_Spec.swift in Sources */, 26B32B941FE20B9700888A0A /* mucExtension+BERT.swift in Sources */, E7A0C73D1FE965A400E00C2B /* TypingExtension.swift in Sources */, @@ -6421,14 +6476,14 @@ 35B1ABBD1FA34FEB00E65233 /* cur.swift in Sources */, 35B1ABA11FA34A0D00E65233 /* Tag.swift in Sources */, 005886FD203206FB00FE2E89 /* timeoutEvent.swift in Sources */, - 359EB2341F9A16CF00147437 /* BuildFile in Sources */, + 359EB2341F9A16CF00147437 /* (null) in Sources */, 359EB2401F9A1CCE00147437 /* IoHandler.swift in Sources */, - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */, + 359EB24F1F9A1DCF00147437 /* (null) in Sources */, 262D4389203352D4002F1E45 /* FriendExtansion+BERT.swift in Sources */, - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */, + 359EB24F1F9A1DCF00147437 /* (null) in Sources */, 35B1ABCA1FA3506C00E65233 /* Auth.swift in Sources */, - 359EB2491F9A1D7900147437 /* BuildFile in Sources */, - 359EB2381F9A171400147437 /* BuildFile in Sources */, + 359EB2491F9A1D7900147437 /* (null) in Sources */, + 359EB2381F9A171400147437 /* (null) in Sources */, 4B736D4720237C140028F2CB /* CGSizeExtension.swift in Sources */, E785F15A1FF3E38D006C52D9 /* UIImageView+Rounded.swift in Sources */, 35B1ABBE1FA34FF000E65233 /* Cursor.swift in Sources */, @@ -6443,9 +6498,9 @@ 359EB2351F9A16D800147437 /* CountryModel.swift in Sources */, 35B1AB8D1FA3458500E65233 /* Desc.swift in Sources */, 35B1ABA21FA34A0F00E65233 /* Tag_Spec.swift in Sources */, - 359EB24E1F9A1DCC00147437 /* BuildFile in Sources */, + 359EB24E1F9A1DCC00147437 /* (null) in Sources */, 35B98FA21F9CB948009B8DEC /* Layout.swift in Sources */, - 359EB2551F9A1E2C00147437 /* BuildFile in Sources */, + 359EB2551F9A1E2C00147437 /* (null) in Sources */, 35B1ABB81FA34CA800E65233 /* reader_Spec.swift in Sources */, 35B1AB9C1FA3498200E65233 /* Member_Spec.swift in Sources */, 005886FA203206F100FE2E89 /* serviceTask.swift in Sources */, @@ -6457,13 +6512,13 @@ 35B1AB961FA3491900E65233 /* Roster_Spec.swift in Sources */, 35B1AB8F1FA3488000E65233 /* Profile.swift in Sources */, 35B1ABCD1FA3508D00E65233 /* Index.swift in Sources */, - 359EB2541F9A1E2000147437 /* BuildFile in Sources */, + 359EB2541F9A1E2000147437 /* (null) in Sources */, 35B1ABBF1FA34FFC00E65233 /* iter.swift in Sources */, 35B1ABA61FA34A5C00E65233 /* error_Spec.swift in Sources */, - 359EB24C1F9A1DAA00147437 /* BuildFile in Sources */, + 359EB24C1F9A1DAA00147437 /* (null) in Sources */, 35B1ABC21FA3501300E65233 /* log.swift in Sources */, 35B1AB9D1FA3499E00E65233 /* muc_Spec.swift in Sources */, - 359EB2531F9A1E1300147437 /* BuildFile in Sources */, + 359EB2531F9A1E1300147437 /* (null) in Sources */, 35B1ABCE1FA3509600E65233 /* Test.swift in Sources */, 005886DD2032024F00FE2E89 /* process.swift in Sources */, 35B1AB931FA348C400E65233 /* Service_Spec.swift in Sources */, @@ -6472,7 +6527,7 @@ 0008E91C20333BC1003E316E /* JobHandler.swift in Sources */, E70A8D711FE84EE6008B0BD0 /* SendingStatus.swift in Sources */, E7A77FDC1FACC5E2004AE609 /* ContactExtension.swift in Sources */, - 359EB24A1F9A1D8700147437 /* BuildFile in Sources */, + 359EB24A1F9A1D8700147437 /* (null) in Sources */, 005886DE2032025200FE2E89 /* sequenceFlow.swift in Sources */, 35C5BD341F9AA7F0008BDD3A /* ChatListTableDS.swift in Sources */, 359EB2751F9A284F00147437 /* Constants.swift in Sources */, @@ -6484,7 +6539,7 @@ 35B98F9C1F9BFDC3009B8DEC /* MQTTServiceChat.swift in Sources */, 005886D62032023000FE2E89 /* Job_Spec.swift in Sources */, 005886DB2032024800FE2E89 /* Job.swift in Sources */, - 359EB2601F9A1EBC00147437 /* BuildFile in Sources */, + 359EB2601F9A1EBC00147437 /* (null) in Sources */, E757B5401FE92CA800467BA2 /* RecordingStatus.swift in Sources */, 35B1ABCF1FA350B600E65233 /* Profile_Spec.swift in Sources */, 266AE8C42034971A0096A12C /* AsyncOperation.swift in Sources */, @@ -6495,7 +6550,7 @@ 35B98F9F1F9BFDF1009B8DEC /* ReadMessageModel.swift in Sources */, 35B1ABBC1FA34FDE00E65233 /* reader.swift in Sources */, 005886FC203206F700FE2E89 /* boundaryEvent.swift in Sources */, - 359EB2561F9A1E3800147437 /* BuildFile in Sources */, + 359EB2561F9A1E3800147437 /* (null) in Sources */, E745A24C200621BC00D7EF42 /* TableDefinitionExtension.swift in Sources */, 2683F75A203F352D0003181A /* ButtonExtension.swift in Sources */, 359EB27B1F9A28C500147437 /* MessageHandler.swift in Sources */, @@ -6503,20 +6558,20 @@ 26A373571FC6EFC500616C21 /* ProgressHUD.swift in Sources */, E757B53E1FE92C9E00467BA2 /* TypingModel.swift in Sources */, 359EB2321F9A16BC00147437 /* StringAtom.swift in Sources */, - 359EB2521F9A1E0700147437 /* BuildFile in Sources */, - 359EB2471F9A1D6100147437 /* BuildFile in Sources */, + 359EB2521F9A1E0700147437 /* (null) in Sources */, + 359EB2471F9A1D6100147437 /* (null) in Sources */, 35B1AB821F9FB06500E65233 /* AttachmentModel.swift in Sources */, 359EB2831F9A2E6A00147437 /* ProfileHandler.swift in Sources */, - 359EB25A1F9A1E9100147437 /* BuildFile in Sources */, + 359EB25A1F9A1E9100147437 /* (null) in Sources */, 005886F8203206EB00FE2E89 /* Task.swift in Sources */, 35B1AB901FA3489900E65233 /* Feature.swift in Sources */, 35B1AB9A1FA3496E00E65233 /* Room_Spec.swift in Sources */, 005886DC2032024B00FE2E89 /* messageEvent.swift in Sources */, - 359EB25F1F9A1EB400147437 /* BuildFile in Sources */, + 359EB25F1F9A1EB400147437 /* (null) in Sources */, 26FA4211201823AA00E6F6EC /* StarHandler.swift in Sources */, 35B1ABB41FA34B9000E65233 /* p2p.swift in Sources */, 2679D1061FEA0D1F00BC0013 /* HistoryHandler.swift in Sources */, - 359EB24B1F9A1D9A00147437 /* BuildFile in Sources */, + 359EB24B1F9A1D9A00147437 /* (null) in Sources */, 35B1ABA41FA34A3C00E65233 /* ok_Spec.swift in Sources */, 35B1ABC81FA3505700E65233 /* Person.swift in Sources */, 35B1ABD41FA36F6A00E65233 /* ChatsServiceProtocol.swift in Sources */, @@ -6531,20 +6586,20 @@ 005887002032070900FE2E89 /* serviceTask_Spec.swift in Sources */, 26B32B8E1FE20B4D00888A0A /* MessageExtension+BERT.swift in Sources */, 35B1AB841F9FB10600E65233 /* GCD.swift in Sources */, - 359EB26F1F9A200700147437 /* BuildFile in Sources */, + 359EB26F1F9A200700147437 /* (null) in Sources */, 359EB2761F9A285C00147437 /* Color.swift in Sources */, - 359EB2641F9A1EDB00147437 /* BuildFile in Sources */, + 359EB2641F9A1EDB00147437 /* (null) in Sources */, 26A0CFE2200513B4006F6617 /* MemberExtension+BERT.swift in Sources */, 35B1ABB01FA34B2600E65233 /* SearchModel.swift in Sources */, 4B052CB12036193900BC2A9B /* StringAtomExtension.swift in Sources */, 35B98F9E1F9BFDE1009B8DEC /* SendModel.swift in Sources */, - 359EB2621F9A1ECF00147437 /* BuildFile in Sources */, + 359EB2621F9A1ECF00147437 /* (null) in Sources */, 35B1ABC71FA3504600E65233 /* CDR.swift in Sources */, 35B1ABB11FA34B5400E65233 /* p2p_Spec.swift in Sources */, 264FFA971FC591600028243D /* Describable.swift in Sources */, 35B1AB981FA3495300E65233 /* Message_Spec.swift in Sources */, 265AEA181FE9B1BD00AC4806 /* MemberModel.swift in Sources */, - 359EB2591F9A1E8B00147437 /* BuildFile in Sources */, + 359EB2591F9A1E8B00147437 /* (null) in Sources */, 35B1AB831F9FB0DD00E65233 /* AmazonManager.swift in Sources */, 35B1ABAC1FA34AE100E65233 /* error2.swift in Sources */, E76978321FCD7323005B4F36 /* RosterHandler.swift in Sources */, @@ -6552,7 +6607,7 @@ 262D438820335225002F1E45 /* FriendRequstModel.swift in Sources */, 263D662A1FE8359900A509F8 /* RoomExtension+BERT.swift in Sources */, 005886D72032023200FE2E89 /* messageEvent_Spec.swift in Sources */, - 359EB2481F9A1D6D00147437 /* BuildFile in Sources */, + 359EB2481F9A1D6D00147437 /* (null) in Sources */, 35B1ABAB1FA34ADE00E65233 /* error.swift in Sources */, 35B1AB8C1FA3457C00E65233 /* Message.swift in Sources */, 35B1ABB21FA34B6F00E65233 /* History_Spec.swift in Sources */, @@ -6560,7 +6615,7 @@ 263D66311FE8D30200A509F8 /* TypingExtension+BERT.swift in Sources */, 2683F757203F34BE0003181A /* act_Spec.swift in Sources */, E757B53F1FE92CA400467BA2 /* ActionStatus.swift in Sources */, - 359EB2631F9A1ED600147437 /* BuildFile in Sources */, + 359EB2631F9A1ED600147437 /* (null) in Sources */, E7A77FDB1FACC58A004AE609 /* KeychainService.swift in Sources */, 35B98FA11F9CB898009B8DEC /* ChatListVCLayout.swift in Sources */, 35B1ABC01FA34FFE00E65233 /* iterator.swift in Sources */, @@ -6569,24 +6624,24 @@ 2691CE2E1FC5A5D20008F10D /* ContactHandler.swift in Sources */, 005886DA2032023D00FE2E89 /* sequenceFlow_Spec.swift in Sources */, 35C5BD361F9AA8D0008BDD3A /* ChatListCell.swift in Sources */, - 359EB2311F9A16B200147437 /* BuildFile in Sources */, + 359EB2311F9A16B200147437 /* (null) in Sources */, 35B1ABC41FA3502B00E65233 /* chain.swift in Sources */, - 359EB2611F9A1EC300147437 /* BuildFile in Sources */, - 359EB26E1F9A200300147437 /* BuildFile in Sources */, + 359EB2611F9A1EC300147437 /* (null) in Sources */, + 359EB26E1F9A200300147437 /* (null) in Sources */, 35B1ABB71FA34C8F00E65233 /* writer_Spec.swift in Sources */, - 359EB2371F9A170E00147437 /* BuildFile in Sources */, + 359EB2371F9A170E00147437 /* (null) in Sources */, 4B3B1A2A20248EDD001A47AF /* ThumbnailGenerator.swift in Sources */, 358DE87E1F9D342600B558A3 /* ServiceManager.swift in Sources */, - 359EB2451F9A1D2600147437 /* BuildFile in Sources */, + 359EB2451F9A1D2600147437 /* (null) in Sources */, 269848CB200EA0B400590D6F /* StarExtension+BERT.swift in Sources */, 359EB23A1F9A18B400147437 /* MQTTService.swift in Sources */, 359EB22C1F9A137200147437 /* ChatListVC.swift in Sources */, 263D66341FE8D98700A509F8 /* TypingHandler.swift in Sources */, 35B1ABC61FA3503F00E65233 /* muc.swift in Sources */, 35B1ABAF1FA34B1500E65233 /* Search.swift in Sources */, - 359EB24D1F9A1DBB00147437 /* BuildFile in Sources */, + 359EB24D1F9A1DBB00147437 /* (null) in Sources */, 35B98F9D1F9BFDD4009B8DEC /* GetHistoryModel.swift in Sources */, - 359EB2461F9A1D3200147437 /* BuildFile in Sources */, + 359EB2461F9A1D3200147437 /* (null) in Sources */, 26E79CB81FF8452200F6EF5D /* RoomExtension.swift in Sources */, E7B3D5FC1FCC4053008BCFAC /* StorageService.swift in Sources */, 26C061C21FEAA26500A2EBE4 /* FeatureExtension+BERT.swift in Sources */, @@ -6595,17 +6650,17 @@ 359EB23C1F9A1BD800147437 /* Reachability.swift in Sources */, 35B1ABCB1FA3507B00E65233 /* Loc.swift in Sources */, 26FF00AC1FCC40D8002170B1 /* RecepientModel.swift in Sources */, - 359EB2331F9A16C300147437 /* BuildFile in Sources */, + 359EB2331F9A16C300147437 /* (null) in Sources */, 35B1ABB31FA34B7B00E65233 /* History.swift in Sources */, 26B32B6B1FE1717900888A0A /* WeakRef.swift in Sources */, - 359EB2511F9A1DDF00147437 /* BuildFile in Sources */, + 359EB2511F9A1DDF00147437 /* (null) in Sources */, 35B1AB941FA348ED00E65233 /* TypeSpec.swift in Sources */, - 359EB2581F9A1E7400147437 /* BuildFile in Sources */, + 359EB2581F9A1E7400147437 /* (null) in Sources */, 005886FF2032070600FE2E89 /* receiveTask_Spec.swift in Sources */, 268C62E32008DA0900433705 /* UIImageExtensions.swift in Sources */, 264FFA961FC5913A0028243D /* ProfileTable.swift in Sources */, 005887022032070F00FE2E89 /* boundaryEvent_Spec.swift in Sources */, - 359EB25D1F9A1EA500147437 /* BuildFile in Sources */, + 359EB25D1F9A1EA500147437 /* (null) in Sources */, 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */, 35B1AB951FA3491500E65233 /* Roster.swift in Sources */, 26770A551FFD2F91009AC870 /* StorageSubscriber.swift in Sources */, @@ -6614,13 +6669,13 @@ 35C5BD301F9A7CEA008BDD3A /* String+Localized.swift in Sources */, 35C5BD381F9AAE63008BDD3A /* UIViewController+SafeArea.swift in Sources */, 35B1ABB51FA34C0C00E65233 /* Desc_Spec.swift in Sources */, - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */, + 359EB2501F9A1DDC00147437 /* (null) in Sources */, 850AC31D203EC32200EF0774 /* ChatState.swift in Sources */, - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */, + 359EB2501F9A1DDC00147437 /* (null) in Sources */, 2683F754203F34890003181A /* act.swift in Sources */, - 359EB25B1F9A1E9700147437 /* BuildFile in Sources */, + 359EB25B1F9A1E9700147437 /* (null) in Sources */, 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */, - 359EB25E1F9A1EAD00147437 /* BuildFile in Sources */, + 359EB25E1F9A1EAD00147437 /* (null) in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6693,6 +6748,7 @@ 26FA4210201821B400E6F6EC /* StarHandler.swift in Sources */, E77764B61FBDA8E30042541D /* WheelContainerDataSource.swift in Sources */, 8EB41D7F1FED597A00C20AB5 /* ContextMenuConfiguration+Messages.swift in Sources */, + 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */, 269D9DEE1FC3987200324263 /* URLExtensions.swift in Sources */, 3A33DF1B1F53FDEA00BAD53C /* ReadMessageModel.swift in Sources */, 267BE28C1FDE9EDF00C47E18 /* SettingsSwitchCell.swift in Sources */, @@ -6860,6 +6916,7 @@ 005886F52032065600FE2E89 /* boundaryEvent_Spec.swift in Sources */, E74E53951FB45D6800463242 /* ScrollBar.swift in Sources */, 26035BB01F9A741C00003850 /* error2_Spec.swift in Sources */, + 85788C5120444F2E003600C9 /* WheelPositionPickerProtocols.swift in Sources */, 3A771CAA1F191B38008D968A /* ProfileHandler.swift in Sources */, E78EFB871FC867A900C44975 /* DBP2p.swift in Sources */, 8ED0F3CF1FBC5CF2004916AB /* GroupsListPresenter.swift in Sources */, @@ -7033,7 +7090,7 @@ 039B595B084FE6336504E071 /* ProfileProtocols.swift in Sources */, 26035B951F9A740A00003850 /* Person.swift in Sources */, E74EC9ED1FC2DA6E007268E6 /* RoomTable.swift in Sources */, - 2607270A203C598F00290545 /* BuildFile in Sources */, + 2607270A203C598F00290545 /* (null) in Sources */, 26E7D0451FCB880F001C69B7 /* Roster+DBRoster.swift in Sources */, E77D58A21F98C58A00FBE926 /* LabelExtensions.swift in Sources */, E79061BA1FBF2AF1009FD83A /* RosterTable.swift in Sources */, @@ -7101,6 +7158,7 @@ E7598F661FA1D8B90082FBE7 /* ProfileMessageCell.swift in Sources */, 619C44B00CC7B169077CDEC2 /* EditProfileProtocols.swift in Sources */, E7B32C0E2007C44E00371A67 /* MessageConfiguration.swift in Sources */, + 85788C57204450AE003600C9 /* WheelPositionPickerViewController.swift in Sources */, 85AC785B2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift in Sources */, 850AC31C203EBF3000EF0774 /* StorageService+UnreadCounters.swift in Sources */, 264668F21FB4683C0040FB32 /* MessageExtension.swift in Sources */, @@ -7138,6 +7196,7 @@ 001169B5201A0B02001B435F /* MapSearchCell.swift in Sources */, 00102F3E202C8E3A00A877A9 /* NynjaTimeControl.swift in Sources */, 267BE2941FDEA24000C47E18 /* SettingsGroupDS.swift in Sources */, + 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */, 26035BA21F9A740A00003850 /* writer.swift in Sources */, F0839BACB1A52FCF846584D4 /* EditProfileWireframe.swift in Sources */, 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */, @@ -7169,7 +7228,7 @@ E7291E4E201B3CC100FB56B7 /* PositionType.swift in Sources */, 2AC52C9C5598DB3C4D3D9364 /* AddContactViaPhoneWireframe.swift in Sources */, E75D2CFA2004ED84001E6718 /* MessageVideoView.swift in Sources */, - 4BB634BB203C33EA006581C4 /* BuildFile in Sources */, + 4BB634BB203C33EA006581C4 /* (null) in Sources */, C9C6952E202349DA00A57297 /* SelectCountryCellLayout.swift in Sources */, E75D2CF22004ED84001E6718 /* MessageViewFactory.swift in Sources */, 005886E72032047800FE2E89 /* userTask.swift in Sources */, @@ -7181,6 +7240,7 @@ 26770A541FFCF6C4009AC870 /* StorageService+Observer.swift in Sources */, 4B1D7E032029C80800703228 /* ByContactsItemsFactory.swift in Sources */, E72AE6521F8E3D24006417D0 /* CGContext+Gradient.swift in Sources */, + 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */, E7D0E95A1F7E88EA003F21D4 /* ContactExtension.swift in Sources */, 3A237BC91F30AB0F00C42B6E /* EditProfileVC.swift in Sources */, 2661D1331F373D5900F3E125 /* WheelConfiguration.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift b/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift new file mode 100644 index 000000000..bec690611 --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift @@ -0,0 +1,14 @@ +// +// WheelPositionPickerInteractor.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class WheelPositionPickerInteractor: WheelPositionPickerInteractorInputProtocol { + + weak var presenter: WheelPositionPickerInteractorOutputProtocol! +} diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift new file mode 100644 index 000000000..1db3192bb --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -0,0 +1,21 @@ +// +// WheelPositionPickerPresenter.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPresenterProtocol, WheelPositionPickerInteractorOutputProtocol { + + override var itemsFactory: WCItemsFactory? { + // TODO: return valid wheel factory + return nil + } + + weak var view: WheelPositionPickerViewProtocol! + var interactor: WheelPositionPickerInteractorInputProtocol! + var wireFrame: WheelPositionPickerWireFrameProtocol! +} diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift new file mode 100644 index 000000000..636de6b3f --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift @@ -0,0 +1,25 @@ +// +// WheelPositionPickerViewController.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewProtocol { + + var presenter: WheelPositionPickerPresenterProtocol! { + didSet { + _presenter = presenter + } + } + + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + } +} diff --git a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift new file mode 100644 index 000000000..faeb2a00c --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift @@ -0,0 +1,54 @@ +// +// WheelPositionPickerProtocols.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit + +protocol WheelPositionPickerWireFrameProtocol: class { + + func presentWheelPositionPicker(navigation: UINavigationController, main: MainWireFrame?) + + /** + * Add here your methods for communication PRESENTER -> WIREFRAME + */ +} + +protocol WheelPositionPickerViewProtocol: class { + + var presenter: WheelPositionPickerPresenterProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> VIEW + */ +} + +protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { + + var view: WheelPositionPickerViewProtocol! { get set } + var interactor: WheelPositionPickerInteractorInputProtocol! { get set } + var wireFrame: WheelPositionPickerWireFrameProtocol! { get set } + + /** + * Add here your methods for communication VIEW -> PRESENTER + */ +} + +protocol WheelPositionPickerInteractorOutputProtocol: class { + + /** + * Add here your methods for communication INTERACTOR -> PRESENTER + */ +} + +protocol WheelPositionPickerInteractorInputProtocol: class { + + var presenter: WheelPositionPickerInteractorOutputProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> INTERACTOR + */ +} diff --git a/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift b/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift new file mode 100644 index 000000000..5e9356c24 --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift @@ -0,0 +1,34 @@ +// +// WheelPositionPickerWireFrame.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class WheelPositionPickerWireFrame: WheelPositionPickerWireFrameProtocol { + + weak var navigation: UINavigationController? + weak var main: MainWireFrame? + + func presentWheelPositionPicker(navigation: UINavigationController, main: MainWireFrame?) { + self.navigation = navigation + self.main = main + + let view = WheelPositionPickerViewController() + let presenter = WheelPositionPickerPresenter() + let interactor = WheelPositionPickerInteractor() + + // Connecting + view.presenter = presenter + presenter.view = view + presenter.wireFrame = self + presenter.interactor = interactor + interactor.presenter = presenter + + navigation.pushViewController(view, animated: true) + } + +} -- GitLab From 8bae6705b5a0f9162a1c801c119982bd3c68a07d Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 16:46:09 +0200 Subject: [PATCH 03/24] Added localizable strings for wheel position module. --- .../View/WheelPositionPickerViewController.swift | 2 ++ Nynja/Resources/en.lproj/Localizable.strings | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift index 636de6b3f..61178e5c0 100644 --- a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift @@ -21,5 +21,7 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr override func viewDidLoad() { super.viewDidLoad() + + screenTitle = "wheel position title".localized } } diff --git a/Nynja/Resources/en.lproj/Localizable.strings b/Nynja/Resources/en.lproj/Localizable.strings index fb913344a..5d65dc292 100644 --- a/Nynja/Resources/en.lproj/Localizable.strings +++ b/Nynja/Resources/en.lproj/Localizable.strings @@ -386,3 +386,10 @@ "am" = "AM"; "pm" = "PM"; + +//MARK: Wheel Position Picker +"wheel position title" = "WHEEL POSITION"; +"choose wheel position" = "Choose wheel position."; +"wheel current position" = "current position"; +"wheel left hand" = "Left hand"; +"wheel right hand" = "Right hand"; -- GitLab From a06d571d22bd62eb6965891ae0e777cb078f211d Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 17:12:24 +0200 Subject: [PATCH 04/24] Add base skeleton of UI layout. --- Nynja.xcodeproj/project.pbxproj | 4 ++ .../WheelPositionPickerViewController.swift | 63 ++++++++++++++++++- .../WheelPositionViewControllerLayout.swift | 45 +++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 0f0fa1a90..20b436411 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -776,6 +776,7 @@ 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; + 85788C5F2044554A003600C9 /* WheelPositionViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; @@ -1747,6 +1748,7 @@ 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; + 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionViewControllerLayout.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; @@ -4389,6 +4391,7 @@ isa = PBXGroup; children = ( 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */, + 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */, ); path = View; sourceTree = ""; @@ -7196,6 +7199,7 @@ 001169B5201A0B02001B435F /* MapSearchCell.swift in Sources */, 00102F3E202C8E3A00A877A9 /* NynjaTimeControl.swift in Sources */, 267BE2941FDEA24000C47E18 /* SettingsGroupDS.swift in Sources */, + 85788C5F2044554A003600C9 /* WheelPositionViewControllerLayout.swift in Sources */, 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */, 26035BA21F9A740A00003850 /* writer.swift in Sources */, F0839BACB1A52FCF846584D4 /* EditProfileWireframe.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift index 61178e5c0..fe4e997f6 100644 --- a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift @@ -6,7 +6,8 @@ // Copyright © 2018 TecSynt Solutions. All rights reserved. // -import Foundation +import UIKit +import SnapKit final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewProtocol { @@ -17,11 +18,69 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr } + // MARK: - Views + + private lazy var collectionTitleLabel: UILabel = { + let label = UILabel() + label.textAlignment = .center + self.view.addSubview(label) + + label.snp.makeConstraints { maker in + let horizontalInset = Constraints.collectionTitleLabel.horizontalInset.adjustedByWidth + maker.left.equalToSuperview().offset(horizontalInset) + maker.right.equalToSuperview().inset(horizontalInset) + + maker.top.equalTo(self.navigationView.snp.bottom).offset(Constraints.collectionTitleLabel.topOffset.adjustedByWidth) + maker.height.equalTo(Constraints.collectionTitleLabel.height.adjustedByWidth) + } + + return label + }() + + private lazy var collectionView: UICollectionView = { + let collectionView = UICollectionView() + self.view.addSubview(collectionView) + + collectionView.snp.makeConstraints { maker in + maker.left.right.equalToSuperview() + maker.top.equalTo(collectionTitleLabel.snp.bottom).offset(Constraints.collectionView.topOffset.adjustedByWidth) + maker.bottom.equalToSuperview().inset(Constraints.collectionView.bottomOffset.adjustedByWidth) + } + + return collectionView + }() + + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - + setupUI() + } + + private func setupUI() { screenTitle = "wheel position title".localized + collectionView.delegate = self + collectionView.dataSource = self + } +} + +// MARK: - UICollectionViewDataSource +extension WheelPositionPickerViewController: UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 0 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + return UICollectionViewCell() + } +} + +// MARK: - UICollectionViewDelegate +extension WheelPositionPickerViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + } } diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift b/Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift new file mode 100644 index 000000000..eda594c69 --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift @@ -0,0 +1,45 @@ +// +// WheelPositionViewControllerLayout.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +extension WheelPositionPickerViewController { + + enum Constraints { + + enum collectionTitleLabel { + static let topOffset: CGFloat = 20 + static let height: CGFloat = 20 + static let horizontalInset: CGFloat = 16 + } + + enum collectionView { + static let topOffset: CGFloat = 20 + static let bottomOffset: CGFloat = 20 + + enum items { + static let itemPadding: CGFloat = 24 + static let maxScale: CGFloat = scaledState.height / normalState.height + static let aspectRatio: CGFloat = normalState.width / normalState.height + + enum normalState { + static let width: CGFloat = 270 + static let height: CGFloat = 480 + } + enum scaledState { + static let height: CGFloat = 355 + } + + enum shadow { + static let size = CGSize(width: 0, height: 16) + static let radius: CGFloat = 24 + } + } + } + } +} -- GitLab From 2d2743b199b014a68b53463380a20055d663dd9b Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 18:09:18 +0200 Subject: [PATCH 05/24] Implemented logic for handling collectionView and interaction between view -> presenter. Added assets. --- Nynja.xcodeproj/project.pbxproj | 34 ++++++-- .../WheelPositionPickerPresenter.swift | 6 ++ .../WheelPositionCellModel.swift | 38 +++++++++ .../WheelPositionCollectionViewCell.swift | 79 ++++++++++++++++++ .../WheelPositionPickerViewController.swift | 34 ++++++-- ...lPositionPickerViewControllerLayout.swift} | 10 +-- .../WheelPositionPickerProtocols.swift | 4 + .../WheelPosition/Contents.json | 6 ++ .../wheel_left_image.imageset/Contents.json | 15 ++++ .../wheel_left_image.imageset/left_image.pdf | Bin 0 -> 253015 bytes .../wheel_right_image.imageset/Contents.json | 15 ++++ .../right_image.pdf | Bin 0 -> 260993 bytes 12 files changed, 224 insertions(+), 17 deletions(-) create mode 100644 Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift create mode 100644 Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift rename Nynja/Modules/WheelPositionPicker/View/{ => ViewController}/WheelPositionPickerViewController.swift (70%) rename Nynja/Modules/WheelPositionPicker/View/{WheelPositionViewControllerLayout.swift => ViewController/WheelPositionPickerViewControllerLayout.swift} (79%) create mode 100644 Nynja/Resources/Assets.xcassets/WheelPosition/Contents.json create mode 100644 Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json create mode 100644 Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/left_image.pdf create mode 100644 Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json create mode 100644 Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/right_image.pdf diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 20b436411..bc205c32c 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -764,6 +764,7 @@ 8511D3742034596E00B2A620 /* Collection+ViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8511D3732034596E00B2A620 /* Collection+ViewLayout.swift */; }; 852DF26120371FB400A4F8B6 /* FileExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF26020371FB400A4F8B6 /* FileExtension.swift */; }; 852DF263203720E600A4F8B6 /* FileIcons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF262203720E600A4F8B6 /* FileIcons.swift */; }; + 854FC1C92044674E00B12BE5 /* WheelPositionCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */; }; 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; @@ -776,7 +777,8 @@ 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; - 85788C5F2044554A003600C9 /* WheelPositionViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */; }; + 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */; }; + 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; @@ -1738,6 +1740,7 @@ 8511D3732034596E00B2A620 /* Collection+ViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+ViewLayout.swift"; sourceTree = ""; }; 852DF26020371FB400A4F8B6 /* FileExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtension.swift; sourceTree = ""; }; 852DF262203720E600A4F8B6 /* FileIcons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileIcons.swift; sourceTree = ""; }; + 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCellModel.swift; sourceTree = ""; }; 855EF418202CB86500541BE3 /* ExtendedStar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar.swift; sourceTree = ""; }; 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar_Spec.swift; sourceTree = ""; }; 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; @@ -1748,7 +1751,8 @@ 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; - 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionViewControllerLayout.swift; sourceTree = ""; }; + 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewControllerLayout.swift; sourceTree = ""; }; + 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCollectionViewCell.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; @@ -4390,8 +4394,8 @@ 85788C5220445064003600C9 /* View */ = { isa = PBXGroup; children = ( - 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */, - 85788C5E2044554A003600C9 /* WheelPositionViewControllerLayout.swift */, + 85788C6220445B8D003600C9 /* CollectionView */, + 85788C6120445B82003600C9 /* ViewController */, ); path = View; sourceTree = ""; @@ -4420,6 +4424,24 @@ path = WireFrame; sourceTree = ""; }; + 85788C6120445B82003600C9 /* ViewController */ = { + isa = PBXGroup; + children = ( + 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */, + 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 85788C6220445B8D003600C9 /* CollectionView */ = { + isa = PBXGroup; + children = ( + 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */, + 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */, + ); + path = CollectionView; + sourceTree = ""; + }; 85801C4020342A3E00CC364C /* BottomActions */ = { isa = PBXGroup; children = ( @@ -6806,11 +6828,13 @@ E79385871FC32ACC00744CB0 /* DBProfile.swift in Sources */, 4B1D7E0D2029DACF00703228 /* ByNumberItemsFactory.swift in Sources */, 26FA420A2017ADF000E6F6EC /* StarMessageCell.swift in Sources */, + 854FC1C92044674E00B12BE5 /* WheelPositionCellModel.swift in Sources */, C9C6952620232B0200A57297 /* SortableObject.swift in Sources */, E751E0051F73A70F00FEF533 /* MainItem.swift in Sources */, 26035BAB1F9A741C00003850 /* container_Spec.swift in Sources */, 26035BB71F9A741C00003850 /* iterator_Spec.swift in Sources */, C9DF574A2023A29A006B990A /* SelectCountryTableDelegate.swift in Sources */, + 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */, 26035BC91F9A741C00003850 /* Star_Spec.swift in Sources */, 3ABCE8F11EC9330D00A80B15 /* AppDelegate.swift in Sources */, 4B1D7E052029CF2900703228 /* ShareContactsItemsFactory.swift in Sources */, @@ -7199,7 +7223,7 @@ 001169B5201A0B02001B435F /* MapSearchCell.swift in Sources */, 00102F3E202C8E3A00A877A9 /* NynjaTimeControl.swift in Sources */, 267BE2941FDEA24000C47E18 /* SettingsGroupDS.swift in Sources */, - 85788C5F2044554A003600C9 /* WheelPositionViewControllerLayout.swift in Sources */, + 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */, 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */, 26035BA21F9A740A00003850 /* writer.swift in Sources */, F0839BACB1A52FCF846584D4 /* EditProfileWireframe.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index 1db3192bb..40b3e7f56 100644 --- a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -18,4 +18,10 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres weak var view: WheelPositionPickerViewProtocol! var interactor: WheelPositionPickerInteractorInputProtocol! var wireFrame: WheelPositionPickerWireFrameProtocol! + + func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) { + guard !itemPositionModel.isCurrent else { return } + + // TODO: present popup + } } diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift new file mode 100644 index 000000000..1ca185e3a --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -0,0 +1,38 @@ +// +// WheelPositionCellModel.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +enum WheelPosition { + case left, right +} + +struct WheelPositionCellModel: CellViewModel { + + let position: WheelPosition + let isCurrent: Bool + + func setup(cell: WheelPositionCollectionViewCell) { + switch position { + case .left: + if isCurrent { + cell.itemLabel.text = "wheel left hand".localized + } else { + cell.itemLabel.text = "\("wheel left hand".localized) (\("wheel current position".localized))" + } + cell.imageView.image = UIImage(named: "wheel_left_image") + case .right: + if isCurrent { + cell.itemLabel.text = "wheel right hand".localized + } else { + cell.itemLabel.text = "\("wheel right hand".localized) (\("wheel current position".localized))" + } + cell.imageView.image = UIImage(named: "wheel_right_image") + } + } +} diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift new file mode 100644 index 000000000..61a164add --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift @@ -0,0 +1,79 @@ +// +// WheelPositionCollectionViewCell.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +final class WheelPositionCollectionViewCell: UICollectionViewCell { + + // MARK: - Views + + private(set) lazy var imageView: UIImageView = { + let imageView = UIImageView() + self.contentView.addSubview(imageView) + + imageView.layer.shadowRadius = Constraints.shadow.radius + imageView.layer.shadowOffset = Constraints.shadow.offset + + imageView.snp.makeConstraints { maker in + maker.top.left.right.equalToSuperview() + } + return imageView + }() + + private(set) lazy var itemLabel: UILabel = { + let width = Constraints.itemLabel.width.adjustedByWidth + let height = Constraints.itemLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) + + self.contentView.addSubview(label) + + label.snp.makeConstraints { maker in + maker.left.right.equalToSuperview() + maker.top.equalTo(imageView.snp.bottom).offset(Constraints.itemLabel.topOffset.adjustedByWidth) + maker.height.equalTo(Constraints.itemLabel.topOffset.adjustedByWidth) + } + return label + }() + + + // MARK: - Init + + override init(frame: CGRect) { + super.init(frame: frame) + baseSetup() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + baseSetup() + } + + + // MARK: - UI Setup + + private func baseSetup() { + itemLabel.isHidden = false + } +} + +// MARK: - Layout +extension WheelPositionCollectionViewCell { + enum Constraints { + enum itemLabel { + static let topOffset: CGFloat = 21 + static let height: CGFloat = 22 + static let width: CGFloat = 270 + } + enum shadow { + static let offset = CGSize(width: 0, height: 16) + static let radius: CGFloat = 24 + } + } +} diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift similarity index 70% rename from Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift rename to Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index fe4e997f6..d7b11bcbd 100644 --- a/Nynja/Modules/WheelPositionPicker/View/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -17,11 +17,21 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr } } + private var items: [WheelPositionCellModel] = [] { + didSet { + collectionView.reloadData() + } + } // MARK: - Views private lazy var collectionTitleLabel: UILabel = { - let label = UILabel() + let width = Constraints.collectionTitleLabel.width.adjustedByWidth + let height = Constraints.collectionTitleLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), + color: Constants.colors.darkGray.getColor(), fontName: Constants.fonts.regular) + label.textAlignment = .center self.view.addSubview(label) @@ -30,7 +40,9 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr maker.left.equalToSuperview().offset(horizontalInset) maker.right.equalToSuperview().inset(horizontalInset) - maker.top.equalTo(self.navigationView.snp.bottom).offset(Constraints.collectionTitleLabel.topOffset.adjustedByWidth) + let topOffset = Constraints.collectionTitleLabel.topOffset.adjustedByWidth + maker.top.equalTo(self.navigationView.snp.bottom).offset(topOffset) + maker.height.equalTo(Constraints.collectionTitleLabel.height.adjustedByWidth) } @@ -63,17 +75,28 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr collectionView.delegate = self collectionView.dataSource = self } + + + // MARK: - WheelPositionPickerViewProtocol + + func setupOptions(_ items: [WheelPositionCellModel]) { + self.items = items + } } // MARK: - UICollectionViewDataSource extension WheelPositionPickerViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 0 + return items.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - return UICollectionViewCell() + return collectionView.dequeueReusableCell(withModel: itemModel(at: indexPath), for: indexPath) + } + + private func itemModel(at indexPath: IndexPath) -> WheelPositionCellModel { + return items[indexPath.row] } } @@ -81,6 +104,7 @@ extension WheelPositionPickerViewController: UICollectionViewDataSource { extension WheelPositionPickerViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - + let selectedItem = itemModel(at: indexPath) + presenter.didSelectItemModel(selectedItem) } } diff --git a/Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift similarity index 79% rename from Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift rename to Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift index eda594c69..15ecdad4a 100644 --- a/Nynja/Modules/WheelPositionPicker/View/WheelPositionViewControllerLayout.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift @@ -1,5 +1,5 @@ // -// WheelPositionViewControllerLayout.swift +// WheelPositionPickerViewControllerLayout.swift // Nynja // // Created by Anton Poltoratskyi on 26.02.2018. @@ -15,12 +15,13 @@ extension WheelPositionPickerViewController { enum collectionTitleLabel { static let topOffset: CGFloat = 20 static let height: CGFloat = 20 + static let width: CGFloat = 270 static let horizontalInset: CGFloat = 16 } enum collectionView { static let topOffset: CGFloat = 20 - static let bottomOffset: CGFloat = 20 + static let bottomOffset: CGFloat = 85 enum items { static let itemPadding: CGFloat = 24 @@ -34,11 +35,6 @@ extension WheelPositionPickerViewController { enum scaledState { static let height: CGFloat = 355 } - - enum shadow { - static let size = CGSize(width: 0, height: 16) - static let radius: CGFloat = 24 - } } } } diff --git a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift index faeb2a00c..58c94f7cf 100644 --- a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift +++ b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift @@ -24,6 +24,8 @@ protocol WheelPositionPickerViewProtocol: class { /** * Add here your methods for communication PRESENTER -> VIEW */ + + func setupOptions(_ items: [WheelPositionCellModel]) } protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { @@ -35,6 +37,8 @@ protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { /** * Add here your methods for communication VIEW -> PRESENTER */ + + func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) } protocol WheelPositionPickerInteractorOutputProtocol: class { diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/Contents.json b/Nynja/Resources/Assets.xcassets/WheelPosition/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Nynja/Resources/Assets.xcassets/WheelPosition/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json new file mode 100644 index 000000000..d1fa0da3d --- /dev/null +++ b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "left_image.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/left_image.pdf b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/left_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a21b5c9f751612124205c9b533bb03172339cabe GIT binary patch literal 253015 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

&;T-tZpE#vBi3lJg5@cY=V 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

r3Hw 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

7LO)^p*; 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 literal 0 HcmV?d00001 diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json new file mode 100644 index 000000000..84396fb31 --- /dev/null +++ b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "right_image.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/right_image.pdf b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/right_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf18d530ee760b9e9df2cc3b63238e98fc1a2391 GIT binary patch literal 260993 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 TxNSuspRnsER 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

lU;#cc|lb~B8L1%{-_cAU_ku}S3(6+vZG zQVu%%*_Q?Kk=B)fT<_-h6`3v3)#Vk)ku?41C3A1iP;mp}PgH@^dz>kpbTy?1)^js_ z*t~hXf!vLC`1Q2)$c?cA$D{*kV2}jJ!^`@b(^_!X#dHAhROMSIOiM}L%Qwr>Ni!)p z7-as+njrI4Atoj9P;;Ch0!}62oxqXgy(R@`$ane%IgdsQX-{)I&G~P;j<-7g1gAgT z8xJdCuHKq}m$g8pZ%p1^X$j7IZ^FvMk0D;+abhp>oo^kxvnYgU7Oszdtq|Cx{#H#2 zE=?3TIm6br8^sU2N0$t*#xvIRbLWHboA){AFIqEhb2odRn(t+v~>F z=XotQ44p}Q@DP!_9SR>_)bX%3ash)tVELoPdyhMh%jM;#&ptMf9ZixvULJRq2&@P$ z{PONtd{s`|TW0N*liMB==%4~(D|a`OgPS6ZS1TN5${P{m-yf@{WLFOQYRQ(0hH|}4 zpROGMCa-tTZkTLv>*Fn(bA4=XSt{FW_nPAGD(|kYlQY9dlSj!|QfEQjcum;een+&g zlXqlCB!#+dlUPEf!U(z+`eM4w<@Bj8VlgUs%GfG}HhMSNw?*nS>$Ba&+|o|APIk|{ zR+#Y0u&-&=UmMb#D_xg;t?4b;L1%eg?rbM?@+m}F>Qf(}@N?m(T~XEwR+0+FiV1sy z)3wtP>{BiRo7<;SI!O8^Z3=L*)Gdf6*wIYQ8GJ)?S7KRzsEfZs^p2!XY!{su zn;0_-D-@Xoy(m8~xKW~4T>p)(xK0@3ViNKC%OVnL%*c>*8GPvjS#w$7tZJFS8%iDy z3I@}jt<~Dyw#5{IS8|JyEyDL8{*t|FrH5VH;Zo7l7whf1axu$im9i>2K zGn-4sNAbPWM;87w6Z3%DdFLu8TBp=Q2nXf_cmj&Pn|FsNySzFiv-P59feTs|@?bkX zqI9JcEH|p~Cge*#CG{*w%J*bZAHQF%(Uc~7(&gd(#Rr{_-Wm;p8a-tnc7obShZn}8 zn&H+v*zHB~Ey5K>)`BuDM|0KZ(F9TwWqwRH5VD5T436H|RGkJ_iH`h$*~`uvbVU zk&*2#qtUwsj;U~@A{2U21tRpXf#WJWWUQtvldSeETWpz$%0HS}s9BlHbIK@+>))a) z<7mV#jNlG`GZE_0>t-3MkCcfoO6T(nPR>u|`Wl%A#%igB(p*W&zz9b|_<|}%ET$n& z78dvQ?gNsHtV~*5Xu@>-dqa0a)J@NogA_IVg~>eil8-q}DuF-uvhqq83;ayOEo#h2 zrqO4{CXB{OrivyMAc?7S*oc|US(`1#_1%Yx7w_Z6BaPCh$}SRz!VmoyLt#_j1jl}< z%nK`_>tYxJO=d4TOeY^0Y!Fq}kK6R7Din#qn{!)dW@?ezEsh3d28A*i^QZFdpx7(23*bc` zhNZXX=bbIKQzWDFh1mtT<(#eWtKs8Xc`gdu=$;Gbg$`|}4p(ZMT@|^TV0ocodZuFY z(%h$}`f{IpLLV$*AF~YTGbvK$vzk}L2rn{-!u`O^3K?H#JHlJv=ODX%gL!9$ziE=i zm<8zIUcyaJ^(?SN{(ysEV2Hf7Q2F{EZ#S*_b1AN%O#ha@iW zj<=4{kXP29kkp$+pQoRq!FAuV*m~jH^*1ru7%Tg}nqBOYNmw&BzM*jownWxiaGKwp z)RW+TN~2r+4G1v>wHtK;1DUv4gIKxWv8tMXhr51lxQ`@mFJCCVUOiSlf8Ljm&+&0E zuu7&mVJi8DCRHh*x%n>03vp&B1lVv?$JcOmEYN|mM|!k(Ml$L{FWAZJ3H~vER)|N# zG}p}-(I{UmKP~Sz#5{7@G|y#n7QHz!5g4o6jyKhk*?h&2P#X03@kZd$^qMR{&j2yX zzn;or1=&Hy<1^zfFTUTtE?jxgTn4QnzIY^SAYBWpT(Gl9y0A~Tx`BBaoF(xk&M*$p z+2bCQB=86^GqFHCB}=IPb1!p$V*lID$&QpkiVoI3cYo{;kmoXk#sNTEbpLLLQ7^+l zN0$r+8+6hA08EjHFg`|$@J$zX=f&F;O3_?rDYCeFnDrw!_;|VgP*Q2WxT24@AJryv zIhxqRst}xJ9YN)gBfoo@WgSu4AB)ZO`sYmQpE}5c75t;n?$vNMP1A?ae>kCXf^^?N0%DQbti9NsqA&EPWK+Una z6O3C#dMBt&&aZHD7lX~95@WfhxyZA{hVeFFQF2b!jo+f+r zup1uJG$_|RlZ{Zg5Gnn)S6wwTTyp zrqraFr1(CdEp>4fTFB<+28n#Qu_K`|2u7wYn@W->`- zbKEDWDk}ux&DCNBFgesIJXFc_y*ohn}*o{--gDI7K<@y)#aJQ=aUK{WJ)5yOWo%%}BM997U8lrshnOgP1=cGm?@J_YBHg(d4@(Scptdm0QwGn_4eFOW}TF4#7 zYhMeK1*NyS$+RT8)FG19{c-!23{^YSdR6v4h04|?TBM;pWfna__VO3YHW;iZM8^yi zc0WdD82ZmIh<({?VVB6EzW9E?gpG$~`~YJn3|H}9a25*XJPSQzP%upX=tzN)XPH?1$tJe6pWs49!M#c7Pm=6BwyOE^nd?<|6CC z>m&1=rDlMqCYrb#T5DR*IEpyqIOw>@pR%89rm&|{e_H)im}EAmGS@SoGryZ+EQ%P( zA8|<=N!4Y4+PDwiD{BaGue&wB=-3n3izQ4VY$hZi{6v_*-pxUfWS!KPw3)Qc-cx0& ziCPV(xv9Bb4PcJ@aWweRn6fgAC$j{2n9ndKn6p?UP-0L}scw=jUpf3rCx%gr>wT?u zt%{3?f((;7lWwUJI8#t5y(B%SMY2W9r@wWS{MYBO_sMMqnW332dTDyus|Ig=Mi-6I zW@~2ib#oik*oB@5u4_@1g``TwNJaF?smx9;ef-=oQZ<5Rv1LldUc}MZlU25$p;0U` zox#(=-|Ly}mV85pDiEd~mWsQGt4n`KufniTPo_bm0k3XVwO4lA@vAe*LdU?XC&+x= zpmI2GajUwdkYU-m<sr=ICBu5Y=f`dnj-Ud*CX}j0tCiNqT%fEW6&2D6YXsL5ZOE4 zD;XAnD}(DI(I?p@J|!t9?jfEaE|Z{6uTi-n5w00do+p4yMuY?LU)vX6jW5asuOF(T8B}1U%lc~p?m7LQTRRTdo~SQ;aK62*_W#8 zstFNFz0fi`9X0`K5K{+xHnV6$zuDB$r&n3RW6`qj95jp@6TdymUVI3Dn@ky?fm&%^ zv1B4?l-{p2_;TxfBWc5WfTZuN@6MaUn8U@%q}ll~=)R5P$O642a2lvRUoY>X)7G$h z(YzmNMQ-(B?s!0AAi{`f**bJ-QYk~JtogHPC3ve_q+Ud66~r*Cg>KnpiDP-VXk1xh zKA%7V7`xCPSPNZKpj?RAU)JzayICB({Bj7&z0AFHS#d^kSye5?SE$$fE&)REfG4av$5j*^F5pRU6}}z%t;{fL}r>;H2KZa2|Ab|0$u!1jwVq=auROIt+Spl+}W6LF$3r2hb|R03tjp>WZoH^_eAd=KrH4sNO;%96Z!tsmCDL^Yx(NS z+1-C()c$S1vU0Mp{%zF$ZLaSi6VkT$jW`^(~MQxlQB}G}tnPkii9U#=lKU0JKrak_BShj!G-ukmoQ9VaJOB)k% zrawFXO^Srr%&JEA4rVsiwl2_{+<lCvd#AU zk>h`mv2#L3^-tOF{(hhSe~|q@g%2knKJYXE|)6=N)JM& zetn-j*}9>lACjLXJqrv1b1j6&&ww47G1@v{Sg6l?^>#$nsMTo4^E~Isn<>XUbJik}H!A`O9MD?S z0rY1Yv;nN_>H)0R{qr&3zt=~5VSnC#aR(VA*xUAeXjx-i&CbeuJ$(lZ_?(r@f|YSOS{xKYppUJ4j-4(^atQk5pn Date: Mon, 26 Feb 2018 18:24:06 +0200 Subject: [PATCH 06/24] Added custom flow layout. --- Nynja.xcodeproj/project.pbxproj | 4 + .../CollectionView/CarouselFlowLayout.swift | 140 ++++++++++++++++++ .../WheelPositionPickerViewController.swift | 8 + 3 files changed, 152 insertions(+) create mode 100644 Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index bc205c32c..2b8c4d626 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -765,6 +765,7 @@ 852DF26120371FB400A4F8B6 /* FileExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF26020371FB400A4F8B6 /* FileExtension.swift */; }; 852DF263203720E600A4F8B6 /* FileIcons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF262203720E600A4F8B6 /* FileIcons.swift */; }; 854FC1C92044674E00B12BE5 /* WheelPositionCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */; }; + 854FC1CB204468FC00B12BE5 /* CarouselFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854FC1CA204468FC00B12BE5 /* CarouselFlowLayout.swift */; }; 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; @@ -1741,6 +1742,7 @@ 852DF26020371FB400A4F8B6 /* FileExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtension.swift; sourceTree = ""; }; 852DF262203720E600A4F8B6 /* FileIcons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileIcons.swift; sourceTree = ""; }; 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCellModel.swift; sourceTree = ""; }; + 854FC1CA204468FC00B12BE5 /* CarouselFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselFlowLayout.swift; sourceTree = ""; }; 855EF418202CB86500541BE3 /* ExtendedStar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar.swift; sourceTree = ""; }; 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar_Spec.swift; sourceTree = ""; }; 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; @@ -4438,6 +4440,7 @@ children = ( 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */, 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */, + 854FC1CA204468FC00B12BE5 /* CarouselFlowLayout.swift */, ); path = CollectionView; sourceTree = ""; @@ -6869,6 +6872,7 @@ 8EE53A12200543F40079CCA8 /* GroupCollectionConstants.swift in Sources */, E7A941681F7178FD00F790DA /* IndexPath+WheelContainer.swift in Sources */, 8E0E0FED1FD0936F006AA3EA /* String+LocationURL.swift in Sources */, + 854FC1CB204468FC00B12BE5 /* CarouselFlowLayout.swift in Sources */, AF440BA5CEBE5170D082FF60 /* AuthProtocols.swift in Sources */, 2617AE711FD87BC800759269 /* DrawableAudioWaveform.swift in Sources */, 6D6234F81F1E158600EF375F /* HistoryCell.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift new file mode 100644 index 000000000..1a4bba691 --- /dev/null +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift @@ -0,0 +1,140 @@ +// +// CarouselFlowLayout.swift +// Nynja +// +// Created by Anton Poltoratskyi on 26.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit + +public enum CarouselFlowLayoutSpacingMode { + case fixed(spacing: CGFloat) + case overlap(visibleOffset: CGFloat) +} + +/* + Source: https://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift + */ +open class CarouselFlowLayout: UICollectionViewFlowLayout { + + fileprivate struct LayoutState { + var size: CGSize + var direction: UICollectionViewScrollDirection + func isEqual(_ otherState: LayoutState) -> Bool { + return self.size.equalTo(otherState.size) && self.direction == otherState.direction + } + } + + @IBInspectable open var sideItemScale: CGFloat = 0.6 + @IBInspectable open var sideItemAlpha: CGFloat = 0.6 + @IBInspectable open var sideItemShift: CGFloat = 0.0 + + open var spacingMode = CarouselFlowLayoutSpacingMode.fixed(spacing: 40) + + fileprivate var state = LayoutState(size: CGSize.zero, direction: .horizontal) + + + override open func prepare() { + super.prepare() + + let currentState = LayoutState(size: self.collectionView!.bounds.size, direction: self.scrollDirection) + + if !self.state.isEqual(currentState) { + self.setupCollectionView() + self.updateLayout() + self.state = currentState + } + } + + fileprivate func setupCollectionView() { + guard let collectionView = self.collectionView else { return } + if collectionView.decelerationRate != UIScrollViewDecelerationRateFast { + collectionView.decelerationRate = UIScrollViewDecelerationRateFast + } + } + + fileprivate func updateLayout() { + guard let collectionView = self.collectionView else { return } + + let collectionSize = collectionView.bounds.size + let isHorizontal = (self.scrollDirection == .horizontal) + + let yInset = (collectionSize.height - self.itemSize.height) / 2 + let xInset = (collectionSize.width - self.itemSize.width) / 2 + self.sectionInset = UIEdgeInsetsMake(yInset, xInset, yInset, xInset) + + let side = isHorizontal ? self.itemSize.width : self.itemSize.height + let scaledItemOffset = (side - side*self.sideItemScale) / 2 + switch self.spacingMode { + case .fixed(let spacing): + self.minimumLineSpacing = spacing - scaledItemOffset + case .overlap(let visibleOffset): + let fullSizeSideItemOverlap = visibleOffset + scaledItemOffset + let inset = isHorizontal ? xInset : yInset + self.minimumLineSpacing = inset - fullSizeSideItemOverlap + } + } + + override open func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { + return true + } + + override open func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + guard let superAttributes = super.layoutAttributesForElements(in: rect), + let attributes = NSArray(array: superAttributes, copyItems: true) as? [UICollectionViewLayoutAttributes] + else { return nil } + return attributes.map({ self.transformLayoutAttributes($0) }) + } + + fileprivate func transformLayoutAttributes(_ attributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { + guard let collectionView = self.collectionView else { return attributes } + let isHorizontal = (self.scrollDirection == .horizontal) + + let collectionCenter = isHorizontal ? collectionView.frame.size.width/2 : collectionView.frame.size.height/2 + let offset = isHorizontal ? collectionView.contentOffset.x : collectionView.contentOffset.y + let normalizedCenter = (isHorizontal ? attributes.center.x : attributes.center.y) - offset + + let maxDistance = (isHorizontal ? self.itemSize.width : self.itemSize.height) + self.minimumLineSpacing + let distance = min(abs(collectionCenter - normalizedCenter), maxDistance) + let ratio = (maxDistance - distance)/maxDistance + + let alpha = ratio * (1 - self.sideItemAlpha) + self.sideItemAlpha + let scale = ratio * (1 - self.sideItemScale) + self.sideItemScale + let shift = (1 - ratio) * self.sideItemShift + attributes.alpha = alpha + attributes.transform3D = CATransform3DScale(CATransform3DIdentity, scale, scale, 1) + attributes.zIndex = Int(alpha * 10) + + if isHorizontal { + attributes.center.y = attributes.center.y + shift + } else { + attributes.center.x = attributes.center.x + shift + } + + return attributes + } + + override open func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { + guard let collectionView = collectionView , !collectionView.isPagingEnabled, + let layoutAttributes = self.layoutAttributesForElements(in: collectionView.bounds) + else { return super.targetContentOffset(forProposedContentOffset: proposedContentOffset) } + + let isHorizontal = (self.scrollDirection == .horizontal) + + let midSide = (isHorizontal ? collectionView.bounds.size.width : collectionView.bounds.size.height) / 2 + let proposedContentOffsetCenterOrigin = (isHorizontal ? proposedContentOffset.x : proposedContentOffset.y) + midSide + + var targetContentOffset: CGPoint + if isHorizontal { + let closest = layoutAttributes.sorted { abs($0.center.x - proposedContentOffsetCenterOrigin) < abs($1.center.x - proposedContentOffsetCenterOrigin) }.first ?? UICollectionViewLayoutAttributes() + targetContentOffset = CGPoint(x: floor(closest.center.x - midSide), y: proposedContentOffset.y) + } + else { + let closest = layoutAttributes.sorted { abs($0.center.y - proposedContentOffsetCenterOrigin) < abs($1.center.y - proposedContentOffsetCenterOrigin) }.first ?? UICollectionViewLayoutAttributes() + targetContentOffset = CGPoint(x: proposedContentOffset.x, y: floor(closest.center.y - midSide)) + } + + return targetContentOffset + } +} diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index d7b11bcbd..c2fdad9e9 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -51,6 +51,14 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr private lazy var collectionView: UICollectionView = { let collectionView = UICollectionView() + + let layout = CarouselFlowLayout() + layout.itemSize = CGSize( + width: Constraints.collectionView.items.normalState.width.adjustedByWidth, + height: Constraints.collectionView.items.normalState.height.adjustedByWidth + ) + collectionView.collectionViewLayout = layout + self.view.addSubview(collectionView) collectionView.snp.makeConstraints { maker in -- GitLab From 8cb97dd7bfc0de18751ba57351f9fbccacb67af2 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Mon, 26 Feb 2018 19:01:57 +0200 Subject: [PATCH 07/24] Present wheel position picker module. --- Nynja/Modules/Main/MainProtocols.swift | 2 ++ Nynja/Modules/Main/Presenter/MainPresenter.swift | 4 ++++ Nynja/Modules/Main/View/MainNavigationItem.swift | 3 ++- .../Modules/Main/View/MainViewControllerNav.swift | 5 +++++ Nynja/Modules/Main/View/NavigateProtocol.swift | 3 ++- Nynja/Modules/Main/WireFrame/MainWireframe.swift | 10 +++++++--- .../Presenter/WheelPositionPickerPresenter.swift | 8 ++++++++ .../WheelPositionPickerViewController.swift | 9 ++++++--- .../WheelPositionPickerProtocols.swift | 3 ++- .../WireFrame/WheelPositionPickerWireFrame.swift | 6 ++---- Nynja/OptionsItemsFactory.swift | 15 +++++++++++---- 11 files changed, 51 insertions(+), 17 deletions(-) diff --git a/Nynja/Modules/Main/MainProtocols.swift b/Nynja/Modules/Main/MainProtocols.swift index 0b1d2706a..9e27c9970 100644 --- a/Nynja/Modules/Main/MainProtocols.swift +++ b/Nynja/Modules/Main/MainProtocols.swift @@ -49,6 +49,7 @@ protocol MainWireFrameProtocol: class { func viewShowed() func showMessages(contact: Contact, callVC: CallViewProtocol, isVideo: Bool) func showBuildNumber() + func showWheelPositionPicker() func logout() func hideReturnToCallView() func returnToCall() @@ -137,6 +138,7 @@ protocol MainPresenterProtocol: class { func returnToCall() func about() func showBuildNumber() + func showWheelPositionPicker() func openMapView() func deleteAccount() diff --git a/Nynja/Modules/Main/Presenter/MainPresenter.swift b/Nynja/Modules/Main/Presenter/MainPresenter.swift index ece7c27b2..f872f4186 100644 --- a/Nynja/Modules/Main/Presenter/MainPresenter.swift +++ b/Nynja/Modules/Main/Presenter/MainPresenter.swift @@ -167,6 +167,10 @@ class MainPresenter: MainPresenterProtocol, MainInteractorOutputProtocol, Schedu self.wireFrame.showBuildNumber() } + func showWheelPositionPicker() { + self.wireFrame.showWheelPositionPicker() + } + func showContactsToShare() { self.wireFrame.showContactsToShare() } diff --git a/Nynja/Modules/Main/View/MainNavigationItem.swift b/Nynja/Modules/Main/View/MainNavigationItem.swift index 6bf707db2..376947314 100644 --- a/Nynja/Modules/Main/View/MainNavigationItem.swift +++ b/Nynja/Modules/Main/View/MainNavigationItem.swift @@ -81,9 +81,10 @@ enum MainNavigationItem: String { // Options section case options = "Setting" + case wheelPosition = "Wheel position" + case buildNumber = "Build number" case logOut = "LOG OUT" case about = "About" - case buildNumber = "Build Number" case deleteAccount = "Delete Account" // Location subsection diff --git a/Nynja/Modules/Main/View/MainViewControllerNav.swift b/Nynja/Modules/Main/View/MainViewControllerNav.swift index 503387ecb..0dc589d22 100644 --- a/Nynja/Modules/Main/View/MainViewControllerNav.swift +++ b/Nynja/Modules/Main/View/MainViewControllerNav.swift @@ -359,6 +359,11 @@ extension MainViewController: NavigateProtocol { closeWheel(indexPath: indexPath) } + func showWheelPositionPicker(indexPath: IndexPath?) { + presenter.showWheelPositionPicker() + closeWheel(indexPath: indexPath) + } + func deleteAccount(indexPath: IndexPath?) { presenter.deleteAccount() closeWheel(indexPath: indexPath) diff --git a/Nynja/Modules/Main/View/NavigateProtocol.swift b/Nynja/Modules/Main/View/NavigateProtocol.swift index 4f7dc015c..1722b3aa7 100644 --- a/Nynja/Modules/Main/View/NavigateProtocol.swift +++ b/Nynja/Modules/Main/View/NavigateProtocol.swift @@ -74,8 +74,9 @@ protocol SecondLevelNavigateProtocol: class { // MARK: - Options - func logout(indexPath: IndexPath?) + func showWheelPositionPicker(indexPath: IndexPath?) func showBuildNumber(indexPath: IndexPath?) + func logout(indexPath: IndexPath?) func showAbout(indexPath: IndexPath?) func deleteAccount(indexPath: IndexPath?) } diff --git a/Nynja/Modules/Main/WireFrame/MainWireframe.swift b/Nynja/Modules/Main/WireFrame/MainWireframe.swift index b246c923f..f3fd0f604 100644 --- a/Nynja/Modules/Main/WireFrame/MainWireframe.swift +++ b/Nynja/Modules/Main/WireFrame/MainWireframe.swift @@ -432,9 +432,13 @@ class MainWireFrame: MainWireFrameProtocol, VoxServiceDelegate { } func showBuildNumber() { - if let navigation = contentNavigation { - BuildNumberWireFrame().presentBuildNumber(navigation: navigation) - } + guard let navigation = contentNavigation else { return } + BuildNumberWireFrame().presentBuildNumber(navigation: navigation) + } + + func showWheelPositionPicker() { + guard let navigation = contentNavigation else { return } + WheelPositionPickerWireFrame().presentWheelPositionPicker(navigation: navigation) } diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index 40b3e7f56..9862ac944 100644 --- a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -19,6 +19,14 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres var interactor: WheelPositionPickerInteractorInputProtocol! var wireFrame: WheelPositionPickerWireFrameProtocol! + func showed() { + let items = [ + WheelPositionCellModel(position: .left, isCurrent: false), + WheelPositionCellModel(position: .right, isCurrent: true) + ] + view.setupOptions(items) + } + func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) { guard !itemPositionModel.isCurrent else { return } diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index c2fdad9e9..1225af73a 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -50,14 +50,15 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr }() private lazy var collectionView: UICollectionView = { - let collectionView = UICollectionView() - let layout = CarouselFlowLayout() + layout.scrollDirection = .horizontal layout.itemSize = CGSize( width: Constraints.collectionView.items.normalState.width.adjustedByWidth, height: Constraints.collectionView.items.normalState.height.adjustedByWidth ) - collectionView.collectionViewLayout = layout + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) + collectionView.backgroundColor = .clear + collectionView.showsHorizontalScrollIndicator = false self.view.addSubview(collectionView) @@ -76,10 +77,12 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr override func viewDidLoad() { super.viewDidLoad() setupUI() + presenter.showed() } private func setupUI() { screenTitle = "wheel position title".localized + collectionView.register(viewModel: WheelPositionCellModel.self) collectionView.delegate = self collectionView.dataSource = self } diff --git a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift index 58c94f7cf..e31028c4d 100644 --- a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift +++ b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift @@ -10,7 +10,7 @@ import UIKit protocol WheelPositionPickerWireFrameProtocol: class { - func presentWheelPositionPicker(navigation: UINavigationController, main: MainWireFrame?) + func presentWheelPositionPicker(navigation: UINavigationController) /** * Add here your methods for communication PRESENTER -> WIREFRAME @@ -38,6 +38,7 @@ protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { * Add here your methods for communication VIEW -> PRESENTER */ + func showed() func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) } diff --git a/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift b/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift index 5e9356c24..815d30501 100644 --- a/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift +++ b/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift @@ -11,12 +11,10 @@ import Foundation final class WheelPositionPickerWireFrame: WheelPositionPickerWireFrameProtocol { weak var navigation: UINavigationController? - weak var main: MainWireFrame? - func presentWheelPositionPicker(navigation: UINavigationController, main: MainWireFrame?) { + func presentWheelPositionPicker(navigation: UINavigationController) { self.navigation = navigation - self.main = main - + let view = WheelPositionPickerViewController() let presenter = WheelPositionPickerPresenter() let interactor = WheelPositionPickerInteractor() diff --git a/Nynja/OptionsItemsFactory.swift b/Nynja/OptionsItemsFactory.swift index 726928554..ffc17a543 100644 --- a/Nynja/OptionsItemsFactory.swift +++ b/Nynja/OptionsItemsFactory.swift @@ -20,15 +20,15 @@ class OptionsItemsFactory: WCBaseItemsFactory { // MARK: - Second lvl override var secondLevelItems: ItemModels { - return [logout, about, buildNumber, deleteAccount] + return [logout, wheelPosition, buildNumber, about, deleteAccount] } // MARK: - Items - var about: ImageActionItemModel { - let item = ImageActionItemModel(navItem: .about, action: { [weak navigateDelegate] (item, indexPath) in - navigateDelegate?.showAbout(indexPath: indexPath) + var wheelPosition: ImageActionItemModel { + let item = ImageActionItemModel(navItem: .wheelPosition, action: { [weak navigateDelegate] (item, indexPath) in + navigateDelegate?.showWheelPositionPicker(indexPath: indexPath) }) return item } @@ -40,6 +40,13 @@ class OptionsItemsFactory: WCBaseItemsFactory { return item } + var about: ImageActionItemModel { + let item = ImageActionItemModel(navItem: .about, action: { [weak navigateDelegate] (item, indexPath) in + navigateDelegate?.showAbout(indexPath: indexPath) + }) + return item + } + var logout: ImageActionItemModel { let item = ImageActionItemModel(navItem: .logOut, action: { [weak navigateDelegate] (item, indexPath) in navigateDelegate?.logout(indexPath: indexPath) -- GitLab From 070ef497d5e5320b49f18191f1873d3fce012792 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 13:26:47 +0200 Subject: [PATCH 08/24] Fixed CarouselFlowLayout. Fixed performance issues - don't use pdf images with perserved vector data in collectionview with custom layout! It caused re-rendering of images on each layout change. --- .../CollectionView/CarouselFlowLayout.swift | 38 +++++++++++-------- .../WheelPositionPickerViewController.swift | 8 +++- .../wheel_left_image.imageset/Contents.json | 3 -- .../wheel_right_image.imageset/Contents.json | 3 -- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift index 1a4bba691..a4a746e94 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift @@ -81,17 +81,14 @@ open class CarouselFlowLayout: UICollectionViewFlowLayout { } override open func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { - guard let superAttributes = super.layoutAttributesForElements(in: rect), - let attributes = NSArray(array: superAttributes, copyItems: true) as? [UICollectionViewLayoutAttributes] - else { return nil } - return attributes.map({ self.transformLayoutAttributes($0) }) + return super.layoutAttributesForElements(in: rect)?.map { self.transformLayoutAttributes($0) } } fileprivate func transformLayoutAttributes(_ attributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { guard let collectionView = self.collectionView else { return attributes } let isHorizontal = (self.scrollDirection == .horizontal) - let collectionCenter = isHorizontal ? collectionView.frame.size.width/2 : collectionView.frame.size.height/2 + let collectionCenter = isHorizontal ? collectionView.frame.size.width / 2 : collectionView.frame.size.height / 2 let offset = isHorizontal ? collectionView.contentOffset.x : collectionView.contentOffset.y let normalizedCenter = (isHorizontal ? attributes.center.x : attributes.center.y) - offset @@ -116,25 +113,34 @@ open class CarouselFlowLayout: UICollectionViewFlowLayout { } override open func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { - guard let collectionView = collectionView , !collectionView.isPagingEnabled, + guard + let collectionView = collectionView , !collectionView.isPagingEnabled, let layoutAttributes = self.layoutAttributesForElements(in: collectionView.bounds) - else { return super.targetContentOffset(forProposedContentOffset: proposedContentOffset) } - + else { + return super.targetContentOffset(forProposedContentOffset: proposedContentOffset) + } let isHorizontal = (self.scrollDirection == .horizontal) - + let midSide = (isHorizontal ? collectionView.bounds.size.width : collectionView.bounds.size.height) / 2 - let proposedContentOffsetCenterOrigin = (isHorizontal ? proposedContentOffset.x : proposedContentOffset.y) + midSide - var targetContentOffset: CGPoint + let proposedContentOffsetCenterOrigin = isHorizontal + ? proposedContentOffset.x + velocity.x * itemSize.width + midSide + : proposedContentOffset.y + velocity.y * itemSize.height + midSide + + let targetContentOffset: CGPoint if isHorizontal { - let closest = layoutAttributes.sorted { abs($0.center.x - proposedContentOffsetCenterOrigin) < abs($1.center.x - proposedContentOffsetCenterOrigin) }.first ?? UICollectionViewLayoutAttributes() + let closest = layoutAttributes.sorted { + abs($0.center.x - proposedContentOffsetCenterOrigin) < abs($1.center.x - proposedContentOffsetCenterOrigin) + }.first ?? UICollectionViewLayoutAttributes() + targetContentOffset = CGPoint(x: floor(closest.center.x - midSide), y: proposedContentOffset.y) - } - else { - let closest = layoutAttributes.sorted { abs($0.center.y - proposedContentOffsetCenterOrigin) < abs($1.center.y - proposedContentOffsetCenterOrigin) }.first ?? UICollectionViewLayoutAttributes() + } else { + let closest = layoutAttributes.sorted { + abs($0.center.y - proposedContentOffsetCenterOrigin) < abs($1.center.y - proposedContentOffsetCenterOrigin) + }.first ?? UICollectionViewLayoutAttributes() + targetContentOffset = CGPoint(x: proposedContentOffset.x, y: floor(closest.center.y - midSide)) } - return targetContentOffset } } diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index 1225af73a..7984985e3 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -49,14 +49,18 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr return label }() - private lazy var collectionView: UICollectionView = { + private lazy var carouselLayout: CarouselFlowLayout = { let layout = CarouselFlowLayout() layout.scrollDirection = .horizontal layout.itemSize = CGSize( width: Constraints.collectionView.items.normalState.width.adjustedByWidth, height: Constraints.collectionView.items.normalState.height.adjustedByWidth ) - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) + return layout + }() + + private lazy var collectionView: UICollectionView = { + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.carouselLayout) collectionView.backgroundColor = .clear collectionView.showsHorizontalScrollIndicator = false diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json index d1fa0da3d..bab7f7d16 100644 --- a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json +++ b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_left_image.imageset/Contents.json @@ -8,8 +8,5 @@ "info" : { "version" : 1, "author" : "xcode" - }, - "properties" : { - "preserves-vector-representation" : true } } \ No newline at end of file diff --git a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json index 84396fb31..3c7f1cbf1 100644 --- a/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json +++ b/Nynja/Resources/Assets.xcassets/WheelPosition/wheel_right_image.imageset/Contents.json @@ -8,8 +8,5 @@ "info" : { "version" : 1, "author" : "xcode" - }, - "properties" : { - "preserves-vector-representation" : true } } \ No newline at end of file -- GitLab From f7ec49f16a52f18d24608ef7be7c93a5c6302350 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 15:19:40 +0200 Subject: [PATCH 09/24] Update wheel position picker ui. --- Nynja/Library/UI/Layout.swift | 41 ++++++++++++++++++- .../WheelPositionCellModel.swift | 8 ++-- .../WheelPositionCollectionViewCell.swift | 31 ++++++++++++-- .../WheelPositionPickerViewController.swift | 19 +++++++-- ...elPositionPickerViewControllerLayout.swift | 13 +----- Nynja/Services/MQTT/MQTTService.swift | 4 +- 6 files changed, 89 insertions(+), 27 deletions(-) diff --git a/Nynja/Library/UI/Layout.swift b/Nynja/Library/UI/Layout.swift index f8fa6ccff..f6412798f 100644 --- a/Nynja/Library/UI/Layout.swift +++ b/Nynja/Library/UI/Layout.swift @@ -53,7 +53,7 @@ extension CGFloat { return restored(from: .height) } - private func adjusted(by side: AdjustedSide) -> CGFloat { + fileprivate func adjusted(by side: AdjustedSide) -> CGFloat { guard iPhone6plusSize != UIScreen.main.bounds.size else { return self } @@ -61,7 +61,7 @@ extension CGFloat { return ceil(self * side.current / side.mockup) } - private func restored(from side: AdjustedSide) -> CGFloat { + fileprivate func restored(from side: AdjustedSide) -> CGFloat { guard iPhone6plusSize != UIScreen.main.bounds.size else { return self } @@ -190,3 +190,40 @@ extension Int { } } + +extension CGSize { + + /// Adjusted value by width of iPhone 6+ screen size to current screen size. + var adjustedByWidth: CGSize { + return adjusted(by: .width) + } + + /// Adjusted value by height of iPhone 6+ screen size to current screen size. + var adjustedByHeight: CGSize { + return adjusted(by: .height) + } + + /// Adjusted value by width of iPhone 6+ screen size to current screen size. + var restoredFromWidth: CGSize { + return restored(from: .width) + } + + /// Adjusted value by height of iPhone 6+ screen size to current screen size. + var restoredFromHeight: CGSize { + return restored(from: .height) + } + + private func adjusted(by side: AdjustedSide) -> CGSize { + guard iPhone6plusSize != UIScreen.main.bounds.size else { + return self + } + return CGSize(width: width.adjusted(by: side), height: height.adjusted(by: side)) + } + + private func restored(from side: AdjustedSide) -> CGSize { + guard iPhone6plusSize != UIScreen.main.bounds.size else { + return self + } + return CGSize(width: width.restored(from: side), height: height.restored(from: side)) + } +} diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index 1ca185e3a..144613eab 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -21,16 +21,16 @@ struct WheelPositionCellModel: CellViewModel { switch position { case .left: if isCurrent { - cell.itemLabel.text = "wheel left hand".localized - } else { cell.itemLabel.text = "\("wheel left hand".localized) (\("wheel current position".localized))" + } else { + cell.itemLabel.text = "wheel left hand".localized } cell.imageView.image = UIImage(named: "wheel_left_image") case .right: if isCurrent { - cell.itemLabel.text = "wheel right hand".localized - } else { cell.itemLabel.text = "\("wheel right hand".localized) (\("wheel current position".localized))" + } else { + cell.itemLabel.text = "wheel right hand".localized } cell.imageView.image = UIImage(named: "wheel_right_image") } diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift index 61a164add..73d994354 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift @@ -17,11 +17,16 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { let imageView = UIImageView() self.contentView.addSubview(imageView) - imageView.layer.shadowRadius = Constraints.shadow.radius - imageView.layer.shadowOffset = Constraints.shadow.offset + imageView.layer.shadowOpacity = Constraints.shadow.alpha + imageView.layer.shadowRadius = Constraints.shadow.radius.adjustedByWidth + imageView.layer.shadowOffset = Constraints.shadow.offset.adjustedByWidth + + imageView.clipsToBounds = false + imageView.layer.masksToBounds = false imageView.snp.makeConstraints { maker in maker.top.left.right.equalToSuperview() + maker.width.equalTo(imageView.snp.height).multipliedBy(Constraints.imageView.aspectRatio) } return imageView }() @@ -31,6 +36,7 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { let height = Constraints.itemLabel.height.adjustedByWidth let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) + label.textAlignment = .center self.contentView.addSubview(label) @@ -59,6 +65,10 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { // MARK: - UI Setup private func baseSetup() { + clipsToBounds = false + layer.masksToBounds = false + contentView.clipsToBounds = false + contentView.layer.masksToBounds = false itemLabel.isHidden = false } } @@ -66,14 +76,27 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { // MARK: - Layout extension WheelPositionCollectionViewCell { enum Constraints { + enum imageView { + static let minScale: CGFloat = scaledState.height / normalState.height + static let aspectRatio: CGFloat = normalState.width / normalState.height + + enum normalState { + static let width: CGFloat = 270 + static let height: CGFloat = 480 + } + enum scaledState { + static let height: CGFloat = 355 + } + } enum itemLabel { static let topOffset: CGFloat = 21 static let height: CGFloat = 22 static let width: CGFloat = 270 } enum shadow { - static let offset = CGSize(width: 0, height: 16) - static let radius: CGFloat = 24 + static let offset = CGSize(width: 0, height: 12) + static let radius: CGFloat = 12 + static let alpha: Float = 0.5 } } } diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index 7984985e3..b9ef63f5e 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -33,6 +33,8 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr color: Constants.colors.darkGray.getColor(), fontName: Constants.fonts.regular) label.textAlignment = .center + label.text = "choose wheel position".localized + self.view.addSubview(label) label.snp.makeConstraints { maker in @@ -51,11 +53,11 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr private lazy var carouselLayout: CarouselFlowLayout = { let layout = CarouselFlowLayout() + layout.spacingMode = .fixed(spacing: Constraints.collectionView.items.padding.adjustedByWidth) + layout.sideItemScale = WheelPositionCollectionViewCell.Constraints.imageView.minScale + layout.sideItemAlpha = 1.0 layout.scrollDirection = .horizontal - layout.itemSize = CGSize( - width: Constraints.collectionView.items.normalState.width.adjustedByWidth, - height: Constraints.collectionView.items.normalState.height.adjustedByWidth - ) + return layout }() @@ -63,6 +65,7 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.carouselLayout) collectionView.backgroundColor = .clear collectionView.showsHorizontalScrollIndicator = false + collectionView.clipsToBounds = false self.view.addSubview(collectionView) @@ -84,6 +87,14 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr presenter.showed() } + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + carouselLayout.itemSize = CGSize( + width: collectionView.bounds.width - Constraints.collectionView.items.horizontalInset.adjustedByWidth * 2, + height: collectionView.bounds.height + ) + } + private func setupUI() { screenTitle = "wheel position title".localized collectionView.register(viewModel: WheelPositionCellModel.self) diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift index 15ecdad4a..f275a7891 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift @@ -24,17 +24,8 @@ extension WheelPositionPickerViewController { static let bottomOffset: CGFloat = 85 enum items { - static let itemPadding: CGFloat = 24 - static let maxScale: CGFloat = scaledState.height / normalState.height - static let aspectRatio: CGFloat = normalState.width / normalState.height - - enum normalState { - static let width: CGFloat = 270 - static let height: CGFloat = 480 - } - enum scaledState { - static let height: CGFloat = 355 - } + static let padding: CGFloat = 24 + static let horizontalInset: CGFloat = 72 } } } diff --git a/Nynja/Services/MQTT/MQTTService.swift b/Nynja/Services/MQTT/MQTTService.swift index b53eefcc9..9c05b53ed 100644 --- a/Nynja/Services/MQTT/MQTTService.swift +++ b/Nynja/Services/MQTT/MQTTService.swift @@ -20,7 +20,7 @@ class MQTTService: NSObject, CocoaMQTTDelegate, ReachabilityServiceObserver { var mqtt: CocoaMQTT? - static let version = 2 + static let version = 3 var currentHost = host.Test let port: UInt16 = 1883 @@ -80,7 +80,7 @@ class MQTTService: NSObject, CocoaMQTTDelegate, ReachabilityServiceObserver { mqtt?.password = "" mqtt?.username = "api" } - mqtt?.willMessage = CocoaMQTTWill(topic: "version/2", message: "") + mqtt?.willMessage = CocoaMQTTWill(topic: "version/\(type(of: self).version)", message: "") mqtt?.cleanSession = true mqtt?.keepAlive = 90 mqtt?.delegate = self -- GitLab From 5186306a05a74fad7ddd64109a9df8f0563ce031 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 15:30:05 +0200 Subject: [PATCH 10/24] Added popup to confirm wheel position change. --- .../Presenter/WheelPositionPickerPresenter.swift | 15 ++++++++++++++- Nynja/Resources/en.lproj/Localizable.strings | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index 9862ac944..15496d453 100644 --- a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -30,6 +30,19 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) { guard !itemPositionModel.isCurrent else { return } - // TODO: present popup + AlertManager.sharedInstance.showAlertWithTwoActions( + title: "wheel position alert title".localized, + message: "", + firstActionTitle: "yes".localized, + secondActionTitle: "no".localized, + firstAction: { + self.apply(wheelPosition: itemPositionModel.position) + }, + secondAction: nil + ) + } + + private func apply(wheelPosition: WheelPosition) { + // TODO: apply position across the application } } diff --git a/Nynja/Resources/en.lproj/Localizable.strings b/Nynja/Resources/en.lproj/Localizable.strings index 7bff987ac..fe7833424 100644 --- a/Nynja/Resources/en.lproj/Localizable.strings +++ b/Nynja/Resources/en.lproj/Localizable.strings @@ -393,6 +393,7 @@ "wheel current position" = "current position"; "wheel left hand" = "Left hand"; "wheel right hand" = "Right hand"; +"wheel position alert title" = "Use this wheel position?"; //MARK: Build Number "build number title" = "BUILD NUMBER"; -- GitLab From 6adffe444a6fcd032a8d0fe8bace4cf0c1317dcf Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 15:56:56 +0200 Subject: [PATCH 11/24] Make label static. --- .../WheelPositionCellModel.swift | 19 ++++++---- .../WheelPositionCollectionViewCell.swift | 19 +--------- .../WheelPositionPickerViewController.swift | 36 +++++++++++++++++++ ...elPositionPickerViewControllerLayout.swift | 9 ++++- 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index 144613eab..df7b3789d 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -18,21 +18,28 @@ struct WheelPositionCellModel: CellViewModel { let isCurrent: Bool func setup(cell: WheelPositionCollectionViewCell) { + switch position { + case .left: + cell.imageView.image = UIImage(named: "wheel_left_image") + case .right: + cell.imageView.image = UIImage(named: "wheel_right_image") + } + } + + func title() -> String { switch position { case .left: if isCurrent { - cell.itemLabel.text = "\("wheel left hand".localized) (\("wheel current position".localized))" + return "\("wheel left hand".localized) (\("wheel current position".localized))" } else { - cell.itemLabel.text = "wheel left hand".localized + return "wheel left hand".localized } - cell.imageView.image = UIImage(named: "wheel_left_image") case .right: if isCurrent { - cell.itemLabel.text = "\("wheel right hand".localized) (\("wheel current position".localized))" + return "\("wheel right hand".localized) (\("wheel current position".localized))" } else { - cell.itemLabel.text = "wheel right hand".localized + return "wheel right hand".localized } - cell.imageView.image = UIImage(named: "wheel_right_image") } } } diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift index 73d994354..467437208 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift @@ -31,23 +31,6 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { return imageView }() - private(set) lazy var itemLabel: UILabel = { - let width = Constraints.itemLabel.width.adjustedByWidth - let height = Constraints.itemLabel.height.adjustedByWidth - - let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) - label.textAlignment = .center - - self.contentView.addSubview(label) - - label.snp.makeConstraints { maker in - maker.left.right.equalToSuperview() - maker.top.equalTo(imageView.snp.bottom).offset(Constraints.itemLabel.topOffset.adjustedByWidth) - maker.height.equalTo(Constraints.itemLabel.topOffset.adjustedByWidth) - } - return label - }() - // MARK: - Init @@ -69,7 +52,7 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { layer.masksToBounds = false contentView.clipsToBounds = false contentView.layer.masksToBounds = false - itemLabel.isHidden = false + imageView.isHidden = false } } diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index b9ef63f5e..3b45e2a52 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -78,6 +78,23 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr return collectionView }() + private(set) lazy var selectedItemLabel: UILabel = { + let width = Constraints.selectedItemLabel.width.adjustedByWidth + let height = Constraints.selectedItemLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) + label.textAlignment = .center + + self.view.addSubview(label) + + label.snp.makeConstraints { maker in + maker.left.right.equalToSuperview() + maker.top.equalTo(collectionView.snp.bottom).offset(Constraints.selectedItemLabel.topOffset.adjustedByWidth) + maker.height.equalTo(Constraints.selectedItemLabel.topOffset.adjustedByWidth) + } + return label + }() + // MARK: - Life Cycle @@ -102,11 +119,19 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr collectionView.dataSource = self } + private func setupTitle(for model: WheelPositionCellModel) { + selectedItemLabel.text = model.title() + } + // MARK: - WheelPositionPickerViewProtocol func setupOptions(_ items: [WheelPositionCellModel]) { self.items = items + + if let firstItem = items.first { + setupTitle(for: firstItem) + } } } @@ -133,4 +158,15 @@ extension WheelPositionPickerViewController: UICollectionViewDelegate { let selectedItem = itemModel(at: indexPath) presenter.didSelectItemModel(selectedItem) } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + var point = scrollView.contentOffset + point.x += scrollView.bounds.width / 2 + + guard let indexPath = collectionView.indexPathForItem(at: point) else { + return + } + let itemModel = self.itemModel(at: indexPath) + setupTitle(for: itemModel) + } } diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift index f275a7891..d9adfac9c 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift @@ -21,12 +21,19 @@ extension WheelPositionPickerViewController { enum collectionView { static let topOffset: CGFloat = 20 - static let bottomOffset: CGFloat = 85 + static let bottomOffset: CGFloat = 128 enum items { static let padding: CGFloat = 24 static let horizontalInset: CGFloat = 72 } } + + enum selectedItemLabel { + static let horizontalInset: CGFloat = 16 + static let topOffset: CGFloat = 21 + static let height: CGFloat = 22 + static let width: CGFloat = 270 + } } } -- GitLab From 1cfbb9a74d60ecf91ebcf0543a5cbe4dd536d8fc Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 16:06:40 +0200 Subject: [PATCH 12/24] Fixed cell UI. --- .../View/CollectionView/WheelPositionCollectionViewCell.swift | 2 +- .../ViewController/WheelPositionPickerViewController.swift | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift index 467437208..314315967 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift @@ -25,7 +25,7 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { imageView.layer.masksToBounds = false imageView.snp.makeConstraints { maker in - maker.top.left.right.equalToSuperview() + maker.top.bottom.centerX.equalToSuperview() maker.width.equalTo(imageView.snp.height).multipliedBy(Constraints.imageView.aspectRatio) } return imageView diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index 3b45e2a52..fb5629292 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -112,6 +112,9 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr ) } + + // MARK: - UI Setup + private func setupUI() { screenTitle = "wheel position title".localized collectionView.register(viewModel: WheelPositionCellModel.self) -- GitLab From bed004014162d190d810af9e5fc84f4648296c92 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 16:50:32 +0200 Subject: [PATCH 13/24] Move CarouselFlowLayout to Library folder. --- Nynja.xcodeproj/project.pbxproj | 136 ++++++++++-------- .../Layout}/CarouselFlowLayout.swift | 0 2 files changed, 76 insertions(+), 60 deletions(-) rename Nynja/{Modules/WheelPositionPicker/View/CollectionView => Library/UI/CollectionView/Layout}/CarouselFlowLayout.swift (100%) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 482a97f10..dcaddfe1d 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -773,13 +773,6 @@ 855EF421202CC6F800541BE3 /* GetExtendedStarsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */; }; 855EF423202CC85300541BE3 /* MQTTServiceStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */; }; 855EF425202CCADB00541BE3 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; - 85788C5120444F2E003600C9 /* WheelPositionPickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */; }; - 85788C57204450AE003600C9 /* WheelPositionPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */; }; - 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; - 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; - 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; - 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */; }; - 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */; }; 85788C3C204422FB003600C9 /* BuildNumberProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C3B204422FB003600C9 /* BuildNumberProtocols.swift */; }; 85788C422044237B003600C9 /* BuildNumberViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C412044237B003600C9 /* BuildNumberViewController.swift */; }; 85788C4420442385003600C9 /* BuildNumberPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4320442385003600C9 /* BuildNumberPresenter.swift */; }; @@ -788,6 +781,13 @@ 85788C4A20442887003600C9 /* Bundle+Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4920442887003600C9 /* Bundle+Keys.swift */; }; 85788C4C20443366003600C9 /* BuildNumberViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4B20443366003600C9 /* BuildNumberViewControllerLayout.swift */; }; 85788C4E20443DD2003600C9 /* BuildNumberItemsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */; }; + 85788C5120444F2E003600C9 /* WheelPositionPickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */; }; + 85788C57204450AE003600C9 /* WheelPositionPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */; }; + 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; + 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; + 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; + 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */; }; + 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; @@ -1756,13 +1756,6 @@ 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTServiceStars.swift; sourceTree = ""; }; 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStarHandler.swift; sourceTree = ""; }; - 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerProtocols.swift; sourceTree = ""; }; - 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewController.swift; sourceTree = ""; }; - 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; - 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; - 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; - 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewControllerLayout.swift; sourceTree = ""; }; - 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCollectionViewCell.swift; sourceTree = ""; }; 85788C3B204422FB003600C9 /* BuildNumberProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberProtocols.swift; sourceTree = ""; }; 85788C412044237B003600C9 /* BuildNumberViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberViewController.swift; sourceTree = ""; }; 85788C4320442385003600C9 /* BuildNumberPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberPresenter.swift; sourceTree = ""; }; @@ -1771,6 +1764,13 @@ 85788C4920442887003600C9 /* Bundle+Keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Keys.swift"; sourceTree = ""; }; 85788C4B20443366003600C9 /* BuildNumberViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberViewControllerLayout.swift; sourceTree = ""; }; 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildNumberItemsFactory.swift; sourceTree = ""; }; + 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerProtocols.swift; sourceTree = ""; }; + 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewController.swift; sourceTree = ""; }; + 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; + 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; + 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; + 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewControllerLayout.swift; sourceTree = ""; }; + 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCollectionViewCell.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; @@ -3205,6 +3205,7 @@ 3A82187C1EDEEDF400337B05 /* UI */ = { isa = PBXGroup; children = ( + 85082DD92045A744000AE4B2 /* CollectionView */, 2683F77F204043C80003181A /* CustomPopup */, 2683F776203F38AE0003181A /* PickerView */, 2607270B203C59D600290545 /* UITableViewCells */, @@ -4278,6 +4279,22 @@ path = Profile; sourceTree = ""; }; + 85082DD92045A744000AE4B2 /* CollectionView */ = { + isa = PBXGroup; + children = ( + 85082DDA2045A77D000AE4B2 /* Layout */, + ); + path = CollectionView; + sourceTree = ""; + }; + 85082DDA2045A77D000AE4B2 /* Layout */ = { + isa = PBXGroup; + children = ( + 854FC1CA204468FC00B12BE5 /* CarouselFlowLayout.swift */, + ); + path = Layout; + sourceTree = ""; + }; 850FC5EA2032F1D900832D87 /* ForwardSelector */ = { isa = PBXGroup; children = ( @@ -4399,27 +4416,6 @@ path = Models; sourceTree = ""; }; - 85788C4F20444EF1003600C9 /* WheelPositionPicker */ = { - isa = PBXGroup; - children = ( - 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */, - 85788C5220445064003600C9 /* View */, - 85788C542044506E003600C9 /* Presenter */, - 85788C5320445069003600C9 /* Interactor */, - 85788C5520445073003600C9 /* WireFrame */, - ); - path = WheelPositionPicker; - sourceTree = ""; - }; - 85788C5220445064003600C9 /* View */ = { - isa = PBXGroup; - children = ( - 85788C6220445B8D003600C9 /* CollectionView */, - 85788C6120445B82003600C9 /* ViewController */, - ); - path = View; - sourceTree = ""; - }; 85788C3A20442263003600C9 /* BuildNumber */ = { isa = PBXGroup; children = ( @@ -4441,6 +4437,51 @@ path = View; sourceTree = ""; }; + 85788C3E20442312003600C9 /* Presenter */ = { + isa = PBXGroup; + children = ( + 85788C4320442385003600C9 /* BuildNumberPresenter.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 85788C3F2044235F003600C9 /* Interactor */ = { + isa = PBXGroup; + children = ( + 85788C4520442392003600C9 /* BuildNumberInteractor.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 85788C4020442365003600C9 /* WireFrame */ = { + isa = PBXGroup; + children = ( + 85788C47204423A4003600C9 /* BuildNumberWireFrame.swift */, + ); + path = WireFrame; + sourceTree = ""; + }; + 85788C4F20444EF1003600C9 /* WheelPositionPicker */ = { + isa = PBXGroup; + children = ( + 85788C5020444F2E003600C9 /* WheelPositionPickerProtocols.swift */, + 85788C5220445064003600C9 /* View */, + 85788C542044506E003600C9 /* Presenter */, + 85788C5320445069003600C9 /* Interactor */, + 85788C5520445073003600C9 /* WireFrame */, + ); + path = WheelPositionPicker; + sourceTree = ""; + }; + 85788C5220445064003600C9 /* View */ = { + isa = PBXGroup; + children = ( + 85788C6220445B8D003600C9 /* CollectionView */, + 85788C6120445B82003600C9 /* ViewController */, + ); + path = View; + sourceTree = ""; + }; 85788C5320445069003600C9 /* Interactor */ = { isa = PBXGroup; children = ( @@ -4453,14 +4494,6 @@ isa = PBXGroup; children = ( 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */, - ); - path = Presenter; - sourceTree = ""; - }; - 85788C3E20442312003600C9 /* Presenter */ = { - isa = PBXGroup; - children = ( - 85788C4320442385003600C9 /* BuildNumberPresenter.swift */, ); path = Presenter; sourceTree = ""; @@ -4487,25 +4520,8 @@ children = ( 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */, 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */, - 854FC1CA204468FC00B12BE5 /* CarouselFlowLayout.swift */, ); path = CollectionView; - sourceTree = ""; - }; - 85788C3F2044235F003600C9 /* Interactor */ = { - isa = PBXGroup; - children = ( - 85788C4520442392003600C9 /* BuildNumberInteractor.swift */, - ); - path = Interactor; - sourceTree = ""; - }; - 85788C4020442365003600C9 /* WireFrame */ = { - isa = PBXGroup; - children = ( - 85788C47204423A4003600C9 /* BuildNumberWireFrame.swift */, - ); - path = WireFrame; sourceTree = ""; }; 85801C4020342A3E00CC364C /* BottomActions */ = { diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift b/Nynja/Library/UI/CollectionView/Layout/CarouselFlowLayout.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/View/CollectionView/CarouselFlowLayout.swift rename to Nynja/Library/UI/CollectionView/Layout/CarouselFlowLayout.swift -- GitLab From d0044a840e4545a94d6e09fed56d2da539e75573 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 17:33:29 +0200 Subject: [PATCH 14/24] Save wheel position in the user defaults. --- Nynja.xcodeproj/project.pbxproj | 16 +++++++++++ .../WheelPositionPickerInteractor.swift | 10 ++++++- .../WheelPositionPickerPresenter.swift | 20 +++++++++---- .../WheelPositionCellModel.swift | 4 --- .../WheelPositionPickerProtocols.swift | 3 ++ Nynja/UISettings/UISettingsService.swift | 28 +++++++++++++++++++ Nynja/UISettings/WheelPosition.swift | 20 +++++++++++++ 7 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 Nynja/UISettings/UISettingsService.swift create mode 100644 Nynja/UISettings/WheelPosition.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index dcaddfe1d..597d818e6 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -741,6 +741,8 @@ 7C51CDC1260CE191C07EE46C /* SelectCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFD3063186FFCB048E843FD /* SelectCountryViewController.swift */; }; 82FCF48AA4A8C04CC8B0B5B6 /* FavoritesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC0DFB96051C50F0FC5B9CA /* FavoritesWireframe.swift */; }; 85029EE3203DA8EC00FDD9B6 /* ChatState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85029EE2203DA8EC00FDD9B6 /* ChatState.swift */; }; + 85082DDD2045A873000AE4B2 /* UISettingsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85082DDC2045A873000AE4B2 /* UISettingsService.swift */; }; + 85082DDF2045A8C2000AE4B2 /* WheelPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */; }; 850833DB2037171600587EEF /* FileExtensionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850833DA2037171600587EEF /* FileExtensionView.swift */; }; 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; 850A2BB0203584B000D68FDF /* SearchActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A2BAF203584B000D68FDF /* SearchActionsView.swift */; }; @@ -1728,6 +1730,8 @@ 83894D517BFF22637F2878B7 /* EditUsernameProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameProtocols.swift; sourceTree = ""; }; 83D3668B46C0CDA421807094 /* TimeZoneSelectorPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimeZoneSelectorPresenter.swift; sourceTree = ""; }; 85029EE2203DA8EC00FDD9B6 /* ChatState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatState.swift; sourceTree = ""; }; + 85082DDC2045A873000AE4B2 /* UISettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISettingsService.swift; sourceTree = ""; }; + 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPosition.swift; sourceTree = ""; }; 850833DA2037171600587EEF /* FileExtensionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtensionView.swift; sourceTree = ""; }; 850A2BAF203584B000D68FDF /* SearchActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchActionsView.swift; sourceTree = ""; }; 850A2BB12035AE5E00D68FDF /* ForwardCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardCellViewModel.swift; sourceTree = ""; }; @@ -3162,6 +3166,7 @@ 3A8045CC1F60C8E200AED866 /* MQTT */, 3A1DC7371EF151B6006A8E9F /* HandleServices */, 3AC321761EEAC4700068F3C8 /* Models */, + 85082DDB2045A864000AE4B2 /* UISettings */, 3A27B0AC1EF3590E00B4B3CB /* StorageService.swift */, 3A768F061ED4987300108F7C /* VoxService.swift */, E70189BA1F9107AD00CA7005 /* ProximitySensorManager.swift */, @@ -4295,6 +4300,15 @@ path = Layout; sourceTree = ""; }; + 85082DDB2045A864000AE4B2 /* UISettings */ = { + isa = PBXGroup; + children = ( + 85082DDC2045A873000AE4B2 /* UISettingsService.swift */, + 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */, + ); + path = UISettings; + sourceTree = ""; + }; 850FC5EA2032F1D900832D87 /* ForwardSelector */ = { isa = PBXGroup; children = ( @@ -6828,6 +6842,7 @@ C9C694F9201FA4AB00A57297 /* SlideAnimatedTransitioning.swift in Sources */, E7598F5B1FA1D5D90082FBE7 /* ProfileActionCellLayout.swift in Sources */, 3A2171561EFB4A4A00F34B8B /* CountryField.swift in Sources */, + 85082DDD2045A873000AE4B2 /* UISettingsService.swift in Sources */, 1F8247691F2779AD00E5B749 /* iCarousel.m in Sources */, 3A27B0AD1EF3590E00B4B3CB /* StorageService.swift in Sources */, 3A1146651ED6E85A006BA132 /* SoundService.swift in Sources */, @@ -7390,6 +7405,7 @@ 3AE0A84C1F20321A008A04F3 /* WheelItemModel.swift in Sources */, 2686D3271FC640440079CB75 /* DBSyncFile.swift in Sources */, 06E67B3C3ED6CE5F6A913762 /* MainProtocols.swift in Sources */, + 85082DDF2045A8C2000AE4B2 /* WheelPosition.swift in Sources */, 266F04CD2015401F00B97A83 /* StorageService+Star.swift in Sources */, E70938371FBEDA2B006CCDC6 /* ProfileTable.swift in Sources */, 26035BCD1F9A741C00003850 /* Vox_Spec.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift b/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift index bec690611..416a34247 100644 --- a/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift +++ b/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift @@ -9,6 +9,14 @@ import Foundation final class WheelPositionPickerInteractor: WheelPositionPickerInteractorInputProtocol { - weak var presenter: WheelPositionPickerInteractorOutputProtocol! + + func getCurrentWheelPosition() -> WheelPosition { + return UISettingsService.shared.wheelPosition + } + + func setWheelPosition(_ wheelPosition: WheelPosition) { + UISettingsService.shared.wheelPosition = wheelPosition + presenter.didUpdateWheelPosition(wheelPosition) + } } diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index 15496d453..fc1d96458 100644 --- a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -20,11 +20,8 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres var wireFrame: WheelPositionPickerWireFrameProtocol! func showed() { - let items = [ - WheelPositionCellModel(position: .left, isCurrent: false), - WheelPositionCellModel(position: .right, isCurrent: true) - ] - view.setupOptions(items) + let currentPosition = interactor.getCurrentWheelPosition() + setupView(for: currentPosition) } func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) { @@ -42,7 +39,18 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres ) } + private func setupView(for currentPosition: WheelPosition) { + let items = WheelPosition.all.map { + WheelPositionCellModel(position: $0, isCurrent: $0 == currentPosition) + } + view.setupOptions(items) + } + private func apply(wheelPosition: WheelPosition) { - // TODO: apply position across the application + interactor.setWheelPosition(wheelPosition) + } + + func didUpdateWheelPosition(_ wheelPosition: WheelPosition) { + setupView(for: wheelPosition) } } diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index df7b3789d..3deccd980 100644 --- a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -8,10 +8,6 @@ import Foundation -enum WheelPosition { - case left, right -} - struct WheelPositionCellModel: CellViewModel { let position: WheelPosition diff --git a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift index e31028c4d..4605be8c8 100644 --- a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift +++ b/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift @@ -47,6 +47,7 @@ protocol WheelPositionPickerInteractorOutputProtocol: class { /** * Add here your methods for communication INTERACTOR -> PRESENTER */ + func didUpdateWheelPosition(_ wheelPosition: WheelPosition) } protocol WheelPositionPickerInteractorInputProtocol: class { @@ -56,4 +57,6 @@ protocol WheelPositionPickerInteractorInputProtocol: class { /** * Add here your methods for communication PRESENTER -> INTERACTOR */ + func getCurrentWheelPosition() -> WheelPosition + func setWheelPosition(_ wheelPosition: WheelPosition) } diff --git a/Nynja/UISettings/UISettingsService.swift b/Nynja/UISettings/UISettingsService.swift new file mode 100644 index 000000000..3f4456a8c --- /dev/null +++ b/Nynja/UISettings/UISettingsService.swift @@ -0,0 +1,28 @@ +// +// UISettingsService.swift +// Nynja +// +// Created by Anton Poltoratskyi on 27.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class UISettingsService { + private enum Keys { + static let wheelPosition = "wheelPosition" + } + static let shared = UISettingsService() + + private let storage = UserDefaults.standard + + var wheelPosition: WheelPosition { + get { + guard let position = storage.string(forKey: Keys.wheelPosition) else { return .default } + return WheelPosition(rawValue: position) ?? .default + } + set { + storage.set(newValue.rawValue, forKey: Keys.wheelPosition) + } + } +} diff --git a/Nynja/UISettings/WheelPosition.swift b/Nynja/UISettings/WheelPosition.swift new file mode 100644 index 000000000..baab3100a --- /dev/null +++ b/Nynja/UISettings/WheelPosition.swift @@ -0,0 +1,20 @@ +// +// WheelPosition.swift +// Nynja +// +// Created by Anton Poltoratskyi on 27.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +enum WheelPosition: String { + case left = "left" + case right = "right" + + static let all: [WheelPosition] = [left, right] + + static var `default`: WheelPosition { + return .right + } +} -- GitLab From 1457423de3a9aeb869364e5b704f063b89de574a Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 18:08:45 +0200 Subject: [PATCH 15/24] Show current wheel position when open wheel position picker screen. Add WheelPositionItemsFactory. --- Nynja.xcodeproj/project.pbxproj | 4 +++ .../WheelPositionPickerPresenter.swift | 3 +- .../WheelPositionPickerViewController.swift | 29 +++++++++++++++++-- Nynja/WheelPositionItemsFactory.swift | 18 ++++++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 Nynja/WheelPositionItemsFactory.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 597d818e6..02beff639 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -764,6 +764,7 @@ 850FC611203312FA00832D87 /* ForwardSelectorViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850FC610203312FA00832D87 /* ForwardSelectorViewControllerLayout.swift */; }; 8511D3712034427F00B2A620 /* UIView+SafeArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8511D3702034427F00B2A620 /* UIView+SafeArea.swift */; }; 8511D3742034596E00B2A620 /* Collection+ViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8511D3732034596E00B2A620 /* Collection+ViewLayout.swift */; }; + 85249D322045B1F800B43007 /* WheelPositionItemsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85249D312045B1F800B43007 /* WheelPositionItemsFactory.swift */; }; 852DF26120371FB400A4F8B6 /* FileExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF26020371FB400A4F8B6 /* FileExtension.swift */; }; 852DF263203720E600A4F8B6 /* FileIcons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852DF262203720E600A4F8B6 /* FileIcons.swift */; }; 854FC1C92044674E00B12BE5 /* WheelPositionCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */; }; @@ -1751,6 +1752,7 @@ 850FC610203312FA00832D87 /* ForwardSelectorViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardSelectorViewControllerLayout.swift; sourceTree = ""; }; 8511D3702034427F00B2A620 /* UIView+SafeArea.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+SafeArea.swift"; sourceTree = ""; }; 8511D3732034596E00B2A620 /* Collection+ViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+ViewLayout.swift"; sourceTree = ""; }; + 85249D312045B1F800B43007 /* WheelPositionItemsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionItemsFactory.swift; sourceTree = ""; }; 852DF26020371FB400A4F8B6 /* FileExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtension.swift; sourceTree = ""; }; 852DF262203720E600A4F8B6 /* FileIcons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileIcons.swift; sourceTree = ""; }; 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCellModel.swift; sourceTree = ""; }; @@ -3786,6 +3788,7 @@ 4B1D7E002029C4BE00703228 /* OptionsItemsFactory.swift */, 4B1D7DFD2029C41C00703228 /* AboutItemsFactory.swift */, 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */, + 85249D312045B1F800B43007 /* WheelPositionItemsFactory.swift */, ); name = Options; sourceTree = ""; @@ -7117,6 +7120,7 @@ 85788C4A20442887003600C9 /* Bundle+Keys.swift in Sources */, 2652D6161FA82EFE005E62C7 /* EditProfileVCLayout.swift in Sources */, E70189BB1F9107AD00CA7005 /* ProximitySensorManager.swift in Sources */, + 85249D322045B1F800B43007 /* WheelPositionItemsFactory.swift in Sources */, E7C36C2F1FC438C800740630 /* StorageService+Profile.swift in Sources */, E7C284CA1F87551C0060CA63 /* UIViewController+SafeArea.swift in Sources */, E7C543542006666B00732030 /* InfoInjectible.swift in Sources */, diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index fc1d96458..65e9fe773 100644 --- a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -11,8 +11,7 @@ import Foundation final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPresenterProtocol, WheelPositionPickerInteractorOutputProtocol { override var itemsFactory: WCItemsFactory? { - // TODO: return valid wheel factory - return nil + return WheelPositionItemsFactory() } weak var view: WheelPositionPickerViewProtocol! diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index fb5629292..649a98edf 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -23,6 +23,9 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr } } + private var isAppeared = false + + // MARK: - Views private lazy var collectionTitleLabel: UILabel = { @@ -106,10 +109,19 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() + + guard !isAppeared else { return } + carouselLayout.itemSize = CGSize( width: collectionView.bounds.width - Constraints.collectionView.items.horizontalInset.adjustedByWidth * 2, height: collectionView.bounds.height ) + showSelectedPosition() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + isAppeared = true } @@ -131,10 +143,20 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr func setupOptions(_ items: [WheelPositionCellModel]) { self.items = items + showSelectedPosition() + } + + private func showSelectedPosition() { + guard let index = items.index(where: { $0.isCurrent }) else { return } + scrollToModel(at: index, animated: false) + } + + private func scrollToModel(at index: Int, animated: Bool) { + let item = items[index] + setupTitle(for: item) - if let firstItem = items.first { - setupTitle(for: firstItem) - } + let indexPath = IndexPath(item: index, section: 0) + collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: animated) } } @@ -158,6 +180,7 @@ extension WheelPositionPickerViewController: UICollectionViewDataSource { extension WheelPositionPickerViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + scrollToModel(at: indexPath.item, animated: true) let selectedItem = itemModel(at: indexPath) presenter.didSelectItemModel(selectedItem) } diff --git a/Nynja/WheelPositionItemsFactory.swift b/Nynja/WheelPositionItemsFactory.swift new file mode 100644 index 000000000..7dbef1710 --- /dev/null +++ b/Nynja/WheelPositionItemsFactory.swift @@ -0,0 +1,18 @@ +// +// WheelPositionItemsFactory.swift +// Nynja +// +// Created by Anton Poltoratskyi on 27.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +class WheelPositionItemsFactory: OptionsItemsFactory { + + // MARK: - Second lvl + + override var wheelPosition: ImageActionItemModel { + let item = super.wheelPosition + item.state = .highlighted + return item + } +} -- GitLab From d1727351a1a92b38fbf84181783b57a144d36563 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Tue, 27 Feb 2018 18:41:53 +0200 Subject: [PATCH 16/24] Update ui logic in WheelPositionPickerViewController. --- .../WheelPositionPickerViewController.swift | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index 649a98edf..64bcb0f6f 100644 --- a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -98,6 +98,12 @@ final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewPr return label }() + private var currentItemIndexPath: IndexPath? { + var point = collectionView.contentOffset + point.x += collectionView.bounds.width / 2 + return collectionView.indexPathForItem(at: point) + } + // MARK: - Life Cycle @@ -180,16 +186,14 @@ extension WheelPositionPickerViewController: UICollectionViewDataSource { extension WheelPositionPickerViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - scrollToModel(at: indexPath.item, animated: true) + guard indexPath == self.currentItemIndexPath else { return } + let selectedItem = itemModel(at: indexPath) presenter.didSelectItemModel(selectedItem) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - var point = scrollView.contentOffset - point.x += scrollView.bounds.width / 2 - - guard let indexPath = collectionView.indexPathForItem(at: point) else { + guard let indexPath = currentItemIndexPath else { return } let itemModel = self.itemModel(at: indexPath) -- GitLab From be5977899d8cb8b03dea9c53b678150ae75027cf Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Wed, 28 Feb 2018 11:27:27 +0200 Subject: [PATCH 17/24] Handle selected position of navigation wheel. Update layout and transform of wheel button and WheelContainer. --- Nynja.xcodeproj/project.pbxproj | 4 ++ Nynja/ChatState.swift | 20 ++----- .../UI/WheelContainer/WheelContainer.swift | 25 ++++++++- .../Main/View/MainViewController.swift | 52 ++++++++++++++----- Nynja/UISettings/UISettingsRespondable.swift | 28 ++++++++++ Nynja/UISettings/UISettingsService.swift | 38 ++++++++++++++ Nynja/WeakRef.swift | 19 ++++--- 7 files changed, 147 insertions(+), 39 deletions(-) create mode 100644 Nynja/UISettings/UISettingsRespondable.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 02beff639..378cf24d3 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -745,6 +745,7 @@ 85082DDF2045A8C2000AE4B2 /* WheelPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */; }; 850833DB2037171600587EEF /* FileExtensionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850833DA2037171600587EEF /* FileExtensionView.swift */; }; 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; + 850A0C6520469AED004F79AD /* UISettingsRespondable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */; }; 850A2BB0203584B000D68FDF /* SearchActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A2BAF203584B000D68FDF /* SearchActionsView.swift */; }; 850A2BB22035AE5E00D68FDF /* ForwardCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A2BB12035AE5E00D68FDF /* ForwardCellViewModel.swift */; }; 850AC31C203EBF3000EF0774 /* StorageService+UnreadCounters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850AC31B203EBF3000EF0774 /* StorageService+UnreadCounters.swift */; }; @@ -1734,6 +1735,7 @@ 85082DDC2045A873000AE4B2 /* UISettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISettingsService.swift; sourceTree = ""; }; 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPosition.swift; sourceTree = ""; }; 850833DA2037171600587EEF /* FileExtensionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtensionView.swift; sourceTree = ""; }; + 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISettingsRespondable.swift; sourceTree = ""; }; 850A2BAF203584B000D68FDF /* SearchActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchActionsView.swift; sourceTree = ""; }; 850A2BB12035AE5E00D68FDF /* ForwardCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardCellViewModel.swift; sourceTree = ""; }; 850AC31B203EBF3000EF0774 /* StorageService+UnreadCounters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+UnreadCounters.swift"; sourceTree = ""; }; @@ -4306,6 +4308,7 @@ 85082DDB2045A864000AE4B2 /* UISettings */ = { isa = PBXGroup; children = ( + 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */, 85082DDC2045A873000AE4B2 /* UISettingsService.swift */, 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */, ); @@ -7148,6 +7151,7 @@ 267BE28E1FDE9FCC00C47E18 /* SettingsGroupWireFrame.swift in Sources */, 269666181FB57963009E41C1 /* RoomHandler.swift in Sources */, 852DF263203720E600A4F8B6 /* FileIcons.swift in Sources */, + 850A0C6520469AED004F79AD /* UISettingsRespondable.swift in Sources */, E7598F6C1FA1D8B90082FBE7 /* ProfileContactCellLayout.swift in Sources */, 6D5BA6A61F14857900A16844 /* EditField.swift in Sources */, E757B53D1FE9225C00467BA2 /* TypingExtension.swift in Sources */, diff --git a/Nynja/ChatState.swift b/Nynja/ChatState.swift index 896c9fbfb..3b2ec87fc 100644 --- a/Nynja/ChatState.swift +++ b/Nynja/ChatState.swift @@ -19,18 +19,8 @@ final class ChatState { case room(ChatIdentifier) } - private final class ChatStateObserver { - let object: WeakRef - let handler: Handler - - init(object: AnyObject, handler: Handler) { - self.object = WeakRef(value: object) - self.handler = handler - } - } - - private var observers: [ChatStateObserver] = [] - private var totalCountObservers: [ChatStateObserver] = [] + private var observers: [AnyWeakSubscriber] = [] + private var totalCountObservers: [AnyWeakSubscriber] = [] private var contacts: [ChatIdentifier: Int64] = [:] private var contactsCount: Int64 { @@ -88,12 +78,12 @@ final class ChatState { } func observeUnreadCount(_ object: AnyObject, handler: @escaping ChatHandler) { - let subscriber = ChatStateObserver(object: object, handler: handler) + let subscriber = AnyWeakSubscriber(object: object, handler: handler) observers.append(subscriber) } func observeUnreadCount(_ object: AnyObject, in chat: Chat, handler: @escaping ChatHandler) { - let subscriber = ChatStateObserver(object: object, handler: handler) + let subscriber = AnyWeakSubscriber(object: object, handler: handler) observers.append(subscriber) // Always return the current value on registering observer. @@ -109,7 +99,7 @@ final class ChatState { } func observeTotalUnreadCount(_ object: AnyObject, handler: @escaping TotalHandler) { - let subscriber = ChatStateObserver(object: object, handler: handler) + let subscriber = AnyWeakSubscriber(object: object, handler: handler) totalCountObservers.append(subscriber) handler(self.totalUnreadCount) diff --git a/Nynja/Library/UI/WheelContainer/WheelContainer.swift b/Nynja/Library/UI/WheelContainer/WheelContainer.swift index 02b81b1ef..fec51e0bd 100644 --- a/Nynja/Library/UI/WheelContainer/WheelContainer.swift +++ b/Nynja/Library/UI/WheelContainer/WheelContainer.swift @@ -15,7 +15,7 @@ private typealias AnimationCompletion = () -> Void /// It uses two type of index path /// 1. Full index path: , where size of index path is equal to number of wheels in container /// 2. Simple index path: , where level - is an index of wheel and item is and index of item view -class WheelContainer: UIView { +class WheelContainer: UIView, UISettingsRespondable { weak var delegate: WheelContainerDelegate? weak var dataSource: WheelContainerDataSource? @@ -70,17 +70,23 @@ class WheelContainer: UIView { convenience init(with configurations: Configurations) { self.init() configure(with: configurations) + registerForUserInterfaceSettingsNotifications() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + deinit { + unregisterForUserInterfaceSettingsNotifications() + } + func configure(with configurations: Configurations) { backgroundColor = UIColor.clear clipsToBounds = true wheels = createWheels(with: configurations) + } override func draw(_ rect: CGRect) { @@ -207,7 +213,7 @@ class WheelContainer: UIView { wheel.configuration = configuration // Rotate wheel, so the 1st item is in the center of visible part - wheel.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi / 4)) + setupTransform(forWheel: wheel) // Set selection handler wheel.selectHandler = { [unowned self] index in @@ -505,6 +511,21 @@ class WheelContainer: UIView { borderView.removeFromSuperview() } + // MARK: UISettingsRespondable + + func userInterfaceSettingsDidChange(_ newSettings: UISettings) { + wheels.forEach { setupTransform(forWheel: $0, with: newSettings) } + } + + private func setupTransform(forWheel wheel: Wheel, with settings: UISettings = .default) { + switch settings.wheelPosition { + case .right: + wheel.transform = CGAffineTransform(rotationAngle: CGFloat(-Double.pi / 4)) + case .left: + wheel.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 4)) + } + } + // MARK: Utils private func wheel(for level: Int) -> Wheel? { return level >= 0 && level < wheels.count ? wheels[level] : nil diff --git a/Nynja/Modules/Main/View/MainViewController.swift b/Nynja/Modules/Main/View/MainViewController.swift index 1a5908e65..63327e3e7 100644 --- a/Nynja/Modules/Main/View/MainViewController.swift +++ b/Nynja/Modules/Main/View/MainViewController.swift @@ -13,7 +13,7 @@ import MobileCoreServices import AssetsLibrary -class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, DefaultInputViewProtocol, RecordViewProtocol, ImageSelectorDelegate, HitTestDelegate, ALTextInputBarDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, CustomImagePickerDelegate { +class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, DefaultInputViewProtocol, RecordViewProtocol, ImageSelectorDelegate, HitTestDelegate, ALTextInputBarDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, CustomImagePickerDelegate, UISettingsRespondable { var presenter: MainPresenterProtocol! @@ -100,17 +100,7 @@ class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, Defau self.view.addSubview(btn) - let centerX = Constraints.nextButton.centerX.adjustedByWidth - - btn.snp.makeConstraints({ (make) in - make.width.height.equalTo(self.smallButtonWidth) - make.centerX.equalTo(self.view.snp.trailing).offset(-centerX) - if #available(iOS 11, *) { - make.centerY.equalTo(self.view.safeAreaLayoutGuide.snp.bottomMargin).offset(-centerX) - } else { - make.centerY.equalTo(self.view.snp.bottom).offset(-centerX) - } - }) + self.setupWheelButton(btn) return btn }() @@ -281,6 +271,10 @@ class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, Defau } + deinit { + unregisterForUserInterfaceSettingsNotifications() + } + func updateWheelGestures(enabled: Bool) { if let oldGestures = nextButton.gestureRecognizers { for i in oldGestures { @@ -304,6 +298,7 @@ class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, Defau // MARK: BaseVC + override func initialize() { super.initialize() @@ -318,8 +313,35 @@ class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, Defau inputBarDelegate = self defaultInputView.isHidden = true recordInputView.isHidden = true + + registerForUserInterfaceSettingsNotifications() + } + + + // MARK - UI Setup + + private func setupWheelButton(_ button: UIButton, with settings: UISettings = .default) { + let centerX = Constraints.nextButton.centerX.adjustedByWidth + + button.snp.remakeConstraints { make in + make.width.height.equalTo(self.smallButtonWidth) + + switch settings.wheelPosition { + case .right: + make.centerX.equalTo(self.view.snp.trailing).offset(-centerX) + case .left: + make.centerX.equalTo(self.view.snp.leading).offset(centerX) + } + if #available(iOS 11, *) { + make.centerY.equalTo(self.view.safeAreaLayoutGuide.snp.bottomMargin).offset(-centerX) + } else { + make.centerY.equalTo(self.view.snp.bottom).offset(-centerX) + } + } } + // MARK: - Keyboard + override func keyboardNotified(endFrame: CGRect) { let centerX = Constraints.nextButton.centerX.adjustedByWidth @@ -861,6 +883,12 @@ class MainViewController: BaseVC, MainViewProtocol, BaseInputViewProtocol, Defau nextButton.isUserInteractionEnabled = true } + // MARK: - UISettingsRespondable + + func userInterfaceSettingsDidChange(_ newSettings: UISettings) { + setupWheelButton(self.nextButton, with: newSettings) + } + //MARK: - Clean Input func cleanTextInput() { self.textInputBar.text = "" diff --git a/Nynja/UISettings/UISettingsRespondable.swift b/Nynja/UISettings/UISettingsRespondable.swift new file mode 100644 index 000000000..7e753a78b --- /dev/null +++ b/Nynja/UISettings/UISettingsRespondable.swift @@ -0,0 +1,28 @@ +// +// UISettingsRespondable.swift +// Nynja +// +// Created by Anton Poltoratskyi on 28.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +protocol UISettingsRespondable: class { + func userInterfaceSettingsDidChange(_ newSettings: UISettings) +} + +extension UISettingsRespondable { + + func registerForUserInterfaceSettingsNotifications() { + UISettingsService.shared.addSubscriber(self) { [weak self] newSettings in + self?.userInterfaceSettingsDidChange(newSettings) + } + } + + func unregisterForUserInterfaceSettingsNotifications() { + UISettingsService.shared.removeSubscriber(self) + } + + func userInterfaceSettingsDidChange(_ newSettings: UISettings) { } +} diff --git a/Nynja/UISettings/UISettingsService.swift b/Nynja/UISettings/UISettingsService.swift index 3f4456a8c..d841cb7c1 100644 --- a/Nynja/UISettings/UISettingsService.swift +++ b/Nynja/UISettings/UISettingsService.swift @@ -8,6 +8,13 @@ import Foundation +struct UISettings { + static let `default` = UISettings(wheelPosition: .default) + fileprivate(set) var wheelPosition: WheelPosition +} + +typealias UISettingsChangeHandler = (UISettings) -> Void + final class UISettingsService { private enum Keys { static let wheelPosition = "wheelPosition" @@ -16,6 +23,12 @@ final class UISettingsService { private let storage = UserDefaults.standard + // MARK: - Settings + + private lazy var settings: UISettings = { + return UISettings(wheelPosition: wheelPosition) + }() + var wheelPosition: WheelPosition { get { guard let position = storage.string(forKey: Keys.wheelPosition) else { return .default } @@ -23,6 +36,31 @@ final class UISettingsService { } set { storage.set(newValue.rawValue, forKey: Keys.wheelPosition) + settings.wheelPosition = newValue + notifySubscribers(with: settings) + } + } + + // MARK: - Subscribers + + private var subscribers: [AnyWeakSubscriber] = [] + + func addSubscriber(_ object: AnyObject, handler: @escaping UISettingsChangeHandler) { + guard !subscribers.contains(where: { $0.object.value === object }) else { + return } + let subscriber = AnyWeakSubscriber(object: object, handler: handler) + subscribers.append(subscriber) + + // notify subscriber with current ui settings. + subscriber.handler(settings) + } + + func removeSubscriber(_ object: AnyObject) { + subscribers = subscribers.filter { $0.object.value != nil && $0.object.value !== object } + } + + func notifySubscribers(with settings: UISettings) { + subscribers.forEach { $0.handler(settings) } } } diff --git a/Nynja/WeakRef.swift b/Nynja/WeakRef.swift index c79f25327..7a5a05299 100644 --- a/Nynja/WeakRef.swift +++ b/Nynja/WeakRef.swift @@ -17,13 +17,12 @@ class WeakRef where T: AnyObject { } } - -//class DBModelRef where T: DBModelProtocol { -// -// private(set) var value: T? -// -// init(value: T?) { -// self.value = value -// } -//} - +class AnyWeakSubscriber { + let object: WeakRef + let handler: Handler + + init(object: AnyObject, handler: Handler) { + self.object = WeakRef(value: object) + self.handler = handler + } +} -- GitLab From cd0221272ee240ce3821f1f8146d837052ee475a Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Wed, 28 Feb 2018 18:17:38 +0200 Subject: [PATCH 18/24] Update datasource and appearance of the wheel when wheel position changed. --- Nynja.xcodeproj/project.pbxproj | 4 + .../Wheel/ItemModels/WheelItemModel.swift | 4 + .../Wheel/ItemViews/WheelItemView.swift | 47 +++- .../Main/View/MainViewControllerNav.swift | 31 ++- .../Manager/WCDataManager.swift | 202 +++++++++++------- Nynja/WCItemsFactoryDecorator.swift | 86 ++++++++ 6 files changed, 284 insertions(+), 90 deletions(-) create mode 100644 Nynja/WCItemsFactoryDecorator.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 378cf24d3..82c9cb9a0 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -746,6 +746,7 @@ 850833DB2037171600587EEF /* FileExtensionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850833DA2037171600587EEF /* FileExtensionView.swift */; }; 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; 850A0C6520469AED004F79AD /* UISettingsRespondable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */; }; + 850A0C672046B65D004F79AD /* WCItemsFactoryDecorator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A0C662046B65D004F79AD /* WCItemsFactoryDecorator.swift */; }; 850A2BB0203584B000D68FDF /* SearchActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A2BAF203584B000D68FDF /* SearchActionsView.swift */; }; 850A2BB22035AE5E00D68FDF /* ForwardCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850A2BB12035AE5E00D68FDF /* ForwardCellViewModel.swift */; }; 850AC31C203EBF3000EF0774 /* StorageService+UnreadCounters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850AC31B203EBF3000EF0774 /* StorageService+UnreadCounters.swift */; }; @@ -1736,6 +1737,7 @@ 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPosition.swift; sourceTree = ""; }; 850833DA2037171600587EEF /* FileExtensionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileExtensionView.swift; sourceTree = ""; }; 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISettingsRespondable.swift; sourceTree = ""; }; + 850A0C662046B65D004F79AD /* WCItemsFactoryDecorator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WCItemsFactoryDecorator.swift; sourceTree = ""; }; 850A2BAF203584B000D68FDF /* SearchActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchActionsView.swift; sourceTree = ""; }; 850A2BB12035AE5E00D68FDF /* ForwardCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardCellViewModel.swift; sourceTree = ""; }; 850AC31B203EBF3000EF0774 /* StorageService+UnreadCounters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+UnreadCounters.swift"; sourceTree = ""; }; @@ -3731,6 +3733,7 @@ children = ( 4B06D30320287060003B275B /* WCDataManager.swift */, 4B06D30420287060003B275B /* WCDataManagerProtocol.swift */, + 850A0C662046B65D004F79AD /* WCItemsFactoryDecorator.swift */, ); name = Manager; sourceTree = ""; @@ -7114,6 +7117,7 @@ 26E476591FFEE2D400C06C05 /* Modelka.swift in Sources */, 62BCFA14D06D96AFFE53D8BE /* WebViewPresenter.swift in Sources */, 3AC07E3C1F055B3F00ADBE26 /* DoubleExtensions.swift in Sources */, + 850A0C672046B65D004F79AD /* WCItemsFactoryDecorator.swift in Sources */, 4B736D4920238FA40028F2CB /* ThumbnailGenerator.swift in Sources */, 8EC767DC2007850400655F80 /* GroupImagesCell.swift in Sources */, E75D2CE92004ED84001E6718 /* OponentChatCell.swift in Sources */, diff --git a/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift b/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift index 09da84369..bd4281ff8 100644 --- a/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift +++ b/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift @@ -129,6 +129,9 @@ class WheelItemModel: WheelItemModelDelegate { /// Default: empty array var subitems: ItemModels = [] + var isReversed: Bool = false + + // MARK: - Init init() {} @@ -137,6 +140,7 @@ class WheelItemModel: WheelItemModelDelegate { self.subitems = model.subitems self.isSeparatorVisible = model.isSeparatorVisible self.isSelectable = model.isSelectable + self.isReversed = model.isReversed self.delegate = model.delegate } diff --git a/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift b/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift index 90665210f..20bed2583 100644 --- a/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift +++ b/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift @@ -108,8 +108,15 @@ class WheelItemView: UIView { adjustContentViewMask(contentView.bounds) // Draw separator line + if model?.isSeparatorVisible ?? true { - self.drawSeparator(from: point1, to: point4) + if model?.isReversed ?? false { + let from = CGPoint(x: rect.maxX, y: rect.minY) + let to = CGPoint(x: rect.maxX - (rect.width - CGFloat(widthBottom)) / 2, y: rect.maxY) + self.drawSeparator(from: from, to: to, in: rect) + } else { + self.drawSeparator(from: point1, to: point4, in: rect) + } } // Draw marker @@ -190,9 +197,19 @@ fileprivate extension WheelItemView { markerLayer?.removeFromSuperlayer() // Define points of pin - let point1 = CGPoint(x: rect.minX, y: rect.minY) - let point2 = CGPoint(x: rect.minX + 20, y: rect.minY) - let point3 = CGPoint(x: rect.minX, y: rect.minY + 30) + let point1: CGPoint + let point2: CGPoint + let point3: CGPoint + + if model?.isReversed ?? false { + point1 = CGPoint(x: rect.maxX, y: rect.minY) + point2 = CGPoint(x: rect.maxX - 20, y: rect.minY) + point3 = CGPoint(x: rect.maxX, y: rect.minY + 30) + } else { + point1 = CGPoint(x: rect.minX, y: rect.minY) + point2 = CGPoint(x: rect.minX + 20, y: rect.minY) + point3 = CGPoint(x: rect.minX, y: rect.minY + 30) + } let markerPath = UIBezierPath() markerPath.move(to: point1) @@ -207,7 +224,7 @@ fileprivate extension WheelItemView { layer.addSublayer(markerLayer!) } - func drawSeparator(from: CGPoint, to: CGPoint) { + func drawSeparator(from: CGPoint, to: CGPoint, in rect: CGRect) { separatorLayer?.removeFromSuperlayer() // Calculate distance between two points @@ -225,11 +242,23 @@ fileprivate extension WheelItemView { var point2 = interpolate(point1: from, point2: to, alpha: (delta + separatorOffset.top.adjustedByWidth) / distance) var point3 = interpolate(point1: from, point2: to, alpha: (distance - separatorOffset.bottom.adjustedByWidth) / distance) - let point1 = CGPoint(x: 0, y: point2.y) - let point4 = CGPoint(x: 0, y: point3.y) - point2.x += 1 - point3.x += 1 + let point1: CGPoint + let point4: CGPoint + let offset: CGFloat + + if model?.isReversed ?? false { + point1 = CGPoint(x: rect.maxX, y: point2.y) + point4 = CGPoint(x: rect.maxX, y: point3.y) + offset = 0 + } else { + point1 = CGPoint(x: 0, y: point2.y) + point4 = CGPoint(x: 0, y: point3.y) + offset = 1 + } + + point2.x += offset + point3.x += offset let path = UIBezierPath() path.move(to: point1) diff --git a/Nynja/Modules/Main/View/MainViewControllerNav.swift b/Nynja/Modules/Main/View/MainViewControllerNav.swift index 0dc589d22..58a549c47 100644 --- a/Nynja/Modules/Main/View/MainViewControllerNav.swift +++ b/Nynja/Modules/Main/View/MainViewControllerNav.swift @@ -30,24 +30,38 @@ extension MainViewController: NavigateProtocol { var newPosition : Int! var items = wheelContainerDS.items[level - 1] - if items[position].isSelected { - subitems = items[position].subitems + let selectedItem = items[position] + + if selectedItem.isSelected { + items.remove(at: position) + subitems = selectedItem.subitems subitems.forEach { $0.state = .normal } items.insert(contentsOf: subitems, at: position) - newPosition = position+subitems.count + if selectedItem.isReversed { + newPosition = position + } else { + newPosition = position + subitems.count + } + items.insert(selectedItem, at: newPosition) + } else { - subitems = items[position].subitems - items.removeSubrange((position-subitems.count).. 1 { + _dsItems = [_dsItems[0]] + } + } else { + if _dsItems.count == 1 { + _dsItems.append(secondLevelItems) + } + } + + wheelContainerDS?.items = _dsItems + } + + if var _prevItems = prevItems, !_prevItems.isEmpty { + _prevItems.first?[index].state = state + + if secondLevelItems.isEmpty { + if _prevItems.count > 1 { + _prevItems = [_prevItems[0]] + } + } else { + if _prevItems.count == 1 { + _prevItems.append(secondLevelItems) + } + } + } + + items.first?[index].state = state + if secondLevelItems.isEmpty { + if items.count > 1 { + items = [items[0]] + } + } else { + if items.count == 1 { + items.append(secondLevelItems) + } + } } - private func invalidateRestoreTimer() { - restoreTimer?.invalidate() - prevItems = nil - restoreTimer = nil - } + + // MARK: - Items func getSubItems(index: Int, of level: Int = 0) -> ItemModels? { guard level < items.count else { return nil } @@ -104,22 +190,38 @@ class WCDataManager: WCDataManagerProtocol { case .actions: return items[1] case .chats: - if _factory is P2pChatsItemsFactory { - return _factory?.secondLevelItems + if _factory.originalFactory is P2pChatsItemsFactory { + return _factory.secondLevelItems } - return P2pChatsItemsFactory().secondLevelItems.normal() + return WCItemsFactoryDecorator(self._factory) + .with(factory: P2pChatsItemsFactory()) + .secondLevelItems + .normal() + case .groups: - if _factory is GroupChatsItemsFactory { - return _factory?.secondLevelItems + if _factory.originalFactory is GroupChatsItemsFactory { + return _factory.secondLevelItems } - return GroupChatsItemsFactory().secondLevelItems.normal() + return WCItemsFactoryDecorator(self._factory) + .with(factory: GroupChatsItemsFactory()) + .secondLevelItems + .normal() + case .contacts: - if _factory is ContactsItemsFactory { - return _factory?.secondLevelItems + if _factory.originalFactory is ContactsItemsFactory { + return _factory.secondLevelItems } - return ContactsItemsFactory().secondLevelItems.normal() + return WCItemsFactoryDecorator(self._factory) + .with(factory: ContactsItemsFactory()) + .secondLevelItems + .normal() + case .options: - return OptionsItemsFactory().secondLevelItems + return WCItemsFactoryDecorator(self._factory) + .with(factory: OptionsItemsFactory()) + .secondLevelItems + .normal() + default: break } @@ -138,7 +240,7 @@ class WCDataManager: WCDataManagerProtocol { } - guard let factoryItem = _factory?[index]?.first(where: { + guard let factoryItem = _factory[index]?.first(where: { guard let factoryItem = $0 as? ImageWheelItemModel else { return false } @@ -149,50 +251,4 @@ class WCDataManager: WCDataManagerProtocol { return factoryItem.state == .highlighted ? .highlighted : .normal } - - func updateActionsState(_ isDisabled: Bool) { - let index: Int = 5 - let state: WheelItemState = isDisabled ? .disabled : .selected - let secondLevelItems : ItemModels = isDisabled ? [] : (_factory?.secondLevelItems ?? []) - if var _dsItems = wheelContainerDS?.items, !_dsItems.isEmpty { - _dsItems.first?[index].state = state - - if secondLevelItems.isEmpty { - if _dsItems.count > 1 { - _dsItems = [_dsItems[0]] - } - } else { - if _dsItems.count == 1 { - _dsItems.append(secondLevelItems) - } - } - - wheelContainerDS?.items = _dsItems - } - - if var _prevItems = prevItems, !_prevItems.isEmpty { - _prevItems.first?[index].state = state - - if secondLevelItems.isEmpty { - if _prevItems.count > 1 { - _prevItems = [_prevItems[0]] - } - } else { - if _prevItems.count == 1 { - _prevItems.append(secondLevelItems) - } - } - } - - items.first?[index].state = state - if secondLevelItems.isEmpty { - if items.count > 1 { - items = [items[0]] - } - } else { - if items.count == 1 { - items.append(secondLevelItems) - } - } - } } diff --git a/Nynja/WCItemsFactoryDecorator.swift b/Nynja/WCItemsFactoryDecorator.swift new file mode 100644 index 000000000..4e61799c0 --- /dev/null +++ b/Nynja/WCItemsFactoryDecorator.swift @@ -0,0 +1,86 @@ +// +// WCItemsFactoryDecorator.swift +// Nynja +// +// Created by Anton Poltoratskyi on 28.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +class WCItemsFactoryDecorator: WCItemsFactory { + + var originalFactory: WCItemsFactory? + + var isReversed: Bool + + private var map: ([WheelItemModel]) -> [WheelItemModel] { + if isReversed { + return { items in + items.map { + let clone = $0.cloned() + clone.isReversed = true + clone.subitems.reverse() + clone.subitems.forEach { $0.isReversed = true } + return clone + }.reversed() + } + } else { + return { items in items } + } + } + + + // MARK: - WCItemsFactory + + var navigateDelegate: NavigateProtocol? { + return originalFactory?.navigateDelegate + } + + var initionalScrollStates: IndexPath? { + guard isReversed else { + return originalFactory?.initionalScrollStates + } + guard let initialStates = originalFactory?.initionalScrollStates else { + return nil + } + + let levels = [firstLevelItems, secondLevelItems] + let indices: [Int] = zip(initialStates, levels).map { (scrollIndex, level) in + level.count - scrollIndex - 1 + } + return IndexPath(indexes: indices) + } + + var items: [ItemModels] { + return (originalFactory?.items ?? []).map { itemModels -> ItemModels in + return map(itemModels) + } + } + + var firstLevelItems: ItemModels { + return map(originalFactory?.firstLevelItems ?? []) + } + + var secondLevelItems: ItemModels { + return map(originalFactory?.secondLevelItems ?? []) + } + + + // MARK: - Init + + init(factory: WCItemsFactory? = nil, isReversed: Bool = false) { + self.originalFactory = factory + self.isReversed = isReversed + } + + init(_ decorator: WCItemsFactoryDecorator) { + self.originalFactory = decorator.originalFactory + self.isReversed = decorator.isReversed + } + + func with(factory: WCItemsFactory) -> Self { + self.originalFactory = factory + return self + } +} -- GitLab From 07609c1778c3adb837d0944d4cafaa0e6a92379c Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 1 Mar 2018 11:48:07 +0200 Subject: [PATCH 19/24] Fixed appearance of wheel item separators. --- .../Wheel/ItemModels/WheelItemModel.swift | 1 + .../WheelContainer/Wheel/ItemViews/WheelItemView.swift | 1 + Nynja/Library/UI/WheelContainer/iCarousel/iCarousel.m | 1 + .../Main/View/MainWheelContainerDataSource.swift | 10 ++++++++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift b/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift index bd4281ff8..16a245299 100644 --- a/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift +++ b/Nynja/Library/UI/WheelContainer/Wheel/ItemModels/WheelItemModel.swift @@ -129,6 +129,7 @@ class WheelItemModel: WheelItemModelDelegate { /// Default: empty array var subitems: ItemModels = [] + /// true - if left wheel position is currently selected, otherwise - false. var isReversed: Bool = false diff --git a/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift b/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift index 20bed2583..5414d2618 100644 --- a/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift +++ b/Nynja/Library/UI/WheelContainer/Wheel/ItemViews/WheelItemView.swift @@ -111,6 +111,7 @@ class WheelItemView: UIView { if model?.isSeparatorVisible ?? true { if model?.isReversed ?? false { + // Draw separator on right side of the view. let from = CGPoint(x: rect.maxX, y: rect.minY) let to = CGPoint(x: rect.maxX - (rect.width - CGFloat(widthBottom)) / 2, y: rect.maxY) self.drawSeparator(from: from, to: to, in: rect) diff --git a/Nynja/Library/UI/WheelContainer/iCarousel/iCarousel.m b/Nynja/Library/UI/WheelContainer/iCarousel/iCarousel.m index a10cd87ae..998c64b09 100644 --- a/Nynja/Library/UI/WheelContainer/iCarousel/iCarousel.m +++ b/Nynja/Library/UI/WheelContainer/iCarousel/iCarousel.m @@ -843,6 +843,7 @@ NSComparisonResult compareViewDepth(UIView *view1, UIView *view2, iCarousel *sel view.frame = frame; [containerView addSubview:view]; containerView.layer.opacity = 0; + containerView.layer.zPosition = view.layer.zPosition; return containerView; } diff --git a/Nynja/Modules/Main/View/MainWheelContainerDataSource.swift b/Nynja/Modules/Main/View/MainWheelContainerDataSource.swift index dc1e81b11..186f24790 100644 --- a/Nynja/Modules/Main/View/MainWheelContainerDataSource.swift +++ b/Nynja/Modules/Main/View/MainWheelContainerDataSource.swift @@ -72,16 +72,22 @@ class MainWheelContainerDataSource: WheelContainerDataSource { func wheelContainer(_ container: WheelContainer, itemViewAt indexPath: IndexPath) -> WheelItemView {// Get level let level = indexPath.level + let levelItems = items[level] // Get model - let itemModel = items[level][indexPath.item] - // Crete Frame + let itemIndex = indexPath.item + let itemModel = levelItems[itemIndex] + + // Create Frame let frame = CGRect(origin: CGPoint.zero, size: configurations[level].sectorSize) // Get item view and update it with model let itemView = itemViewFactory.itemViewForModel(itemModel, frame: frame) itemView.update(model: itemModel) + // Update zPosition order when wheel is transformed for left position. + itemView.layer.zPosition = itemModel.isReversed ? CGFloat(levelItems.count - itemIndex) : CGFloat(itemIndex) + return itemView } -- GitLab From 6cd1a28b2a03945a8faa5567625de0a351d1af39 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 1 Mar 2018 12:00:53 +0200 Subject: [PATCH 20/24] Fixed preselected index of subitems of expanded wheel item. --- Nynja/Modules/Main/View/MainViewControllerNav.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Nynja/Modules/Main/View/MainViewControllerNav.swift b/Nynja/Modules/Main/View/MainViewControllerNav.swift index 58a549c47..dfd9c24db 100644 --- a/Nynja/Modules/Main/View/MainViewControllerNav.swift +++ b/Nynja/Modules/Main/View/MainViewControllerNav.swift @@ -26,12 +26,17 @@ extension MainViewController: NavigateProtocol { return } - var subitems : ItemModels! - var newPosition : Int! + var subitems: ItemModels + let newPosition: Int var items = wheelContainerDS.items[level - 1] let selectedItem = items[position] + var indexOfItem = indexOfItem + if let index = indexOfItem, selectedItem.isReversed { + indexOfItem = selectedItem.subitems.count - index - 1 + } + if selectedItem.isSelected { items.remove(at: position) -- GitLab From 88507a3e1faead435cac72bad390e66a8654c4ce Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 1 Mar 2018 14:04:20 +0200 Subject: [PATCH 21/24] Add base empty skeleton for ThemePicker module. Move modules (ThemePicker, BuildNumber, WheelPositionPicker) to common 'Settings' folder. --- Nynja.xcodeproj/project.pbxproj | 72 ++++++++++++++++++- .../BuildNumber/BuildNumberProtocols.swift | 0 .../Interactor/BuildNumberInteractor.swift | 0 .../Presenter/BuildNumberPresenter.swift | 0 .../View/BuildNumberViewController.swift | 0 .../BuildNumberViewControllerLayout.swift | 0 .../WireFrame/BuildNumberWireFrame.swift | 0 .../Interactor/ThemePickerInteractor.swift | 15 ++++ .../Presenter/ThemePickerPresenter.swift | 24 +++++++ .../ThemePicker/ThemePickerProtocols.swift | 57 +++++++++++++++ .../View/ThemePickerViewController.swift | 34 +++++++++ .../WireFrame/ThemePickerWireFrame.swift | 32 +++++++++ .../WheelPositionPickerInteractor.swift | 0 .../WheelPositionPickerPresenter.swift | 0 .../WheelPositionCellModel.swift | 0 .../WheelPositionCollectionViewCell.swift | 0 .../WheelPositionPickerViewController.swift | 0 ...elPositionPickerViewControllerLayout.swift | 0 .../WheelPositionPickerProtocols.swift | 0 .../WheelPositionPickerWireFrame.swift | 0 20 files changed, 232 insertions(+), 2 deletions(-) rename Nynja/Modules/{ => Settings}/BuildNumber/BuildNumberProtocols.swift (100%) rename Nynja/Modules/{ => Settings}/BuildNumber/Interactor/BuildNumberInteractor.swift (100%) rename Nynja/Modules/{ => Settings}/BuildNumber/Presenter/BuildNumberPresenter.swift (100%) rename Nynja/Modules/{ => Settings}/BuildNumber/View/BuildNumberViewController.swift (100%) rename Nynja/Modules/{ => Settings}/BuildNumber/View/BuildNumberViewControllerLayout.swift (100%) rename Nynja/Modules/{ => Settings}/BuildNumber/WireFrame/BuildNumberWireFrame.swift (100%) create mode 100644 Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift create mode 100644 Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift create mode 100644 Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift create mode 100644 Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift create mode 100644 Nynja/Modules/Settings/ThemePicker/WireFrame/ThemePickerWireFrame.swift rename Nynja/Modules/{ => Settings}/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/WheelPositionPickerProtocols.swift (100%) rename Nynja/Modules/{ => Settings}/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift (100%) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 7ef262303..76ad1f0f2 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -799,6 +799,11 @@ 8586CACB203338F6009F2A75 /* ForwardTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CACA203338F6009F2A75 /* ForwardTarget.swift */; }; 858A72E5A4AE48CE24AFF649 /* MainInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70CEB31C47B0FEB0040FD0DA /* MainInteractor.swift */; }; 858BC123203320BB0022EB25 /* ForwardSelectorDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */; }; + 859B862C204820DC003272B2 /* ThemePickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */; }; + 859B862D204820DC003272B2 /* ThemePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8628204820DC003272B2 /* ThemePickerViewController.swift */; }; + 859B862E204820DC003272B2 /* ThemePickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */; }; + 859B862F204820DC003272B2 /* ThemePickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B862A204820DC003272B2 /* ThemePickerInteractor.swift */; }; + 859B8630204820DC003272B2 /* ThemePickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B862B204820DC003272B2 /* ThemePickerWireFrame.swift */; }; 859F9B4C2035CB1E009D017A /* ForwardContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859F9B4B2035CB1E009D017A /* ForwardContent.swift */; }; 85AC785B2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AC785A2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift */; }; 85B750A120334A2B00AD6013 /* ForwardTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B750A020334A2B00AD6013 /* ForwardTableViewCell.swift */; }; @@ -1786,6 +1791,11 @@ 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; 8586CACA203338F6009F2A75 /* ForwardTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardTarget.swift; sourceTree = ""; }; 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardSelectorDataSource.swift; sourceTree = ""; }; + 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerPresenter.swift; sourceTree = ""; }; + 859B8628204820DC003272B2 /* ThemePickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerViewController.swift; sourceTree = ""; }; + 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerProtocols.swift; sourceTree = ""; }; + 859B862A204820DC003272B2 /* ThemePickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerInteractor.swift; sourceTree = ""; }; + 859B862B204820DC003272B2 /* ThemePickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerWireFrame.swift; sourceTree = ""; }; 859F9B4B2035CB1E009D017A /* ForwardContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardContent.swift; sourceTree = ""; }; 85AC785A2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContextMenuConfiguration+Favorites.swift"; sourceTree = ""; }; 85B750A020334A2B00AD6013 /* ForwardTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardTableViewCell.swift; sourceTree = ""; }; @@ -3689,12 +3699,11 @@ 91732B7DCE35ABC02702095D /* GroupStorage */, 115A968821FB24FA3C58A6D5 /* SelectCountry */, 80CA53AB5B009455E0ECDC30 /* AddContactByUsername */, - 85788C4F20444EF1003600C9 /* WheelPositionPicker */, 4188F5659F19255180FB387D /* MapSearch */, E61C394BD0E94E3DCF853D4F /* ScheduleMessage */, 975DB2471671357A9EEBF65B /* TimeZoneSelector */, E1BF3560A2E8EE8B02A9A9FB /* DateTimePicker */, - 85788C3A20442263003600C9 /* BuildNumber */, + 859B86352048224B003272B2 /* Settings */, ); path = Modules; sourceTree = ""; @@ -4318,6 +4327,18 @@ path = UISettings; sourceTree = ""; }; + 8509547D20481AF900905B46 /* ThemePicker */ = { + isa = PBXGroup; + children = ( + 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */, + 859B8632204820EC003272B2 /* View */, + 859B8631204820E5003272B2 /* Presenter */, + 859B8633204820F3003272B2 /* Interactor */, + 859B8634204820FA003272B2 /* WireFrame */, + ); + path = ThemePicker; + sourceTree = ""; + }; 850FC5EA2032F1D900832D87 /* ForwardSelector */ = { isa = PBXGroup; children = ( @@ -4556,6 +4577,48 @@ path = BottomActions; sourceTree = ""; }; + 859B8631204820E5003272B2 /* Presenter */ = { + isa = PBXGroup; + children = ( + 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */, + ); + path = Presenter; + sourceTree = ""; + }; + 859B8632204820EC003272B2 /* View */ = { + isa = PBXGroup; + children = ( + 859B8628204820DC003272B2 /* ThemePickerViewController.swift */, + ); + path = View; + sourceTree = ""; + }; + 859B8633204820F3003272B2 /* Interactor */ = { + isa = PBXGroup; + children = ( + 859B862A204820DC003272B2 /* ThemePickerInteractor.swift */, + ); + path = Interactor; + sourceTree = ""; + }; + 859B8634204820FA003272B2 /* WireFrame */ = { + isa = PBXGroup; + children = ( + 859B862B204820DC003272B2 /* ThemePickerWireFrame.swift */, + ); + path = WireFrame; + sourceTree = ""; + }; + 859B86352048224B003272B2 /* Settings */ = { + isa = PBXGroup; + children = ( + 85788C3A20442263003600C9 /* BuildNumber */, + 8509547D20481AF900905B46 /* ThemePicker */, + 85788C4F20444EF1003600C9 /* WheelPositionPicker */, + ); + path = Settings; + sourceTree = ""; + }; 859F9B4A2035C555009D017A /* Cell */ = { isa = PBXGroup; children = ( @@ -6854,6 +6917,7 @@ 00102F3C202C8B6600A877A9 /* NynjaSegmentedControl.swift in Sources */, E76D132F1FA35D2900B07F0E /* ProfilePlaceholderCellLayout.swift in Sources */, 8E47DBEB200EB05900E612B0 /* MapViewControllerConstants.swift in Sources */, + 859B862C204820DC003272B2 /* ThemePickerPresenter.swift in Sources */, 2686D3201FC3E39C0079CB75 /* ContentNavigationVC.swift in Sources */, 0008E9092031E974003E316E /* Job_Spec.swift in Sources */, 001F0CF5202C38FA006B4304 /* TimeZoneCell.swift in Sources */, @@ -7284,6 +7348,7 @@ E7B32C0E2007C44E00371A67 /* MessageConfiguration.swift in Sources */, 85788C57204450AE003600C9 /* WheelPositionPickerViewController.swift in Sources */, 85AC785B2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift in Sources */, + 859B862D204820DC003272B2 /* ThemePickerViewController.swift in Sources */, 850AC31C203EBF3000EF0774 /* StorageService+UnreadCounters.swift in Sources */, 264668F21FB4683C0040FB32 /* MessageExtension.swift in Sources */, 26035BC31F9A741C00003850 /* push_Spec.swift in Sources */, @@ -7349,6 +7414,7 @@ 26035BA41F9A740F00003850 /* TypeSpec.swift in Sources */, 8E6C4BDE1FF40B97009C8374 /* GroupFilesCell.swift in Sources */, 6CED2C4CE125011A3A731D62 /* AddContactViaPhoneInteractor.swift in Sources */, + 859B862F204820DC003272B2 /* ThemePickerInteractor.swift in Sources */, 263A60AC1FB4F8F7006F9D52 /* ParticipantsDataSource.swift in Sources */, E7291E4E201B3CC100FB56B7 /* PositionType.swift in Sources */, 2AC52C9C5598DB3C4D3D9364 /* AddContactViaPhoneWireframe.swift in Sources */, @@ -7537,6 +7603,7 @@ DDDA12EC6C743547BC91276F /* ImagePreviewWireframe.swift in Sources */, 26035BB21F9A741C00003850 /* Friend_Spec.swift in Sources */, 26035B8B1F9A740A00003850 /* iterator.swift in Sources */, + 859B8630204820DC003272B2 /* ThemePickerWireFrame.swift in Sources */, 265C5A001FE251160037CB79 /* MyTextField.swift in Sources */, 263D66301FE8D20100A509F8 /* TypingExtension+BERT.swift in Sources */, C90EE13E20246E2700FDB873 /* SelctCountryDelegate.swift in Sources */, @@ -7617,6 +7684,7 @@ 2683F75C203F35BE0003181A /* LongPressWithUpSwipeGestureRecognizer.swift in Sources */, 04EDA50C90C7EBD46AA1FCB2 /* AddParticipantsViewController.swift in Sources */, 26FF00AE1FCCCA21002170B1 /* CustomNavigationVC.swift in Sources */, + 859B862E204820DC003272B2 /* ThemePickerProtocols.swift in Sources */, 1D1D5634D125333796D14E10 /* AddParticipantsPresenter.swift in Sources */, 26C1A3F32031EED30009F7F0 /* OtherUserHeaderView.swift in Sources */, 00772A49F4B53A5EB669E8F2 /* AddParticipantsInteractor.swift in Sources */, diff --git a/Nynja/Modules/BuildNumber/BuildNumberProtocols.swift b/Nynja/Modules/Settings/BuildNumber/BuildNumberProtocols.swift similarity index 100% rename from Nynja/Modules/BuildNumber/BuildNumberProtocols.swift rename to Nynja/Modules/Settings/BuildNumber/BuildNumberProtocols.swift diff --git a/Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift b/Nynja/Modules/Settings/BuildNumber/Interactor/BuildNumberInteractor.swift similarity index 100% rename from Nynja/Modules/BuildNumber/Interactor/BuildNumberInteractor.swift rename to Nynja/Modules/Settings/BuildNumber/Interactor/BuildNumberInteractor.swift diff --git a/Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift b/Nynja/Modules/Settings/BuildNumber/Presenter/BuildNumberPresenter.swift similarity index 100% rename from Nynja/Modules/BuildNumber/Presenter/BuildNumberPresenter.swift rename to Nynja/Modules/Settings/BuildNumber/Presenter/BuildNumberPresenter.swift diff --git a/Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift b/Nynja/Modules/Settings/BuildNumber/View/BuildNumberViewController.swift similarity index 100% rename from Nynja/Modules/BuildNumber/View/BuildNumberViewController.swift rename to Nynja/Modules/Settings/BuildNumber/View/BuildNumberViewController.swift diff --git a/Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift b/Nynja/Modules/Settings/BuildNumber/View/BuildNumberViewControllerLayout.swift similarity index 100% rename from Nynja/Modules/BuildNumber/View/BuildNumberViewControllerLayout.swift rename to Nynja/Modules/Settings/BuildNumber/View/BuildNumberViewControllerLayout.swift diff --git a/Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift b/Nynja/Modules/Settings/BuildNumber/WireFrame/BuildNumberWireFrame.swift similarity index 100% rename from Nynja/Modules/BuildNumber/WireFrame/BuildNumberWireFrame.swift rename to Nynja/Modules/Settings/BuildNumber/WireFrame/BuildNumberWireFrame.swift diff --git a/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift b/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift new file mode 100644 index 000000000..bf444f946 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift @@ -0,0 +1,15 @@ +// +// ThemePickerInteractor.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class ThemePickerInteractor: ThemePickerInteractorInputProtocol { + + weak var presenter: ThemePickerInteractorOutputProtocol! +} + diff --git a/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift b/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift new file mode 100644 index 000000000..48b3c86d3 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift @@ -0,0 +1,24 @@ +// +// ThemePickerPresenter.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +final class ThemePickerPresenter: BasePresenter, ThemePickerPresenterProtocol, ThemePickerInteractorOutputProtocol { + + override var itemsFactory: WCItemsFactory? { + return nil + } + + weak var view: ThemePickerViewProtocol! + var interactor: ThemePickerInteractorInputProtocol! + var wireFrame: ThemePickerWireFrameProtocol! + + func showed() { + + } +} diff --git a/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift b/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift new file mode 100644 index 000000000..a92faff97 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift @@ -0,0 +1,57 @@ +// +// ThemePickerProtocols.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit + +protocol ThemePickerWireFrameProtocol: class { + + func presentThemePicker(navigation: UINavigationController) + + /** + * Add here your methods for communication PRESENTER -> WIREFRAME + */ +} + +protocol ThemePickerViewProtocol: class { + + var presenter: ThemePickerPresenterProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> VIEW + */ + +} + +protocol ThemePickerPresenterProtocol: class, BasePresenterProtocol { + + var view: ThemePickerViewProtocol! { get set } + var interactor: ThemePickerInteractorInputProtocol! { get set } + var wireFrame: ThemePickerWireFrameProtocol! { get set } + + /** + * Add here your methods for communication VIEW -> PRESENTER + */ + + func showed() +} + +protocol ThemePickerInteractorOutputProtocol: class { + + /** + * Add here your methods for communication INTERACTOR -> PRESENTER + */ +} + +protocol ThemePickerInteractorInputProtocol: class { + + var presenter: ThemePickerInteractorOutputProtocol! { get set } + + /** + * Add here your methods for communication PRESENTER -> INTERACTOR + */ +} diff --git a/Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift b/Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift new file mode 100644 index 000000000..4a6ad87f7 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift @@ -0,0 +1,34 @@ +// +// ThemePickerViewController.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +final class ThemePickerViewController: BaseVC, ThemePickerViewProtocol { + + var presenter: ThemePickerPresenterProtocol! { + didSet { + _presenter = presenter + } + } + + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + presenter.showed() + } + + + // MARK: - UI Setup + + private func setupUI() { + } +} diff --git a/Nynja/Modules/Settings/ThemePicker/WireFrame/ThemePickerWireFrame.swift b/Nynja/Modules/Settings/ThemePicker/WireFrame/ThemePickerWireFrame.swift new file mode 100644 index 000000000..a6c3eb765 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/WireFrame/ThemePickerWireFrame.swift @@ -0,0 +1,32 @@ +// +// ThemePickerWireFrame.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit + +final class ThemePickerWireFrame: ThemePickerWireFrameProtocol { + + weak var navigation: UINavigationController? + + func presentThemePicker(navigation: UINavigationController) { + self.navigation = navigation + + let view = ThemePickerViewController() + let presenter = ThemePickerPresenter() + let interactor = ThemePickerInteractor() + + // Connecting + view.presenter = presenter + presenter.view = view + presenter.wireFrame = self + presenter.interactor = interactor + interactor.presenter = presenter + + navigation.pushViewController(view, animated: true) + } + +} diff --git a/Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift b/Nynja/Modules/Settings/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift rename to Nynja/Modules/Settings/WheelPositionPicker/Interactor/WheelPositionPickerInteractor.swift diff --git a/Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift rename to Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift rename to Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift diff --git a/Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift rename to Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift rename to Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift diff --git a/Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift rename to Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift diff --git a/Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/WheelPositionPickerProtocols.swift rename to Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift diff --git a/Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift b/Nynja/Modules/Settings/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift similarity index 100% rename from Nynja/Modules/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift rename to Nynja/Modules/Settings/WheelPositionPicker/WireFrame/WheelPositionPickerWireFrame.swift -- GitLab From 69e6c18f141eefee26f0255900a5bc6d4334a47d Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 1 Mar 2018 19:26:47 +0200 Subject: [PATCH 22/24] Move reusable logic to CarouselPickerViewController. --- Nynja.xcodeproj/project.pbxproj | 52 ++++- .../CarouselPickerProtocols.swift | 17 ++ .../CarouselPickerCellModel.swift | 19 ++ .../CarouselPickerCollectionViewCell.swift} | 6 +- .../CarouselPickerViewController.swift | 205 ++++++++++++++++++ .../CarouselPickerViewControllerLayout.swift} | 8 +- .../WheelPositionPickerPresenter.swift | 13 +- .../WheelPositionCellModel.swift | 14 +- .../WheelPositionPickerViewController.swift | 180 +-------------- .../WheelPositionPickerProtocols.swift | 6 +- 10 files changed, 317 insertions(+), 203 deletions(-) create mode 100644 Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift create mode 100644 Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCellModel.swift rename Nynja/Modules/Settings/{WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift => CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift} (93%) create mode 100644 Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift rename Nynja/Modules/Settings/{WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift => CarouselPicker/ViewController/CarouselPickerViewControllerLayout.swift} (84%) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 76ad1f0f2..13e2ab15f 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -791,19 +791,22 @@ 85788C59204450FE003600C9 /* WheelPositionPickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */; }; 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */; }; 85788C5D20445166003600C9 /* WheelPositionPickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */; }; - 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */; }; - 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */; }; + 85788C6420445BA7003600C9 /* CarouselPickerCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85788C6320445BA7003600C9 /* CarouselPickerCollectionViewCell.swift */; }; 857A06612035E3360097C49B /* ForwardAvatarCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */; }; 85801C3F20342A2F00CC364C /* ActionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85801C3E20342A2F00CC364C /* ActionsView.swift */; }; 8586CAC5203335C7009F2A75 /* ForwardAvatarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */; }; 8586CACB203338F6009F2A75 /* ForwardTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586CACA203338F6009F2A75 /* ForwardTarget.swift */; }; 858A72E5A4AE48CE24AFF649 /* MainInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70CEB31C47B0FEB0040FD0DA /* MainInteractor.swift */; }; 858BC123203320BB0022EB25 /* ForwardSelectorDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */; }; + 8595E0D9204863BF00178171 /* CarouselPickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8595E0D8204863BF00178171 /* CarouselPickerProtocols.swift */; }; + 8595E0DC204863DB00178171 /* CarouselPickerCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8595E0DB204863DB00178171 /* CarouselPickerCellModel.swift */; }; 859B862C204820DC003272B2 /* ThemePickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */; }; 859B862D204820DC003272B2 /* ThemePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8628204820DC003272B2 /* ThemePickerViewController.swift */; }; 859B862E204820DC003272B2 /* ThemePickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */; }; 859B862F204820DC003272B2 /* ThemePickerInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B862A204820DC003272B2 /* ThemePickerInteractor.swift */; }; 859B8630204820DC003272B2 /* ThemePickerWireFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B862B204820DC003272B2 /* ThemePickerWireFrame.swift */; }; + 859B863720485F01003272B2 /* CarouselPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B863620485F01003272B2 /* CarouselPickerViewController.swift */; }; + 859B863920486068003272B2 /* CarouselPickerViewControllerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B863820486068003272B2 /* CarouselPickerViewControllerLayout.swift */; }; 859F9B4C2035CB1E009D017A /* ForwardContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859F9B4B2035CB1E009D017A /* ForwardContent.swift */; }; 85AC785B2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AC785A2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift */; }; 85B750A120334A2B00AD6013 /* ForwardTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B750A020334A2B00AD6013 /* ForwardTableViewCell.swift */; }; @@ -1784,18 +1787,21 @@ 85788C58204450FE003600C9 /* WheelPositionPickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerPresenter.swift; sourceTree = ""; }; 85788C5A20445106003600C9 /* WheelPositionPickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerInteractor.swift; sourceTree = ""; }; 85788C5C20445166003600C9 /* WheelPositionPickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerWireFrame.swift; sourceTree = ""; }; - 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionPickerViewControllerLayout.swift; sourceTree = ""; }; - 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCollectionViewCell.swift; sourceTree = ""; }; + 85788C6320445BA7003600C9 /* CarouselPickerCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerCollectionViewCell.swift; sourceTree = ""; }; 857A06602035E3360097C49B /* ForwardAvatarCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarCollectionViewCell.swift; sourceTree = ""; }; 85801C3E20342A2F00CC364C /* ActionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsView.swift; sourceTree = ""; }; 8586CAC4203335C7009F2A75 /* ForwardAvatarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardAvatarViewModel.swift; sourceTree = ""; }; 8586CACA203338F6009F2A75 /* ForwardTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardTarget.swift; sourceTree = ""; }; 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardSelectorDataSource.swift; sourceTree = ""; }; + 8595E0D8204863BF00178171 /* CarouselPickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerProtocols.swift; sourceTree = ""; }; + 8595E0DB204863DB00178171 /* CarouselPickerCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerCellModel.swift; sourceTree = ""; }; 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerPresenter.swift; sourceTree = ""; }; 859B8628204820DC003272B2 /* ThemePickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerViewController.swift; sourceTree = ""; }; 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerProtocols.swift; sourceTree = ""; }; 859B862A204820DC003272B2 /* ThemePickerInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerInteractor.swift; sourceTree = ""; }; 859B862B204820DC003272B2 /* ThemePickerWireFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerWireFrame.swift; sourceTree = ""; }; + 859B863620485F01003272B2 /* CarouselPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerViewController.swift; sourceTree = ""; }; + 859B863820486068003272B2 /* CarouselPickerViewControllerLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerViewControllerLayout.swift; sourceTree = ""; }; 859F9B4B2035CB1E009D017A /* ForwardContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardContent.swift; sourceTree = ""; }; 85AC785A2031C68C007D8302 /* ContextMenuConfiguration+Favorites.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ContextMenuConfiguration+Favorites.swift"; sourceTree = ""; }; 85B750A020334A2B00AD6013 /* ForwardTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardTableViewCell.swift; sourceTree = ""; }; @@ -4554,7 +4560,6 @@ isa = PBXGroup; children = ( 85788C56204450AE003600C9 /* WheelPositionPickerViewController.swift */, - 85788C5E2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift */, ); path = ViewController; sourceTree = ""; @@ -4563,7 +4568,6 @@ isa = PBXGroup; children = ( 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */, - 85788C6320445BA7003600C9 /* WheelPositionCollectionViewCell.swift */, ); path = CollectionView; sourceTree = ""; @@ -4577,6 +4581,24 @@ path = BottomActions; sourceTree = ""; }; + 8595E0DA204863CF00178171 /* CollectionView */ = { + isa = PBXGroup; + children = ( + 8595E0DB204863DB00178171 /* CarouselPickerCellModel.swift */, + 85788C6320445BA7003600C9 /* CarouselPickerCollectionViewCell.swift */, + ); + path = CollectionView; + sourceTree = ""; + }; + 8595E0DE204863FD00178171 /* ViewController */ = { + isa = PBXGroup; + children = ( + 859B863620485F01003272B2 /* CarouselPickerViewController.swift */, + 859B863820486068003272B2 /* CarouselPickerViewControllerLayout.swift */, + ); + path = ViewController; + sourceTree = ""; + }; 859B8631204820E5003272B2 /* Presenter */ = { isa = PBXGroup; children = ( @@ -4612,6 +4634,7 @@ 859B86352048224B003272B2 /* Settings */ = { isa = PBXGroup; children = ( + 859B863A2048606F003272B2 /* CarouselPicker */, 85788C3A20442263003600C9 /* BuildNumber */, 8509547D20481AF900905B46 /* ThemePicker */, 85788C4F20444EF1003600C9 /* WheelPositionPicker */, @@ -4619,6 +4642,16 @@ path = Settings; sourceTree = ""; }; + 859B863A2048606F003272B2 /* CarouselPicker */ = { + isa = PBXGroup; + children = ( + 8595E0D8204863BF00178171 /* CarouselPickerProtocols.swift */, + 8595E0DA204863CF00178171 /* CollectionView */, + 8595E0DE204863FD00178171 /* ViewController */, + ); + path = CarouselPicker; + sourceTree = ""; + }; 859F9B4A2035C555009D017A /* Cell */ = { isa = PBXGroup; children = ( @@ -6987,7 +7020,7 @@ 26035BAB1F9A741C00003850 /* container_Spec.swift in Sources */, 26035BB71F9A741C00003850 /* iterator_Spec.swift in Sources */, C9DF574A2023A29A006B990A /* SelectCountryTableDelegate.swift in Sources */, - 85788C6420445BA7003600C9 /* WheelPositionCollectionViewCell.swift in Sources */, + 85788C6420445BA7003600C9 /* CarouselPickerCollectionViewCell.swift in Sources */, 26035BC91F9A741C00003850 /* Star_Spec.swift in Sources */, 3ABCE8F11EC9330D00A80B15 /* AppDelegate.swift in Sources */, 4B1D7E052029CF2900703228 /* ShareContactsItemsFactory.swift in Sources */, @@ -7277,6 +7310,7 @@ 65AC1F6564EEFA0439F5C236 /* QRCodeReaderWireframe.swift in Sources */, 039B595B084FE6336504E071 /* ProfileProtocols.swift in Sources */, 26035B951F9A740A00003850 /* Person.swift in Sources */, + 859B863920486068003272B2 /* CarouselPickerViewControllerLayout.swift in Sources */, E74EC9ED1FC2DA6E007268E6 /* RoomTable.swift in Sources */, 2607270A203C598F00290545 /* (null) in Sources */, 26E7D0451FCB880F001C69B7 /* Roster+DBRoster.swift in Sources */, @@ -7307,6 +7341,7 @@ 8E55172E200D095B00C12B5D /* UserGroupRulesVC.swift in Sources */, 4BDC7E63203494C000BCD381 /* ScheduleButton.swift in Sources */, 95FE45E089AF69B08815EB9E /* ProfilePresenter.swift in Sources */, + 8595E0D9204863BF00178171 /* CarouselPickerProtocols.swift in Sources */, 4B06D31C2028A6A1003B275B /* ChatItemsFactory.swift in Sources */, 9E9DD4C7F700872D7CCEE227 /* ProfileInteractor.swift in Sources */, 26035BC61F9A741C00003850 /* Roster_Spec.swift in Sources */, @@ -7385,7 +7420,6 @@ 001169B5201A0B02001B435F /* MapSearchCell.swift in Sources */, 00102F3E202C8E3A00A877A9 /* NynjaTimeControl.swift in Sources */, 267BE2941FDEA24000C47E18 /* SettingsGroupDS.swift in Sources */, - 85788C5F2044554A003600C9 /* WheelPositionPickerViewControllerLayout.swift in Sources */, 85788C5B20445106003600C9 /* WheelPositionPickerInteractor.swift in Sources */, 26035BA21F9A740A00003850 /* writer.swift in Sources */, F0839BACB1A52FCF846584D4 /* EditProfileWireframe.swift in Sources */, @@ -7454,6 +7488,7 @@ 2683F764203F36B10003181A /* MessageBackgroundTaskHandler.swift in Sources */, 26FA420C2017AE3300E6F6EC /* StarMessageCellLayout.swift in Sources */, E79117921F97A48900462D68 /* ProfileDetailsViewLayout.swift in Sources */, + 8595E0DC204863DB00178171 /* CarouselPickerCellModel.swift in Sources */, 26035B981F9A740A00003850 /* reader.swift in Sources */, 262DAFEC1F9AB74B00EB9C01 /* CDR_Spec.swift in Sources */, 0DE4B40440737CF42D3E0204 /* HistoryWireframe.swift in Sources */, @@ -7572,6 +7607,7 @@ 26441A141F9FC78B00E724B5 /* ArrayExtension.swift in Sources */, 85788C4620442392003600C9 /* BuildNumberInteractor.swift in Sources */, 6B3D349607A18D5650BF47E6 /* SplashInteractor.swift in Sources */, + 859B863720485F01003272B2 /* CarouselPickerViewController.swift in Sources */, 26035BB51F9A741C00003850 /* io_Spec.swift in Sources */, E7E6E3DE1FB2F37900401D9E /* ParticipantsDelegate.swift in Sources */, 628E2C26BE0854DB1DF64990 /* SplashWireframe.swift in Sources */, diff --git a/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift b/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift new file mode 100644 index 000000000..72e784692 --- /dev/null +++ b/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift @@ -0,0 +1,17 @@ +// +// CarouselPickerProtocols.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +protocol CarouselPickerPresenterProtocol: BasePresenterProtocol { + func didSelectItem(_ item: CarouselPickerCellModel) +} + +protocol CarouselPickerViewProtocol: class { + func setupItems(_ items: [CarouselPickerCellModel]) +} diff --git a/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCellModel.swift b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCellModel.swift new file mode 100644 index 000000000..5409a4818 --- /dev/null +++ b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCellModel.swift @@ -0,0 +1,19 @@ +// +// CarouselPickerCellModel.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +typealias CarouselPickerCellModel = AnyCellViewModel & SelectableCellModel & TextRepresentable + +protocol SelectableCellModel { + var isSelected: Bool { get } +} + +protocol TextRepresentable { + func title() -> String? +} diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift similarity index 93% rename from Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift rename to Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift index 314315967..abd358796 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift +++ b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift @@ -1,5 +1,5 @@ // -// WheelPositionCollectionViewCell.swift +// CarouselPickerCollectionViewCell.swift // Nynja // // Created by Anton Poltoratskyi on 26.02.2018. @@ -9,7 +9,7 @@ import UIKit import SnapKit -final class WheelPositionCollectionViewCell: UICollectionViewCell { +final class CarouselPickerCollectionViewCell: UICollectionViewCell { // MARK: - Views @@ -57,7 +57,7 @@ final class WheelPositionCollectionViewCell: UICollectionViewCell { } // MARK: - Layout -extension WheelPositionCollectionViewCell { +extension CarouselPickerCollectionViewCell { enum Constraints { enum imageView { static let minScale: CGFloat = scaledState.height / normalState.height diff --git a/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift new file mode 100644 index 000000000..f726b521c --- /dev/null +++ b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift @@ -0,0 +1,205 @@ +// +// CarouselPickerViewController.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +class CarouselPickerViewController: BaseVC, CarouselPickerViewProtocol, UICollectionViewDataSource, UICollectionViewDelegate { + + var carouselPresenter: CarouselPickerPresenterProtocol! { + didSet { + _presenter = carouselPresenter + } + } + + private(set) var items: [CarouselPickerCellModel] = [] { + didSet { + collectionView.reloadData() + } + } + + var collectionTitle: String? { + didSet { + collectionTitleLabel.text = collectionTitle + } + } + + var selectedItemText: String? { + didSet { + selectedItemLabel.text = selectedItemText + } + } + + private var currentItemIndexPath: IndexPath? { + var point = collectionView.contentOffset + point.x += collectionView.bounds.width / 2 + return collectionView.indexPathForItem(at: point) + } + + private var isAppeared = false + + + // MARK: - Views + + private lazy var collectionTitleLabel: UILabel = { + let width = Constraints.collectionTitleLabel.width.adjustedByWidth + let height = Constraints.collectionTitleLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), + color: Constants.colors.darkGray.getColor(), fontName: Constants.fonts.regular) + + label.textAlignment = .center + + self.view.addSubview(label) + + label.snp.makeConstraints { maker in + let horizontalInset = Constraints.collectionTitleLabel.horizontalInset.adjustedByWidth + maker.left.equalToSuperview().offset(horizontalInset) + maker.right.equalToSuperview().inset(horizontalInset) + + let topOffset = Constraints.collectionTitleLabel.topOffset.adjustedByWidth + maker.top.equalTo(self.navigationView.snp.bottom).offset(topOffset) + + maker.height.equalTo(Constraints.collectionTitleLabel.height.adjustedByWidth) + } + + return label + }() + + private(set) lazy var carouselLayout: CarouselFlowLayout = { + let layout = CarouselFlowLayout() + layout.spacingMode = .fixed(spacing: Constraints.collectionView.items.padding.adjustedByWidth) + layout.sideItemScale = CarouselPickerCollectionViewCell.Constraints.imageView.minScale + layout.sideItemAlpha = 1.0 + layout.scrollDirection = .horizontal + + return layout + }() + + private(set) lazy var collectionView: UICollectionView = { + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.carouselLayout) + collectionView.backgroundColor = .clear + collectionView.showsHorizontalScrollIndicator = false + collectionView.clipsToBounds = false + + self.view.addSubview(collectionView) + + collectionView.snp.makeConstraints { maker in + maker.left.right.equalToSuperview() + maker.top.equalTo(collectionTitleLabel.snp.bottom).offset(Constraints.collectionView.topOffset.adjustedByWidth) + maker.bottom.equalToSuperview().inset(Constraints.collectionView.bottomOffset.adjustedByWidth) + } + + return collectionView + }() + + private(set) lazy var selectedItemLabel: UILabel = { + let width = Constraints.selectedItemLabel.width.adjustedByWidth + let height = Constraints.selectedItemLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) + label.textAlignment = .center + + self.view.addSubview(label) + + label.snp.makeConstraints { maker in + maker.left.right.equalToSuperview() + maker.top.equalTo(collectionView.snp.bottom).offset(Constraints.selectedItemLabel.topOffset.adjustedByWidth) + maker.height.equalTo(Constraints.selectedItemLabel.topOffset.adjustedByWidth) + } + return label + }() + + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + guard !isAppeared else { return } + + carouselLayout.itemSize = CGSize( + width: collectionView.bounds.width - Constraints.collectionView.items.horizontalInset.adjustedByWidth * 2, + height: collectionView.bounds.height + ) + showSelectedPosition() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + isAppeared = true + } + + + // MARK: - UI Setup + + func setupUI() { + // TODO: register cell in subclasses + collectionView.delegate = self + collectionView.dataSource = self + } + + + // MARK: - CarouselPickerViewProtocol + + func setupItems(_ items: [CarouselPickerCellModel]) { + self.items = items + showSelectedPosition() + } + + private func showSelectedPosition() { + guard let index = items.index(where: { $0.isSelected }) else { return } + scrollToModel(at: index, animated: false) + } + + private func scrollToModel(at index: Int, animated: Bool) { + let item = items[index] + selectedItemText = item.title() + + let indexPath = IndexPath(item: index, section: 0) + collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: animated) + } + + + // MARK: - UICollectionViewDataSource + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return items.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + return collectionView.dequeueReusableCell(withModel: itemModel(at: indexPath), for: indexPath) + } + + private func itemModel(at indexPath: IndexPath) -> CarouselPickerCellModel { + return items[indexPath.row] + } + + + // MARK: - UICollectionViewDelegate + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard indexPath == self.currentItemIndexPath else { return } + + let selectedItem = itemModel(at: indexPath) + carouselPresenter.didSelectItem(selectedItem) + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + guard let indexPath = currentItemIndexPath else { + return + } + let itemModel = self.itemModel(at: indexPath) + selectedItemText = itemModel.title() + } +} diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewControllerLayout.swift similarity index 84% rename from Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift rename to Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewControllerLayout.swift index d9adfac9c..a5590cd3e 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewControllerLayout.swift +++ b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewControllerLayout.swift @@ -1,14 +1,14 @@ // -// WheelPositionPickerViewControllerLayout.swift +// CarouselPickerViewControllerLayout.swift // Nynja // -// Created by Anton Poltoratskyi on 26.02.2018. +// Created by Anton Poltoratskyi on 01.03.2018. // Copyright © 2018 TecSynt Solutions. All rights reserved. // -import Foundation +import UIKit -extension WheelPositionPickerViewController { +extension CarouselPickerViewController { enum Constraints { diff --git a/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index 65e9fe773..ac9ab67fb 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -9,6 +9,7 @@ import Foundation final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPresenterProtocol, WheelPositionPickerInteractorOutputProtocol { + override var itemsFactory: WCItemsFactory? { return WheelPositionItemsFactory() @@ -23,8 +24,12 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres setupView(for: currentPosition) } - func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) { - guard !itemPositionModel.isCurrent else { return } + func didSelectItem(_ itemPositionModel: CarouselPickerCellModel) { + guard !itemPositionModel.isSelected else { return } + + guard let itemPositionModel = itemPositionModel as? WheelPositionCellModel else { + return + } AlertManager.sharedInstance.showAlertWithTwoActions( title: "wheel position alert title".localized, @@ -40,9 +45,9 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres private func setupView(for currentPosition: WheelPosition) { let items = WheelPosition.all.map { - WheelPositionCellModel(position: $0, isCurrent: $0 == currentPosition) + WheelPositionCellModel(position: $0, isSelected: $0 == currentPosition) } - view.setupOptions(items) + view.setupItems(items) } private func apply(wheelPosition: WheelPosition) { diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index 3deccd980..3d580cf32 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -8,12 +8,12 @@ import Foundation -struct WheelPositionCellModel: CellViewModel { - +struct WheelPositionCellModel: CellViewModel, SelectableCellModel, TextRepresentable { + let position: WheelPosition - let isCurrent: Bool + var isSelected: Bool - func setup(cell: WheelPositionCollectionViewCell) { + func setup(cell: CarouselPickerCollectionViewCell) { switch position { case .left: cell.imageView.image = UIImage(named: "wheel_left_image") @@ -22,16 +22,16 @@ struct WheelPositionCellModel: CellViewModel { } } - func title() -> String { + func title() -> String? { switch position { case .left: - if isCurrent { + if isSelected { return "\("wheel left hand".localized) (\("wheel current position".localized))" } else { return "wheel left hand".localized } case .right: - if isCurrent { + if isSelected { return "\("wheel right hand".localized) (\("wheel current position".localized))" } else { return "wheel right hand".localized diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift index 64bcb0f6f..d963083c2 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/View/ViewController/WheelPositionPickerViewController.swift @@ -9,194 +9,28 @@ import UIKit import SnapKit -final class WheelPositionPickerViewController: BaseVC, WheelPositionPickerViewProtocol { +final class WheelPositionPickerViewController: CarouselPickerViewController, WheelPositionPickerViewProtocol { var presenter: WheelPositionPickerPresenterProtocol! { didSet { - _presenter = presenter + carouselPresenter = presenter } } - - private var items: [WheelPositionCellModel] = [] { - didSet { - collectionView.reloadData() - } - } - - private var isAppeared = false - - - // MARK: - Views - - private lazy var collectionTitleLabel: UILabel = { - let width = Constraints.collectionTitleLabel.width.adjustedByWidth - let height = Constraints.collectionTitleLabel.height.adjustedByWidth - - let label = UILabel(size: CGSize(width: width, height: height), - color: Constants.colors.darkGray.getColor(), fontName: Constants.fonts.regular) - label.textAlignment = .center - label.text = "choose wheel position".localized - - self.view.addSubview(label) - - label.snp.makeConstraints { maker in - let horizontalInset = Constraints.collectionTitleLabel.horizontalInset.adjustedByWidth - maker.left.equalToSuperview().offset(horizontalInset) - maker.right.equalToSuperview().inset(horizontalInset) - - let topOffset = Constraints.collectionTitleLabel.topOffset.adjustedByWidth - maker.top.equalTo(self.navigationView.snp.bottom).offset(topOffset) - - maker.height.equalTo(Constraints.collectionTitleLabel.height.adjustedByWidth) - } - - return label - }() - - private lazy var carouselLayout: CarouselFlowLayout = { - let layout = CarouselFlowLayout() - layout.spacingMode = .fixed(spacing: Constraints.collectionView.items.padding.adjustedByWidth) - layout.sideItemScale = WheelPositionCollectionViewCell.Constraints.imageView.minScale - layout.sideItemAlpha = 1.0 - layout.scrollDirection = .horizontal - return layout - }() - - private lazy var collectionView: UICollectionView = { - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: self.carouselLayout) - collectionView.backgroundColor = .clear - collectionView.showsHorizontalScrollIndicator = false - collectionView.clipsToBounds = false - - self.view.addSubview(collectionView) - - collectionView.snp.makeConstraints { maker in - maker.left.right.equalToSuperview() - maker.top.equalTo(collectionTitleLabel.snp.bottom).offset(Constraints.collectionView.topOffset.adjustedByWidth) - maker.bottom.equalToSuperview().inset(Constraints.collectionView.bottomOffset.adjustedByWidth) - } - - return collectionView - }() - - private(set) lazy var selectedItemLabel: UILabel = { - let width = Constraints.selectedItemLabel.width.adjustedByWidth - let height = Constraints.selectedItemLabel.height.adjustedByWidth - - let label = UILabel(size: CGSize(width: width, height: height), color: Constants.colors.white.getColor(), fontName: Constants.fonts.medium) - label.textAlignment = .center - - self.view.addSubview(label) - - label.snp.makeConstraints { maker in - maker.left.right.equalToSuperview() - maker.top.equalTo(collectionView.snp.bottom).offset(Constraints.selectedItemLabel.topOffset.adjustedByWidth) - maker.height.equalTo(Constraints.selectedItemLabel.topOffset.adjustedByWidth) - } - return label - }() - - private var currentItemIndexPath: IndexPath? { - var point = collectionView.contentOffset - point.x += collectionView.bounds.width / 2 - return collectionView.indexPathForItem(at: point) - } - - // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setupUI() presenter.showed() } - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - guard !isAppeared else { return } - - carouselLayout.itemSize = CGSize( - width: collectionView.bounds.width - Constraints.collectionView.items.horizontalInset.adjustedByWidth * 2, - height: collectionView.bounds.height - ) - showSelectedPosition() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - isAppeared = true - } - - - // MARK: - UI Setup - - private func setupUI() { + override func setupUI() { + super.setupUI() screenTitle = "wheel position title".localized - collectionView.register(viewModel: WheelPositionCellModel.self) - collectionView.delegate = self - collectionView.dataSource = self - } - - private func setupTitle(for model: WheelPositionCellModel) { - selectedItemLabel.text = model.title() - } - - - // MARK: - WheelPositionPickerViewProtocol - - func setupOptions(_ items: [WheelPositionCellModel]) { - self.items = items - showSelectedPosition() - } - - private func showSelectedPosition() { - guard let index = items.index(where: { $0.isCurrent }) else { return } - scrollToModel(at: index, animated: false) - } - - private func scrollToModel(at index: Int, animated: Bool) { - let item = items[index] - setupTitle(for: item) - - let indexPath = IndexPath(item: index, section: 0) - collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: animated) - } -} - -// MARK: - UICollectionViewDataSource -extension WheelPositionPickerViewController: UICollectionViewDataSource { - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return items.count - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - return collectionView.dequeueReusableCell(withModel: itemModel(at: indexPath), for: indexPath) - } - - private func itemModel(at indexPath: IndexPath) -> WheelPositionCellModel { - return items[indexPath.row] - } -} - -// MARK: - UICollectionViewDelegate -extension WheelPositionPickerViewController: UICollectionViewDelegate { - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard indexPath == self.currentItemIndexPath else { return } + collectionTitle = "choose wheel position".localized - let selectedItem = itemModel(at: indexPath) - presenter.didSelectItemModel(selectedItem) - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - guard let indexPath = currentItemIndexPath else { - return - } - let itemModel = self.itemModel(at: indexPath) - setupTitle(for: itemModel) + // Important to register custom cell model + collectionView.register(viewModel: WheelPositionCellModel.self) } } diff --git a/Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift b/Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift index 4605be8c8..25f356617 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/WheelPositionPickerProtocols.swift @@ -17,7 +17,7 @@ protocol WheelPositionPickerWireFrameProtocol: class { */ } -protocol WheelPositionPickerViewProtocol: class { +protocol WheelPositionPickerViewProtocol: CarouselPickerViewProtocol { var presenter: WheelPositionPickerPresenterProtocol! { get set } @@ -25,10 +25,9 @@ protocol WheelPositionPickerViewProtocol: class { * Add here your methods for communication PRESENTER -> VIEW */ - func setupOptions(_ items: [WheelPositionCellModel]) } -protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { +protocol WheelPositionPickerPresenterProtocol: class, CarouselPickerPresenterProtocol { var view: WheelPositionPickerViewProtocol! { get set } var interactor: WheelPositionPickerInteractorInputProtocol! { get set } @@ -39,7 +38,6 @@ protocol WheelPositionPickerPresenterProtocol: class, BasePresenterProtocol { */ func showed() - func didSelectItemModel(_ itemPositionModel: WheelPositionCellModel) } protocol WheelPositionPickerInteractorOutputProtocol: class { -- GitLab From 6265ade0e9b6c8a581000dd7d32eeb87ea0142ae Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Fri, 2 Mar 2018 10:28:23 +0200 Subject: [PATCH 23/24] Presented Theme picker screen. --- Nynja.xcodeproj/project.pbxproj | 30 ++++++++++++- Nynja/Modules/Main/MainProtocols.swift | 6 ++- .../Main/Presenter/MainPresenter.swift | 8 +++- .../Main/View/MainNavigationItem.swift | 1 + .../Main/View/MainViewControllerNav.swift | 9 +++- .../Modules/Main/View/NavigateProtocol.swift | 1 + .../Main/WireFrame/MainWireframe.swift | 9 +++- .../CarouselPickerProtocols.swift | 8 ++-- .../CarouselPickerViewController.swift | 2 +- .../Interactor/ThemePickerInteractor.swift | 9 ++++ .../Presenter/ThemePickerPresenter.swift | 44 +++++++++++++++++++ .../ThemePicker/ThemePickerProtocols.swift | 7 ++- .../View/CollectionView/ThemeCellModel.swift | 28 ++++++++++++ .../ThemePickerViewController.swift | 13 ++++-- .../WheelPositionPickerPresenter.swift | 19 +++++--- .../WheelPositionCellModel.swift | 2 +- Nynja/OptionsItemsFactory.swift | 9 +++- Nynja/Resources/en.lproj/Localizable.strings | 10 ++++- Nynja/Services/MQTT/MQTTService.swift | 2 +- Nynja/ThemeItemsFactory.swift | 18 ++++++++ Nynja/UISettings/Theme.swift | 35 +++++++++++++++ Nynja/UISettings/UISettingsService.swift | 20 ++++++++- Nynja/UISettings/WheelPosition.swift | 5 +-- .../BaseModule/BasePresenterProtocol.swift | 2 +- 24 files changed, 261 insertions(+), 36 deletions(-) create mode 100644 Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift rename Nynja/Modules/Settings/ThemePicker/View/{ => ViewController}/ThemePickerViewController.swift (52%) create mode 100644 Nynja/ThemeItemsFactory.swift create mode 100644 Nynja/UISettings/Theme.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 13e2ab15f..fc54bfd1e 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -800,6 +800,9 @@ 858BC123203320BB0022EB25 /* ForwardSelectorDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */; }; 8595E0D9204863BF00178171 /* CarouselPickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8595E0D8204863BF00178171 /* CarouselPickerProtocols.swift */; }; 8595E0DC204863DB00178171 /* CarouselPickerCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8595E0DB204863DB00178171 /* CarouselPickerCellModel.swift */; }; + 8596CEF22048A763006FC65D /* ThemeCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8596CEF12048A763006FC65D /* ThemeCellModel.swift */; }; + 8596CEF42048A98E006FC65D /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8596CEF32048A98E006FC65D /* Theme.swift */; }; + 8596CEF62048AEB8006FC65D /* ThemeItemsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8596CEF52048AEB8006FC65D /* ThemeItemsFactory.swift */; }; 859B862C204820DC003272B2 /* ThemePickerPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */; }; 859B862D204820DC003272B2 /* ThemePickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8628204820DC003272B2 /* ThemePickerViewController.swift */; }; 859B862E204820DC003272B2 /* ThemePickerProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */; }; @@ -1795,6 +1798,9 @@ 858BC122203320BB0022EB25 /* ForwardSelectorDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardSelectorDataSource.swift; sourceTree = ""; }; 8595E0D8204863BF00178171 /* CarouselPickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerProtocols.swift; sourceTree = ""; }; 8595E0DB204863DB00178171 /* CarouselPickerCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselPickerCellModel.swift; sourceTree = ""; }; + 8596CEF12048A763006FC65D /* ThemeCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeCellModel.swift; sourceTree = ""; }; + 8596CEF32048A98E006FC65D /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; + 8596CEF52048AEB8006FC65D /* ThemeItemsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeItemsFactory.swift; sourceTree = ""; }; 859B8627204820DC003272B2 /* ThemePickerPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerPresenter.swift; sourceTree = ""; }; 859B8628204820DC003272B2 /* ThemePickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerViewController.swift; sourceTree = ""; }; 859B8629204820DC003272B2 /* ThemePickerProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePickerProtocols.swift; sourceTree = ""; }; @@ -3809,6 +3815,7 @@ 4B1D7DFD2029C41C00703228 /* AboutItemsFactory.swift */, 85788C4D20443DD2003600C9 /* BuildNumberItemsFactory.swift */, 85249D312045B1F800B43007 /* WheelPositionItemsFactory.swift */, + 8596CEF52048AEB8006FC65D /* ThemeItemsFactory.swift */, ); name = Options; sourceTree = ""; @@ -4329,6 +4336,7 @@ 850A0C6420469AED004F79AD /* UISettingsRespondable.swift */, 85082DDC2045A873000AE4B2 /* UISettingsService.swift */, 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */, + 8596CEF32048A98E006FC65D /* Theme.swift */, ); path = UISettings; sourceTree = ""; @@ -4599,6 +4607,22 @@ path = ViewController; sourceTree = ""; }; + 8596CEEF2048A746006FC65D /* ViewController */ = { + isa = PBXGroup; + children = ( + 859B8628204820DC003272B2 /* ThemePickerViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 8596CEF02048A752006FC65D /* CollectionView */ = { + isa = PBXGroup; + children = ( + 8596CEF12048A763006FC65D /* ThemeCellModel.swift */, + ); + path = CollectionView; + sourceTree = ""; + }; 859B8631204820E5003272B2 /* Presenter */ = { isa = PBXGroup; children = ( @@ -4610,7 +4634,8 @@ 859B8632204820EC003272B2 /* View */ = { isa = PBXGroup; children = ( - 859B8628204820DC003272B2 /* ThemePickerViewController.swift */, + 8596CEF02048A752006FC65D /* CollectionView */, + 8596CEEF2048A746006FC65D /* ViewController */, ); path = View; sourceTree = ""; @@ -6921,6 +6946,7 @@ 4B1D7E072029D00000703228 /* OtherUserProfileItemsFactory.swift in Sources */, 3A1DC73C1EF15330006A8E9F /* HandleService.swift in Sources */, E7302A951FC86424002892F8 /* P2pTable.swift in Sources */, + 8596CEF62048AEB8006FC65D /* ThemeItemsFactory.swift in Sources */, 850FC60420330C6800832D87 /* UICollectionView+ViewModel.swift in Sources */, E76D132C1FA35CCF00B07F0E /* ProfilePlaceholderCell.swift in Sources */, E7EED2341F740BF3005DAE20 /* ChatsItem.swift in Sources */, @@ -7717,6 +7743,7 @@ 4B06D30520287060003B275B /* WCDataManager.swift in Sources */, DE89BF12597D1B7D5BB68AA3 /* TopUpAccountWireframe.swift in Sources */, E6BAC896CF1531C489B1549C /* AddParticipantsProtocols.swift in Sources */, + 8596CEF42048A98E006FC65D /* Theme.swift in Sources */, 2683F75C203F35BE0003181A /* LongPressWithUpSwipeGestureRecognizer.swift in Sources */, 04EDA50C90C7EBD46AA1FCB2 /* AddParticipantsViewController.swift in Sources */, 26FF00AE1FCCCA21002170B1 /* CustomNavigationVC.swift in Sources */, @@ -7775,6 +7802,7 @@ B3D0F59E1E7BDB7E485AE662 /* GroupStorageWireframe.swift in Sources */, FEA59F90B93C7B49BAF99F9C /* SelectCountryProtocols.swift in Sources */, 7C51CDC1260CE191C07EE46C /* SelectCountryViewController.swift in Sources */, + 8596CEF22048A763006FC65D /* ThemeCellModel.swift in Sources */, A1AD6864F4F49D9FC8997D59 /* SelectCountryPresenter.swift in Sources */, 32E5A25AD25BF752EB3864AB /* SelectCountryInteractor.swift in Sources */, 1A9DFA4A2ED5ACE55035FA17 /* SelectCountryWireframe.swift in Sources */, diff --git a/Nynja/Modules/Main/MainProtocols.swift b/Nynja/Modules/Main/MainProtocols.swift index 9e27c9970..7e732ec29 100644 --- a/Nynja/Modules/Main/MainProtocols.swift +++ b/Nynja/Modules/Main/MainProtocols.swift @@ -48,8 +48,9 @@ protocol MainWireFrameProtocol: class { func getContact() -> String? func viewShowed() func showMessages(contact: Contact, callVC: CallViewProtocol, isVideo: Bool) - func showBuildNumber() func showWheelPositionPicker() + func showBuildNumber() + func showThemePicker() func logout() func hideReturnToCallView() func returnToCall() @@ -137,8 +138,9 @@ protocol MainPresenterProtocol: class { func openScheduleMessageScreen(text : String?, audioUrl : URL?) func returnToCall() func about() - func showBuildNumber() func showWheelPositionPicker() + func showBuildNumber() + func showThemePicker() func openMapView() func deleteAccount() diff --git a/Nynja/Modules/Main/Presenter/MainPresenter.swift b/Nynja/Modules/Main/Presenter/MainPresenter.swift index f872f4186..ef20a2982 100644 --- a/Nynja/Modules/Main/Presenter/MainPresenter.swift +++ b/Nynja/Modules/Main/Presenter/MainPresenter.swift @@ -163,12 +163,16 @@ class MainPresenter: MainPresenterProtocol, MainInteractorOutputProtocol, Schedu self.wireFrame.showSplash() } + func showWheelPositionPicker() { + self.wireFrame.showWheelPositionPicker() + } + func showBuildNumber() { self.wireFrame.showBuildNumber() } - func showWheelPositionPicker() { - self.wireFrame.showWheelPositionPicker() + func showThemePicker() { + self.wireFrame.showThemePicker() } func showContactsToShare() { diff --git a/Nynja/Modules/Main/View/MainNavigationItem.swift b/Nynja/Modules/Main/View/MainNavigationItem.swift index 376947314..ddff69347 100644 --- a/Nynja/Modules/Main/View/MainNavigationItem.swift +++ b/Nynja/Modules/Main/View/MainNavigationItem.swift @@ -83,6 +83,7 @@ enum MainNavigationItem: String { case options = "Setting" case wheelPosition = "Wheel position" case buildNumber = "Build number" + case theme = "Theme" case logOut = "LOG OUT" case about = "About" case deleteAccount = "Delete Account" diff --git a/Nynja/Modules/Main/View/MainViewControllerNav.swift b/Nynja/Modules/Main/View/MainViewControllerNav.swift index dfd9c24db..3e771d0c1 100644 --- a/Nynja/Modules/Main/View/MainViewControllerNav.swift +++ b/Nynja/Modules/Main/View/MainViewControllerNav.swift @@ -374,13 +374,18 @@ extension MainViewController: NavigateProtocol { closeWheel(indexPath: indexPath) } + func showWheelPositionPicker(indexPath: IndexPath?) { + presenter.showWheelPositionPicker() + closeWheel(indexPath: indexPath) + } + func showBuildNumber(indexPath: IndexPath?) { presenter.showBuildNumber() closeWheel(indexPath: indexPath) } - func showWheelPositionPicker(indexPath: IndexPath?) { - presenter.showWheelPositionPicker() + func showThemePicker(indexPath: IndexPath?) { + presenter.showThemePicker() closeWheel(indexPath: indexPath) } diff --git a/Nynja/Modules/Main/View/NavigateProtocol.swift b/Nynja/Modules/Main/View/NavigateProtocol.swift index 1722b3aa7..dcc9e6e14 100644 --- a/Nynja/Modules/Main/View/NavigateProtocol.swift +++ b/Nynja/Modules/Main/View/NavigateProtocol.swift @@ -76,6 +76,7 @@ protocol SecondLevelNavigateProtocol: class { // MARK: - Options func showWheelPositionPicker(indexPath: IndexPath?) func showBuildNumber(indexPath: IndexPath?) + func showThemePicker(indexPath: IndexPath?) func logout(indexPath: IndexPath?) func showAbout(indexPath: IndexPath?) func deleteAccount(indexPath: IndexPath?) diff --git a/Nynja/Modules/Main/WireFrame/MainWireframe.swift b/Nynja/Modules/Main/WireFrame/MainWireframe.swift index f3fd0f604..031f166af 100644 --- a/Nynja/Modules/Main/WireFrame/MainWireframe.swift +++ b/Nynja/Modules/Main/WireFrame/MainWireframe.swift @@ -431,14 +431,19 @@ class MainWireFrame: MainWireFrameProtocol, VoxServiceDelegate { } } + func showWheelPositionPicker() { + guard let navigation = contentNavigation else { return } + WheelPositionPickerWireFrame().presentWheelPositionPicker(navigation: navigation) + } + func showBuildNumber() { guard let navigation = contentNavigation else { return } BuildNumberWireFrame().presentBuildNumber(navigation: navigation) } - func showWheelPositionPicker() { + func showThemePicker() { guard let navigation = contentNavigation else { return } - WheelPositionPickerWireFrame().presentWheelPositionPicker(navigation: navigation) + ThemePickerWireFrame().presentThemePicker(navigation: navigation) } diff --git a/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift b/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift index 72e784692..dee7f69d0 100644 --- a/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift +++ b/Nynja/Modules/Settings/CarouselPicker/CarouselPickerProtocols.swift @@ -8,10 +8,10 @@ import Foundation -protocol CarouselPickerPresenterProtocol: BasePresenterProtocol { - func didSelectItem(_ item: CarouselPickerCellModel) -} - protocol CarouselPickerViewProtocol: class { func setupItems(_ items: [CarouselPickerCellModel]) } + +protocol CarouselPickerPresenterProtocol: BasePresenterProtocol { + func didSelectItem(_ item: CarouselPickerCellModel) +} diff --git a/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift index f726b521c..ff4a934a3 100644 --- a/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift +++ b/Nynja/Modules/Settings/CarouselPicker/ViewController/CarouselPickerViewController.swift @@ -144,9 +144,9 @@ class CarouselPickerViewController: BaseVC, CarouselPickerViewProtocol, UICollec // MARK: - UI Setup func setupUI() { - // TODO: register cell in subclasses collectionView.delegate = self collectionView.dataSource = self + // register cell in subclasses } diff --git a/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift b/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift index bf444f946..992c98139 100644 --- a/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift +++ b/Nynja/Modules/Settings/ThemePicker/Interactor/ThemePickerInteractor.swift @@ -11,5 +11,14 @@ import Foundation final class ThemePickerInteractor: ThemePickerInteractorInputProtocol { weak var presenter: ThemePickerInteractorOutputProtocol! + + func getCurrentTheme() -> Theme { + return UISettingsService.shared.theme + } + + func setTheme(_ theme: Theme) { + UISettingsService.shared.theme = theme + presenter.didUpdateTheme(theme) + } } diff --git a/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift b/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift index 48b3c86d3..ddab646c0 100644 --- a/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift +++ b/Nynja/Modules/Settings/ThemePicker/Presenter/ThemePickerPresenter.swift @@ -18,7 +18,51 @@ final class ThemePickerPresenter: BasePresenter, ThemePickerPresenterProtocol, T var interactor: ThemePickerInteractorInputProtocol! var wireFrame: ThemePickerWireFrameProtocol! + + // MARK: - ThemePickerPresenterProtocol + func showed() { + let currentTheme = interactor.getCurrentTheme() + setupView(for: currentTheme) + } + + func didSelectItem(_ itemModel: CarouselPickerCellModel) { + guard !itemModel.isSelected else { return } + guard let itemModel = itemModel as? ThemeCellModel else { + return + } + + AlertManager.sharedInstance.showAlertWithTwoActions( + title: "theme picker alert title".localized, + message: "", + firstActionTitle: "yes".localized, + secondActionTitle: "no".localized, + firstAction: { + self.applyTheme(itemModel.theme) + }, + secondAction: nil + ) + } + + + // MARK: - ThemePickerInteractorOutputProtocol + + func didUpdateTheme(_ theme: Theme) { + setupView(for: theme) + } + + + // MARK: - Private + + private func setupView(for currentTheme: Theme) { + let items = Theme.all.map { + ThemeCellModel(theme: $0, isSelected: $0 == currentTheme) + } + view.setupItems(items) + } + + private func applyTheme(_ theme: Theme) { + interactor.setTheme(theme) } } diff --git a/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift b/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift index a92faff97..b3f847a6e 100644 --- a/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift +++ b/Nynja/Modules/Settings/ThemePicker/ThemePickerProtocols.swift @@ -17,7 +17,7 @@ protocol ThemePickerWireFrameProtocol: class { */ } -protocol ThemePickerViewProtocol: class { +protocol ThemePickerViewProtocol: CarouselPickerViewProtocol { var presenter: ThemePickerPresenterProtocol! { get set } @@ -27,7 +27,7 @@ protocol ThemePickerViewProtocol: class { } -protocol ThemePickerPresenterProtocol: class, BasePresenterProtocol { +protocol ThemePickerPresenterProtocol: CarouselPickerPresenterProtocol { var view: ThemePickerViewProtocol! { get set } var interactor: ThemePickerInteractorInputProtocol! { get set } @@ -45,6 +45,7 @@ protocol ThemePickerInteractorOutputProtocol: class { /** * Add here your methods for communication INTERACTOR -> PRESENTER */ + func didUpdateTheme(_ theme: Theme) } protocol ThemePickerInteractorInputProtocol: class { @@ -54,4 +55,6 @@ protocol ThemePickerInteractorInputProtocol: class { /** * Add here your methods for communication PRESENTER -> INTERACTOR */ + func getCurrentTheme() -> Theme + func setTheme(_ theme: Theme) } diff --git a/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift new file mode 100644 index 000000000..692613a08 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift @@ -0,0 +1,28 @@ +// +// ThemeCellModel.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit + +struct ThemeCellModel: CellViewModel, SelectableCellModel, TextRepresentable { + + let theme: Theme + var isSelected: Bool + + func setup(cell: CarouselPickerCollectionViewCell) { + cell.imageView.image = UIImage(named: theme.backgroundName) + } + + func title() -> String? { + if isSelected { + return "\(theme.name) (\("theme current name".localized))" + } else { + return theme.name + } + } + +} diff --git a/Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift b/Nynja/Modules/Settings/ThemePicker/View/ViewController/ThemePickerViewController.swift similarity index 52% rename from Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift rename to Nynja/Modules/Settings/ThemePicker/View/ViewController/ThemePickerViewController.swift index 4a6ad87f7..b284a8b3d 100644 --- a/Nynja/Modules/Settings/ThemePicker/View/ThemePickerViewController.swift +++ b/Nynja/Modules/Settings/ThemePicker/View/ViewController/ThemePickerViewController.swift @@ -9,11 +9,11 @@ import UIKit import SnapKit -final class ThemePickerViewController: BaseVC, ThemePickerViewProtocol { +final class ThemePickerViewController: CarouselPickerViewController, ThemePickerViewProtocol { var presenter: ThemePickerPresenterProtocol! { didSet { - _presenter = presenter + carouselPresenter = presenter } } @@ -22,13 +22,18 @@ final class ThemePickerViewController: BaseVC, ThemePickerViewProtocol { override func viewDidLoad() { super.viewDidLoad() - setupUI() presenter.showed() } // MARK: - UI Setup - private func setupUI() { + override func setupUI() { + super.setupUI() + screenTitle = "theme picker title".localized + collectionTitle = "choose theme title".localized + + // Important to register custom cell model + collectionView.register(viewModel: ThemeCellModel.self) } } diff --git a/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift b/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift index ac9ab67fb..09d1b32bc 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/Presenter/WheelPositionPickerPresenter.swift @@ -19,6 +19,9 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres var interactor: WheelPositionPickerInteractorInputProtocol! var wireFrame: WheelPositionPickerWireFrameProtocol! + + // MARK: - WheelPositionPickerPresenterProtocol + func showed() { let currentPosition = interactor.getCurrentWheelPosition() setupView(for: currentPosition) @@ -32,7 +35,7 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres } AlertManager.sharedInstance.showAlertWithTwoActions( - title: "wheel position alert title".localized, + title: "wheel position picker alert title".localized, message: "", firstActionTitle: "yes".localized, secondActionTitle: "no".localized, @@ -43,6 +46,16 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres ) } + + // MARK: - WheelPositionPickerInteractorOutputProtocol + + func didUpdateWheelPosition(_ wheelPosition: WheelPosition) { + setupView(for: wheelPosition) + } + + + // MARK: - Private + private func setupView(for currentPosition: WheelPosition) { let items = WheelPosition.all.map { WheelPositionCellModel(position: $0, isSelected: $0 == currentPosition) @@ -53,8 +66,4 @@ final class WheelPositionPickerPresenter: BasePresenter, WheelPositionPickerPres private func apply(wheelPosition: WheelPosition) { interactor.setWheelPosition(wheelPosition) } - - func didUpdateWheelPosition(_ wheelPosition: WheelPosition) { - setupView(for: wheelPosition) - } } diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index 3d580cf32..5d383fbed 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -6,7 +6,7 @@ // Copyright © 2018 TecSynt Solutions. All rights reserved. // -import Foundation +import UIKit struct WheelPositionCellModel: CellViewModel, SelectableCellModel, TextRepresentable { diff --git a/Nynja/OptionsItemsFactory.swift b/Nynja/OptionsItemsFactory.swift index ffc17a543..0fa01c956 100644 --- a/Nynja/OptionsItemsFactory.swift +++ b/Nynja/OptionsItemsFactory.swift @@ -20,7 +20,7 @@ class OptionsItemsFactory: WCBaseItemsFactory { // MARK: - Second lvl override var secondLevelItems: ItemModels { - return [logout, wheelPosition, buildNumber, about, deleteAccount] + return [wheelPosition, buildNumber, theme, logout, about, deleteAccount] } @@ -40,6 +40,13 @@ class OptionsItemsFactory: WCBaseItemsFactory { return item } + var theme: ImageActionItemModel { + let item = ImageActionItemModel(navItem: .theme, action: { [weak navigateDelegate] (item, indexPath) in + navigateDelegate?.showThemePicker(indexPath: indexPath) + }) + return item + } + var about: ImageActionItemModel { let item = ImageActionItemModel(navItem: .about, action: { [weak navigateDelegate] (item, indexPath) in navigateDelegate?.showAbout(indexPath: indexPath) diff --git a/Nynja/Resources/en.lproj/Localizable.strings b/Nynja/Resources/en.lproj/Localizable.strings index fe7833424..93485d5b9 100644 --- a/Nynja/Resources/en.lproj/Localizable.strings +++ b/Nynja/Resources/en.lproj/Localizable.strings @@ -393,7 +393,15 @@ "wheel current position" = "current position"; "wheel left hand" = "Left hand"; "wheel right hand" = "Right hand"; -"wheel position alert title" = "Use this wheel position?"; +"wheel position picker alert title" = "Use this wheel position?"; + +//MARK: Theme Picker +"theme picker title" = "THEME"; +"choose theme title" = "Choose the theme that's best for you."; +"theme current name" = "current theme"; +"theme dark name" = "Back In Black"; +"theme light name" = "Stairway To Heaven"; +"theme picker alert title" = "Use this theme?"; //MARK: Build Number "build number title" = "BUILD NUMBER"; diff --git a/Nynja/Services/MQTT/MQTTService.swift b/Nynja/Services/MQTT/MQTTService.swift index a470ca1ca..e7477d6e5 100644 --- a/Nynja/Services/MQTT/MQTTService.swift +++ b/Nynja/Services/MQTT/MQTTService.swift @@ -22,7 +22,7 @@ class MQTTService: NSObject, CocoaMQTTDelegate, ReachabilityServiceObserver { static let version = 3 - var currentHost = host.DemoTemp + var currentHost = host.Test let port: UInt16 = 1883 var push: String? diff --git a/Nynja/ThemeItemsFactory.swift b/Nynja/ThemeItemsFactory.swift new file mode 100644 index 000000000..f7e0724b1 --- /dev/null +++ b/Nynja/ThemeItemsFactory.swift @@ -0,0 +1,18 @@ +// +// ThemeItemsFactory.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +class ThemeItemsFactory: OptionsItemsFactory { + + // MARK: - Second lvl + + override var theme: ImageActionItemModel { + let item = super.theme + item.state = .highlighted + return item + } +} diff --git a/Nynja/UISettings/Theme.swift b/Nynja/UISettings/Theme.swift new file mode 100644 index 000000000..4f59c3f1c --- /dev/null +++ b/Nynja/UISettings/Theme.swift @@ -0,0 +1,35 @@ +// +// Theme.swift +// Nynja +// +// Created by Anton Poltoratskyi on 01.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +enum Theme: String { + static let `default` = Theme.dark + static let all: [Theme] = [light, dark] + + case light = "light" + case dark = "dark" + + var name: String { + switch self { + case .light: + return "theme light name".localized + case .dark: + return "theme dark name".localized + } + } + + var backgroundName: String { + switch self { + case .light: + return "splash_background" + case .dark: + return "background" + } + } +} diff --git a/Nynja/UISettings/UISettingsService.swift b/Nynja/UISettings/UISettingsService.swift index d841cb7c1..d4e8032a5 100644 --- a/Nynja/UISettings/UISettingsService.swift +++ b/Nynja/UISettings/UISettingsService.swift @@ -9,8 +9,11 @@ import Foundation struct UISettings { - static let `default` = UISettings(wheelPosition: .default) + static let `default` = UISettings(wheelPosition: .default, + theme: .default) + fileprivate(set) var wheelPosition: WheelPosition + fileprivate(set) var theme: Theme } typealias UISettingsChangeHandler = (UISettings) -> Void @@ -18,6 +21,7 @@ typealias UISettingsChangeHandler = (UISettings) -> Void final class UISettingsService { private enum Keys { static let wheelPosition = "wheelPosition" + static let theme = "theme" } static let shared = UISettingsService() @@ -26,7 +30,7 @@ final class UISettingsService { // MARK: - Settings private lazy var settings: UISettings = { - return UISettings(wheelPosition: wheelPosition) + return UISettings(wheelPosition: wheelPosition, theme: theme) }() var wheelPosition: WheelPosition { @@ -41,6 +45,18 @@ final class UISettingsService { } } + var theme: Theme { + get { + guard let position = storage.string(forKey: Keys.theme) else { return .default } + return Theme(rawValue: position) ?? .default + } + set { + storage.set(newValue.rawValue, forKey: Keys.theme) + settings.theme = newValue + notifySubscribers(with: settings) + } + } + // MARK: - Subscribers private var subscribers: [AnyWeakSubscriber] = [] diff --git a/Nynja/UISettings/WheelPosition.swift b/Nynja/UISettings/WheelPosition.swift index baab3100a..ada5addcc 100644 --- a/Nynja/UISettings/WheelPosition.swift +++ b/Nynja/UISettings/WheelPosition.swift @@ -12,9 +12,6 @@ enum WheelPosition: String { case left = "left" case right = "right" + static let `default` = WheelPosition.right static let all: [WheelPosition] = [left, right] - - static var `default`: WheelPosition { - return .right - } } diff --git a/Nynja/Viper/BaseModule/BasePresenterProtocol.swift b/Nynja/Viper/BaseModule/BasePresenterProtocol.swift index afca9e38a..e86d339cb 100644 --- a/Nynja/Viper/BaseModule/BasePresenterProtocol.swift +++ b/Nynja/Viper/BaseModule/BasePresenterProtocol.swift @@ -6,7 +6,7 @@ // Copyright © 2018 TecSynt Solutions. All rights reserved. // -protocol BasePresenterProtocol { +protocol BasePresenterProtocol: class { var wcDataManager: WCDataManagerProtocol { get set } var itemsFactory: WCItemsFactory? { get } -- GitLab From b32831c07ab04a651cae03e6e37729c17c45682a Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Fri, 2 Mar 2018 11:21:49 +0200 Subject: [PATCH 24/24] Implemented theme picker UI. --- Nynja.xcodeproj/project.pbxproj | 182 +++++++++--------- .../CarouselPickerCollectionViewCell.swift | 28 +-- .../View/CollectionView/ThemeCellModel.swift | 4 +- .../ThemeCollectionViewCell.swift | 117 +++++++++++ .../WheelPositionCellModel.swift | 2 +- .../WheelPositionCollectionViewCell.swift | 33 ++++ .../View/TutorialViewController.swift | 2 +- Nynja/Resources/Constants.swift | 1 + Nynja/Resources/en.lproj/Localizable.strings | 1 + 9 files changed, 265 insertions(+), 105 deletions(-) create mode 100644 Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCollectionViewCell.swift create mode 100644 Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 56580e431..116b1c3fe 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -194,7 +194,7 @@ 26035BCE1F9A741C00003850 /* writer_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26035B2A1F9A73C200003850 /* writer_Spec.swift */; }; 260552A61F9E1CD100D68DE6 /* SearchHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260552A51F9E1CD100D68DE6 /* SearchHandler.swift */; }; 26060C961FFDCF4000E5C6F3 /* NSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26060C951FFDCF4000E5C6F3 /* NSLog.swift */; }; - 2607270A203C598F00290545 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 2607270A203C598F00290545 /* (null) in Sources */ = {isa = PBXBuildFile; }; 2617AE711FD87BC800759269 /* DrawableAudioWaveform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2617AE701FD87BC800759269 /* DrawableAudioWaveform.swift */; }; 261F2E2E200EB0AD007D0813 /* RepliesVC+CellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261F2E2D200EB0AD007D0813 /* RepliesVC+CellDelegate.swift */; }; 262D43872033417F002F1E45 /* FriendExtansion+BERT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 262D43862033417F002F1E45 /* FriendExtansion+BERT.swift */; }; @@ -409,14 +409,14 @@ 358DE87E1F9D342600B558A3 /* ServiceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 358DE87D1F9D342600B558A3 /* ServiceManager.swift */; }; 359E343F1F55FA0F002F5F3E /* 1-second-of-silence.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 359E343E1F55FA0F002F5F3E /* 1-second-of-silence.mp3 */; }; 359EB22C1F9A137200147437 /* ChatListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359EB22B1F9A137200147437 /* ChatListVC.swift */; }; - 359EB2301F9A16AB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2311F9A16B200147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2301F9A16AB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2311F9A16B200147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2321F9A16BC00147437 /* StringAtom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A36E5231F4C6A0F001427DF /* StringAtom.swift */; }; - 359EB2331F9A16C300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2341F9A16CF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2331F9A16C300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2341F9A16CF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2351F9A16D800147437 /* CountryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1D03001F0B27D0005F5F18 /* CountryModel.swift */; }; - 359EB2371F9A170E00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2381F9A171400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2371F9A170E00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2381F9A171400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB23A1F9A18B400147437 /* MQTTService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8045CD1F60C8E200AED866 /* MQTTService.swift */; }; 359EB23B1F9A1BC700147437 /* ReachabilityService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1C87431F6103820029B0BC /* ReachabilityService.swift */; }; 359EB23C1F9A1BD800147437 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1C87411F6101A50029B0BC /* Reachability.swift */; }; @@ -424,41 +424,41 @@ 359EB23F1F9A1CCA00147437 /* HandleService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1DC7381EF151C8006A8E9F /* HandleService.swift */; }; 359EB2401F9A1CCE00147437 /* IoHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A1DC73E1EF15B65006A8E9F /* IoHandler.swift */; }; 359EB2441F9A1CFE00147437 /* Bert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A768DE51ECB3E8D00108F7C /* Bert.swift */; }; - 359EB2451F9A1D2600147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2461F9A1D3200147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2471F9A1D6100147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2481F9A1D6D00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2491F9A1D7900147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24A1F9A1D8700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24B1F9A1D9A00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24C1F9A1DAA00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24D1F9A1DBB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24E1F9A1DCC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2511F9A1DDF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2521F9A1E0700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2531F9A1E1300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2541F9A1E2000147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2551F9A1E2C00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2561F9A1E3800147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2451F9A1D2600147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2461F9A1D3200147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2471F9A1D6100147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2481F9A1D6D00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2491F9A1D7900147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24A1F9A1D8700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24B1F9A1D9A00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24C1F9A1DAA00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24D1F9A1DBB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24E1F9A1DCC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB24F1F9A1DCF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2501F9A1DDC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2511F9A1DDF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2521F9A1E0700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2531F9A1E1300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2541F9A1E2000147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2551F9A1E2C00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2561F9A1E3800147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2571F9A1E5000147437 /* BaseMQTTModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A62B7D71F4CB9D100F45B51 /* BaseMQTTModel.swift */; }; - 359EB2581F9A1E7400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2591F9A1E8B00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25A1F9A1E9100147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25B1F9A1E9700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25C1F9A1E9D00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25D1F9A1EA500147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25E1F9A1EAD00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB25F1F9A1EB400147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2601F9A1EBC00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2611F9A1EC300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2621F9A1ECF00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2631F9A1ED600147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2641F9A1EDB00147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB26E1F9A200300147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB26F1F9A200700147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; - 359EB2711F9A203800147437 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 359EB2581F9A1E7400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2591F9A1E8B00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25A1F9A1E9100147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25B1F9A1E9700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25C1F9A1E9D00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25D1F9A1EA500147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25E1F9A1EAD00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB25F1F9A1EB400147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2601F9A1EBC00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2611F9A1EC300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2621F9A1ECF00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2631F9A1ED600147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2641F9A1EDB00147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB26E1F9A200300147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB26F1F9A200700147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 359EB2711F9A203800147437 /* (null) in Sources */ = {isa = PBXBuildFile; }; 359EB2751F9A284F00147437 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8218831EDEEEB100337B05 /* Constants.swift */; }; 359EB2761F9A285C00147437 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8218871EDF102D00337B05 /* Color.swift */; }; 359EB27B1F9A28C500147437 /* MessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359EB27A1F9A28C500147437 /* MessageHandler.swift */; }; @@ -667,7 +667,7 @@ 4BAB9CE22035CAF500385520 /* ScheduleContentType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE12035CAF500385520 /* ScheduleContentType.swift */; }; 4BAB9CE42035CB0A00385520 /* ScheduleTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE32035CB0A00385520 /* ScheduleTarget.swift */; }; 4BAB9CE62035CB3800385520 /* ScheduleDisplayInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB9CE52035CB3800385520 /* ScheduleDisplayInfo.swift */; }; - 4BB634BB203C33EA006581C4 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 4BB634BB203C33EA006581C4 /* (null) in Sources */ = {isa = PBXBuildFile; }; 4BD50B8920333F3B005FFF06 /* MessageForwardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD50B8820333F3B005FFF06 /* MessageForwardView.swift */; }; 4BD53BF4202C8BCA00569C1A /* AVURLAsset+Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = E77FBDDC1FFE828400BDB255 /* AVURLAsset+Duration.swift */; }; 4BDC7E5F203454D300BCD381 /* MessageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BDC7E5E203454D300BCD381 /* MessageContainerView.swift */; }; @@ -740,6 +740,8 @@ 7A8FE56A8E5D02256D8BE936 /* EditPhotoPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4177485419FF2E8F7CF8FF98 /* EditPhotoPresenter.swift */; }; 7C51CDC1260CE191C07EE46C /* SelectCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFD3063186FFCB048E843FD /* SelectCountryViewController.swift */; }; 82FCF48AA4A8C04CC8B0B5B6 /* FavoritesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC0DFB96051C50F0FC5B9CA /* FavoritesWireframe.swift */; }; + 85018417204945F200F324A1 /* WheelPositionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85018416204945F200F324A1 /* WheelPositionCollectionViewCell.swift */; }; + 85018419204946C900F324A1 /* ThemeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85018418204946C900F324A1 /* ThemeCollectionViewCell.swift */; }; 85029EE3203DA8EC00FDD9B6 /* ChatState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85029EE2203DA8EC00FDD9B6 /* ChatState.swift */; }; 85082DDD2045A873000AE4B2 /* UISettingsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85082DDC2045A873000AE4B2 /* UISettingsService.swift */; }; 85082DDF2045A8C2000AE4B2 /* WheelPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */; }; @@ -1743,6 +1745,8 @@ 83310EC1487B51C6F4FE9FB4 /* AudioRecorderInteractor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AudioRecorderInteractor.swift; sourceTree = ""; }; 83894D517BFF22637F2878B7 /* EditUsernameProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameProtocols.swift; sourceTree = ""; }; 83D3668B46C0CDA421807094 /* TimeZoneSelectorPresenter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TimeZoneSelectorPresenter.swift; sourceTree = ""; }; + 85018416204945F200F324A1 /* WheelPositionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPositionCollectionViewCell.swift; sourceTree = ""; }; + 85018418204946C900F324A1 /* ThemeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeCollectionViewCell.swift; sourceTree = ""; }; 85029EE2203DA8EC00FDD9B6 /* ChatState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatState.swift; sourceTree = ""; }; 85082DDC2045A873000AE4B2 /* UISettingsService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISettingsService.swift; sourceTree = ""; }; 85082DDE2045A8C2000AE4B2 /* WheelPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WheelPosition.swift; sourceTree = ""; }; @@ -4576,6 +4580,7 @@ isa = PBXGroup; children = ( 854FC1C82044674E00B12BE5 /* WheelPositionCellModel.swift */, + 85018416204945F200F324A1 /* WheelPositionCollectionViewCell.swift */, ); path = CollectionView; sourceTree = ""; @@ -4619,6 +4624,7 @@ isa = PBXGroup; children = ( 8596CEF12048A763006FC65D /* ThemeCellModel.swift */, + 85018418204946C900F324A1 /* ThemeCollectionViewCell.swift */, ); path = CollectionView; sourceTree = ""; @@ -6635,7 +6641,7 @@ "${SRCROOT}/Pods/Target Support Files/Pods-Nynja/Pods-Nynja-resources.sh", "${PODS_ROOT}/GoogleMaps/Maps/Frameworks/GoogleMaps.framework/Resources/GoogleMaps.bundle", "${PODS_ROOT}/GooglePlaces/Frameworks/GooglePlaces.framework/Resources/GooglePlaces.bundle", - "${SRCROOT}/Pods/Target Support Files/Pods-Nynja/Pods-Nynja-resources.sh" + "${SRCROOT}/Pods/Target Support Files/Pods-Nynja/Pods-Nynja-resources.sh", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -6693,7 +6699,7 @@ 265AEA191FE9B1C600AC4806 /* MemberHandler.swift in Sources */, 269848CC200EA0ED00590D6F /* StarModels.swift in Sources */, 005887012032070C00FE2E89 /* userTask_Spec.swift in Sources */, - 359EB2301F9A16AB00147437 /* BuildFile in Sources */, + 359EB2301F9A16AB00147437 /* (null) in Sources */, 35B1AB921FA348C100E65233 /* Service.swift in Sources */, 2648B1511FEAA8BA007F2AAE /* IdGenerator.swift in Sources */, 359EB23F1F9A1CCA00147437 /* HandleService.swift in Sources */, @@ -6703,9 +6709,9 @@ 35B1AB9F1FA349FD00E65233 /* Star.swift in Sources */, 35B1AB8B1FA3457100E65233 /* Contact.swift in Sources */, 35B1ABA31FA34A2B00E65233 /* io_Spec.swift in Sources */, - 359EB2711F9A203800147437 /* BuildFile in Sources */, + 359EB2711F9A203800147437 /* (null) in Sources */, 359EB2441F9A1CFE00147437 /* Bert.swift in Sources */, - 359EB25C1F9A1E9D00147437 /* BuildFile in Sources */, + 359EB25C1F9A1E9D00147437 /* (null) in Sources */, 35B1ABA51FA34A4B00E65233 /* ok2_Spec.swift in Sources */, 26B32B941FE20B9700888A0A /* mucExtension+BERT.swift in Sources */, E7A0C73D1FE965A400E00C2B /* TypingExtension.swift in Sources */, @@ -6713,14 +6719,14 @@ 35B1ABBD1FA34FEB00E65233 /* cur.swift in Sources */, 35B1ABA11FA34A0D00E65233 /* Tag.swift in Sources */, 005886FD203206FB00FE2E89 /* timeoutEvent.swift in Sources */, - 359EB2341F9A16CF00147437 /* BuildFile in Sources */, + 359EB2341F9A16CF00147437 /* (null) in Sources */, 359EB2401F9A1CCE00147437 /* IoHandler.swift in Sources */, - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */, + 359EB24F1F9A1DCF00147437 /* (null) in Sources */, 262D4389203352D4002F1E45 /* FriendExtansion+BERT.swift in Sources */, - 359EB24F1F9A1DCF00147437 /* BuildFile in Sources */, + 359EB24F1F9A1DCF00147437 /* (null) in Sources */, 35B1ABCA1FA3506C00E65233 /* Auth.swift in Sources */, - 359EB2491F9A1D7900147437 /* BuildFile in Sources */, - 359EB2381F9A171400147437 /* BuildFile in Sources */, + 359EB2491F9A1D7900147437 /* (null) in Sources */, + 359EB2381F9A171400147437 /* (null) in Sources */, 4B736D4720237C140028F2CB /* CGSizeExtension.swift in Sources */, E785F15A1FF3E38D006C52D9 /* UIImageView+Rounded.swift in Sources */, 35B1ABBE1FA34FF000E65233 /* Cursor.swift in Sources */, @@ -6735,9 +6741,9 @@ 359EB2351F9A16D800147437 /* CountryModel.swift in Sources */, 35B1AB8D1FA3458500E65233 /* Desc.swift in Sources */, 35B1ABA21FA34A0F00E65233 /* Tag_Spec.swift in Sources */, - 359EB24E1F9A1DCC00147437 /* BuildFile in Sources */, + 359EB24E1F9A1DCC00147437 /* (null) in Sources */, 35B98FA21F9CB948009B8DEC /* Layout.swift in Sources */, - 359EB2551F9A1E2C00147437 /* BuildFile in Sources */, + 359EB2551F9A1E2C00147437 /* (null) in Sources */, 35B1ABB81FA34CA800E65233 /* reader_Spec.swift in Sources */, 35B1AB9C1FA3498200E65233 /* Member_Spec.swift in Sources */, 005886FA203206F100FE2E89 /* serviceTask.swift in Sources */, @@ -6749,13 +6755,13 @@ 35B1AB961FA3491900E65233 /* Roster_Spec.swift in Sources */, 35B1AB8F1FA3488000E65233 /* Profile.swift in Sources */, 35B1ABCD1FA3508D00E65233 /* Index.swift in Sources */, - 359EB2541F9A1E2000147437 /* BuildFile in Sources */, + 359EB2541F9A1E2000147437 /* (null) in Sources */, 35B1ABBF1FA34FFC00E65233 /* iter.swift in Sources */, 35B1ABA61FA34A5C00E65233 /* error_Spec.swift in Sources */, - 359EB24C1F9A1DAA00147437 /* BuildFile in Sources */, + 359EB24C1F9A1DAA00147437 /* (null) in Sources */, 35B1ABC21FA3501300E65233 /* log.swift in Sources */, 35B1AB9D1FA3499E00E65233 /* muc_Spec.swift in Sources */, - 359EB2531F9A1E1300147437 /* BuildFile in Sources */, + 359EB2531F9A1E1300147437 /* (null) in Sources */, 35B1ABCE1FA3509600E65233 /* Test.swift in Sources */, 005886DD2032024F00FE2E89 /* process.swift in Sources */, 35B1AB931FA348C400E65233 /* Service_Spec.swift in Sources */, @@ -6764,7 +6770,7 @@ 0008E91C20333BC1003E316E /* JobHandler.swift in Sources */, E70A8D711FE84EE6008B0BD0 /* SendingStatus.swift in Sources */, E7A77FDC1FACC5E2004AE609 /* ContactExtension.swift in Sources */, - 359EB24A1F9A1D8700147437 /* BuildFile in Sources */, + 359EB24A1F9A1D8700147437 /* (null) in Sources */, 005886DE2032025200FE2E89 /* sequenceFlow.swift in Sources */, 35C5BD341F9AA7F0008BDD3A /* ChatListTableDS.swift in Sources */, 359EB2751F9A284F00147437 /* Constants.swift in Sources */, @@ -6776,7 +6782,7 @@ 35B98F9C1F9BFDC3009B8DEC /* MQTTServiceChat.swift in Sources */, 005886D62032023000FE2E89 /* Job_Spec.swift in Sources */, 005886DB2032024800FE2E89 /* Job.swift in Sources */, - 359EB2601F9A1EBC00147437 /* BuildFile in Sources */, + 359EB2601F9A1EBC00147437 /* (null) in Sources */, E757B5401FE92CA800467BA2 /* RecordingStatus.swift in Sources */, 35B1ABCF1FA350B600E65233 /* Profile_Spec.swift in Sources */, 266AE8C42034971A0096A12C /* AsyncOperation.swift in Sources */, @@ -6787,7 +6793,7 @@ 35B98F9F1F9BFDF1009B8DEC /* ReadMessageModel.swift in Sources */, 35B1ABBC1FA34FDE00E65233 /* reader.swift in Sources */, 005886FC203206F700FE2E89 /* boundaryEvent.swift in Sources */, - 359EB2561F9A1E3800147437 /* BuildFile in Sources */, + 359EB2561F9A1E3800147437 /* (null) in Sources */, E745A24C200621BC00D7EF42 /* TableDefinitionExtension.swift in Sources */, 2683F75A203F352D0003181A /* ButtonExtension.swift in Sources */, 359EB27B1F9A28C500147437 /* MessageHandler.swift in Sources */, @@ -6795,20 +6801,20 @@ 26A373571FC6EFC500616C21 /* ProgressHUD.swift in Sources */, E757B53E1FE92C9E00467BA2 /* TypingModel.swift in Sources */, 359EB2321F9A16BC00147437 /* StringAtom.swift in Sources */, - 359EB2521F9A1E0700147437 /* BuildFile in Sources */, - 359EB2471F9A1D6100147437 /* BuildFile in Sources */, + 359EB2521F9A1E0700147437 /* (null) in Sources */, + 359EB2471F9A1D6100147437 /* (null) in Sources */, 35B1AB821F9FB06500E65233 /* AttachmentModel.swift in Sources */, 359EB2831F9A2E6A00147437 /* ProfileHandler.swift in Sources */, - 359EB25A1F9A1E9100147437 /* BuildFile in Sources */, + 359EB25A1F9A1E9100147437 /* (null) in Sources */, 005886F8203206EB00FE2E89 /* Task.swift in Sources */, 35B1AB901FA3489900E65233 /* Feature.swift in Sources */, 35B1AB9A1FA3496E00E65233 /* Room_Spec.swift in Sources */, 005886DC2032024B00FE2E89 /* messageEvent.swift in Sources */, - 359EB25F1F9A1EB400147437 /* BuildFile in Sources */, + 359EB25F1F9A1EB400147437 /* (null) in Sources */, 26FA4211201823AA00E6F6EC /* StarHandler.swift in Sources */, 35B1ABB41FA34B9000E65233 /* p2p.swift in Sources */, 2679D1061FEA0D1F00BC0013 /* HistoryHandler.swift in Sources */, - 359EB24B1F9A1D9A00147437 /* BuildFile in Sources */, + 359EB24B1F9A1D9A00147437 /* (null) in Sources */, 35B1ABA41FA34A3C00E65233 /* ok_Spec.swift in Sources */, 35B1ABC81FA3505700E65233 /* Person.swift in Sources */, 35B1ABD41FA36F6A00E65233 /* ChatsServiceProtocol.swift in Sources */, @@ -6823,20 +6829,20 @@ 005887002032070900FE2E89 /* serviceTask_Spec.swift in Sources */, 26B32B8E1FE20B4D00888A0A /* MessageExtension+BERT.swift in Sources */, 35B1AB841F9FB10600E65233 /* GCD.swift in Sources */, - 359EB26F1F9A200700147437 /* BuildFile in Sources */, + 359EB26F1F9A200700147437 /* (null) in Sources */, 359EB2761F9A285C00147437 /* Color.swift in Sources */, - 359EB2641F9A1EDB00147437 /* BuildFile in Sources */, + 359EB2641F9A1EDB00147437 /* (null) in Sources */, 26A0CFE2200513B4006F6617 /* MemberExtension+BERT.swift in Sources */, 35B1ABB01FA34B2600E65233 /* SearchModel.swift in Sources */, 4B052CB12036193900BC2A9B /* StringAtomExtension.swift in Sources */, 35B98F9E1F9BFDE1009B8DEC /* SendModel.swift in Sources */, - 359EB2621F9A1ECF00147437 /* BuildFile in Sources */, + 359EB2621F9A1ECF00147437 /* (null) in Sources */, 35B1ABC71FA3504600E65233 /* CDR.swift in Sources */, 35B1ABB11FA34B5400E65233 /* p2p_Spec.swift in Sources */, 264FFA971FC591600028243D /* Describable.swift in Sources */, 35B1AB981FA3495300E65233 /* Message_Spec.swift in Sources */, 265AEA181FE9B1BD00AC4806 /* MemberModel.swift in Sources */, - 359EB2591F9A1E8B00147437 /* BuildFile in Sources */, + 359EB2591F9A1E8B00147437 /* (null) in Sources */, 35B1AB831F9FB0DD00E65233 /* AmazonManager.swift in Sources */, 35B1ABAC1FA34AE100E65233 /* error2.swift in Sources */, E76978321FCD7323005B4F36 /* RosterHandler.swift in Sources */, @@ -6844,7 +6850,7 @@ 262D438820335225002F1E45 /* FriendRequstModel.swift in Sources */, 263D662A1FE8359900A509F8 /* RoomExtension+BERT.swift in Sources */, 005886D72032023200FE2E89 /* messageEvent_Spec.swift in Sources */, - 359EB2481F9A1D6D00147437 /* BuildFile in Sources */, + 359EB2481F9A1D6D00147437 /* (null) in Sources */, 35B1ABAB1FA34ADE00E65233 /* error.swift in Sources */, 35B1AB8C1FA3457C00E65233 /* Message.swift in Sources */, 35B1ABB21FA34B6F00E65233 /* History_Spec.swift in Sources */, @@ -6852,7 +6858,7 @@ 263D66311FE8D30200A509F8 /* TypingExtension+BERT.swift in Sources */, 2683F757203F34BE0003181A /* act_Spec.swift in Sources */, E757B53F1FE92CA400467BA2 /* ActionStatus.swift in Sources */, - 359EB2631F9A1ED600147437 /* BuildFile in Sources */, + 359EB2631F9A1ED600147437 /* (null) in Sources */, E7A77FDB1FACC58A004AE609 /* KeychainService.swift in Sources */, 35B98FA11F9CB898009B8DEC /* ChatListVCLayout.swift in Sources */, 35B1ABC01FA34FFE00E65233 /* iterator.swift in Sources */, @@ -6861,24 +6867,24 @@ 2691CE2E1FC5A5D20008F10D /* ContactHandler.swift in Sources */, 005886DA2032023D00FE2E89 /* sequenceFlow_Spec.swift in Sources */, 35C5BD361F9AA8D0008BDD3A /* ChatListCell.swift in Sources */, - 359EB2311F9A16B200147437 /* BuildFile in Sources */, + 359EB2311F9A16B200147437 /* (null) in Sources */, 35B1ABC41FA3502B00E65233 /* chain.swift in Sources */, - 359EB2611F9A1EC300147437 /* BuildFile in Sources */, - 359EB26E1F9A200300147437 /* BuildFile in Sources */, + 359EB2611F9A1EC300147437 /* (null) in Sources */, + 359EB26E1F9A200300147437 /* (null) in Sources */, 35B1ABB71FA34C8F00E65233 /* writer_Spec.swift in Sources */, - 359EB2371F9A170E00147437 /* BuildFile in Sources */, + 359EB2371F9A170E00147437 /* (null) in Sources */, 4B3B1A2A20248EDD001A47AF /* ThumbnailGenerator.swift in Sources */, 358DE87E1F9D342600B558A3 /* ServiceManager.swift in Sources */, - 359EB2451F9A1D2600147437 /* BuildFile in Sources */, + 359EB2451F9A1D2600147437 /* (null) in Sources */, 269848CB200EA0B400590D6F /* StarExtension+BERT.swift in Sources */, 359EB23A1F9A18B400147437 /* MQTTService.swift in Sources */, 359EB22C1F9A137200147437 /* ChatListVC.swift in Sources */, 263D66341FE8D98700A509F8 /* TypingHandler.swift in Sources */, 35B1ABC61FA3503F00E65233 /* muc.swift in Sources */, 35B1ABAF1FA34B1500E65233 /* Search.swift in Sources */, - 359EB24D1F9A1DBB00147437 /* BuildFile in Sources */, + 359EB24D1F9A1DBB00147437 /* (null) in Sources */, 35B98F9D1F9BFDD4009B8DEC /* GetHistoryModel.swift in Sources */, - 359EB2461F9A1D3200147437 /* BuildFile in Sources */, + 359EB2461F9A1D3200147437 /* (null) in Sources */, 26E79CB81FF8452200F6EF5D /* RoomExtension.swift in Sources */, E7B3D5FC1FCC4053008BCFAC /* StorageService.swift in Sources */, 26C061C21FEAA26500A2EBE4 /* FeatureExtension+BERT.swift in Sources */, @@ -6887,17 +6893,17 @@ 359EB23C1F9A1BD800147437 /* Reachability.swift in Sources */, 35B1ABCB1FA3507B00E65233 /* Loc.swift in Sources */, 26FF00AC1FCC40D8002170B1 /* RecepientModel.swift in Sources */, - 359EB2331F9A16C300147437 /* BuildFile in Sources */, + 359EB2331F9A16C300147437 /* (null) in Sources */, 35B1ABB31FA34B7B00E65233 /* History.swift in Sources */, 26B32B6B1FE1717900888A0A /* WeakRef.swift in Sources */, - 359EB2511F9A1DDF00147437 /* BuildFile in Sources */, + 359EB2511F9A1DDF00147437 /* (null) in Sources */, 35B1AB941FA348ED00E65233 /* TypeSpec.swift in Sources */, - 359EB2581F9A1E7400147437 /* BuildFile in Sources */, + 359EB2581F9A1E7400147437 /* (null) in Sources */, 005886FF2032070600FE2E89 /* receiveTask_Spec.swift in Sources */, 268C62E32008DA0900433705 /* UIImageExtensions.swift in Sources */, 264FFA961FC5913A0028243D /* ProfileTable.swift in Sources */, 005887022032070F00FE2E89 /* boundaryEvent_Spec.swift in Sources */, - 359EB25D1F9A1EA500147437 /* BuildFile in Sources */, + 359EB25D1F9A1EA500147437 /* (null) in Sources */, 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */, 35B1AB951FA3491500E65233 /* Roster.swift in Sources */, 26770A551FFD2F91009AC870 /* StorageSubscriber.swift in Sources */, @@ -6906,13 +6912,13 @@ 35C5BD301F9A7CEA008BDD3A /* String+Localized.swift in Sources */, 35C5BD381F9AAE63008BDD3A /* UIViewController+SafeArea.swift in Sources */, 35B1ABB51FA34C0C00E65233 /* Desc_Spec.swift in Sources */, - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */, + 359EB2501F9A1DDC00147437 /* (null) in Sources */, 850AC31D203EC32200EF0774 /* ChatState.swift in Sources */, - 359EB2501F9A1DDC00147437 /* BuildFile in Sources */, + 359EB2501F9A1DDC00147437 /* (null) in Sources */, 2683F754203F34890003181A /* act.swift in Sources */, - 359EB25B1F9A1E9700147437 /* BuildFile in Sources */, + 359EB25B1F9A1E9700147437 /* (null) in Sources */, 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */, - 359EB25E1F9A1EAD00147437 /* BuildFile in Sources */, + 359EB25E1F9A1EAD00147437 /* (null) in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6969,6 +6975,7 @@ 6D485DD71F0AC94B00E12FB1 /* ContactCell.swift in Sources */, 261F2E2E200EB0AD007D0813 /* RepliesVC+CellDelegate.swift in Sources */, 26035B911F9A740A00003850 /* ok.swift in Sources */, + 85018417204945F200F324A1 /* WheelPositionCollectionViewCell.swift in Sources */, 6D485DDD1F0AC99F00E12FB1 /* ContactsWireframe.swift in Sources */, 4B0213042037331100650298 /* ScheduleMessageViewControllerConstants.swift in Sources */, 0008E92420347A8E003E316E /* DBJobMessage.swift in Sources */, @@ -7297,6 +7304,7 @@ 005A877F2034C22200372B03 /* JobExtension.swift in Sources */, 85788C4420442385003600C9 /* BuildNumberPresenter.swift in Sources */, 3AE0A84D1F20321A008A04F3 /* WheelItemView.swift in Sources */, + 85018419204946C900F324A1 /* ThemeCollectionViewCell.swift in Sources */, E70A8D681FE84E7B008B0BD0 /* SendingStatus.swift in Sources */, E7F2CFE21F5EEF1E00806E43 /* PermissionManager.swift in Sources */, E7598F671FA1D8B90082FBE7 /* ProfileMessageCellLayout.swift in Sources */, @@ -7341,7 +7349,7 @@ 26035B951F9A740A00003850 /* Person.swift in Sources */, 859B863920486068003272B2 /* CarouselPickerViewControllerLayout.swift in Sources */, E74EC9ED1FC2DA6E007268E6 /* RoomTable.swift in Sources */, - 2607270A203C598F00290545 /* BuildFile in Sources */, + 2607270A203C598F00290545 /* (null) in Sources */, 26E7D0451FCB880F001C69B7 /* Roster+DBRoster.swift in Sources */, E77D58A21F98C58A00FBE926 /* LabelExtensions.swift in Sources */, E79061BA1FBF2AF1009FD83A /* RosterTable.swift in Sources */, @@ -7482,7 +7490,7 @@ E7291E4E201B3CC100FB56B7 /* PositionType.swift in Sources */, 2AC52C9C5598DB3C4D3D9364 /* AddContactViaPhoneWireframe.swift in Sources */, E75D2CFA2004ED84001E6718 /* MessageVideoView.swift in Sources */, - 4BB634BB203C33EA006581C4 /* BuildFile in Sources */, + 4BB634BB203C33EA006581C4 /* (null) in Sources */, C9C6952E202349DA00A57297 /* SelectCountryCellLayout.swift in Sources */, E75D2CF22004ED84001E6718 /* MessageViewFactory.swift in Sources */, 005886E72032047800FE2E89 /* userTask.swift in Sources */, diff --git a/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift index abd358796..d50059fb7 100644 --- a/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift +++ b/Nynja/Modules/Settings/CarouselPicker/CollectionView/CarouselPickerCollectionViewCell.swift @@ -9,26 +9,26 @@ import UIKit import SnapKit -final class CarouselPickerCollectionViewCell: UICollectionViewCell { +class CarouselPickerCollectionViewCell: UICollectionViewCell { // MARK: - Views - private(set) lazy var imageView: UIImageView = { - let imageView = UIImageView() - self.contentView.addSubview(imageView) + private(set) lazy var containerView: UIView = { + let containerView = UIView() + self.contentView.addSubview(containerView) - imageView.layer.shadowOpacity = Constraints.shadow.alpha - imageView.layer.shadowRadius = Constraints.shadow.radius.adjustedByWidth - imageView.layer.shadowOffset = Constraints.shadow.offset.adjustedByWidth + containerView.layer.shadowOpacity = Constraints.shadow.alpha + containerView.layer.shadowRadius = Constraints.shadow.radius.adjustedByWidth + containerView.layer.shadowOffset = Constraints.shadow.offset.adjustedByWidth - imageView.clipsToBounds = false - imageView.layer.masksToBounds = false + containerView.clipsToBounds = false + containerView.layer.masksToBounds = false - imageView.snp.makeConstraints { maker in + containerView.snp.makeConstraints { maker in maker.top.bottom.centerX.equalToSuperview() - maker.width.equalTo(imageView.snp.height).multipliedBy(Constraints.imageView.aspectRatio) + maker.width.equalTo(containerView.snp.height).multipliedBy(Constraints.imageView.aspectRatio) } - return imageView + return containerView }() @@ -47,12 +47,12 @@ final class CarouselPickerCollectionViewCell: UICollectionViewCell { // MARK: - UI Setup - private func baseSetup() { + func baseSetup() { clipsToBounds = false layer.masksToBounds = false contentView.clipsToBounds = false contentView.layer.masksToBounds = false - imageView.isHidden = false + containerView.isHidden = false } } diff --git a/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift index 692613a08..f30e4bfb9 100644 --- a/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift +++ b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCellModel.swift @@ -13,8 +13,8 @@ struct ThemeCellModel: CellViewModel, SelectableCellModel, TextRepresentable { let theme: Theme var isSelected: Bool - func setup(cell: CarouselPickerCollectionViewCell) { - cell.imageView.image = UIImage(named: theme.backgroundName) + func setup(cell: ThemeCollectionViewCell) { + cell.backgroundImageView.image = UIImage(named: theme.backgroundName) } func title() -> String? { diff --git a/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCollectionViewCell.swift b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCollectionViewCell.swift new file mode 100644 index 000000000..56335f060 --- /dev/null +++ b/Nynja/Modules/Settings/ThemePicker/View/CollectionView/ThemeCollectionViewCell.swift @@ -0,0 +1,117 @@ +// +// ThemeCollectionViewCell.swift +// Nynja +// +// Created by Anton Poltoratskyi on 02.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +final class ThemeCollectionViewCell: CarouselPickerCollectionViewCell { + + // MARK: - Views + + private(set) lazy var backgroundImageView: UIImageView = { + let imageView = UIImageView() + self.containerView.addSubview(imageView) + + imageView.snp.makeConstraints { maker in + maker.edges.equalToSuperview() + } + + return imageView + }() + + private lazy var logoImageView: UIImageView = { + let imageView = UIImageView() + self.containerView.addSubview(imageView) + + imageView.image = #imageLiteral(resourceName: "icon") + + imageView.snp.makeConstraints { maker in + maker.width.equalTo(ThemeConstraints.imageLogo.width.adjustedByWidth) + maker.height.equalTo(ThemeConstraints.imageLogo.height.adjustedByWidth) + maker.centerX.equalToSuperview() + maker.centerY.equalToSuperview().offset(-ThemeConstraints.imageLogo.centerOffset.adjustedByWidth) + } + + return imageView + }() + + private lazy var textLogoImageView: UIImageView = { + let imageView = UIImageView() + self.containerView.addSubview(imageView) + + imageView.image = #imageLiteral(resourceName: "ic_logo") + + imageView.snp.makeConstraints { maker in + maker.width.equalTo(ThemeConstraints.textLogo.width.adjustedByWidth) + maker.height.equalTo(ThemeConstraints.textLogo.height.adjustedByWidth) + maker.centerX.equalToSuperview() + maker.centerY.equalToSuperview().offset(ThemeConstraints.textLogo.centerOffset.adjustedByWidth) + } + + return imageView + }() + + private lazy var subtitleLabel: UILabel = { + let width = ThemeConstraints.subtitleLabel.width.adjustedByWidth + let height = ThemeConstraints.subtitleLabel.height.adjustedByWidth + + let label = UILabel(size: CGSize(width: width, height: height), + color: Constants.colors.white.getColor(), + fontName: Constants.fonts.medium) + + label.text = "theme cell subtitle text".localized + label.textColor = Constants.colors.subtitleColor.getColor() + label.textAlignment = .center + + self.containerView.addSubview(label) + + label.snp.makeConstraints { maker in + maker.left.right.equalTo(textLogoImageView) + maker.top.equalTo(textLogoImageView.snp.bottom).offset(ThemeConstraints.subtitleLabel.topOffset.adjustedByWidth) + maker.height.equalTo(height) + } + + return label + }() + + + // MARK: - UI Setup + + override func baseSetup() { + super.baseSetup() + backgroundImageView.isHidden = false + logoImageView.isHidden = false + textLogoImageView.isHidden = false + subtitleLabel.isHidden = false + } +} + +// MARK: - Layout + +extension ThemeCollectionViewCell { + + enum ThemeConstraints { + enum imageLogo { + static let width: CGFloat = 140 + static let height: CGFloat = 132 + static let centerOffset: CGFloat = 86 + } + + enum textLogo { + static let width: CGFloat = 176 + static let height: CGFloat = 24 + static let centerOffset: CGFloat = 76 + } + + enum subtitleLabel { + static let width: CGFloat = 192 + static let height: CGFloat = 14 + static let topOffset: CGFloat = 4 + } + } +} diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift index 5d383fbed..b01bf1193 100644 --- a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift +++ b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCellModel.swift @@ -13,7 +13,7 @@ struct WheelPositionCellModel: CellViewModel, SelectableCellModel, TextRepresent let position: WheelPosition var isSelected: Bool - func setup(cell: CarouselPickerCollectionViewCell) { + func setup(cell: WheelPositionCollectionViewCell) { switch position { case .left: cell.imageView.image = UIImage(named: "wheel_left_image") diff --git a/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift new file mode 100644 index 000000000..c4dd9f813 --- /dev/null +++ b/Nynja/Modules/Settings/WheelPositionPicker/View/CollectionView/WheelPositionCollectionViewCell.swift @@ -0,0 +1,33 @@ +// +// WheelPositionCollectionViewCell.swift +// Nynja +// +// Created by Anton Poltoratskyi on 02.03.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import UIKit +import SnapKit + +final class WheelPositionCollectionViewCell: CarouselPickerCollectionViewCell { + + // MARK: - Views + + private(set) lazy var imageView: UIImageView = { + let imageView = UIImageView() + self.containerView.addSubview(imageView) + + imageView.snp.makeConstraints { maker in + maker.edges.equalToSuperview() + } + + return imageView + }() + + // MARK: - UI Setup + + override func baseSetup() { + super.baseSetup() + imageView.isHidden = false + } +} diff --git a/Nynja/Modules/tutorial/View/TutorialViewController.swift b/Nynja/Modules/tutorial/View/TutorialViewController.swift index b92530a1d..68076a505 100644 --- a/Nynja/Modules/tutorial/View/TutorialViewController.swift +++ b/Nynja/Modules/tutorial/View/TutorialViewController.swift @@ -86,7 +86,7 @@ class TutorialViewController: BaseVC, TutorialViewProtocol, UICollectionViewDele lazy var descLabel: UILabel = { let lbl = UILabel() - lbl.textColor = Color(hex: "#696a6b").getColor() + lbl.textColor = Constants.colors.subtitleColor.getColor() lbl.numberOfLines = 1 let width = Constraints.descLabel.width.adjustedByWidth diff --git a/Nynja/Resources/Constants.swift b/Nynja/Resources/Constants.swift index f30ccfbc9..6ed169b6d 100644 --- a/Nynja/Resources/Constants.swift +++ b/Nynja/Resources/Constants.swift @@ -72,6 +72,7 @@ struct Constants { static let greenForReturnToCallColor = Color(hex:"#00E359") static let blackTranslucent = Color(hex:"#272a30", alpha: 0.9) static let darkGreen = Color(hex: "#106543") + static let subtitleColor = Color(hex: "#696a6b") } struct Amazon { diff --git a/Nynja/Resources/en.lproj/Localizable.strings b/Nynja/Resources/en.lproj/Localizable.strings index 93485d5b9..96d8049a9 100644 --- a/Nynja/Resources/en.lproj/Localizable.strings +++ b/Nynja/Resources/en.lproj/Localizable.strings @@ -402,6 +402,7 @@ "theme dark name" = "Back In Black"; "theme light name" = "Stairway To Heaven"; "theme picker alert title" = "Use this theme?"; +"theme cell subtitle text" = "MOBILE COMMUNICATOR"; //MARK: Build Number "build number title" = "BUILD NUMBER"; -- GitLab