// // MaterialShowcaseController.swift // MaterialShowcase // // Created by Andrei Tulai on 2017-11-06. // Copyright © 2017 Aromajoin. All rights reserved. // import Foundation public protocol MaterialShowcaseControllerDelegate: class { func materialShowcaseController(_ materialShowcaseController: MaterialShowcaseController, materialShowcaseWillDisappear materialShowcase: MaterialShowcase, forIndex index: Int) func materialShowcaseController(_ materialShowcaseController: MaterialShowcaseController, materialShowcaseDidDisappear materialShowcase: MaterialShowcase, forIndex index: Int) } public extension MaterialShowcaseControllerDelegate { func materialShowcaseController(_ materialShowcaseController: MaterialShowcaseController, materialShowcaseWillDisappear materialShowcase: MaterialShowcase, forIndex index: Int) { // do nothing } func materialShowcaseController(_ materialShowcaseController: MaterialShowcaseController, materialShowcaseDidDisappear materialShowcase: MaterialShowcase, forIndex index: Int) { // do nothing } } public protocol MaterialShowcaseControllerDataSource: class { func numberOfShowcases(for materialShowcaseController: MaterialShowcaseController) -> Int func materialShowcaseController(_ materialShowcaseController: MaterialShowcaseController, showcaseAt index: Int) -> MaterialShowcase? } open class MaterialShowcaseController { public weak var dataSource: MaterialShowcaseControllerDataSource? public weak var delegate: MaterialShowcaseControllerDelegate? public var started = false public var currentIndex = -1 public weak var currentShowcase: MaterialShowcase? public init() { } open func start() { started = true nextShowcase() } open func stop() { started = false currentIndex = -1 currentShowcase?.completeShowcase(animated: true) } open func nextShowcase() { if let currentShowcase = self.currentShowcase { currentShowcase.completeShowcase(animated: true) self.currentShowcase = nil } let numberOfShowcases = dataSource?.numberOfShowcases(for: self) ?? 0 currentIndex += 1 let showcase = dataSource?.materialShowcaseController(self, showcaseAt: currentIndex) showcase?.delegate = self guard currentIndex < numberOfShowcases else { started = false currentIndex = -1 return } currentShowcase = showcase showcase?.show(completion: nil) } } extension MaterialShowcaseController: MaterialShowcaseDelegate { public func showCaseWillDismiss(showcase: MaterialShowcase, didTapTarget: Bool) { delegate?.materialShowcaseController(self, materialShowcaseWillDisappear: showcase, forIndex: currentIndex) } public func showCaseDidDismiss(showcase: MaterialShowcase, didTapTarget: Bool) { delegate?.materialShowcaseController(self, materialShowcaseDidDisappear: showcase, forIndex: currentIndex) currentShowcase = nil if started { self.nextShowcase() } } }