From 29dec42b208cbfacb4198e15497a92af18ea499e Mon Sep 17 00:00:00 2001 From: Charles Magahern Date: Wed, 30 Dec 2015 18:47:13 -0800 Subject: [PATCH] Beginning work on header view --- XIONControlPanel.xcodeproj/project.pbxproj | 46 ++++- .../Application/AppDelegate.swift | 2 +- .../ArcadeMachinesViewController.swift | 16 ++ .../Controllers/MainViewController.swift | 70 +++++--- ...wift => VisualizationViewController.swift} | 19 +- XIONControlPanel/External/KSIRingView.h | 47 +++++ XIONControlPanel/External/KSIRingView.m | 169 ++++++++++++++++++ .../Resources/Orbitron-Medium.ttf | Bin 0 -> 39816 bytes .../Assets.xcassets/Contents.json | 6 + .../XIONLogo.imageset/Contents.json | 21 +++ .../XIONLogo.imageset/XIONLogo.png | Bin 0 -> 22227 bytes .../XIONLogoInnerRing.imageset/Contents.json | 21 +++ .../XIONLogoInnerRing.png | Bin 0 -> 7715 bytes .../XIONLogoOuterRing.imageset/Contents.json | 21 +++ .../XIONLogoOuterRing.png | Bin 0 -> 12717 bytes .../XIONLogoWithRing.imageset/Contents.json | 21 +++ .../XIONLogoWithRing.png | Bin 0 -> 16243 bytes XIONControlPanel/SupportingFiles/Info.plist | 7 +- .../XIONControlPanel-Bridging-Header.h | 1 + XIONControlPanel/Views/HeaderView.swift | 90 ++++++++++ XIONControlPanel/Views/XIONLogoView.swift | 78 ++++++++ 21 files changed, 592 insertions(+), 43 deletions(-) create mode 100644 XIONControlPanel/Controllers/ArcadeMachinesViewController.swift rename XIONControlPanel/Controllers/{BackgroundViewController.swift => VisualizationViewController.swift} (92%) create mode 100644 XIONControlPanel/External/KSIRingView.h create mode 100644 XIONControlPanel/External/KSIRingView.m create mode 100755 XIONControlPanel/Resources/Orbitron-Medium.ttf create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/Contents.json create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/Contents.json create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/XIONLogo.png create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/Contents.json create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/XIONLogoInnerRing.png create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/Contents.json create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/XIONLogoOuterRing.png create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/Contents.json create mode 100644 XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/XIONLogoWithRing.png rename XIONControlPanel/{Utilities => SupportingFiles}/XIONControlPanel-Bridging-Header.h (85%) create mode 100644 XIONControlPanel/Views/HeaderView.swift create mode 100644 XIONControlPanel/Views/XIONLogoView.swift diff --git a/XIONControlPanel.xcodeproj/project.pbxproj b/XIONControlPanel.xcodeproj/project.pbxproj index 83de131..bdde5f8 100644 --- a/XIONControlPanel.xcodeproj/project.pbxproj +++ b/XIONControlPanel.xcodeproj/project.pbxproj @@ -9,9 +9,14 @@ /* Begin PBXBuildFile section */ 0C20E2B91C33514100BA789B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C20E2B51C33514100BA789B /* AppDelegate.swift */; }; 0C20E2BB1C33529700BA789B /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C20E2BA1C33529700BA789B /* MainViewController.swift */; }; - 0C20E2BD1C33534F00BA789B /* BackgroundViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C20E2BC1C33534F00BA789B /* BackgroundViewController.swift */; }; + 0C20E2BD1C33534F00BA789B /* VisualizationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C20E2BC1C33534F00BA789B /* VisualizationViewController.swift */; }; 0C3CAEAF1C3350C800B856AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0C3CAEAE1C3350C800B856AD /* Assets.xcassets */; }; 0C3CAEB21C3350C800B856AD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0C3CAEB01C3350C800B856AD /* LaunchScreen.storyboard */; }; + 0C41EF4A1C34B51500AF847F /* ArcadeMachinesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C41EF491C34B51500AF847F /* ArcadeMachinesViewController.swift */; }; + 0C41EF4E1C34B81F00AF847F /* KSIRingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C41EF4D1C34B81F00AF847F /* KSIRingView.m */; }; + 0C41EF501C34B97700AF847F /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C41EF4F1C34B97700AF847F /* HeaderView.swift */; }; + 0C41EF521C34BA4E00AF847F /* Orbitron-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0C41EF511C34BA4E00AF847F /* Orbitron-Medium.ttf */; }; + 0C41EF541C34BC9800AF847F /* XIONLogoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C41EF531C34BC9800AF847F /* XIONLogoView.swift */; }; 0C63A8731C337381007E4B52 /* CubletsTechnique.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0C63A8721C337381007E4B52 /* CubletsTechnique.plist */; }; 0C63A8761C3373D1007E4B52 /* HorizontalBlur.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 0C63A8751C3373D1007E4B52 /* HorizontalBlur.vsh */; }; 0C63A8781C3373D9007E4B52 /* HorizontalBlur.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 0C63A8771C3373D9007E4B52 /* HorizontalBlur.fsh */; }; @@ -27,11 +32,17 @@ /* Begin PBXFileReference section */ 0C20E2B51C33514100BA789B /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 0C20E2BA1C33529700BA789B /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; - 0C20E2BC1C33534F00BA789B /* BackgroundViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundViewController.swift; sourceTree = ""; }; + 0C20E2BC1C33534F00BA789B /* VisualizationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisualizationViewController.swift; sourceTree = ""; }; 0C3CAEA41C3350C800B856AD /* XIONControlPanel.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XIONControlPanel.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0C3CAEAE1C3350C800B856AD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 0C3CAEB11C3350C800B856AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 0C3CAEB31C3350C800B856AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0C41EF491C34B51500AF847F /* ArcadeMachinesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArcadeMachinesViewController.swift; sourceTree = ""; }; + 0C41EF4C1C34B81F00AF847F /* KSIRingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSIRingView.h; sourceTree = ""; }; + 0C41EF4D1C34B81F00AF847F /* KSIRingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSIRingView.m; sourceTree = ""; }; + 0C41EF4F1C34B97700AF847F /* HeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderView.swift; sourceTree = ""; }; + 0C41EF511C34BA4E00AF847F /* Orbitron-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Orbitron-Medium.ttf"; sourceTree = ""; }; + 0C41EF531C34BC9800AF847F /* XIONLogoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XIONLogoView.swift; sourceTree = ""; }; 0C63A8721C337381007E4B52 /* CubletsTechnique.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = CubletsTechnique.plist; sourceTree = ""; }; 0C63A8751C3373D1007E4B52 /* HorizontalBlur.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = HorizontalBlur.vsh; sourceTree = ""; }; 0C63A8771C3373D9007E4B52 /* HorizontalBlur.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = HorizontalBlur.fsh; sourceTree = ""; }; @@ -61,8 +72,9 @@ isa = PBXGroup; children = ( 0C3CAEAE1C3350C800B856AD /* Assets.xcassets */, - 0C3CAEB01C3350C800B856AD /* LaunchScreen.storyboard */, 0C3CAEB31C3350C800B856AD /* Info.plist */, + 0C3CAEB01C3350C800B856AD /* LaunchScreen.storyboard */, + 0C63A87A1C33C655007E4B52 /* XIONControlPanel-Bridging-Header.h */, ); name = "Supporting Files"; path = SupportingFiles; @@ -79,8 +91,9 @@ 0C20E2B61C33514100BA789B /* Controllers */ = { isa = PBXGroup; children = ( - 0C20E2BC1C33534F00BA789B /* BackgroundViewController.swift */, + 0C41EF491C34B51500AF847F /* ArcadeMachinesViewController.swift */, 0C20E2BA1C33529700BA789B /* MainViewController.swift */, + 0C20E2BC1C33534F00BA789B /* VisualizationViewController.swift */, ); path = Controllers; sourceTree = ""; @@ -95,6 +108,8 @@ 0C20E2B81C33514100BA789B /* Views */ = { isa = PBXGroup; children = ( + 0C41EF4F1C34B97700AF847F /* HeaderView.swift */, + 0C41EF531C34BC9800AF847F /* XIONLogoView.swift */, ); path = Views; sourceTree = ""; @@ -103,6 +118,7 @@ isa = PBXGroup; children = ( 0C63A8721C337381007E4B52 /* CubletsTechnique.plist */, + 0C41EF511C34BA4E00AF847F /* Orbitron-Medium.ttf */, ); path = Resources; sourceTree = ""; @@ -128,6 +144,7 @@ children = ( 0C20E2B41C33514100BA789B /* Application */, 0C20E2B61C33514100BA789B /* Controllers */, + 0C41EF4B1C34B81F00AF847F /* External */, 0C20E2B71C33514100BA789B /* Models */, 0C63A8741C3373BC007E4B52 /* Shaders */, 0C20E2C81C336F2E00BA789B /* Resources */, @@ -138,6 +155,15 @@ path = XIONControlPanel; sourceTree = ""; }; + 0C41EF4B1C34B81F00AF847F /* External */ = { + isa = PBXGroup; + children = ( + 0C41EF4C1C34B81F00AF847F /* KSIRingView.h */, + 0C41EF4D1C34B81F00AF847F /* KSIRingView.m */, + ); + path = External; + sourceTree = ""; + }; 0C63A8741C3373BC007E4B52 /* Shaders */ = { isa = PBXGroup; children = ( @@ -158,7 +184,6 @@ children = ( 0C63A87B1C33C655007E4B52 /* NSValue+XIONAdditions.h */, 0C63A87C1C33C655007E4B52 /* NSValue+XIONAdditions.m */, - 0C63A87A1C33C655007E4B52 /* XIONControlPanel-Bridging-Header.h */, ); path = Utilities; sourceTree = ""; @@ -230,6 +255,7 @@ 0C3CAEB21C3350C800B856AD /* LaunchScreen.storyboard in Resources */, 0C3CAEAF1C3350C800B856AD /* Assets.xcassets in Resources */, 0C63A8841C33DC29007E4B52 /* VerticalBlur.fsh in Resources */, + 0C41EF521C34BA4E00AF847F /* Orbitron-Medium.ttf in Resources */, 0C63A8851C33DC29007E4B52 /* VerticalBlur.vsh in Resources */, 0C63A8891C33EB3B007E4B52 /* FinalRender.vsh in Resources */, 0C63A8781C3373D9007E4B52 /* HorizontalBlur.fsh in Resources */, @@ -243,10 +269,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0C41EF4E1C34B81F00AF847F /* KSIRingView.m in Sources */, 0C63A87D1C33C655007E4B52 /* NSValue+XIONAdditions.m in Sources */, - 0C20E2BD1C33534F00BA789B /* BackgroundViewController.swift in Sources */, + 0C20E2BD1C33534F00BA789B /* VisualizationViewController.swift in Sources */, + 0C41EF4A1C34B51500AF847F /* ArcadeMachinesViewController.swift in Sources */, 0C20E2B91C33514100BA789B /* AppDelegate.swift in Sources */, 0C20E2BB1C33529700BA789B /* MainViewController.swift in Sources */, + 0C41EF501C34B97700AF847F /* HeaderView.swift in Sources */, + 0C41EF541C34BC9800AF847F /* XIONLogoView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -359,7 +389,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xionsf.XIONControlPanel; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; - SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/Utilities/XIONControlPanel-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; @@ -376,7 +406,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.xionsf.XIONControlPanel; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; - SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/Utilities/XIONControlPanel-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h"; }; name = Release; }; diff --git a/XIONControlPanel/Application/AppDelegate.swift b/XIONControlPanel/Application/AppDelegate.swift index b46da2d..8270fcc 100644 --- a/XIONControlPanel/Application/AppDelegate.swift +++ b/XIONControlPanel/Application/AppDelegate.swift @@ -25,6 +25,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { - return UIInterfaceOrientationMask.Portrait + return UIInterfaceOrientationMask.Landscape } } diff --git a/XIONControlPanel/Controllers/ArcadeMachinesViewController.swift b/XIONControlPanel/Controllers/ArcadeMachinesViewController.swift new file mode 100644 index 0000000..ddca4cc --- /dev/null +++ b/XIONControlPanel/Controllers/ArcadeMachinesViewController.swift @@ -0,0 +1,16 @@ +// +// ArcadeMachinesViewController.swift +// XIONControlPanel +// +// Created by Charles Magahern on 12/30/15. +// Copyright © 2015 XION. All rights reserved. +// + +import UIKit + +class ArcadeMachinesViewController: UIViewController { + override func viewDidLoad() + { + super.viewDidLoad() + } +} diff --git a/XIONControlPanel/Controllers/MainViewController.swift b/XIONControlPanel/Controllers/MainViewController.swift index 3bc7456..e701d9e 100644 --- a/XIONControlPanel/Controllers/MainViewController.swift +++ b/XIONControlPanel/Controllers/MainViewController.swift @@ -9,7 +9,9 @@ import UIKit class MainViewController: UIViewController { - private var _backgroundController: BackgroundViewController = BackgroundViewController() + private var _visualizationController: VisualizationViewController = VisualizationViewController() + private var _machinesController: ArcadeMachinesViewController = ArcadeMachinesViewController() + private var _headerView: HeaderView = HeaderView() // MARK: Overrides @@ -19,22 +21,13 @@ class MainViewController: UIViewController { self.view.backgroundColor = UIColor.blackColor() - self.addChildViewController(_backgroundController) - self.view.addSubview(_backgroundController.view) + self.addChildViewController(_visualizationController) + self.view.addSubview(_visualizationController.view) - let doubleTapGR = UITapGestureRecognizer(target: self, action: Selector("_handleDoubleFingerTap:")) - doubleTapGR.numberOfTouchesRequired = 2 - self.view.addGestureRecognizer(doubleTapGR) + self.addChildViewController(_machinesController) + self.view.addSubview(_machinesController.view) - let singleTapGR = UITapGestureRecognizer(target: self, action: Selector("_handleSingleFingerTap:")) - singleTapGR.numberOfTouchesRequired = 1 - singleTapGR.requireGestureRecognizerToFail(doubleTapGR) - self.view.addGestureRecognizer(singleTapGR) - } - - override func prefersStatusBarHidden() -> Bool - { - return true + self.view.addSubview(_headerView) } override func viewDidLayoutSubviews() @@ -42,19 +35,50 @@ class MainViewController: UIViewController { super.viewDidLayoutSubviews() let bounds = self.view.bounds - _backgroundController.view.frame = bounds + let headerBounds = CGRect( + x: 0.0, + y: 0.0, + width: bounds.size.width, + height: rint(bounds.size.height / 10.0) + ) + let bodyBounds = CGRect( + x: 0.0, + y: CGRectGetMaxY(headerBounds), + width: bounds.size.width, + height: bounds.size.height - headerBounds.size.height + ) + + _headerView.frame = headerBounds + + let visualizationFrame = CGRect( + x: bodyBounds.origin.x, + y: bodyBounds.origin.y, + width: rint((5.0 / 8.0) * bodyBounds.size.width), + height: bodyBounds.size.height + ) + _visualizationController.view.frame = visualizationFrame + + let machinesControllerFrame = CGRect( + x: CGRectGetMaxX(visualizationFrame), + y: bodyBounds.origin.y, + width: bodyBounds.size.width - visualizationFrame.size.width, + height: bodyBounds.size.height + ) + _machinesController.view.frame = machinesControllerFrame } - // MARK: Internal - - internal func _handleSingleFingerTap(gestureRecognizer: UITapGestureRecognizer) + override func viewDidAppear(animated: Bool) { - let randomPercentage = Float(arc4random()) / Float(UInt32.max) - _backgroundController.setPercentActivated(randomPercentage, animated: true) + _headerView.beginAnimating() } - internal func _handleDoubleFingerTap(gestureRecognizer: UITapGestureRecognizer) + override func viewDidDisappear(animated: Bool) { - _backgroundController.setPercentActivated(0.0, animated: true) + _headerView.stopAnimating() + } + + override func prefersStatusBarHidden() -> Bool + { + return true } } diff --git a/XIONControlPanel/Controllers/BackgroundViewController.swift b/XIONControlPanel/Controllers/VisualizationViewController.swift similarity index 92% rename from XIONControlPanel/Controllers/BackgroundViewController.swift rename to XIONControlPanel/Controllers/VisualizationViewController.swift index aa1fdc5..a874b6b 100644 --- a/XIONControlPanel/Controllers/BackgroundViewController.swift +++ b/XIONControlPanel/Controllers/VisualizationViewController.swift @@ -1,5 +1,5 @@ // -// BackgroundViewController.swift +// VisualizationViewController.swift // XIONControlPanel // // Created by Charles Magahern on 12/29/15. @@ -12,9 +12,9 @@ import GLKit import SceneKit import UIKit -let π = Float(M_PI) +let π = CGFloat(M_PI) -class BackgroundViewController: UIViewController { +class VisualizationViewController: UIViewController { private var _scene: SCNScene = SCNScene() private var _sceneView: SCNView? private var _cameraNode: SCNNode = SCNNode() @@ -34,7 +34,6 @@ class BackgroundViewController: UIViewController { view.backgroundColor = UIColor.blackColor() view.scene = _scene view.allowsCameraControl = false - view.showsStatistics = true _sceneView = view self.view = view @@ -88,7 +87,7 @@ class BackgroundViewController: UIViewController { let ry = Float(arc4random()) / Float(UInt32.max) let rz = Float(arc4random()) / Float(UInt32.max) let rotAxis = SCNVector3Make(rx, ry, rz) - let rotCoeff = Float(arc4random() % 2 == 0 ? -1.0 : 1.0) + let rotCoeff = CGFloat(arc4random() % 2 == 0 ? -1.0 : 1.0) let rotAngle = CGFloat(rotCoeff * π / 4.0) let rotAction = SCNAction.rotateByAngle(rotAngle, aroundAxis: rotAxis, duration: 0.8) @@ -108,7 +107,7 @@ class BackgroundViewController: UIViewController { let camera = SCNCamera() _cameraNode.camera = camera - _cameraNode.position = SCNVector3Make(0.0, 0.0, 50.0) + _cameraNode.position = SCNVector3Make(0.0, 0.0, 30.0) _scene.rootNode.addChildNode(_cameraNode) let centerNode = SCNNode() @@ -136,10 +135,10 @@ class BackgroundViewController: UIViewController { { _cublets.removeAll() - let sz = Float(BackgroundViewController.cubletsSize) - let dim = BackgroundViewController.cubletsDimensions + let sz = Float(VisualizationViewController.cubletsSize) + let dim = VisualizationViewController.cubletsDimensions let dimf = Float(dim) - let spacing = Float(BackgroundViewController.cubletsSpacing) + let spacing = Float(VisualizationViewController.cubletsSpacing) let volume = (dimf * sz) + ((dimf - 1.0) * spacing) let orig = -volume / 2.0 @@ -177,7 +176,7 @@ class BackgroundViewController: UIViewController { internal func _setupAnimation() { let rotAxis = SCNVector3Make(0.25, 1.75, 1.0) - let rotAngle = CGFloat(Float(2.0) * π) + let rotAngle = 2.0 * π let rotAction = SCNAction.repeatActionForever(SCNAction.rotateByAngle(rotAngle, aroundAxis: rotAxis, duration: 40.0)) _cubletsNode.runAction(rotAction) } diff --git a/XIONControlPanel/External/KSIRingView.h b/XIONControlPanel/External/KSIRingView.h new file mode 100644 index 0000000..91f61d2 --- /dev/null +++ b/XIONControlPanel/External/KSIRingView.h @@ -0,0 +1,47 @@ +// +// KSIRingView.h +// Kisai +// +// Created by Charles Magahern on 2/28/15. +// Copyright (c) 2015 zanneth. All rights reserved. +// + +#import + +@interface KSIRingPattern : NSObject + +@property (nonatomic, readonly) UIColor *color; +@property (nonatomic, readonly) CGFloat beginSegmentAngle; +@property (nonatomic, readonly) CGFloat segmentWidth; +@property (nonatomic, readonly) CGFloat segmentLengthRadians; +@property (nonatomic, readonly) CGFloat segmentIntervalRadians; +@property (nonatomic, readonly) NSUInteger segmentsCount; + +- (instancetype)initWithColor:(UIColor *)color + segmentLength:(CGFloat)segmentLengthInRadians + segmentsCount:(NSUInteger)segmentsCount; + +@end + +@interface KSIMutableRingPattern : KSIRingPattern + +@property (nonatomic, strong) UIColor *color; +@property (nonatomic, assign) CGFloat beginSegmentAngle; +@property (nonatomic, assign) CGFloat segmentWidth; +@property (nonatomic, assign) CGFloat segmentLengthRadians; +@property (nonatomic, assign) CGFloat segmentIntervalRadians; +@property (nonatomic, assign) NSUInteger segmentsCount; + +@end + +// ----------------------------------------------------------------------------- + +@interface KSIRingView : UIView + +@property (nonatomic, readonly) NSArray *ringPatterns; // KSIRingPattern(s) + +- (void)addRingPattern:(KSIRingPattern *)pattern; +- (void)insertRingPattern:(KSIRingPattern *)pattern atIndex:(NSUInteger)index; +- (void)removeAllRingPatterns; + +@end diff --git a/XIONControlPanel/External/KSIRingView.m b/XIONControlPanel/External/KSIRingView.m new file mode 100644 index 0000000..919421b --- /dev/null +++ b/XIONControlPanel/External/KSIRingView.m @@ -0,0 +1,169 @@ +// +// KSIRingView.m +// Kisai +// +// Created by Charles Magahern on 2/28/15. +// Copyright (c) 2015 zanneth. All rights reserved. +// + +#import "KSIRingView.h" + +@implementation KSIRingPattern { +@protected + UIColor *_color; + CGFloat _beginSegmentAngle; + CGFloat _segmentWidth; + CGFloat _segmentLengthRadians; + CGFloat _segmentIntervalRadians; + NSUInteger _segmentsCount; +} + +- (instancetype)initWithColor:(UIColor *)color + segmentLength:(CGFloat)segmentLengthInRadians + segmentsCount:(NSUInteger)segmentsCount +{ + self = [super init]; + if (self) { + _color = color; + _beginSegmentAngle = 0.0; + _segmentWidth = 5.0; + _segmentLengthRadians = segmentLengthInRadians; + _segmentIntervalRadians = 0.0; + _segmentsCount = segmentsCount; + } + return self; +} + +- (instancetype)init +{ + return [self initWithColor:[UIColor whiteColor] segmentLength:(2.0 * M_PI) segmentsCount:1]; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [self _copyWithZone:zone usingConcreteClass:[KSIRingPattern class]]; +} + +- (id)mutableCopyWithZone:(NSZone *)zone +{ + return [self _copyWithZone:zone usingConcreteClass:[KSIMutableRingPattern class]]; +} + +#pragma mark - Internal + +- (id)_copyWithZone:(NSZone *)zone usingConcreteClass:(Class)concreteClass +{ + KSIRingPattern *copy = [[concreteClass allocWithZone:zone] init]; + copy->_color = _color; + copy->_beginSegmentAngle = _beginSegmentAngle; + copy->_segmentWidth = _segmentWidth; + copy->_segmentLengthRadians = _segmentLengthRadians; + copy->_segmentIntervalRadians = _segmentIntervalRadians; + copy->_segmentsCount = _segmentsCount; + return copy; +} + +@end + +// ----------------------------------------------------------------------------- + +@implementation KSIMutableRingPattern +@dynamic color; +@dynamic beginSegmentAngle; +@dynamic segmentWidth; +@dynamic segmentLengthRadians; +@dynamic segmentIntervalRadians; +@dynamic segmentsCount; + + +- (void)setColor:(UIColor *)color { _color = color; } +- (void)setBeginSegmentAngle:(CGFloat)beginSegmentAngle { _beginSegmentAngle = beginSegmentAngle; } +- (void)setSegmentWidth:(CGFloat)segmentWidth { _segmentWidth = segmentWidth; } +- (void)setSegmentLengthRadians:(CGFloat)segmentLengthRadians { _segmentLengthRadians = segmentLengthRadians; } +- (void)setSegmentIntervalRadians:(CGFloat)segmentIntervalRadians { _segmentIntervalRadians = segmentIntervalRadians; } +- (void)setSegmentsCount:(NSUInteger)segmentsCount { _segmentsCount = segmentsCount; } + +@end + +// ----------------------------------------------------------------------------- + +@implementation KSIRingView { + NSMutableArray *_ringPatterns; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + _ringPatterns = [[NSMutableArray alloc] init]; + } + return self; +} + +#pragma mark - Accessors + +- (NSArray *)ringPatterns +{ + return _ringPatterns; +} + +#pragma mark - API + +- (void)addRingPattern:(KSIRingPattern *)pattern +{ + [_ringPatterns addObject:[pattern copy]]; + [self setNeedsDisplay]; +} + +- (void)insertRingPattern:(KSIRingPattern *)pattern atIndex:(NSUInteger)index +{ + [_ringPatterns insertObject:[pattern copy] atIndex:index]; + [self setNeedsDisplay]; +} + +- (void)removeAllRingPatterns +{ + [_ringPatterns removeAllObjects]; + [self setNeedsDisplay]; +} + +#pragma mark - Drawing + +- (void)drawRect:(CGRect)rect +{ + const CGFloat radius = rint(rect.size.height / 2.0 - 1.0); + const CGPoint center = { + .x = rint(rect.size.width / 2.0), + .y = rint(rect.size.height / 2.0) + }; + + CGContextRef ctx = UIGraphicsGetCurrentContext(); + CGFloat currentRadius = radius; + + for (KSIRingPattern *ringPattern in _ringPatterns) { + if (![ringPattern.color isEqual:[UIColor clearColor]]) { + NSUInteger segmentsCount = ringPattern.segmentsCount; + CGFloat currentAngle = ringPattern.beginSegmentAngle; + CGFloat segmentWidth = ringPattern.segmentWidth; + + [ringPattern.color setStroke]; + + for (unsigned i = 0; i < segmentsCount; ++i) { + CGFloat beginAngle = currentAngle; + CGFloat endAngle = beginAngle + ringPattern.segmentLengthRadians; + CGContextAddArc(ctx, center.x, center.y, currentRadius - (segmentWidth / 2.0), beginAngle, endAngle, NO); + + if (i < segmentsCount - 1) { + currentAngle += ringPattern.segmentIntervalRadians; + } + + CGContextSetLineWidth(ctx, segmentWidth); + CGContextStrokePath(ctx); + } + } + + currentRadius -= ringPattern.segmentWidth - 1.0; + } +} + +@end diff --git a/XIONControlPanel/Resources/Orbitron-Medium.ttf b/XIONControlPanel/Resources/Orbitron-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..53cc94c64b3f106c2243f941989f35aa881d1910 GIT binary patch literal 39816 zcmc(I33yf2x%OInXFQOE5Rx#nlQ0tk5^@3okw5|jP7+AMq&S4+K%zT?Ntmo+RJ2~N zwYFNXRd1`-YU{O1tpioBQnhNWms)En^{S;-t-YlVw53kj=YQX|_C8Ziz`yr-{y%uu z*=O&yzV*%Dw}!nGQV1~;MUt?p8f#YK7k=E@kMFb9>s`9nNkw!OKxI}{Qo;2*{FwC(nuZNHn^nk|HHz7VT!YzsEG{{6Kv z=uZN^@VDVcYHRXR{BFhX$!#5dyDvLF<2YcY31Pl>L9nND;meDFZv*;F&a=B(nty%u zGbsSQ7;R2;H1F<~m7)gMSEIev+1wF)=7ro}3bFC15DU7yyL$Ute*EEFA+BEwc-M9J z1iRZ(uDufNfsaTfXZZQ^+B<)9Zr0+zi(%$_xFdd6^gnlb-=XTz*yIxP4g5|M2Jhkz zZH)Irz$5uwJU^OTq9EyKy8Kk#`BbbB$?67MN_B6kt{@C!mi!x^8c!J4;NG?RTfQOY ziBECYttLdj5Yt8ovCO;Cy{D&FEEU$#;Ti|v_AZ{07GYEwpk7#!=CT%#3UTjsQ6c-p zB6EVU%u%Ayd``?Y?-ga@s8}R(#eA737RWz~G4h8ZTl_@$jbyP%9L9ILNHLd*h4RZn znoGn&vqF>^ui+lA=Zl5Ljl$$}bFnC8eY7o=zZJ>GUcmitvBkce3KQlV`(`l;@|bVjFXqZy(C$%DX6A|9q{*TP zbxMpMh?&M?Xj>ri$pd_s${WRK@e1l*EDDS_#WZ;t?msGK1D^u3QY_%N@g0$)_(I;q zeUi@wz2KGN6M5x+z^BRj6Z)HYJ@kh#kI1K}k5LF5qkgMv@~9Fr`!#4u@JS+V4}<2t zu^-Sh0-w{w;m}9;95tSGc|-n0edGx-lDvue><4e~LHqg1=ZLbTZ-T#+;RDb=S7wTL z#bP{s(KtCtOc#FwpZ+9@Lh?!J+kWtwe8+E+?S95Nt3B1u~Ku7bBnMm#uM>=oY;-xK@AL*fx}K>R}dM!X?D5dRPZA|y|fjj~zpmV1ro zjn|CVtx?t(Yl2m1O||YT9C=h6HIEL5Zx_N6=ZZU`pgbjhDSj({Cq5FNC@2l`JV3d` zc+NNiC^^<>YkU+G<7jdy6#7Hxt*aEZ#bIy=J%~9tjDd#G^N1ifB7dNS+a_M5+)w; zo9dQ&XeK46q^70&h7Hfi%o>qBGG|n7UjFDYW5cJiBDh z+|%Zj&M)(qFIZTyXz}Sw&R8lcmn}z_UAd}e^_oC!UH#g14UJ9fH*DOr`OLGnoPEx@ z=ZVg)3wtlRbl=rq{+EBf=GyD7|LWJie&Y?_xar@%dGjr|-TLis-F}A%Zfy|%0-I@AC>dUFe(^Ar=r>#!gns!mzHEFk{-JkYY+6!qP zrcX>?n%`G#c*r*lHunM zzkK+;!w(EUI{fpD5gAJ}Iy3q+?$3B4<5 z@3;f_cWAsAUoyUJ{8i)c9{=3<*T(;CLMHxApRj2{_k^n_9GLL>gcB1>CbmwzYvPfK z$0nsrDx6d`>EcOuPkPNtu}Z8S>qhIKb;LSWP*_k=u%cjF!8HYU7d%q%a>2WWqYGCQ zUQ~Er;qjuRqNznoi<*iqF1oGgrK10tEGEyJyc*IrLW#6T-Ct2G*=dt<%BUNw)6e@ zE?%>w#wz&~&&}$rfitp7&Lq|>3NI&mER3Q=H(%}_*xzrg4fxlx1&Yrz(s#27ipvt- z1-}hoEX;kte=0IlF(p5DTBa;2&={90yh{t_<>iCv^QYoI_?cW*np`lie2U9lGx^eg z$*i2=%=ZT-PZ$&M%d6(DP6LCTi_$aX%l5#7@}Ud)E1y=L53Q5?3$JY0*x0bK;mU$5ZKG@Zte!J2 zyzq>kS=)=Ry;jkaEzXs9$PdIYA#$Llxkc3BveG;38*j9)zg~XuHT#AeZ1mv|^@}@& z&2aDaL!bxba5Chco1I@khCNQE zYNiC_-<)OX8I$Fc=^4h$?!7S6ztRN`_7c7t8Od6}2QE3~rP)QWzK7g+zt?_yZnKS^y~3U zj^x!{TEdVh@uKc0121U4RNh5vK0QmMv$8?m(jtJL@!Bj+w5u!ZR^G3=Z%~>e@An7f z6;mtjAjc+7fL$TT}MO^&oPfUDQ%STT*bYOhSbQBx=>*XK&*FkDU=S-ZU+A)>>MGBo)XI5tt+ znf#vHqieH3!Fdh+J_b%{9fDpPXMsnv zG8Nh{r@IU#;!8@D4alisjv8ugaiyRk;ucyjKPvMITj$^s`SZa6f*K6yzE1quJsfI{^>y?L9sa(;HvOuH=K_Q_%D(R6i&)- zsVY#pZXL$2;}ZmN+JVaDOdsgZz-)x;sa389>&x*JB=-qr6i%8Qu;j-Y0c{-#s zn(o+jfkfbj@jrFFA6%d_5#CU_#0>Z{#AY)Ecp$b*6>qfP_xy^PGVl;<8-am`$VDSy zxMpZ;mPYd?U5xQ~!zeN(MsD-`736_JJI0cUAg$%{NDOg(5AtW@5O72MM%?xOWgCYE zj>spRDr5Qp6v=)L|4<3Ec=c&DZuRV<3gbpyUDtIEQJ$LaG&Gw+*j|>!Y({G^WXsef z>|c@Ls_Y7iqW#akGEbwe*vd%umY%FFg5ElZ{{0mc3Y3Yd8b) ziWk{43-U?Ra31I#!I9mRQpD~kk2VTfehd+2(w2cuo;ESB50l{~+mv`(W(*OkpK{QV z3OYt&mXDDbqd1Hx%%VaNLPsNA??QHg#5^-K;IH|4|B(|U2DTd0nNbUBj%P^;ia?w5 zXH5~wq71#5itmU$5h%3MixKYVk$TFJBCU%fG}bUpD6BS~h|F9a<^zv@Jxo-wTn!by zTnPbQ|0XV@z+{d$5Mk*DNbD$@l}+oi2W~T3DF@{J;E(J3BDREJ>v{p>mLY73Hl>9r zMG;`oMTVo?qtz0IV~S`$H~&1q~u=b z(@p>Nk|8%bpY}fWRPR$Xb>p;wUx3#y5B$~082GEk7jeRH03!qKr4m_@ zv&1=$8LFq91ByqUT}ejGQv~1AI#FyKgDF8klR#k5wIi=tj;U z(?1d=#HqQ+VkFjK7Kw+jdV~8p`9;&Noo-Jz-{3R~><;5t<8q@4c83@)!|8(#-(?cy zL0w^<0qUDdljqB~oNEyMs$gPE0{+A2Bav~Y_v4H3K&!D2bIijydQu4HrSM2mJxlc+y!SmnyqHs1!@tlW`ev%|R{(0zD7GJfEKJVfm74 z6fZh{G*PZ#sUCL&1jq$`pwbA2@q@$mpwRF+2>1M?{KR&lo#)(6%v>x@<8uc-5^$aA zKsk&dU_&ol{NN)&`vho4OzMyt&WdCR?bU!ocarCEf%Geu>OPKvt;mkl_)vZoc#nV# z>6xfTMPuM8Fz4`SddBx|*PeNfZ`Mz%a^c z>EIxG#CoMo@@d89B@jMw=N!xJpjpoq!Uvh4dcGPJR1G{~8n!UFYAT*mb;ub!&mW_v z=JcFOBPs{{AAg*lf!a;ZEiTenEA;TY1Z{QPH*<1}reU~?eoEy)|0kdH|Mqg*hHYdy ze{uejb?lgFI2%+u;3W&uZa8{Wo>9&FOf8!aa%>xB^0Zt!(691)uOIW@A%n3|d|+a( z2aevAInE!rAj9_#+GV68DURcb#~Z-$aNmb(P_3*inzuA9kF&9iW#fpRCd?P~42#bB zXb%rd$R6T-1f}ec7;4y3wF0m|+NrV#^x=oz5x-bJ0PYUq2X42Oa~b3Z-Zf{&`2j>LJ5_(Q65jvJ*sJ01nxUb3meKrf=b@@dRS9)6dIM{rjDLCx#QPXU{UPEzpaFgrDXN#^ zdm+Ef$cGJ4{w`idm9s?Q^|Z4@c_;Rri?AaB1Mx?P{2b%Ti=BhEbMTT+3|K1~AvEZi zKOFUx&6zspn=0m;-|T&D(=!JU^55?L_j|tdL$;C+IO`DctDH;aWzMB+&v<_o+Ut0) zY&I1W+-6y6zLC=Z?z{c>-PixlJN@_3Y>zwdW&P?`S#q?@%=#JH&V=6VHkM(IBY`Ij zlbc;??2h(+F4gv%MwH7t=qSf84-zL8^MF%KKHxX%oMrM!#efup@c`SO=B+?&gdIILF?y20o$4nd!|uERK? zW~g&}f#-OFBOI-~+ph%GhOp;C#1BIUuAbc1H)S8wS}P*0#w!?zb^AY!o`Eq)pK%V!o zo9AKWtAKglB9-Tv;qhA*tehh_?KKgIF%STAr{tDmYKvYUjx=QfCN=8ppzVBsU=|8G zY4A?j&IicOYRhT|PLt9JNm*NV^u&q07t=FNa131#I!8PV4pRr+zST+{X@*~c&ARhr zGhABrh=-GS-cYNwzy!aHtDG$5T`)5SZFewFhTcD799Oerr=RZ5jv@60N7*ChI82{; zSj|I)*9->FL`men31*|@MDQuWl$5+$u`Ue%*QbJi24=|V&G&7kOk5F za+AaU$4v1i?>JHFPue*^*MoU8qm@&6x;y)GHC6g9U}Ih>bdDOQBbG>a`~!#uTmtt- zG?95q=XcP-r)X7CbCq}A$?QliKLJei0XTa*81q?GS}007lRgRxw0eRf4jn;c}z4E*AvHp zd0DBH3j+~I`w|1YQLs$~e29!WK>tEJS7ALc*F5afJGdUa-a`8_uikuJ4}0f?c+Wft zcu)$AEV4~a(?WZ@M+l&nYEu3Fu(|nB!#&MoUJLg?5ud8uf2?5q9V0%qNk1 zV4gWLQ#d8gmc5xnxjM#xua8V5-WzSVrk)1^9~h^KJZth&L(cEVjh4Zsp=K6kwqgo= zd3eeyc6!k~pUnEd?i1^`sYCVo-BWaFyrAUc^?6XyIrY?Z=4j~+)$LQBOot}cc;1t> z%i||i-*Zmgcf5Zd3JJL`M#l75LvlVdB6aLJgb-4ods^nQnN73gTQfY zVjQLG>*COKUeziUkE-#Q_IsYpNIP<$gw%WfFAnsD5KcT;bDHujhMp4zPt!OO4$q33 zBs?-Rx>{LTWOh{E2XZ5O0cKK`;kE9_=7q?WI|rhtyY=GsHF762KF9k;5JW`eT6bhg z8^ICF$IW{AI(^_roS0uiT`={0rrE9LGrbu|B)F%`*cnaEgF?`QW;G9!A~hEkGqY(X zX*qsz_+(T9_~$2vZ)}Z)f0n`@`JkHHNrb67+S*jf-ACoi2?W1rO2B z$@0NOecv3P5DrGeG!i9*Cda@@LCh26VFaf6&KY8ixiHT(NJFQD=ZeigaIV-GC13iy zA$AU4zT}N<$&AAtIk1$d`FMBoSoz4(&^hkhG<;;D*>gtI_!;z8XlvXox^tYGYU;Ue zvs;ZO3lw)xGTTjS8*;|`Y1bqM&3eoGl~H(oUHAq20v$v4wPDDj>g5^Fozp>bw*( zT3}CC48r94g^C{r-o+5&r;u|b9|nI*?M}CzaY)z0`x-*LW1fY2v3YK(-Rdy`lYoc3 z+$VGt^-ridt3i2gx!tJn2NsLNc`hed_L&=C&z5V;(KFtI(%q;TaCuz<7ZsUJKNRJj z!g_t7n*+I{$VdhhKReFMV#pbCF0?5xbx=)cELD?skr`+C%^02g!hKFtmKvTdj-8eN z_~d>5LvKH@;spZX7ct z0)fFoPK<}Fh!VJGdy8FpC&+mRVdQ30Lt;|o#ik+p$F!9iY?^AcdtB{lQ#ODxYgs<# zJ2~Ey#~tfYR^+DI#uczzmFp&&tyj5jJ_141jQuT2DPm{sjSrv-UjUxU zb>rYUpC$rWt98qRxdk{P*G-6{o4v$=J?1G<9HzC(YpD1M+UX}%uA30Dm+QuXK1~TF z4(>sE1YhxNPOU${=dmBemcgsBQ9Vub z2uZjW@ePoZxU)|cO?rR&?Z`DSAImv}`AC-rp3w46o{c%FY{97Q&60RiM!7O}SYK); z>xrq)uJL2`2=h`KRC2C%bm_S%J&A;!449=2Z^MCeN6*Ohl3IZSXPjq)-niB90%T-U zxR$Llo%o)UTJ`!kbDjX+j$^Klsd#P{P?PU^C6Xx)be)TFSQ5)fKOeuH8-a>io}sS= z&G0#Q(+Pz7t1c6k3{E^hG!1I1^XTowH{B>Qipak&6R?uaH-UUPnay z{NLjEMHdvEb2W~qTv(JXE{-O22K!_%Kfo~|*PXq+GTsDL)X4B(X>U>cW{lCUt$DIY zCxr0s8ElPH9FE#V=X#|(r?X9aAG5;EQKT4$I$3TVjo&y8&wSqHi4<62K_2r}@&>yPxSfotJgyeW zd1cR(78lGfC@#$mWSU=1wPw$@Qb%TDUq>6Ra>TX5+EI8Odvn|v#e6-%fCTH1<{5IA`BUN$Kh~2oV&bWJ zStMw3z4IgEI(asI3uBgX-N5(c*(#=~XLu2uJzK8pqxG}o?I&9vS zZ@U|}(H76|bf1%#>YWqplF~1o7Xlad?C!;5v-seRpCrGV>|XFtv>#s=dM z7DyhFBhs-^0dF5T&+@$qPS?=SNscFs5b$AUkP7V~OXf)IGb0};%u_I4tt#l}Oxf*5I( zE_7I>yU!8=TOzq3U;Zf7`9R_wuz>$b)eTAzv(HXj^(^wQe!13NdECC;U3s+ak|o$$ zr|7|&zwtQwqzxf=qbgu8AU0H$l^W~x`!b!j^L@G5_THD7=Un*>;wxDstM_l?DJlbe^&yP0i% z%2)6{>$m0G{eMzIR;|<)#VqH~&fDx?%^jkBDy@UOC5q8 zod)u_K$$AdQs|NG{O29=?f2fxGJY~J_uxV7Vm`*|Vc4pT+SND>HiGR^e!lH>r-Sz^ zupbk;7ikj$Qf8yV2V=;BqG?#o!s3xxU^ZU7%~>D3L|$(DZw9ytobHtGAWOjxI%G)hl&jiMp=FSY z`otf?!$?yt0EagsQlfe@mT{}S{){u4!kB`P|AKS)p`7IWeafPWsm^C|jMCgcBJlnm zSBgK7aZ(-Nj{^J%WUTtrl<{R^1&|8Q_YldGYdwHD3~?YlOyM@FZXtNLu%MlKDrDsdHxxzthJM(cb20=wGWDZopV%fCV)54plR#{PFi_vHM0oM$E`9+yGg5lDUE#P zFL&7^U4BcyV;tE-4(zaf9R1)=**<)PUR{J=Lq-M{alKkQ{0ST%@xi!M*&##^|A79z zJ>$kV@#3x0F^N6Ud@oY>iZ=8=+$RpNlFqF@d^ZBV#W0+Q;JD6{=V8m#zdAdV`}>Y_ zHv9AXN@84xPM1bHat#GvkLvEu0}*l+>`r%Rw5nGMTL~m$cbsiYXm;=#5!e_N!TdHY zUc8ZFD?^yrxcGEl(*$8|f1m01&x{zLOy+MnOqn4f1o~5XFK~{Gh@*uSX4by}-DnxH z3$jgfQ0?fKb04R3P=#y2(|Or-Mm6>p{!{Od zweTI+vp(ZpXe$6T5(LlfE);&4POv|=(tj?AJm9vhcIw$!Ero z4`ZGluptyY0B^YGmihNLpf{vJrsK6LEbO|%a^ znl9ryw8MCcb36sP$lgG;Go7iarrR{MtfwHsE6N^*t&_+!Z+qu5`_oVD{?BF2z~k~s zzIWyxW{XJV4h1kG)Bi=ic4`EO4!_FF1i1G`J?}KK_bHD)Ty9$Q%4$;*S&!aDZ>rl2!zJQ%I1k|9QKRTxA=8L?Wy9+T9lM+3<%HSYdLJgj^1IGivHRXVJ5aN>QNG3<*zybkOl>H? zb-MK24(!WT4u~v_az5}oVMpZpAkGtf(S7xQb^e(3>Z@6DjLgV-0kmP)p7AZvrr)1~ z_s1K2#>9T-L)-cA(&yoj_Py|eyx4Kb2k56-hen28PTYwyLnHGO9V+ND!a2;tRJQPY zUD|746h(DBrnC@h(!_iP3aKyAhsP_%EW{m&4$5TIv|#Lhd}1Y%N1{B8!CR`4giK;N z*5@aSiqK~$7l%$Dsx1s1Lb*8f24)r(izGZ>82S+9=^+PiR?Q6!pqz(t22P;!p`0DM z8)Z4}&IFueC>Mu5N7gS*qNEav?B0hH@TuE-pmPW0*6ajQbV1^Et}p;6sI28F~!m8qiV! zm`|bH82TCB-=6|*;4DDYUyPb>p(w=JI34s3fa6u6_fb}3 zC3(3B0P=ECho{R$edryOYt?m=D%XeJ!<|ilyj*Nn<(aDfme9vIr)dSo1y$(lGnAV` ze?qw#Fsp$H%hjr^Rpkais|MyDqTHnJY{8uss^$tncn{YbRk;b!Rw`Mn#M5KA4glws zz>xQe)k;A4B}(G6Qk)5Bt3+1lag?P*wwn8bJOS zWdNt<)u8tiD4W#%^{OPEHGuy!Kv|CHwFZzR%C+cg4Y>Lt%0|$>Mx2SK0YE!}G9c~~ zwYdHx$~x4q6`Sz14wNOMTmucM6B~hH9q>Pfa&zbwlxG2Eop=}!>VYB4YT#KfYH+_^ z)Pk$^kjw8;HmIkY@pLUD_%TY-vR2{07JN7=)&atYC@Ir*N~Y@+&g)R;E!-jZ)tyz~>E=n?ui{JTvrL(EyB+Q8oeRM$q*zuE^mgkqrn<;7Kyd70CV90|y7? zO7ys1;k;hqydM4j33mv8J>VZgc_yT`UTguL8!+$bL%9O;6&u8AK-(ZTLq;0}SIIYs zEqJ;SG=7G%8d|YYado3u1(+MbjbkVqLZ6^q51woUEgzwzCTs-!kHGhpp`V~!11@a> z?Qfu54<2p;>}2$`9JFsnog*k~0Dm*E7ZudGFXQW>1UZ>#xgYI>j$dpIj z>vWN6xU&t&>I;pn?)~97pYliUbw>8ADTVHJrWotr=U$HxY5pI&*V!V)&xpjok+}bR zSei`Y2)qX$eJzoP-S1u-(EOjd*R)Tsev+6d*ShzUg-`ao*D1LFb@w_A=ZHS-UZ>;w z1NVBEs4~X8*TY3I&-_$4WE5^NUUaWB#e9FAdp$yo@PFIA&KAS{kGa<)asL<4>Mk6` zxCi*Ri|wKfQm_y=S`b?-#Dcl_w@?)0x>hvf8K2hTX^rR4)^&|Kx-Gf zao-lbxbDGKvuH(3YC%sOVu=vTyKwSv`}VdzYkJEJYu? zSc^OGduez3?x5X^!;YIw(hR_lPi!1Fitt3R>0){ttJ=4WA9Sh*ak(R0`}t5qxjK^J1dlq(q`(wpAI}5 ztZ*fO;X_<$1DxKNHjRqEedvJ-&9=IRjqeux?o_?8pB=bvRXtm-lq^IrMtb%~X>`Uw z4#Ys9b#G9udvTvuWht$sW=3Nc+pmWWt(pR((OA#{+I<&rCe&tymshh{d4w)?e1B$Oc>{hheOyYxBHwx%)ExbMVs!X{KwMx697`U@X0^LzuJX%D5jc>(IPe{z?e zsRd<(H}q4C_tZmLJmu1c--J&u5V89Xmy47IpJ(T#&`$X5hwDF{M~_T?ZtS9QH{U1x%WJpd@hYz zCiFpD(UN+o`_de?6=#|iX2g+lB!md2cuy;m>BZ8rl|w>smJ6Xd10wo zK^>1!MvTeX7Sz*pcs+J1NIEu9!=p9bleE?!>LKN=xkIX`BaG;pN7PV0YsEkB-pRS4 zwO|gY>H*vcb&-h48l;rZwt?PAq>I&G@`T(V_F58bMP5h8TOXil9VVaSx$DW>_Agaq3akC=C8k4BB5EFzjisI&=ULyOk-8I1|~o+$6Ipa)%OMP7T9HN%R#LDe2` zLBsXvVBHpA6u~9pAwB9D#kJmg)*Owe##}!kUF@I!Ay%tBZ&8J4v;tAK4xc7`70js( zNHJl@=3m+(c|Tstk@%;5c;Oeyk%y9lr%TaR&JiZ#bF8PPOgzeo9eoS=?DAhkHFBaEweXW%P;9+lIp1(;qME(D{UyX=`m7S}VPn&uoM7l9o*R zC|~9|i6hae^v_D5e;%E+=qWb##f}b!qSKR4BD>Vu$tRxwW!A%9Jd5vAo{}}F)y!=8 zg#OfvA3LCfIul~F_G&OoW}eLY%-LuI+Da*JeU~{5t&P3w+8(a4xv9>s;yE2%#|KYx zaxKudLVKj$u^+85%mC=mdX$}N8EVS3th{V8!V%^_(PPMXf93h^X7Grbu?w}SAI$pn z?1-nwo@6T(-^hy|ctY*B;=P^68A^g4dAowG;~1f9YM4jrdpc5Y$1lcS_NedEj>rM# zsf>R%u-t`b%v!ZAYU-mS9Br8yA2nTPo{UYD3bmeXqq8j?VLa;^+JZFo9ECMtq*8-8 zz_A%4f`zpfdS_l&#YKv>3KwSOy^0SSC+$CVX37y6<*aEZhF)G2$+WfZXiebQG^n&Z zHa5mm-36%hL(~JU3qJhPT%gDD;?Jq+rY7p1bne67UZ%Up%}cZwnIOxnf>Xp z8OQVFQ6kSnPP4Y2Gm4Eox`$JFYMt4~kJMsE85%FjYMVRKnx`nQSN0Yi?Y?NAL&=PD zQn51AQGq(0c+@eprs)iaocw3T7u1!LjWC#1(Pkr7r!xlHxVB76($g!>eCj#SNPQh6 z^lZA$j_C#I&pq8|Ywb;j%Hx@D5+Yk@4#j6|%J|%_ z4R%8<=|p|zvW(5%e6FQ*U(Zp{H&ePjVa<&2fSEs|4$F45W?x#q^dcJ$o^xWrA5?Y(}Y`An{olgxLi zowQZPSDjhM=2qIb_PDlF>Us^vty5X&KVv7lw}|dF04Gv2c+Q#Yu6i^aJ-W~%7D|zt zz_A+jl0Ja(R!3*@m>Q?!QsM|08}q!J&eH~ZvmX2-ZaSOtGCf~{u~2L-T7sUN!nUDd z=-AI$xJcIA>B`0%b9(V2HY?EDNZs}{MCTG5vuf^WP4Owc)x7i~Ik`+ZdQ^Fm_Qsg= zm8^*?waJ6$aa((RukCVW8L{JyL?b}$W4%_<`C4MQUe+@>9x@s-|I{(q8=-4It0|%P z&=hLRWhAET=^d#79L>?bZwgSr7Gze2TRmor#vk z=#3}A!O@W%qfBT!+E-CxS`vveC)U?q@>HWBW)_@7W;W=>UiQM@@mV%CfzqZWYH#>O zW+{k^$Kyy((ONk4*fkoy)-F=5ZGsXRDqiaG%>T{2m(DNf9W>vfduD%$;`7Ppy&_ue z&Ags`-pi+?z}^|7Ji8xSC$t7Ng~u{=qB1Er0FxPoFwNogl|%+&(w z5Z7xWoR40;iO+R(F6;SaLZ+wX?6fCq9p5$H9Ah;i0tA3{4Lk-%WW;(EuA!(xt2&+n^pgu*=$0;9-drTB&L=4tVPK^ zOk81Hk5>G}yX*127WMRsBOwzjV#_&F?$>Hi-`ItwFd(-$+d*D&guE7gv&Kr`)ugas zPo$1D$(1HNuLM-KXRmA2U5y!eLMaoM2o%P8_O0=-@O*;{kKT~QRTi6818DYu=MtS3UvfTP20n#%ybh47?18W- z9r7cfxX=jxRikG@(sxKVwTJq>+~pweu@0#rSG~HLhkBlZ^22U6w}yu2i=%>cVc!_) zM7XZ`Obn?f?9rP8iO86J5@!z|>MV81vxEp&Xl2BNJyF*D#U55dO4KCm;d7<0tx)%& zv9W-?)g4d(mb` zXKS#>!rmFHu_j>EcLzIl<$$hGY;6ek^tN|(TBntqR-%EqZ3(8OtGgXQwg&C4UBy;& zXDe?u+r3>@^UmgWn|p99g=4d|qH>+p+*jdqckA@F^t5;P^_KLu+a+B++vn7;2>5)y z+5h~XPvO6|y3SfrU)N*>YL-{mHC9KXZ_T#m`K=Yftvx%Md-iZQRr&v_L*Lql>dM+> zfoiZNXl?HT-B#B&#mhl_w5Ef=85X(U*JbtgwRd3eSRa_v)nm8rYHtntT7x^m#qN$E zWC$oNT{hU))zjS9zB6cTqhz~#y3P-_^z{}i5IefNyL$RmZ|Z3aHnH_VP`=={ZFrzi zX>Mt54R*A*D9PCEo!fV`qw5v`@95ak+1}S41TabsI05=j;9)ge+j@fd>TLCOQ5&}P zK%s!<1y*~fwX3bYrA=YeYjrg5f#9v)HW1aSW#2&{_<@?;%{_hCYS-J=-mSH?3p&=* zs}vIYxgr2HfztFU0>auzN^q--fOkMWi@~ZLtx&OItD~#6eH)dHn4w2d($l_mM<4DG zVSA6&47Kj++|F@Be%F`w$J7|6ER=z|SA_gJuo z_MMvPBpUo_Y3?LCTVW|S5ear|4Ys!ODh>@GHm9pccc+ye@OnL?bNLHiw>9^vu6kU% z^>u>7FdG+L(oJ;ZF;Pgnyr;|}&wGn~ZC$&dKRpUt(hP)qxE(HH;v`PVz~Zhrs+h}l z&5WMlg*)1Nf=d0MKW;ye1nxCMo}QnG_ztVJ3s|$W=I(BLj}LVf1G`#wC@4xHLCTI^ z@)pc@VFEaQwD&|40JXsX`MajBrm3dBuF+Sxg8J_Ht3u$g4Z1_UAei2uvXE`ovCjX#2)OK-a8`^?qpyK_|pTu>1gh`fO^$y_3mhCBRfDOwA-gO108nl=xG7^ z?64S$&<=fa{THwYLwR zf-D6sgkF!Wt?ix7w&&ZTVUs^}9q78LtvA3L_f3H9yZ4IU`tItvSrl!xg;%)o7> zuiBeNA+7zZFP;UE${wqwt+^A7*$zGH>1d`0?BQ*?Nlyb~nL&;9bq04?!OorS*y2kb zli11~eQjMmgGuad-wu}s55R7Myn<10hkxwgbziWht+TzQ+4k+~X{Qv?y*9XRC@+Mu ztE~(C?+m*wSDj;ULicN{8)|DB8(|36RBL&CU6pGTYlA%(LN`2t=4?#gsu8@8cDj4uOHdPzH>dzAx97Uy zJ;gDuPsb3rRy)Q^!|uXP8=w$uqPz8Z=8f)lY-M2c?0XyZw`&(g25z+?N_BPiR``6U z&9Lf%$amayB?fi4p&n0T+9CONv_mx80V9bhPcaM{nUQNeXb`W|Fm5lXxgi6vg7!8D zW!{XFw~VGN?6^E=Ug(HnnhIn?#|x!f49IT42sR_|QXp^)ofM{yoJbLn9`L^2?+$m2 z#7%jnKDx1JAK#0LDwcVUt<`e*N!Qm0Pd2+50TdZZaCe{Q?b>#9Ggtwc&!U zxT}ZEq_=_d@9FC9X=gUm0VH7=k?I}6J~Zq@PSGB;TYFV5$ad@iAhyDdArsS{JSKd1 z0a>?=8-EeY+TpBswg-3V_{h$otv!%VDO96tkT{2y37RR~WBjy_nX?WT@bkS^aCbMj z*WPE*ocoXo!Iq*7(6u~z80~a>5YORT>GXWd!vfJ>)D0@A0qb{Nb0k7a| z1S2qn;g2DLP8x3~^ujSw5p?_`(M+V~&tMv(>Je?%q~p6*k93Bw{aRFA+ECaInaRO| z-RuFKcxhorS08*ru(P$R2YjQUwIbE%YsU|`7+<^J2fQiMyoqrVuJd9J2_hoSi7BAUS9u$k z@Y8m%*w?Y6SLIRBK@xI6k_5pGPKUG;RE;zXW1_3BuVNa|?}@QXbIFZhcumU~e% z2-{0UEI0S^MRKngPJls8j52kV%(r4kbz6h*m`v<;Kp7~6on7t7=(nj3Tpjbgj^~}3 zyZT5q>>aSHY8saZDr;)18+=Wxs`YrRv3^C<#>$3jtESOf+fcuurmDKiDy(e8@4{kh zV@=bl`t?l~YBW^VHEqTK!K$p=Y^|xOt19+YZ^B5cvC*n;uxe`825PFSimjTu<$?88 zHFYbkWoTDd&k4O-HHbEQe9hJ*W?3M%j?%}Zm3zgs;L-_nsBq& zYHFygs;;eUSW`?4>p^mZrK*$wOTe(IH=v%?xT-P`u<+CuhGDI$4^*M{vT9&oiIJp6 z2ZSsB6GzGp02gs?F)pgYkm4RZbac%YT8eV{PH4W9vfgoyv-5?%! z0SP%pWA(cAxPf{;w+qN%RkcDLI9KAo01%aZ}>mRTJ+y zC*z&wRJ@0nj`^%%IF}{^@9|~fy}oR`^_PQpU~_Q>K|cPUmt*k${y3bsIstEmPQr{* z0cNC&#ALk5Jr(b6Psd8nOuQvsjFs;a>{OVGT_yAIZuNY;Q|-rF(F^cyT?O81UW|8? zmxwdOQp{Q6J!Q;R;T>Vj-__tP(KVR2;+wUc`CKO&Fmu*~`Lhj}-`j+_#xwB_<`!|b zI7gf-&codMcf>w%rMOO9A-*E67H^6>#SifQ;q!POaVzHkuLr+=4z9f*UKGC&FNyyW zhcMUwEAg`UrFZ}<5Fd)e;#Ki$Nb%3&U$Bp+9V>GkSS9Ebw_|nSLbXQ9JvMz<1>A-8 zh%34*{ zsj^;`>r~mG%0`wc3h+GrRjT`Rzvd@zQuQ{g@=R4WvrK9(>1|2c%A$ouD~lkDZ7jC4 zXk*dN;(Qdz7pQg@@VCvPgGDEcE*9M^E@aWe0&{~cNqsDKph(`S8t>%gE_Jz!m%G*F zZr0kv-xsOh7vWMFpbUjzZ?ro6J@4%Qo%%j~@dkeXtmvKpR8KPTV>E0F2Rq=m6rbRe zq<-m^Y|W1kHdrjA-Q3p+%ViA#`0D8ec&ilmy!uIQuW5L1cB-m*8nnCzdVH0*R@?+_ zzaJX?G&J@t*u)8Rnh6bBCeM@Gpu{4{AqQeM({V8T-$@PDJid(}Mi!NBPXIIjS2UrTrZ;=~gl zc-{j}>&4suJng|$r#%gAg!oAP&l&3oIOb70cPj^prNC7^nc(?l)-UojRZ?hl6 zTk^zzZUawk;F%3Pu|cX68`9K?4Lq-bZ=dt5 z2AM2iN;JFJtbsvRCmis61D2YYe3<6oO|#r>OF^l`bu84W7E^m!mh^VCbc^}Dy>m|!6)5M4r6^0mPkKVnm+33wroEy% zbqv?cUq&duiPK|{X)MJ()>)wFkm42nTh4R8^$7}6>eCIRJnY_o8+|n(n|Vt7MEs|C z5+^hK4B5la-R$8PDtCAV5&sBcJ0tv?;&(;E5&k>dDLKD9tY+pz|l{D8{^9s rr5nRR>rX-RGq?wDt?1zYP2A+!8{k0n-Aq`wCtGTeCl>%hJ^cM2-3~7b literal 0 HcmV?d00001 diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/Contents.json b/XIONControlPanel/SupportingFiles/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/XIONControlPanel/SupportingFiles/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/Contents.json b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/Contents.json new file mode 100644 index 0000000..ddf1a41 --- /dev/null +++ b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "XIONLogo.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/XIONLogo.png b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogo.imageset/XIONLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad67af7f045a9120b954bf8d7260d61a7006ca9 GIT binary patch literal 22227 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 literal 0 HcmV?d00001 diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/Contents.json b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/Contents.json new file mode 100644 index 0000000..986f206 --- /dev/null +++ b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "XIONLogoInnerRing.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/XIONLogoInnerRing.png b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoInnerRing.imageset/XIONLogoInnerRing.png new file mode 100644 index 0000000000000000000000000000000000000000..45af29625cac2fb02bb44699270de5185e5bad77 GIT binary patch literal 7715 zcmcIJ2T)U6n-_S9f&wB^M5Ops5JL#PB=n*vh;%|Pp%@{Q(5qshiau$g6hVkc6A6N} zs5B)M0SQG20zw`H2)zc_i{;*yj@p4ggF+ z9;TL9OM@%Q&KOTg$9)>fAWv_Q8vx*HLEeteXcSi13FYSDg%G9H5=4bPTo9rbat2Zc z-dZSkkBcF`D3cIFQ|A!0vyzLbnyN57NEsC1iNZPx2YKG`@>32%i2jhP3_kCJp`yY+ zNU&&x=uf3A4UB}fFuo{ZIY~K)vy?PUSV2h=CMTz$AbmktS_&o$m4ZQGG7y-OvaGDK zl$7wVk0>~suZyd)v9|87xxhDss5=(xtqg?*1_nw7%1B~--JmcfB_*hoG*ns|0#ZQy zg1xYgK@cy$)4wHXqx_tGJ-o3V7%$;{iH=Sfe=I^2)bytbp56uq{|NT-`{gLmWzZl; zZzxPs3hL>(Z`TiMKddq8-_`h+)PAPH-YBRs$`9l3>kP)j_4IFM(0Bj+MEiuGHp*9h zJ;0zi-q6N4`+K6iu$QzEq98`n#luC}(NPYifKqgY$S5jEL1d+!o)F`mLdJgw~UFSL+WbcIPtJ1IaET%_b7vM$b25GMsEXNVF^THaMo z-dRD(NkQ}%zsvvCgHTW@=zhBVhxGXk0&{Zz@to$N5jN{Zz+4R^5bVwR*{x^4BD$8>ma}oSIF*8AM&R(R3=u#bzdtx3zlJs& z@N;xC0zbx2{C_6N>W!0TKjAF<`fy@mQimYowdl!5#){{gWRI#8K6HY^?|8eb_V!Qh zp)S~)Q;6?3UoW}MThuP2EE?!i_5o8w&E3GH$;kDKSEk2I<4Ycl-)JDhtMMws1pm1W zCf%ow50^3v78;U$jkLv3ZMh+_Ny)-yi-(q@_6V<>fNCG?@^l)j+>>bTd|Hl89SIEVVoinP6|c=^o2d&;I4Zu*A~i?KRx#=9|NM zeodNj{T&I3k-hH1$XuP91w$1SO2y2`CNb?qV$X0|TKc*i^;otncMQ+0#q+67B5wQm zCNVFe<#n*s=%X@sQmYzDj1v-c*C45@p{}Afz)V#Dm#9l9RrM)&lj}D)Wp*r3;IMZ5 z%v=GF>uA>1WDbGYo3@FPUiS@b+=MwHcNI+M28)&keF`7))#OjlxQ35QPei%H77BQ+ z`@fsa3hL&bShC$4dfeS|MwhYM$vXh_?)q)+-Om?I>mA1GJGxth_z!k-LAEe@eOYP} zcRJG&|L7u@4Pn~9^p9TuQ~NUBQa%l5TAPQ6thLxFrxjT~9W=6!oJoNN9KH)W1hKe6 zyS918w8mDvb3N1nbYrq>&B&IMs`c)phdG~DMQ;-_3Kcr#xj+oo^EG0d2y4PjLM`}@ z=&uE_PB%eTV2;sARq^I05*sC>PoSf1&vp%Gu=CS(Vk5Py&3azcz7!1o z{hQP1t4$M5B>`b}@2-A~^ml4FY4LW%;tHib!7!{7aSg8>PcgfhRurj_y;#+3xHWUP zyk$xwOyeDy_uU1&d_EEm8SORfiu9jdAQ6dEI+yW5Jdfr`cY;Z~*z|xao7aaJ{PhKfUo=|`x=Y75-MbVk}o)a^AVV*9PK$En;CCe0Cn%Xnq6hP!bGij^X009 z#Jx&>t5c8I{M?$-OWC8BM3eX=uiuw1RqzA7pAt_ZC%xHglD1hjs0|QYc~i@-a-;jg zO4_3;jF9cyrB6w>8G^*hEAZ$!Qf2F`6dL5|W9=WEvZ8Y!6!XK`dmXZb!Z+W#2lu^o zEFcF}@N+@BU#3qtlb$SlTx-*UsA4?+?o5f;tiuatBHetcGpF~+#WAVwX6-G><_UO8 z!(*o)E0`JsuIxghd?)$Dgjb$Q6QzATYrP=BO_Dgy_dy6#s6ci;3uff`>(?FE#^De9 z1AJmKD<2q++GJPvx|sIWa{0()kX#7FuEgd=nj6F~e)EYme71$~DyA3tM;} ze|ogjz5%ONW!5jNCqQufV{p5%%ZaKLEMPj{_+GrOLW#8TpqmHOzIu9Xn1*|`j_TU> z4apiVzDl>xYpG}{LTncWqpFJ*D$hPAAYAZ1Z4j6wKdPInBu-_gTaQ}HKD3%ipX~11 zW%3%R$tS1F8qX$u3P4}B6Ore^i)GcKZj4vxRw{SDtNvCEw!K> z=iB*uOS+Z`^cUtu^*yz8Fr^uyUoCIZz+@%xi-1c)4vpUKXZO{-X(+ZTsWfunBN#4* zo!aH=Rpji6N>8HYM6|9JUYjkdAt`mVm(jr?h6l)H21k@T!_Og%1bz+>^K<;b|8Gcy zk#~U~JI{F%Hguk#d<4)gq8U_Li{Du(EW9%)@st(Vffm%=;Enjq$0B0+by?`%?sxfn z-p(%)>q1>uk8&tMfEo*3`}1#mGwg2IF1I_(2@Z3Tzf4~UkC^yCkHo%Y81PuV^K<#- zChWkg8jc%NdZq@NIt)1gl@in{{r!+id!o%qmm%a0c_NwVRWDLL)GnypepD|eJE;2+ zG=#Dr#LV+R0J5HqG(KFpjrb%1ffd9PFsc1|1u^He#q1g|g|ows^^?>pIyNmeNo0{4t<*>eTT1Gp-9!BC^d&<>H{l_x+o+2rQMoj-BY$tzuJCTtV43Q4c=9 zx9|;HyV}}(#1-Bv&g_6Q8!{wHvb{4z3txfYRnJ-iee#MN94$s4*`$2et1<$B?(>+m zKCd0CYpp}Zm@7X3y)+&?aVtukg|lQSz$)IapQoC*6>h>VjGVkQJ+68GSffsXfI41( z7*$C&`BI*dmq;~G0FA9CvPN2dbadK)7MuXlGWCkq1Gs}2eoy+H!ULczc`I?U&1auZ z=?Vqr%gR{gqpPSr02Xne;4@(5;I8${6+@9#}8)6!|_EPkIg!BNmpJkYtV zgD@L3D}y##xIIB$5_Siu_n)EDUryG{A1C_co3K@26y|_v=f;VztroKpPSP#aK7oJV zXs2#ec9h3b&mS$}oVZu3cClv2;}4@OgZL6>lNb|`{7?9m?=5u!W!sPa>qNWHt5>M{ zJT_s?u>{xJbNQBEkG-5WWPKE>hOA0jfg_)s$_@{9`xMLYnZxkPbWZsiy@0#7ApJ?o zG5-%HnIU5w9Rn3v7&|$ibtAo^{XQ#B+m&^BCk`!sc%@h+zCQhtY10N* zPYw3!2kBz2ijga+IaNxN0Q>N~t;C+A%j6>pWId#TaA4^SEl@CEAlHOFCxq&LHSb3V zqZ-5drwNRzq2Gf058q~1t zS-jKC)^f%5%6gg)vwF9Pm{T~!A#=2<=u$IbE-XQ9hZJuzXWnnoQ>>6{!j^LqRoshO zY4$?`hdWEXrMz5gT1^=&-7Y7Qu(g%XsL@Ru*UoXP$Ff?wv02g5RFLAg75qaJjuf?G zymc9paWVdHVpbyt^HS=cePy!YcWxDDHp;q18dOLQR|!2@V(+aCm}*W_cZBOWC+sK; zQL6#MxyPde16W>>*Mvb&kkGY=7O>f?FgcVHrc+#{Q@l;A?$s}wUOQM-W)(@;2R9d2 zjg)N@`AULPdx0GNHrsV#gdx@F*g+%l{L<~6UCjhqMkGL;SJ#%frGQTqYXD^2l0#&+)YT%qmDPYg}OW%5rm_SlqK45eyzhrNR{#PJv zp50+bFx@?z7|aAd#JD$e5+>>xUhT4Lx-X6wE-`SirJHwpPFAeR&Y4y zgZ@4uF7u0&GjQC?{F0y;W$Zm4hXM-dGc#vti#0!ZFGD(tRj=qd$g|*Z5N*J(?w`_k z^L51Ap!Q@2Q>3_{m;|z@gI7I2rRV1BT>n>_j4$xU%0}jR^9*Q|zC=C~N(X)C7f_}Y zILzA3n6uP9s|S&iEnO7PvgEN-RBFLCgE_)cnDYnwkZFcr@T(j715xDad_{U;|40vPT#<}vY>j8qPNzvwm{`*4J% z3#0m-Q^<_bNN|*|+CAKJbt|-8Kz;Q&AHj}Pj=swqB~%N~FRgvR;f-@=Fsf1EK|ZNL zw1^b-M;hP(G255Tz2Ga@&BpQo`SBu8$z4@f@jy_4vkqI-%OGvA?m4H;!Kh$y^XX~@ z+j&jUeM0M({+-ineBhqWmdmU@ZG4cjw(ZFc0V0ZNYA`!cZd(%ABla9$%!(ewfs%Sg z%Khd)cqJXxs=fwd?e#HpYn(ExErK97N7Dq$n0Xuzz@&u-&U^KCZk7gG)d#6w#sdd4 z4JofnIsO{=udgnF<(twqoUuH>;h4gJA}XgWH8IiO7{!hCWvyuPMBtC#V`l3~$vO2t}1JGk*HRa98++qEjqCJ1|*+sx?HQOtGp^jnGhceZ~`m(gS;Y-sN7E!VTPT+J^@ zXaGCw(5K33gqcrf)9vZXI7$lK{=-pFu|1X>KD!I~$%eG&-XRIoc)A5T3pv_YDU+9Y zdB1JPFP6W}Lre4&IkT2!froT*f8;rEEj~xo(%M{}t|lJX8gi*!-KDo4k+4wRd}|T_uO`LB@Tf=5zv8hLiW8}$PVd1d za)varM_wrgrawFiiHi8@Xe(q~{rz!d8q?ZLwB}a(-PWokfoD$5$;OK;iQOL=8wrib z^jf8|+_K2|z0-0Q#Rn-PyW_EurQ;jPJ-pqFicx|jO)6%|xN4f2cb@Z2L4MFKsd9p2 z|ID-!aSv=Eop&dycQ(!iVtaZp7{P6Y(PNNq#=mVrosuYXz4091vdMjirUR=;=jMN4 zn%Rqp%rX&(X7Bf@-HVajB}@~2(E#EQiHxE@uQSh*Q)*<( zaWgo$Bj4S!m1+B%$cj7ru8SG1y61D-VO6M`abwyc-?vQUO~&ftq0TUe$2u?kTOB9Ui@NCmYGkTlF`|r*`@+8T*cwlXGWqcNs&#l&9 zL_Kx^ob&TYUzmP=!|`63k+f+4;%m@s3l2stRF|K{Rl-2-x%YA6;ij)<@c_F^V2Y+b zqON5n<8gT`R3NyUaUk0=Wd|mz*1Bww%lyjzEbmlj3@kjq)q?7*llqW?kJ1>i&9`Hb zXz?y_81!J6-JX9rGQ_1dFtD7xpw~kf-CqY}z~k>WSJ67fvL3Be`t^sTs|7sPm_y=W zH>^tGEgTAZt)q@S+HBu81I^=0Mia!tRG&}2-R(4nyHbZ1S=w*AGr$9jd8RrOU?Vj) zbN06BbMb zlMQDU>8{~)6IXBv&w`i}mqN|ExQfj0_ub|Pb3a?UFKegoWNhu$Y$oxV#JB})&AtJf{7O{uqDF=6NvHE;OubGk^0r3Iz40aJC9a+{j9;?F zn-c4p#7hsJLmRz2myB({sDjgZ_49AyN&N13&65#T;&u#A=X!XA4hxe&}d<>GqSn$tH z+1M~{_w13Tx%(pYPgm*}SzL|qQ6g_VDD=hs?PcN7J$kC<6{eLV&%ML_ihUkF=7uBe{T2AFFtb+^Z36DCOG)=|_v)dkL2dJ&`AaeKch}|h1R`BX<-NDU4>zU2 z){6fSh4$wPlfDwx+VkUSF(MrSlL)?$1ma8RbPKx17vW_xBO$WZ2&2Legf# z!@px&{a#!hHqPESrzL{yYHo~PfTwCw9%ML*1zH^cV835{0*AEOYE0RtAJh}iqrSJD zJ8&9lv>@-0sUc<*CnGRJy*f9!d^?86)Ge{3kJOTUSi662um38m*9mrQwl?IAbvXPZ z1AA6l(P`x8-b`~=G$OB3C^K&C_nq=B)K`yBB(~=}zb~KPzt)o|T}>cWcxga?-&6mM zt5mvOsVg!Y-e>QrLwVg%baq~zFNSA@W{2*`343Gu{#5(u_VI`$*6v#jK2G{9`D?>N zadi@d;Yyt}H0hkG$J9{>pE~+flCcxbcTeP`^pK7@?P zW7_qki`lEzpEKTXDO`_t-x87I>KT$%ga$_bc^iu+YlRnDVZz?eiXe?(nX<3tTN;9o zw&ZOtC2~*nqeX^;KhCV$*PdxPQ=#3r0fz)J2nan<331U;JUeQ3zimA|cHmOt$)v_* z1m*L_m&@a=ODO+_lTV=%kyH2Hk8Hk{u#ZTGsw|^K_G(*~2%&$DZk{r%9AFjioT_b) zzFgb5W8HsW&7p~(hiO^l0bq0>8^iK{y()uO?LprG8-cOANpLBy{l9H5=@@F4YC7Ed EH?^CBod5s; literal 0 HcmV?d00001 diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/Contents.json b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/Contents.json new file mode 100644 index 0000000..e691f7d --- /dev/null +++ b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "XIONLogoOuterRing.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/XIONLogoOuterRing.png b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoOuterRing.imageset/XIONLogoOuterRing.png new file mode 100644 index 0000000000000000000000000000000000000000..39401317e8f6917ff2bbdc487b39868a44c2d5c0 GIT binary patch literal 12717 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 Q|3L9rN%K*;g87U81AO}S2mk;8 literal 0 HcmV?d00001 diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/Contents.json b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/Contents.json new file mode 100644 index 0000000..c8d21ba --- /dev/null +++ b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "XIONLogoWithRing.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/XIONLogoWithRing.png b/XIONControlPanel/SupportingFiles/Assets.xcassets/XIONLogoWithRing.imageset/XIONLogoWithRing.png new file mode 100644 index 0000000000000000000000000000000000000000..862608b5dfbec9494bff28880d2baeb429974725 GIT binary patch literal 16243 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

    e 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 LSRequiresIPhoneOS + UIAppFonts + + Orbitron-Medium.ttf + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -34,7 +38,8 @@ UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad diff --git a/XIONControlPanel/Utilities/XIONControlPanel-Bridging-Header.h b/XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h similarity index 85% rename from XIONControlPanel/Utilities/XIONControlPanel-Bridging-Header.h rename to XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h index 3df906e..295369d 100644 --- a/XIONControlPanel/Utilities/XIONControlPanel-Bridging-Header.h +++ b/XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h @@ -3,3 +3,4 @@ // #import "NSValue+XIONAdditions.h" +#import "KSIRingView.h" diff --git a/XIONControlPanel/Views/HeaderView.swift b/XIONControlPanel/Views/HeaderView.swift new file mode 100644 index 0000000..f1f77da --- /dev/null +++ b/XIONControlPanel/Views/HeaderView.swift @@ -0,0 +1,90 @@ +// +// HeaderView.swift +// XIONControlPanel +// +// Created by Charles Magahern on 12/30/15. +// Copyright © 2015 XION. All rights reserved. +// + +import Darwin +import Foundation +import UIKit + +class HeaderView: UIView { + private var _xionLogoView: XIONLogoView = XIONLogoView() + private var _xionTitleLabel: UILabel = UILabel() + private var _xionJapaneseLabel: UILabel = UILabel() + + override init(frame: CGRect) + { + super.init(frame: frame) + + self.backgroundColor = UIColor.blackColor() + self.addSubview(_xionLogoView) + + _xionTitleLabel.font = UIFont(name: "Orbitron-Medium", size: 16.0) + _xionTitleLabel.text = "XION arcade system control panel" + _xionTitleLabel.textColor = UIColor.whiteColor() + self.addSubview(_xionTitleLabel) + + _xionJapaneseLabel.font = UIFont(name: "Orbitron-Medium", size: 12.0) + _xionJapaneseLabel.text = "ザイーオンゲームセンターのシステム制御プログラム" + _xionJapaneseLabel.textColor = UIColor.whiteColor() + self.addSubview(_xionJapaneseLabel) + } + + required init?(coder aDecoder: NSCoder) + { + fatalError("unsupported") + } + + override func layoutSubviews() + { + super.layoutSubviews() + + let bounds = self.bounds + let hpadding = CGFloat(10.0) + + let logoDimensions = rint(bounds.size.height / 1.2) + let logoFrame = CGRect( + x: hpadding, + y: rint(bounds.size.height / 2.0 - logoDimensions / 2.0), + width: logoDimensions, + height: logoDimensions + ) + _xionLogoView.frame = logoFrame + + let titleJPVerticalMargin: CGFloat = 5.0 + let titleLabelSize = _xionTitleLabel.sizeThatFits(bounds.size) + let jpLabelSize = _xionJapaneseLabel.sizeThatFits(bounds.size) + let totalLabelsHeight = titleLabelSize.height + titleJPVerticalMargin + jpLabelSize.height + + let titleFrame = CGRect( + x: CGRectGetMaxX(logoFrame) + hpadding * 2.0, + y: rint(bounds.size.height / 2.0 - totalLabelsHeight / 2.0), + width: titleLabelSize.width, + height: titleLabelSize.height + ) + _xionTitleLabel.frame = titleFrame + + let jpTitleFrame = CGRect( + x: titleFrame.origin.x, + y: CGRectGetMaxY(titleFrame) + titleJPVerticalMargin, + width: jpLabelSize.width, + height: jpLabelSize.height + 2.0 + ) + _xionJapaneseLabel.frame = jpTitleFrame + } + + // MARK: API + + func beginAnimating() + { + _xionLogoView.beginAnimating() + } + + func stopAnimating() + { + _xionLogoView.stopAnimating() + } +} diff --git a/XIONControlPanel/Views/XIONLogoView.swift b/XIONControlPanel/Views/XIONLogoView.swift new file mode 100644 index 0000000..381083c --- /dev/null +++ b/XIONControlPanel/Views/XIONLogoView.swift @@ -0,0 +1,78 @@ +// +// XIONLogoView.swift +// XIONControlPanel +// +// Created by Charles Magahern on 12/30/15. +// Copyright © 2015 XION. All rights reserved. +// + +import UIKit + +class XIONLogoView: UIView { + private var _xionLogoImageView: UIImageView = UIImageView() + private var _logoInnerRingImageView: UIImageView = UIImageView() + private var _logoOuterRingImageView: UIImageView = UIImageView() + + override init(frame: CGRect) + { + super.init(frame: frame) + + self.backgroundColor = UIColor.blackColor() + + _xionLogoImageView.image = UIImage(named: "XIONLogoWithRing") + _xionLogoImageView.contentMode = .ScaleAspectFit + + _logoInnerRingImageView.image = UIImage(named: "XIONLogoInnerRing") + _logoInnerRingImageView.contentMode = .ScaleAspectFit + + _logoOuterRingImageView.image = UIImage(named: "XIONLogoOuterRing") + _logoOuterRingImageView.contentMode = .ScaleAspectFit + + self.addSubview(_logoOuterRingImageView) + self.addSubview(_logoInnerRingImageView) + self.addSubview(_xionLogoImageView) + } + + required init?(coder aDecoder: NSCoder) + { + fatalError("unsupported") + } + + override func layoutSubviews() + { + super.layoutSubviews() + + let bounds = self.bounds + _xionLogoImageView.frame = bounds + _logoInnerRingImageView.frame = bounds + _logoOuterRingImageView.frame = bounds + } + + // MARK: API + + func beginAnimating() + { + let duration: NSTimeInterval = 20.0 + + let clockwiseAnim = CABasicAnimation(keyPath: "transform.rotation") + clockwiseAnim.fromValue = 0.0 + clockwiseAnim.toValue = 2.0 * π + clockwiseAnim.duration = duration + clockwiseAnim.repeatCount = Float.infinity + + let counterClockwiseAnim = CABasicAnimation(keyPath: "transform.rotation") + counterClockwiseAnim.fromValue = 2.0 * π + counterClockwiseAnim.toValue = 0.0 + counterClockwiseAnim.duration = duration + counterClockwiseAnim.repeatCount = Float.infinity + + _logoInnerRingImageView.layer.addAnimation(clockwiseAnim, forKey: "") + _logoOuterRingImageView.layer.addAnimation(counterClockwiseAnim, forKey: "") + } + + func stopAnimating() + { + _logoInnerRingImageView.layer.removeAllAnimations() + _logoOuterRingImageView.layer.removeAllAnimations() + } +}