From 2f942ee61ac39a5a5dac46de55f01be94bb5532d Mon Sep 17 00:00:00 2001 From: manuroe Date: Mon, 15 Apr 2019 16:26:28 +0200 Subject: [PATCH] Template: Add SimpleScreenTemplate --- Riot.xcodeproj/project.pbxproj | 16 ++ Riot/Generated/Storyboards.swift | 5 + Tools/Templates/README.md | 11 ++ ...pleScreenTemplateViewController.storyboard | 151 ++++++++++++++++++ .../SimpleScreenTemplateViewController.swift | 124 ++++++++++++++ Tools/Templates/createSimpleScreen.sh | 38 +++++ 6 files changed, 345 insertions(+) create mode 100644 Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.storyboard create mode 100644 Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.swift create mode 100755 Tools/Templates/createSimpleScreen.sh diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 7c97f8451..24fef73c5 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -70,6 +70,8 @@ 3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3275FD8B21A5A2C500B9C13D /* TermsView.swift */; }; 3281BCF72201FA4200F4A383 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3281BCF62201FA4200F4A383 /* UIControl.swift */; }; 3284A35120A07C210044F922 /* postMessageAPI.js in Resources */ = {isa = PBXBuildFile; fileRef = 3284A35020A07C210044F922 /* postMessageAPI.js */; }; + 32891D6B2264CBA300C82226 /* SimpleScreenTemplateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32891D692264CBA300C82226 /* SimpleScreenTemplateViewController.swift */; }; + 32891D6C2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 32891D6A2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard */; }; 32B1FEDB21A46F2C00637127 /* TermsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32B1FEDA21A46F2C00637127 /* TermsView.xib */; }; 32BF994F21FA29A400698084 /* SettingsKeyBackupViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32BF994E21FA29A400698084 /* SettingsKeyBackupViewModel.swift */; }; 32BF995121FA29DC00698084 /* SettingsKeyBackupViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32BF995021FA29DC00698084 /* SettingsKeyBackupViewModelType.swift */; }; @@ -571,6 +573,8 @@ 3275FD8B21A5A2C500B9C13D /* TermsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsView.swift; sourceTree = ""; }; 3281BCF62201FA4200F4A383 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = ""; }; 3284A35020A07C210044F922 /* postMessageAPI.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = postMessageAPI.js; sourceTree = ""; }; + 32891D692264CBA300C82226 /* SimpleScreenTemplateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleScreenTemplateViewController.swift; sourceTree = ""; }; + 32891D6A2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SimpleScreenTemplateViewController.storyboard; sourceTree = ""; }; 32B1FEDA21A46F2C00637127 /* TermsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TermsView.xib; sourceTree = ""; }; 32BDC9A1211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/InfoPlist.strings; sourceTree = ""; }; 32BDC9A2211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/Localizable.strings; sourceTree = ""; }; @@ -1296,6 +1300,7 @@ children = ( 3232AB3B2256558300AD6A5C /* FlowCoordinatorTemplate */, 3232AB3F2256558300AD6A5C /* ScreenTemplate */, + 32891D682264C6A000C82226 /* SimpleScreenTemplate */, ); path = buildable; sourceTree = ""; @@ -1408,6 +1413,15 @@ path = Incoming; sourceTree = ""; }; + 32891D682264C6A000C82226 /* SimpleScreenTemplate */ = { + isa = PBXGroup; + children = ( + 32891D6A2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard */, + 32891D692264CBA300C82226 /* SimpleScreenTemplateViewController.swift */, + ); + path = SimpleScreenTemplate; + sourceTree = ""; + }; 32935CB21F628B98006888C8 /* js */ = { isa = PBXGroup; children = ( @@ -3430,6 +3444,7 @@ 3232AB2122564D9100AD6A5C /* README.md in Resources */, B1B5593920EF7BAC00210D55 /* TableViewCellWithCheckBoxes.xib in Resources */, B1B557C120EF5B4500210D55 /* DisabledRoomInputToolbarView.xib in Resources */, + 32891D6C2264CBA300C82226 /* SimpleScreenTemplateViewController.storyboard in Resources */, B1664DA320F4F96200808783 /* Vector.strings in Resources */, B1B557C720EF5CD400210D55 /* DirectoryServerDetailTableViewCell.xib in Resources */, B1B5582620EF638A00210D55 /* RoomMemberTitleView.xib in Resources */, @@ -3834,6 +3849,7 @@ B1098C1021ED07E4000DDA48 /* Presentable.swift in Sources */, B1B558E020EF768F00210D55 /* RoomOutgoingTextMsgBubbleCell.m in Sources */, B1B5593C20EF7BAC00210D55 /* TableViewCellWithCheckBoxes.m in Sources */, + 32891D6B2264CBA300C82226 /* SimpleScreenTemplateViewController.swift in Sources */, B1CA3A2721EF6914000D1D89 /* UIViewController.swift in Sources */, F0D2ADA11F6AA5FD00A7097D /* MXRoomSummary+Riot.m in Sources */, B1B5596F20EFA85D00210D55 /* EncryptionInfoView.m in Sources */, diff --git a/Riot/Generated/Storyboards.swift b/Riot/Generated/Storyboards.swift index 7c6182644..a48c4bbf1 100644 --- a/Riot/Generated/Storyboards.swift +++ b/Riot/Generated/Storyboards.swift @@ -62,6 +62,11 @@ internal enum StoryboardScene { internal static let initialScene = InitialSceneType(storyboard: KeyBackupSetupSuccessFromRecoveryKeyViewController.self) } + internal enum SimpleScreenTemplateViewController: StoryboardType { + internal static let storyboardName = "SimpleScreenTemplateViewController" + + internal static let initialScene = InitialSceneType(storyboard: SimpleScreenTemplateViewController.self) + } internal enum TemplateScreenViewController: StoryboardType { internal static let storyboardName = "TemplateScreenViewController" diff --git a/Tools/Templates/README.md b/Tools/Templates/README.md index 54e33f1aa..c9212a214 100644 --- a/Tools/Templates/README.md +++ b/Tools/Templates/README.md @@ -13,6 +13,17 @@ To create a screen from this template (before it becomes an Xcode template): This will create ScreenFolder within the Riot/Modules. Files inside will be named `MyScreenNameXxx`. +# SimpleScreenTemplate +This is the boilerplate to create a simple screen. + +To create a screen from this template (before it becomes an Xcode template): + +- `./createSimpleScreen.sh ScreenFolder MyScreenName` +- Import the created folder in the Xcode project + +This will create ScreenFolder within the Riot/Modules. Files inside will be named `MyScreenNameXxx`. + + # FlowCoordinatorTemplate The boilerplate to create a root coordinator and its presenter bridge that can be used from Objective-C. diff --git a/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.storyboard b/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.storyboard new file mode 100644 index 000000000..5a96435e9 --- /dev/null +++ b/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.storyboard @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.swift b/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.swift new file mode 100644 index 000000000..c9d6a01fb --- /dev/null +++ b/Tools/Templates/buildable/SimpleScreenTemplate/SimpleScreenTemplateViewController.swift @@ -0,0 +1,124 @@ +/* + Copyright 2019 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import UIKit + +protocol SimpleScreenTemplateViewControllerDelegate: class { + func simpleScreenTemplateViewControllerDidTapSetupAction(_ viewController: SimpleScreenTemplateViewController) + func simpleScreenTemplateViewControllerDidCancel(_ viewController: SimpleScreenTemplateViewController) +} + +final class SimpleScreenTemplateViewController: UIViewController { + + // MARK: - Properties + + // MARK: Outlets + + @IBOutlet private weak var logoImageView: UIImageView! + @IBOutlet private weak var titleLabel: UILabel! + @IBOutlet private weak var informationLabel: UILabel! + + @IBOutlet private weak var okButtonBackgroundView: UIView! + @IBOutlet private weak var okButton: UIButton! + + // MARK: Private + + private var theme: Theme! + + // MARK: Public + + weak var delegate: SimpleScreenTemplateViewControllerDelegate? + + // MARK: - Setup + + class func instantiate() -> SimpleScreenTemplateViewController { + let viewController = StoryboardScene.SimpleScreenTemplateViewController.initialScene.instantiate() + viewController.theme = ThemeService.shared().theme + return viewController + } + + // MARK: - Life cycle + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + + self.title = "Template" + self.vc_removeBackTitle() + + self.setupViews() + self.registerThemeServiceDidChangeThemeNotification() + self.update(theme: self.theme) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return self.theme.statusBarStyle + } + + // MARK: - Private + + private func setupViews() { + let cancelBarButtonItem = MXKBarButtonItem(title: VectorL10n.cancel, style: .plain) { [weak self] in + self?.cancelButtonAction() + } + self.navigationItem.rightBarButtonItem = cancelBarButtonItem + +// let logoImage = Asset.Images.* +// self.logoImageView.image = keybackupLogoImage + +// self.titleLabel.text = VectorL10n.xxxxTitle +// self.informationLabel.text = VectorL10n.xxxxDescription +// +// self.okButton.setTitle(VectorL10n.xxxxAction, for: .normal) + } + + private func update(theme: Theme) { + self.theme = theme + + self.view.backgroundColor = theme.headerBackgroundColor + + if let navigationBar = self.navigationController?.navigationBar { + theme.applyStyle(onNavigationBar: navigationBar) + } + + self.logoImageView.tintColor = theme.textPrimaryColor + + self.titleLabel.textColor = theme.textPrimaryColor + self.informationLabel.textColor = theme.textPrimaryColor + + self.okButtonBackgroundView.backgroundColor = theme.backgroundColor + theme.applyStyle(onButton: self.okButton) + } + + private func registerThemeServiceDidChangeThemeNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .themeServiceDidChangeTheme, object: nil) + } + + // MARK: - Actions + + @objc private func themeDidChange() { + self.update(theme: ThemeService.shared().theme) + } + + @IBAction private func validateButtonAction(_ sender: Any) { + self.delegate?.simpleScreenTemplateViewControllerDidTapSetupAction(self) + } + + private func cancelButtonAction() { + self.delegate?.simpleScreenTemplateViewControllerDidCancel(self) + } +} diff --git a/Tools/Templates/createSimpleScreen.sh b/Tools/Templates/createSimpleScreen.sh new file mode 100755 index 000000000..bc8a046e5 --- /dev/null +++ b/Tools/Templates/createSimpleScreen.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +if [ ! $# -eq 2 ]; then + echo "Usage: ./createSimpleScreen.sh Folder MyScreenName" + exit 1 +fi + +OUTPUT_DIR="../../Riot/Modules"/$1 +SCREEN_NAME=$2 +SCREEN_VAR_NAME=`echo $SCREEN_NAME | awk '{ print tolower(substr($0, 1, 1)) substr($0, 2) }'` + +MODULE_DIR="../../Riot/Modules" + +if [ -e $OUTPUT_DIR ]; then + echo "Error: Folder ${OUTPUT_DIR} already exists" + exit 1 +fi + +echo "Create folder ${OUTPUT_DIR}" + +mkdir -p $OUTPUT_DIR +cp -R buildable/SimpleScreenTemplate/ $OUTPUT_DIR/ + +cd $OUTPUT_DIR +for file in * +do + echo "Building ${file/SimpleScreenTemplate/$SCREEN_NAME}..." + perl -p -i -e "s/SimpleScreenTemplate/"$SCREEN_NAME"/g" $file + perl -p -i -e "s/simpleScreenTemplate/"$SCREEN_VAR_NAME"/g" $file + + if [[ ! $file == *.storyboard ]]; + then + echo "// $ createSimpleScreen.sh $@" | cat - ${file} > /tmp/$$ && mv /tmp/$$ ${file} + echo '// File created from simpleScreenTemplate' | cat - ${file} > /tmp/$$ && mv /tmp/$$ ${file} + fi + + mv ${file} ${file/SimpleScreenTemplate/$SCREEN_NAME} +done \ No newline at end of file