Commit 5ff5bf7f by Daniel Dahan

issue-309: Updated example SideNavigationController example to demonstrate how…

issue-309: Updated example SideNavigationController example to demonstrate how to transition the rootViewController.
parent fa7f1714
...@@ -47,18 +47,13 @@ class AppMenuViewController: MenuViewController { ...@@ -47,18 +47,13 @@ class AppMenuViewController: MenuViewController {
super.init(coder: aDecoder) super.init(coder: aDecoder)
} }
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { override init(rootViewController: UIViewController) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) super.init(rootViewController: rootViewController)
}
init() {
super.init(nibName: nil, bundle: nil)
prepareTabBarItem() prepareTabBarItem()
} }
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
prepareView()
prepareMenuView() prepareMenuView()
} }
...@@ -103,11 +98,6 @@ class AppMenuViewController: MenuViewController { ...@@ -103,11 +98,6 @@ class AppMenuViewController: MenuViewController {
} }
} }
/// Prepares view.
private func prepareView() {
view.backgroundColor = MaterialColor.black
}
/// Prepares the menuView. /// Prepares the menuView.
private func prepareMenuView() { private func prepareMenuView() {
var image: UIImage? = MaterialIcon.cm.add var image: UIImage? = MaterialIcon.cm.add
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
96E5E4671CC1E5EC0054837B /* PurpleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E4661CC1E5EC0054837B /* PurpleViewController.swift */; };
96E5E4691CC1E6130054837B /* OrangeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E4681CC1E6130054837B /* OrangeViewController.swift */; };
96E5E46B1CC1E8FB0054837B /* AppLeftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E46A1CC1E8FB0054837B /* AppLeftViewController.swift */; };
96F2F2051C97A68800A5FE27 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */; }; 96F2F2051C97A68800A5FE27 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */; };
96F2F2061C97A68800A5FE27 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */; }; 96F2F2061C97A68800A5FE27 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */; };
96F2F2071C97A68800A5FE27 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96F2F1FF1C97A68800A5FE27 /* LaunchScreen.storyboard */; }; 96F2F2071C97A68800A5FE27 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 96F2F1FF1C97A68800A5FE27 /* LaunchScreen.storyboard */; };
...@@ -30,6 +33,9 @@ ...@@ -30,6 +33,9 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
9663F9651C7ADCB600AF0965 /* SideNavigationController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SideNavigationController.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9663F9651C7ADCB600AF0965 /* SideNavigationController.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SideNavigationController.app; sourceTree = BUILT_PRODUCTS_DIR; };
96E5E4661CC1E5EC0054837B /* PurpleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PurpleViewController.swift; sourceTree = "<group>"; };
96E5E4681CC1E6130054837B /* OrangeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrangeViewController.swift; sourceTree = "<group>"; };
96E5E46A1CC1E8FB0054837B /* AppLeftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppLeftViewController.swift; sourceTree = "<group>"; };
96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
96F2F2001C97A68800A5FE27 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 96F2F2001C97A68800A5FE27 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
...@@ -70,9 +76,12 @@ ...@@ -70,9 +76,12 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */, 96F2F1FD1C97A68800A5FE27 /* AppDelegate.swift */,
96E5E46A1CC1E8FB0054837B /* AppLeftViewController.swift */,
96F2F2011C97A68800A5FE27 /* BlueViewController.swift */, 96F2F2011C97A68800A5FE27 /* BlueViewController.swift */,
96F2F2021C97A68800A5FE27 /* GreenViewcontroller.swift */, 96F2F2021C97A68800A5FE27 /* GreenViewcontroller.swift */,
96F2F2041C97A68800A5FE27 /* YellowViewController.swift */, 96F2F2041C97A68800A5FE27 /* YellowViewController.swift */,
96E5E4661CC1E5EC0054837B /* PurpleViewController.swift */,
96E5E4681CC1E6130054837B /* OrangeViewController.swift */,
96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */, 96F2F1FE1C97A68800A5FE27 /* Assets.xcassets */,
96F2F1FF1C97A68800A5FE27 /* LaunchScreen.storyboard */, 96F2F1FF1C97A68800A5FE27 /* LaunchScreen.storyboard */,
96F2F2031C97A68800A5FE27 /* Info.plist */, 96F2F2031C97A68800A5FE27 /* Info.plist */,
...@@ -153,7 +162,10 @@ ...@@ -153,7 +162,10 @@
files = ( files = (
96F2F20B1C97A68800A5FE27 /* YellowViewController.swift in Sources */, 96F2F20B1C97A68800A5FE27 /* YellowViewController.swift in Sources */,
96F2F2081C97A68800A5FE27 /* BlueViewController.swift in Sources */, 96F2F2081C97A68800A5FE27 /* BlueViewController.swift in Sources */,
96E5E4691CC1E6130054837B /* OrangeViewController.swift in Sources */,
96E5E4671CC1E5EC0054837B /* PurpleViewController.swift in Sources */,
96F2F2051C97A68800A5FE27 /* AppDelegate.swift in Sources */, 96F2F2051C97A68800A5FE27 /* AppDelegate.swift in Sources */,
96E5E46B1CC1E8FB0054837B /* AppLeftViewController.swift in Sources */,
96F2F2091C97A68800A5FE27 /* GreenViewcontroller.swift in Sources */, 96F2F2091C97A68800A5FE27 /* GreenViewcontroller.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
......
...@@ -38,7 +38,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ...@@ -38,7 +38,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
window = UIWindow(frame: UIScreen.mainScreen().bounds) window = UIWindow(frame: UIScreen.mainScreen().bounds)
window!.rootViewController = SideNavigationController(rootViewController: YellowViewController(), leftViewController: GreenViewController(), rightViewController: BlueViewController()) window!.rootViewController = SideNavigationController(rootViewController: YellowViewController(), leftViewController: AppLeftViewController(), rightViewController: BlueViewController())
window!.makeKeyAndVisible() window!.makeKeyAndVisible()
return true return true
} }
......
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Material nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
import Material
private struct Item {
var text: String
var image: UIImage?
}
class AppLeftViewController: UIViewController {
/// A tableView used to display navigation items.
private var tableView: UITableView!
/// A list of all the navigation items.
private var items: Array<Item>!
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
prepareCells()
prepareTableView()
}
/// General preparation statements.
private func prepareView() {
view.backgroundColor = MaterialColor.grey.darken4
}
/// Prepares the items that are displayed within the tableView.
private func prepareCells() {
items = Array<Item>()
items.append(Item(text: "Orange", image: MaterialIcon.cm.audioLibrary))
items.append(Item(text: "Purple", image: MaterialIcon.cm.photoLibrary))
items.append(Item(text: "Green", image: MaterialIcon.cm.microphone))
items.append(Item(text: "Blue", image: MaterialIcon.cm.audio))
items.append(Item(text: "Yellow", image: MaterialIcon.cm.settings))
}
/// Prepares the tableView.
private func prepareTableView() {
tableView = UITableView()
tableView.registerClass(MaterialTableViewCell.self, forCellReuseIdentifier: "MaterialTableViewCell")
tableView.backgroundColor = MaterialColor.clear
tableView.dataSource = self
tableView.delegate = self
tableView.separatorStyle = .None
// Use MaterialLayout to easily align the tableView.
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
MaterialLayout.alignToParent(view, child: tableView, top: 170)
}
}
/// TableViewDataSource methods.
extension AppLeftViewController: UITableViewDataSource {
/// Determines the number of rows in the tableView.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count;
}
/// Prepares the cells within the tableView.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: MaterialTableViewCell = tableView.dequeueReusableCellWithIdentifier("MaterialTableViewCell", forIndexPath: indexPath) as! MaterialTableViewCell
let item: Item = items[indexPath.row]
cell.textLabel!.text = item.text
cell.textLabel!.textColor = MaterialColor.grey.lighten2
cell.textLabel!.font = RobotoFont.medium
cell.imageView!.image = item.image
cell.imageView!.tintColor = MaterialColor.grey.lighten2
cell.backgroundColor = MaterialColor.clear
return cell
}
}
/// UITableViewDelegate methods.
extension AppLeftViewController: UITableViewDelegate {
/// Sets the tableView cell height.
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 64
}
/// Select item at row in tableView.
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let item: Item = items[indexPath.row]
switch item.text {
case "Orange":
sideNavigationController?.transitionFromRootViewController(OrangeViewController())
case "Purple":
sideNavigationController?.transitionFromRootViewController(PurpleViewController())
case "Green":
sideNavigationController?.transitionFromRootViewController(GreenViewController())
case "Blue":
sideNavigationController?.transitionFromRootViewController(BlueViewController())
case "Yellow":
// To close the sideNavigationController after loading the UIViewController, use the following.
sideNavigationController?.transitionFromRootViewController(YellowViewController(),
duration: 1,
options: .TransitionNone,
animations: nil,
completion: { [weak self] _ in
self?.sideNavigationController?.closeLeftView()
})
default:break
}
}
}
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of GraphKit nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
import Material
class OrangeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
}
/// Prepares view.
private func prepareView() {
view.backgroundColor = MaterialColor.orange.base
}
}
/*
* Copyright (C) 2015 - 2016, Daniel Dahan and CosmicMind, Inc. <http://cosmicmind.io>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of GraphKit nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import UIKit
import Material
class PurpleViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
prepareView()
}
/// Prepares view.
private func prepareView() {
view.backgroundColor = MaterialColor.purple.base
}
}
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'Material' s.name = 'Material'
s.version = '1.39.11' s.version = '1.39.12'
s.license = 'BSD' s.license = 'BSD'
s.summary = 'An animation and graphics framework for Material Design in Swift.' s.summary = 'An animation and graphics framework for Material Design in Swift.'
s.homepage = 'http://cosmicmind.io' s.homepage = 'http://cosmicmind.io'
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.39.11</string> <string>1.39.12</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
......
...@@ -69,6 +69,7 @@ public class BottomNavigationController : UITabBarController, UITabBarController ...@@ -69,6 +69,7 @@ public class BottomNavigationController : UITabBarController, UITabBarController
*/ */
public required init?(coder aDecoder: NSCoder) { public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder) super.init(coder: aDecoder)
prepareView()
} }
/** /**
...@@ -78,6 +79,7 @@ public class BottomNavigationController : UITabBarController, UITabBarController ...@@ -78,6 +79,7 @@ public class BottomNavigationController : UITabBarController, UITabBarController
*/ */
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
prepareView()
} }
public init() { public init() {
......
...@@ -75,11 +75,30 @@ public class MenuViewController : UIViewController { ...@@ -75,11 +75,30 @@ public class MenuViewController : UIViewController {
public private(set) var rootViewController: UIViewController! public private(set) var rootViewController: UIViewController!
/** /**
An initializer for the MenuViewController. An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
prepareView()
}
/**
An initializer that initializes the object with an Optional nib and bundle.
- Parameter nibNameOrNil: An Optional String for the nib.
- Parameter bundle: An Optional NSBundle where the nib is located.
*/
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
prepareView()
}
/**
An initializer for the StatusBarViewController.
- Parameter rootViewController: The main UIViewController. - Parameter rootViewController: The main UIViewController.
*/ */
public convenience init(rootViewController: UIViewController) { public init(rootViewController: UIViewController) {
self.init() super.init(nibName: nil, bundle: nil)
self.rootViewController = rootViewController self.rootViewController = rootViewController
prepareView() prepareView()
} }
......
...@@ -62,6 +62,20 @@ public class StatusBarViewController : UIViewController { ...@@ -62,6 +62,20 @@ public class StatusBarViewController : UIViewController {
*/ */
public private(set) var rootViewController: UIViewController! public private(set) var rootViewController: UIViewController!
/**
An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance.
*/
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
prepareView()
}
/**
An initializer that initializes the object with an Optional nib and bundle.
- Parameter nibNameOrNil: An Optional String for the nib.
- Parameter bundle: An Optional NSBundle where the nib is located.
*/
public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
prepareView() prepareView()
...@@ -77,11 +91,6 @@ public class StatusBarViewController : UIViewController { ...@@ -77,11 +91,6 @@ public class StatusBarViewController : UIViewController {
prepareView() prepareView()
} }
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
prepareView()
}
/** /**
A method to swap rootViewController objects. A method to swap rootViewController objects.
- Parameter toViewController: The UIViewController to swap - Parameter toViewController: The UIViewController to swap
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment