├── .gitignore ├── LICENSE ├── README.md ├── SimpleClock ├── SimpleClock.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── SimpleClock │ ├── ClockSkin.swift │ ├── Date.swift │ ├── Resources │ │ ├── Info.plist │ │ ├── thumbnail.png │ │ ├── thumbnail@2x.png │ │ └── thumbnail_source.png │ ├── SimpleClock.swift │ └── Skins │ │ ├── AscotClock.swift │ │ ├── BraunBN0032Dark.swift │ │ ├── FiveOClock.swift │ │ ├── KundoQuartzRepetitionWestGermanyWecker.swift │ │ ├── PunktAC01AlarmClock.swift │ │ ├── SeikoStandardKX308K.swift │ │ ├── SeikoStandardKX308KDark.swift │ │ ├── SeikoStandardKX308W.swift │ │ ├── SeikoStandardKX308WDark.swift │ │ ├── SwissRailwayClockDark.swift │ │ ├── SwissRailwayClockLight.swift │ │ └── TimeSaverClock.swift └── SimpleClockDemo │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Base.lproj │ └── Main.storyboard │ ├── Info.plist │ └── MainViewController.swift ├── icon.png ├── icon.svg ├── images ├── BraunBN0032Dark.png ├── FiveOClock.png ├── KundoQuartzRepetitionWestGermanyWecker.png ├── SeikoStandardKX308K.png ├── SwissRailwayClockDark.png └── SwissRailwayClockLight.png └── scripts └── release.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | # Pods/ 49 | 50 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | # Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2016 - 2018, Pascal Wagler 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Simple Clock Screensaver 4 | 5 | A simple clock screensaver for macOS written entirely in Swift. It has support for skins/themes (in source code only) and can be styled to match a wide variety of analogue wall clocks. 6 | 7 | ## Skins 8 | 9 | ![Braun BN0032 Dark](images/BraunBN0032Dark.png) 10 | 11 | ![Five O'Clock](images/FiveOClock.png) 12 | 13 | ![Kundo Quartz Wecker](images/KundoQuartzRepetitionWestGermanyWecker.png) 14 | 15 | ![Seiko Standard KX308K](images/SeikoStandardKX308K.png) 16 | 17 | ![Swiss Railway Clock Dark](images/SwissRailwayClockDark.png) 18 | 19 | ![Swiss Railway Clock Light](images/SwissRailwayClockLight.png) 20 | 21 | ## Installation 22 | 23 | - Download the [latest version](https://github.com/Wandmalfarbe/Simple-Clock-Screensaver/releases/latest) of the screensaver from the releases page. 24 | - Extract the ZIP file by double-clicking on it. 25 | - Install the screensaver by double-clicking on the file with the extension `.saver`. 26 | 27 | ## Credits 28 | 29 | - The screensaver uses a `Date` extension by Daniel Love. 30 | 31 | ## License 32 | 33 | This project is open source licensed under the BSD 3-Clause License. Please see the [LICENSE file](LICENSE) for more information. -------------------------------------------------------------------------------- /SimpleClock/SimpleClock.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 500111511D3000850049411A /* SwissRailwayClockDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500111501D3000850049411A /* SwissRailwayClockDark.swift */; }; 11 | 501C52AF1D33F112002F845D /* BraunBN0032Dark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501C52AE1D33F112002F845D /* BraunBN0032Dark.swift */; }; 12 | 501DF9E01D54B1AD003A6DC9 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501DF9DF1D54B1AD003A6DC9 /* MainViewController.swift */; }; 13 | 501DF9E11D54BBCE003A6DC9 /* PunktAC01AlarmClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507B2FA61D52551E002218B6 /* PunktAC01AlarmClock.swift */; }; 14 | 504BEDC11D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC01D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift */; }; 15 | 504BEDC31D4E5AB100437ED2 /* SeikoStandardKX308K.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC21D4E5AB100437ED2 /* SeikoStandardKX308K.swift */; }; 16 | 504BEDC51D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC41D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift */; }; 17 | 504BEDC71D4E727400437ED2 /* SeikoStandardKX308W.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC61D4E727400437ED2 /* SeikoStandardKX308W.swift */; }; 18 | 504BEDC91D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC81D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift */; }; 19 | 504BEDCB1D4E74E700437ED2 /* FiveOClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDCA1D4E74E700437ED2 /* FiveOClock.swift */; }; 20 | 5055063B1D2FD38B00C647A3 /* SwissRailwayClockLight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5055063A1D2FD38B00C647A3 /* SwissRailwayClockLight.swift */; }; 21 | 5055063D1D2FD5AA00C647A3 /* ClockSkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5055063C1D2FD5AA00C647A3 /* ClockSkin.swift */; }; 22 | 5070EF431BC1719200BB18C5 /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5070EF421BC1719200BB18C5 /* Date.swift */; }; 23 | 5077845B1D34493300A7A6B5 /* thumbnail.png in Resources */ = {isa = PBXBuildFile; fileRef = 507784591D34493300A7A6B5 /* thumbnail.png */; }; 24 | 5077845C1D34493300A7A6B5 /* thumbnail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5077845A1D34493300A7A6B5 /* thumbnail@2x.png */; }; 25 | 507B2FA71D52551E002218B6 /* PunktAC01AlarmClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507B2FA61D52551E002218B6 /* PunktAC01AlarmClock.swift */; }; 26 | 50D1BF881BC1388A0023EFF5 /* SimpleClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D1BF871BC1388A0023EFF5 /* SimpleClock.swift */; }; 27 | 50DB822F1D300300005A4E5D /* AscotClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DB822E1D300300005A4E5D /* AscotClock.swift */; }; 28 | 50DB82311D3004F2005A4E5D /* TimeSaverClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DB82301D3004F2005A4E5D /* TimeSaverClock.swift */; }; 29 | 50EDE28C1D50E2B60019277B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50EDE28B1D50E2B60019277B /* AppDelegate.swift */; }; 30 | 50EDE2901D50E2B60019277B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50EDE28F1D50E2B60019277B /* Assets.xcassets */; }; 31 | 50EDE2931D50E2B60019277B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50EDE2911D50E2B60019277B /* Main.storyboard */; }; 32 | 50EDE2981D50E2E70019277B /* AscotClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DB822E1D300300005A4E5D /* AscotClock.swift */; }; 33 | 50EDE2991D50E2EA0019277B /* SwissRailwayClockDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500111501D3000850049411A /* SwissRailwayClockDark.swift */; }; 34 | 50EDE29A1D50E2EE0019277B /* SwissRailwayClockLight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5055063A1D2FD38B00C647A3 /* SwissRailwayClockLight.swift */; }; 35 | 50EDE29B1D50E2F10019277B /* TimeSaverClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DB82301D3004F2005A4E5D /* TimeSaverClock.swift */; }; 36 | 50EDE29C1D50E2F50019277B /* BraunBN0032Dark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501C52AE1D33F112002F845D /* BraunBN0032Dark.swift */; }; 37 | 50EDE29D1D50E2F80019277B /* KundoQuartzRepetitionWestGermanyWecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC01D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift */; }; 38 | 50EDE29E1D50E2FC0019277B /* SeikoStandardKX308K.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC21D4E5AB100437ED2 /* SeikoStandardKX308K.swift */; }; 39 | 50EDE29F1D50E3010019277B /* SeikoStandardKX308KDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC41D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift */; }; 40 | 50EDE2A01D50E3050019277B /* SeikoStandardKX308W.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC61D4E727400437ED2 /* SeikoStandardKX308W.swift */; }; 41 | 50EDE2A11D50E3080019277B /* SeikoStandardKX308WDark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDC81D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift */; }; 42 | 50EDE2A21D50E30C0019277B /* FiveOClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504BEDCA1D4E74E700437ED2 /* FiveOClock.swift */; }; 43 | 50EDE2A31D50E30F0019277B /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5070EF421BC1719200BB18C5 /* Date.swift */; }; 44 | 50EDE2A41D50E3130019277B /* SimpleClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D1BF871BC1388A0023EFF5 /* SimpleClock.swift */; }; 45 | 50EDE2A51D50E3170019277B /* ClockSkin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5055063C1D2FD5AA00C647A3 /* ClockSkin.swift */; }; 46 | /* End PBXBuildFile section */ 47 | 48 | /* Begin PBXFileReference section */ 49 | 500111501D3000850049411A /* SwissRailwayClockDark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwissRailwayClockDark.swift; sourceTree = ""; }; 50 | 501C52AE1D33F112002F845D /* BraunBN0032Dark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BraunBN0032Dark.swift; sourceTree = ""; }; 51 | 501DF9DF1D54B1AD003A6DC9 /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 52 | 504BEDC01D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KundoQuartzRepetitionWestGermanyWecker.swift; sourceTree = ""; }; 53 | 504BEDC21D4E5AB100437ED2 /* SeikoStandardKX308K.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeikoStandardKX308K.swift; sourceTree = ""; }; 54 | 504BEDC41D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeikoStandardKX308KDark.swift; sourceTree = ""; }; 55 | 504BEDC61D4E727400437ED2 /* SeikoStandardKX308W.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeikoStandardKX308W.swift; sourceTree = ""; }; 56 | 504BEDC81D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeikoStandardKX308WDark.swift; sourceTree = ""; }; 57 | 504BEDCA1D4E74E700437ED2 /* FiveOClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FiveOClock.swift; sourceTree = ""; }; 58 | 5055063A1D2FD38B00C647A3 /* SwissRailwayClockLight.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwissRailwayClockLight.swift; sourceTree = ""; }; 59 | 5055063C1D2FD5AA00C647A3 /* ClockSkin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClockSkin.swift; sourceTree = ""; }; 60 | 5070EF421BC1719200BB18C5 /* Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; }; 61 | 507784591D34493300A7A6B5 /* thumbnail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumbnail.png; sourceTree = ""; }; 62 | 5077845A1D34493300A7A6B5 /* thumbnail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumbnail@2x.png"; sourceTree = ""; }; 63 | 507B2FA61D52551E002218B6 /* PunktAC01AlarmClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PunktAC01AlarmClock.swift; sourceTree = ""; }; 64 | 50D1BF7A1BC1385E0023EFF5 /* SimpleClock.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SimpleClock.saver; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 50D1BF811BC1385E0023EFF5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66 | 50D1BF871BC1388A0023EFF5 /* SimpleClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleClock.swift; sourceTree = ""; }; 67 | 50DB822E1D300300005A4E5D /* AscotClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AscotClock.swift; sourceTree = ""; }; 68 | 50DB82301D3004F2005A4E5D /* TimeSaverClock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeSaverClock.swift; sourceTree = ""; }; 69 | 50EDE2891D50E2B60019277B /* SimpleClockDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleClockDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | 50EDE28B1D50E2B60019277B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 71 | 50EDE28F1D50E2B60019277B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 72 | 50EDE2921D50E2B60019277B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 73 | 50EDE2941D50E2B60019277B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 74 | /* End PBXFileReference section */ 75 | 76 | /* Begin PBXFrameworksBuildPhase section */ 77 | 50D1BF761BC1385E0023EFF5 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | 50EDE2861D50E2B60019277B /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | /* End PBXFrameworksBuildPhase section */ 92 | 93 | /* Begin PBXGroup section */ 94 | 5004A3BF1D3518EE004C8020 /* Skins */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 50DB822E1D300300005A4E5D /* AscotClock.swift */, 98 | 500111501D3000850049411A /* SwissRailwayClockDark.swift */, 99 | 5055063A1D2FD38B00C647A3 /* SwissRailwayClockLight.swift */, 100 | 50DB82301D3004F2005A4E5D /* TimeSaverClock.swift */, 101 | 501C52AE1D33F112002F845D /* BraunBN0032Dark.swift */, 102 | 504BEDC01D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift */, 103 | 504BEDC21D4E5AB100437ED2 /* SeikoStandardKX308K.swift */, 104 | 504BEDC41D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift */, 105 | 504BEDC61D4E727400437ED2 /* SeikoStandardKX308W.swift */, 106 | 504BEDC81D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift */, 107 | 504BEDCA1D4E74E700437ED2 /* FiveOClock.swift */, 108 | 507B2FA61D52551E002218B6 /* PunktAC01AlarmClock.swift */, 109 | ); 110 | path = Skins; 111 | sourceTree = ""; 112 | }; 113 | 507784501D3448D700A7A6B5 /* Resources */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 507784591D34493300A7A6B5 /* thumbnail.png */, 117 | 5077845A1D34493300A7A6B5 /* thumbnail@2x.png */, 118 | 50D1BF811BC1385E0023EFF5 /* Info.plist */, 119 | ); 120 | path = Resources; 121 | sourceTree = ""; 122 | }; 123 | 50D1BF701BC1385E0023EFF5 = { 124 | isa = PBXGroup; 125 | children = ( 126 | 50D1BF7C1BC1385E0023EFF5 /* SimpleClock */, 127 | 50EDE28A1D50E2B60019277B /* SimpleClockDemo */, 128 | 50D1BF7B1BC1385E0023EFF5 /* Products */, 129 | ); 130 | sourceTree = ""; 131 | }; 132 | 50D1BF7B1BC1385E0023EFF5 /* Products */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 50D1BF7A1BC1385E0023EFF5 /* SimpleClock.saver */, 136 | 50EDE2891D50E2B60019277B /* SimpleClockDemo.app */, 137 | ); 138 | name = Products; 139 | sourceTree = ""; 140 | }; 141 | 50D1BF7C1BC1385E0023EFF5 /* SimpleClock */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 507784501D3448D700A7A6B5 /* Resources */, 145 | 5004A3BF1D3518EE004C8020 /* Skins */, 146 | 5070EF421BC1719200BB18C5 /* Date.swift */, 147 | 50D1BF871BC1388A0023EFF5 /* SimpleClock.swift */, 148 | 5055063C1D2FD5AA00C647A3 /* ClockSkin.swift */, 149 | ); 150 | path = SimpleClock; 151 | sourceTree = ""; 152 | }; 153 | 50EDE28A1D50E2B60019277B /* SimpleClockDemo */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 50EDE28B1D50E2B60019277B /* AppDelegate.swift */, 157 | 50EDE28F1D50E2B60019277B /* Assets.xcassets */, 158 | 50EDE2911D50E2B60019277B /* Main.storyboard */, 159 | 50EDE2941D50E2B60019277B /* Info.plist */, 160 | 501DF9DF1D54B1AD003A6DC9 /* MainViewController.swift */, 161 | ); 162 | path = SimpleClockDemo; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXHeadersBuildPhase section */ 168 | 50D1BF771BC1385E0023EFF5 /* Headers */ = { 169 | isa = PBXHeadersBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | ); 173 | runOnlyForDeploymentPostprocessing = 0; 174 | }; 175 | /* End PBXHeadersBuildPhase section */ 176 | 177 | /* Begin PBXNativeTarget section */ 178 | 50D1BF791BC1385E0023EFF5 /* SimpleClock */ = { 179 | isa = PBXNativeTarget; 180 | buildConfigurationList = 50D1BF841BC1385E0023EFF5 /* Build configuration list for PBXNativeTarget "SimpleClock" */; 181 | buildPhases = ( 182 | 50D1BF751BC1385E0023EFF5 /* Sources */, 183 | 50D1BF761BC1385E0023EFF5 /* Frameworks */, 184 | 50D1BF771BC1385E0023EFF5 /* Headers */, 185 | 50D1BF781BC1385E0023EFF5 /* Resources */, 186 | 509D84E91D32E15E00E232C4 /* ShellScript */, 187 | ); 188 | buildRules = ( 189 | ); 190 | dependencies = ( 191 | ); 192 | name = SimpleClock; 193 | productName = SimpleClock; 194 | productReference = 50D1BF7A1BC1385E0023EFF5 /* SimpleClock.saver */; 195 | productType = "com.apple.product-type.bundle"; 196 | }; 197 | 50EDE2881D50E2B60019277B /* SimpleClockDemo */ = { 198 | isa = PBXNativeTarget; 199 | buildConfigurationList = 50EDE2951D50E2B60019277B /* Build configuration list for PBXNativeTarget "SimpleClockDemo" */; 200 | buildPhases = ( 201 | 50EDE2851D50E2B60019277B /* Sources */, 202 | 50EDE2861D50E2B60019277B /* Frameworks */, 203 | 50EDE2871D50E2B60019277B /* Resources */, 204 | ); 205 | buildRules = ( 206 | ); 207 | dependencies = ( 208 | ); 209 | name = SimpleClockDemo; 210 | productName = SimpleClockDemo; 211 | productReference = 50EDE2891D50E2B60019277B /* SimpleClockDemo.app */; 212 | productType = "com.apple.product-type.application"; 213 | }; 214 | /* End PBXNativeTarget section */ 215 | 216 | /* Begin PBXProject section */ 217 | 50D1BF711BC1385E0023EFF5 /* Project object */ = { 218 | isa = PBXProject; 219 | attributes = { 220 | LastSwiftUpdateCheck = 0730; 221 | LastUpgradeCheck = 0940; 222 | ORGANIZATIONNAME = "Pascal Wagler"; 223 | TargetAttributes = { 224 | 50D1BF791BC1385E0023EFF5 = { 225 | CreatedOnToolsVersion = 7.0.1; 226 | LastSwiftMigration = 1010; 227 | }; 228 | 50EDE2881D50E2B60019277B = { 229 | CreatedOnToolsVersion = 7.3.1; 230 | LastSwiftMigration = 0800; 231 | }; 232 | }; 233 | }; 234 | buildConfigurationList = 50D1BF741BC1385E0023EFF5 /* Build configuration list for PBXProject "SimpleClock" */; 235 | compatibilityVersion = "Xcode 3.2"; 236 | developmentRegion = English; 237 | hasScannedForEncodings = 0; 238 | knownRegions = ( 239 | en, 240 | Base, 241 | ); 242 | mainGroup = 50D1BF701BC1385E0023EFF5; 243 | productRefGroup = 50D1BF7B1BC1385E0023EFF5 /* Products */; 244 | projectDirPath = ""; 245 | projectRoot = ""; 246 | targets = ( 247 | 50D1BF791BC1385E0023EFF5 /* SimpleClock */, 248 | 50EDE2881D50E2B60019277B /* SimpleClockDemo */, 249 | ); 250 | }; 251 | /* End PBXProject section */ 252 | 253 | /* Begin PBXResourcesBuildPhase section */ 254 | 50D1BF781BC1385E0023EFF5 /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | 5077845B1D34493300A7A6B5 /* thumbnail.png in Resources */, 259 | 5077845C1D34493300A7A6B5 /* thumbnail@2x.png in Resources */, 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | 50EDE2871D50E2B60019277B /* Resources */ = { 264 | isa = PBXResourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | 50EDE2901D50E2B60019277B /* Assets.xcassets in Resources */, 268 | 50EDE2931D50E2B60019277B /* Main.storyboard in Resources */, 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | }; 272 | /* End PBXResourcesBuildPhase section */ 273 | 274 | /* Begin PBXShellScriptBuildPhase section */ 275 | 509D84E91D32E15E00E232C4 /* ShellScript */ = { 276 | isa = PBXShellScriptBuildPhase; 277 | buildActionMask = 2147483647; 278 | files = ( 279 | ); 280 | inputPaths = ( 281 | ); 282 | outputPaths = ( 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | shellPath = /bin/sh; 286 | shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi"; 287 | }; 288 | /* End PBXShellScriptBuildPhase section */ 289 | 290 | /* Begin PBXSourcesBuildPhase section */ 291 | 50D1BF751BC1385E0023EFF5 /* Sources */ = { 292 | isa = PBXSourcesBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | 50D1BF881BC1388A0023EFF5 /* SimpleClock.swift in Sources */, 296 | 504BEDC91D4E72AE00437ED2 /* SeikoStandardKX308WDark.swift in Sources */, 297 | 504BEDC51D4E70DD00437ED2 /* SeikoStandardKX308KDark.swift in Sources */, 298 | 5070EF431BC1719200BB18C5 /* Date.swift in Sources */, 299 | 5055063B1D2FD38B00C647A3 /* SwissRailwayClockLight.swift in Sources */, 300 | 504BEDC71D4E727400437ED2 /* SeikoStandardKX308W.swift in Sources */, 301 | 507B2FA71D52551E002218B6 /* PunktAC01AlarmClock.swift in Sources */, 302 | 50DB82311D3004F2005A4E5D /* TimeSaverClock.swift in Sources */, 303 | 5055063D1D2FD5AA00C647A3 /* ClockSkin.swift in Sources */, 304 | 504BEDC11D4E539700437ED2 /* KundoQuartzRepetitionWestGermanyWecker.swift in Sources */, 305 | 500111511D3000850049411A /* SwissRailwayClockDark.swift in Sources */, 306 | 50DB822F1D300300005A4E5D /* AscotClock.swift in Sources */, 307 | 501C52AF1D33F112002F845D /* BraunBN0032Dark.swift in Sources */, 308 | 504BEDCB1D4E74E700437ED2 /* FiveOClock.swift in Sources */, 309 | 504BEDC31D4E5AB100437ED2 /* SeikoStandardKX308K.swift in Sources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | 50EDE2851D50E2B60019277B /* Sources */ = { 314 | isa = PBXSourcesBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | 50EDE2981D50E2E70019277B /* AscotClock.swift in Sources */, 318 | 50EDE29D1D50E2F80019277B /* KundoQuartzRepetitionWestGermanyWecker.swift in Sources */, 319 | 50EDE29B1D50E2F10019277B /* TimeSaverClock.swift in Sources */, 320 | 50EDE29C1D50E2F50019277B /* BraunBN0032Dark.swift in Sources */, 321 | 50EDE2A41D50E3130019277B /* SimpleClock.swift in Sources */, 322 | 50EDE2A01D50E3050019277B /* SeikoStandardKX308W.swift in Sources */, 323 | 50EDE29A1D50E2EE0019277B /* SwissRailwayClockLight.swift in Sources */, 324 | 501DF9E01D54B1AD003A6DC9 /* MainViewController.swift in Sources */, 325 | 50EDE2A11D50E3080019277B /* SeikoStandardKX308WDark.swift in Sources */, 326 | 50EDE29E1D50E2FC0019277B /* SeikoStandardKX308K.swift in Sources */, 327 | 501DF9E11D54BBCE003A6DC9 /* PunktAC01AlarmClock.swift in Sources */, 328 | 50EDE2A31D50E30F0019277B /* Date.swift in Sources */, 329 | 50EDE2A51D50E3170019277B /* ClockSkin.swift in Sources */, 330 | 50EDE2A21D50E30C0019277B /* FiveOClock.swift in Sources */, 331 | 50EDE2991D50E2EA0019277B /* SwissRailwayClockDark.swift in Sources */, 332 | 50EDE28C1D50E2B60019277B /* AppDelegate.swift in Sources */, 333 | 50EDE29F1D50E3010019277B /* SeikoStandardKX308KDark.swift in Sources */, 334 | ); 335 | runOnlyForDeploymentPostprocessing = 0; 336 | }; 337 | /* End PBXSourcesBuildPhase section */ 338 | 339 | /* Begin PBXVariantGroup section */ 340 | 50EDE2911D50E2B60019277B /* Main.storyboard */ = { 341 | isa = PBXVariantGroup; 342 | children = ( 343 | 50EDE2921D50E2B60019277B /* Base */, 344 | ); 345 | name = Main.storyboard; 346 | sourceTree = ""; 347 | }; 348 | /* End PBXVariantGroup section */ 349 | 350 | /* Begin XCBuildConfiguration section */ 351 | 50D1BF821BC1385E0023EFF5 /* Debug */ = { 352 | isa = XCBuildConfiguration; 353 | buildSettings = { 354 | ALWAYS_SEARCH_USER_PATHS = NO; 355 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 356 | CLANG_CXX_LIBRARY = "libc++"; 357 | CLANG_ENABLE_MODULES = YES; 358 | CLANG_ENABLE_OBJC_ARC = YES; 359 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 360 | CLANG_WARN_BOOL_CONVERSION = YES; 361 | CLANG_WARN_COMMA = YES; 362 | CLANG_WARN_CONSTANT_CONVERSION = YES; 363 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 364 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 365 | CLANG_WARN_EMPTY_BODY = YES; 366 | CLANG_WARN_ENUM_CONVERSION = YES; 367 | CLANG_WARN_INFINITE_RECURSION = YES; 368 | CLANG_WARN_INT_CONVERSION = YES; 369 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 370 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 371 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 372 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 373 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 374 | CLANG_WARN_STRICT_PROTOTYPES = YES; 375 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 376 | CLANG_WARN_UNREACHABLE_CODE = YES; 377 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 378 | COPY_PHASE_STRIP = NO; 379 | DEBUG_INFORMATION_FORMAT = dwarf; 380 | ENABLE_STRICT_OBJC_MSGSEND = YES; 381 | ENABLE_TESTABILITY = YES; 382 | GCC_C_LANGUAGE_STANDARD = gnu99; 383 | GCC_DYNAMIC_NO_PIC = NO; 384 | GCC_NO_COMMON_BLOCKS = YES; 385 | GCC_OPTIMIZATION_LEVEL = 0; 386 | GCC_PREPROCESSOR_DEFINITIONS = ( 387 | "DEBUG=1", 388 | "$(inherited)", 389 | ); 390 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 391 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 392 | GCC_WARN_UNDECLARED_SELECTOR = YES; 393 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 394 | GCC_WARN_UNUSED_FUNCTION = YES; 395 | GCC_WARN_UNUSED_VARIABLE = YES; 396 | MACOSX_DEPLOYMENT_TARGET = 10.10; 397 | MTL_ENABLE_DEBUG_INFO = YES; 398 | ONLY_ACTIVE_ARCH = YES; 399 | PRODUCT_NAME = SimpleClock; 400 | SDKROOT = macosx; 401 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 402 | SWIFT_VERSION = 4.0; 403 | }; 404 | name = Debug; 405 | }; 406 | 50D1BF831BC1385E0023EFF5 /* Release */ = { 407 | isa = XCBuildConfiguration; 408 | buildSettings = { 409 | ALWAYS_SEARCH_USER_PATHS = NO; 410 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 411 | CLANG_CXX_LIBRARY = "libc++"; 412 | CLANG_ENABLE_MODULES = YES; 413 | CLANG_ENABLE_OBJC_ARC = YES; 414 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 415 | CLANG_WARN_BOOL_CONVERSION = YES; 416 | CLANG_WARN_COMMA = YES; 417 | CLANG_WARN_CONSTANT_CONVERSION = YES; 418 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 419 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 420 | CLANG_WARN_EMPTY_BODY = YES; 421 | CLANG_WARN_ENUM_CONVERSION = YES; 422 | CLANG_WARN_INFINITE_RECURSION = YES; 423 | CLANG_WARN_INT_CONVERSION = YES; 424 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 425 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 426 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 427 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 428 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 429 | CLANG_WARN_STRICT_PROTOTYPES = YES; 430 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 431 | CLANG_WARN_UNREACHABLE_CODE = YES; 432 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 433 | COPY_PHASE_STRIP = NO; 434 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 435 | ENABLE_NS_ASSERTIONS = NO; 436 | ENABLE_STRICT_OBJC_MSGSEND = YES; 437 | GCC_C_LANGUAGE_STANDARD = gnu99; 438 | GCC_NO_COMMON_BLOCKS = YES; 439 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 440 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 441 | GCC_WARN_UNDECLARED_SELECTOR = YES; 442 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 443 | GCC_WARN_UNUSED_FUNCTION = YES; 444 | GCC_WARN_UNUSED_VARIABLE = YES; 445 | MACOSX_DEPLOYMENT_TARGET = 10.10; 446 | MTL_ENABLE_DEBUG_INFO = NO; 447 | PRODUCT_NAME = SimpleClock; 448 | SDKROOT = macosx; 449 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 450 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 451 | SWIFT_VERSION = 4.0; 452 | }; 453 | name = Release; 454 | }; 455 | 50D1BF851BC1385E0023EFF5 /* Debug */ = { 456 | isa = XCBuildConfiguration; 457 | buildSettings = { 458 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 459 | CLANG_ENABLE_MODULES = YES; 460 | COMBINE_HIDPI_IMAGES = YES; 461 | INFOPLIST_FILE = SimpleClock/Resources/Info.plist; 462 | INSTALL_PATH = "$(HOME)/Library/Screen Savers"; 463 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 464 | PRODUCT_BUNDLE_IDENTIFIER = de.pascalwagler.SimpleClock; 465 | PRODUCT_NAME = SimpleClock; 466 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 467 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 468 | SWIFT_VERSION = 4.2; 469 | WRAPPER_EXTENSION = saver; 470 | }; 471 | name = Debug; 472 | }; 473 | 50D1BF861BC1385E0023EFF5 /* Release */ = { 474 | isa = XCBuildConfiguration; 475 | buildSettings = { 476 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 477 | CLANG_ENABLE_MODULES = YES; 478 | COMBINE_HIDPI_IMAGES = YES; 479 | INFOPLIST_FILE = SimpleClock/Resources/Info.plist; 480 | INSTALL_PATH = "$(HOME)/Library/Screen Savers"; 481 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 482 | PRODUCT_BUNDLE_IDENTIFIER = de.pascalwagler.SimpleClock; 483 | PRODUCT_NAME = SimpleClock; 484 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 485 | SWIFT_VERSION = 4.2; 486 | WRAPPER_EXTENSION = saver; 487 | }; 488 | name = Release; 489 | }; 490 | 50EDE2961D50E2B60019277B /* Debug */ = { 491 | isa = XCBuildConfiguration; 492 | buildSettings = { 493 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 494 | CLANG_ANALYZER_NONNULL = YES; 495 | CODE_SIGN_IDENTITY = "-"; 496 | COMBINE_HIDPI_IMAGES = YES; 497 | INFOPLIST_FILE = SimpleClockDemo/Info.plist; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 499 | MACOSX_DEPLOYMENT_TARGET = 10.11; 500 | PRODUCT_BUNDLE_IDENTIFIER = de.pascalwagler.SimpleClockDemo; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 503 | SWIFT_VERSION = 3.0; 504 | }; 505 | name = Debug; 506 | }; 507 | 50EDE2971D50E2B60019277B /* Release */ = { 508 | isa = XCBuildConfiguration; 509 | buildSettings = { 510 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 511 | CLANG_ANALYZER_NONNULL = YES; 512 | CODE_SIGN_IDENTITY = "-"; 513 | COMBINE_HIDPI_IMAGES = YES; 514 | INFOPLIST_FILE = SimpleClockDemo/Info.plist; 515 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 516 | MACOSX_DEPLOYMENT_TARGET = 10.11; 517 | PRODUCT_BUNDLE_IDENTIFIER = de.pascalwagler.SimpleClockDemo; 518 | PRODUCT_NAME = "$(TARGET_NAME)"; 519 | SWIFT_VERSION = 3.0; 520 | }; 521 | name = Release; 522 | }; 523 | /* End XCBuildConfiguration section */ 524 | 525 | /* Begin XCConfigurationList section */ 526 | 50D1BF741BC1385E0023EFF5 /* Build configuration list for PBXProject "SimpleClock" */ = { 527 | isa = XCConfigurationList; 528 | buildConfigurations = ( 529 | 50D1BF821BC1385E0023EFF5 /* Debug */, 530 | 50D1BF831BC1385E0023EFF5 /* Release */, 531 | ); 532 | defaultConfigurationIsVisible = 0; 533 | defaultConfigurationName = Release; 534 | }; 535 | 50D1BF841BC1385E0023EFF5 /* Build configuration list for PBXNativeTarget "SimpleClock" */ = { 536 | isa = XCConfigurationList; 537 | buildConfigurations = ( 538 | 50D1BF851BC1385E0023EFF5 /* Debug */, 539 | 50D1BF861BC1385E0023EFF5 /* Release */, 540 | ); 541 | defaultConfigurationIsVisible = 0; 542 | defaultConfigurationName = Release; 543 | }; 544 | 50EDE2951D50E2B60019277B /* Build configuration list for PBXNativeTarget "SimpleClockDemo" */ = { 545 | isa = XCConfigurationList; 546 | buildConfigurations = ( 547 | 50EDE2961D50E2B60019277B /* Debug */, 548 | 50EDE2971D50E2B60019277B /* Release */, 549 | ); 550 | defaultConfigurationIsVisible = 0; 551 | defaultConfigurationName = Release; 552 | }; 553 | /* End XCConfigurationList section */ 554 | }; 555 | rootObject = 50D1BF711BC1385E0023EFF5 /* Project object */; 556 | } 557 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/ClockSkin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClockSkin.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol ClockSkin { 12 | 13 | var scaling: ClockSkinScaling { get } 14 | var color: ClockSkinColor { get } 15 | var tick: ClockSkinTick { get } 16 | var lineCap: ClockSkinLineCap { get } 17 | } 18 | 19 | protocol ClockSkinScaling { 20 | var clockFaceHeight: CGFloat { get } 21 | var borderWidth: CGFloat { get } 22 | 23 | var majorTickWidth: CGFloat { get } 24 | var majorTickHeight: CGFloat { get } 25 | 26 | var minorTickWidth: CGFloat { get } 27 | var minorTickHeight: CGFloat { get } 28 | 29 | var majorTickRadius: CGFloat { get } 30 | var minorTickRadius: CGFloat { get } 31 | 32 | var secondHandWidth: CGFloat { get } 33 | var secondHandHeight: CGFloat { get } 34 | var secondHandOverhangWidth: CGFloat { get } 35 | var secondHandOverhangHeight: CGFloat { get } 36 | 37 | var minuteHandWidth: CGFloat { get } 38 | var minuteHandHeight: CGFloat { get } 39 | var minuteHandOverhangWidth: CGFloat { get } 40 | var minuteHandOverhangHeight: CGFloat { get } 41 | 42 | var hourHandWidth: CGFloat { get } 43 | var hourHandHeight: CGFloat { get } 44 | var hourHandOverhangWidth: CGFloat { get } 45 | var hourHandOverhangHeight: CGFloat { get } 46 | 47 | var handCircleRadius: CGFloat { get } 48 | } 49 | 50 | protocol ClockSkinColor { 51 | var screenBackground: CGColor { get } 52 | var clockBackground: CGColor { get } 53 | 54 | var border: CGColor { get } 55 | var majorTick: CGColor { get } 56 | var minorTick: CGColor { get } 57 | 58 | var secondHand: CGColor { get } 59 | var minuteHand: CGColor { get } 60 | var hourHand: CGColor { get } 61 | var handShadow: CGColor { get } 62 | } 63 | 64 | protocol ClockSkinTick { 65 | var totalTicks: Int { get } 66 | var majorTickEveryX: Int { get } 67 | var removeTickEveryX: Int { get } 68 | } 69 | 70 | protocol ClockSkinLineCap { 71 | var majorTick: CGLineCap { get } 72 | var minorTick: CGLineCap { get } 73 | 74 | var secondHand: CGLineCap { get } 75 | var secondHandOverhang: CGLineCap { get } 76 | 77 | var minuteHand: CGLineCap { get } 78 | var minuteHandOverhang: CGLineCap { get } 79 | 80 | var hourHand: CGLineCap { get } 81 | var hourHandOverhang: CGLineCap { get } 82 | } 83 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Date.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateExtensions.swift 3 | // Timesaver 4 | // 5 | // Created by Daniel Love on 14/06/2014. 6 | // Copyright (c) 2014 Daniel Love. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | extension Date { 12 | 13 | func millisAgo() -> CGFloat { 14 | return CGFloat(self.timeIntervalSince1970 * 1000) 15 | } 16 | 17 | func secondsAgo() -> CGFloat { 18 | let comps = (Calendar.current as NSCalendar).components(NSCalendar.Unit.second, from: self) 19 | return CGFloat(comps.second!) / 60.0 20 | } 21 | 22 | func minutesAgo() -> CGFloat { 23 | let comps = (Calendar.current as NSCalendar).components(NSCalendar.Unit.minute, from: self) 24 | return CGFloat(comps.minute!) / 60.0 + self.secondsAgo() / 60.0 25 | } 26 | 27 | func hoursAgo() -> CGFloat { 28 | let comps = (Calendar.current as NSCalendar).components(NSCalendar.Unit.hour, from: self) 29 | return CGFloat(comps.hour!) / 12.0 + (CGFloat((self.minutesAgo() / 60.0) * (60.0 / 12.0))) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.1 23 | NSHumanReadableCopyright 24 | Copyright © 2016 - 2018 Pascal Wagler. All rights reserved. 25 | NSPrincipalClass 26 | SimpleClock.SimpleClock 27 | 28 | 29 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Resources/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/SimpleClock/SimpleClock/Resources/thumbnail.png -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Resources/thumbnail@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/SimpleClock/SimpleClock/Resources/thumbnail@2x.png -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Resources/thumbnail_source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/SimpleClock/SimpleClock/Resources/thumbnail_source.png -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/SimpleClock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SimpleClock.swift 3 | // Timesaver 4 | // 5 | // Created by Pascal Wagler. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SimpleClock: ScreenSaverView { 13 | 14 | var context: CGContext! = nil 15 | var skin: ClockSkin! = nil 16 | var clockRect: NSRect! = nil 17 | 18 | func getSize(_ scalingFactor: CGFloat) -> CGFloat { 19 | return clockRect.size.height * scalingFactor 20 | } 21 | 22 | override func draw(_ screenRect: NSRect) { 23 | super.draw(screenRect) 24 | 25 | context = NSGraphicsContext.current!.cgContext 26 | 27 | //skin = SwissRailwayClockDark() 28 | //skin = SwissRailwayClockLight() 29 | //skin = TimeSaverClock() 30 | //skin = AscotClock() 31 | skin = BraunBN0032Dark() 32 | //skin = KundoQuartzRepetitionWestGermanyWecker() 33 | 34 | //skin = SeikoStandardKX308K() 35 | //skin = SeikoStandardKX308KDark() 36 | 37 | //skin = SeikoStandardKX308W() 38 | //skin = SeikoStandardKX308WDark() 39 | 40 | //skin = FiveOClock() 41 | 42 | if skin == nil { 43 | //Swift.print("Is nil") 44 | skin = BraunBN0032Dark() 45 | //return 46 | } 47 | 48 | clockRect = getClockRect(screenRect) 49 | 50 | /* 51 | * Draw the screen background (color) 52 | */ 53 | context.saveGState() 54 | context.setFillColor(skin.color.screenBackground) 55 | context.fill(self.bounds) 56 | context.restoreGState() 57 | 58 | /* 59 | * Get the time 60 | */ 61 | 62 | let date: Date = Date() 63 | let seconds: CGFloat = date.secondsAgo() 64 | let minutes: CGFloat = date.minutesAgo() 65 | let hours: CGFloat = date.hoursAgo() 66 | 67 | /* 68 | * Draw the clock 69 | */ 70 | 71 | drawClockFace() 72 | 73 | drawClockTicks( 74 | skin.tick.totalTicks, 75 | majorTickEveryX: skin.tick.majorTickEveryX, 76 | removeTickEveryX: skin.tick.removeTickEveryX 77 | ) 78 | 79 | drawClockHand( // Hour 80 | CGSize(width: getSize(skin.scaling.hourHandWidth), 81 | height: getSize(skin.scaling.hourHandHeight)), 82 | overhangSize: CGSize( 83 | width: getSize(skin.scaling.hourHandOverhangWidth), 84 | height: getSize(skin.scaling.hourHandOverhangHeight)), 85 | color: skin.color.hourHand, 86 | lineCap: (skin.lineCap.hourHand, skin.lineCap.hourHandOverhang), 87 | progress: hours * 12, 88 | total: 12) 89 | 90 | drawClockHand( // Minute 91 | CGSize(width: getSize(skin.scaling.minuteHandWidth), 92 | height: getSize(skin.scaling.minuteHandHeight)), 93 | overhangSize: CGSize( 94 | width: getSize(skin.scaling.minuteHandOverhangWidth), 95 | height: getSize(skin.scaling.minuteHandOverhangHeight)), 96 | color: skin.color.minuteHand, 97 | lineCap: (skin.lineCap.minuteHand, skin.lineCap.minuteHandOverhang), 98 | progress: minutes * 60, 99 | total: 60) 100 | 101 | drawClockHand( // Second 102 | CGSize(width: getSize(skin.scaling.secondHandWidth), 103 | height: getSize(skin.scaling.secondHandHeight)), 104 | overhangSize: CGSize( 105 | width: getSize(skin.scaling.secondHandOverhangWidth), 106 | height: getSize(skin.scaling.secondHandOverhangHeight)), 107 | color: skin.color.secondHand, 108 | lineCap: (skin.lineCap.secondHand, skin.lineCap.secondHandOverhang), 109 | progress: seconds * 60, 110 | total: 60) 111 | 112 | drawHandCircle() 113 | } 114 | 115 | func drawClockFace() { 116 | 117 | context.saveGState() 118 | 119 | context.setLineWidth(ceil(getSize(skin.scaling.borderWidth))) 120 | context.setStrokeColor(skin.color.border) 121 | context.setFillColor(skin.color.clockBackground) 122 | 123 | context.addEllipse(in: clockRect) 124 | context.drawPath(using: .fillStroke) 125 | context.strokePath() 126 | 127 | context.restoreGState() 128 | } 129 | 130 | func drawClockTicks(_ totalTicks: Int, majorTickEveryX: Int, removeTickEveryX: Int) { 131 | 132 | context.saveGState() 133 | 134 | let center: CGPoint = CGPoint(x: clockRect.midX, y: clockRect.midY) 135 | 136 | let majorTickWidth = getSize(skin.scaling.majorTickWidth) 137 | let majorTickHeight = getSize(skin.scaling.majorTickHeight) 138 | let majorTickColor = skin.color.majorTick 139 | let majorTickRadius = getSize(skin.scaling.majorTickRadius) 140 | let majorTickLineCap = skin.lineCap.majorTick 141 | 142 | let minorTickWidth = getSize(skin.scaling.minorTickWidth) 143 | let minorTickHeight = getSize(skin.scaling.minorTickHeight) 144 | let minorTickColor = skin.color.minorTick 145 | let minorTickRadius = getSize(skin.scaling.minorTickRadius) 146 | let minorTickLineCap = skin.lineCap.minorTick 147 | 148 | var tickHeight: CGFloat 149 | var tickRadius: CGFloat 150 | 151 | var time: Int = totalTicks 152 | while time > 0 { 153 | 154 | let angle: CGFloat = self.angleForTimeUnit(CGFloat(time), total: totalTicks) 155 | let isMajorTick = (time % majorTickEveryX == 0) 156 | let isHiddenTick = (time % removeTickEveryX == 0) 157 | 158 | if isMajorTick { 159 | context.setLineWidth(ceil(majorTickWidth)) 160 | context.setStrokeColor(majorTickColor) 161 | context.setLineCap(majorTickLineCap) 162 | tickHeight = majorTickHeight 163 | tickRadius = majorTickRadius 164 | } else { 165 | context.setLineWidth(ceil(minorTickWidth)) 166 | context.setStrokeColor(minorTickColor) 167 | context.setLineCap(minorTickLineCap) 168 | tickHeight = minorTickHeight 169 | tickRadius = minorTickRadius 170 | } 171 | 172 | if !isHiddenTick { 173 | let startLineX: CGFloat = center.x + (cos(angle) * tickRadius) 174 | let startLineY: CGFloat = center.y + (sin(angle) * tickRadius) 175 | 176 | let endLineX: CGFloat = center.x + (cos(angle) * (tickRadius - tickHeight)) 177 | let endLineY: CGFloat = center.y + (sin(angle) * (tickRadius - tickHeight)) 178 | 179 | context.beginPath() 180 | context.move(to: CGPoint(x: ceil(startLineX), y: ceil(startLineY))) 181 | context.addLine(to: CGPoint(x: ceil(endLineX), y: ceil(endLineY))) 182 | context.strokePath() 183 | } 184 | 185 | time -= 1 186 | } 187 | context.restoreGState() 188 | } 189 | 190 | func drawClockHand(_ size: CGSize, overhangSize: CGSize, color: CGColor, lineCap: (CGLineCap, CGLineCap), progress: CGFloat, total: Int) { 191 | let center: CGPoint = CGPoint(x: clockRect.midX, y: clockRect.midY) 192 | 193 | let angle: CGFloat = self.angleForTimeUnit(progress, total: total) 194 | let handLineX: CGFloat = center.x + (cos(angle) * size.height) 195 | let handLineY: CGFloat = center.y + (sin(angle) * size.height) 196 | 197 | let overhangLineX: CGFloat = center.x + (-cos(angle) * overhangSize.height) 198 | let overhangLineY: CGFloat = center.y + (-sin(angle) * overhangSize.height) 199 | 200 | context.saveGState() 201 | 202 | //CGContextSetShadowWithColor(context, CGSize(width: 0, height: 0), 1, skin.color.handShadow) 203 | context.setStrokeColor(color) 204 | 205 | // draw the hand 206 | context.beginPath() 207 | context.setLineCap(lineCap.0) 208 | context.setLineWidth(ceil(size.width)) 209 | context.move(to: CGPoint(x: handLineX, y: handLineY)) 210 | context.addLine(to: CGPoint(x: center.x, y: center.y)) 211 | context.strokePath() 212 | 213 | // draw the overhang of the hand 214 | context.beginPath() 215 | context.setLineCap(lineCap.1) 216 | context.setLineWidth(ceil(overhangSize.width)) 217 | context.move(to: CGPoint(x: center.x, y: center.y)) 218 | context.addLine(to: CGPoint(x: overhangLineX, y: overhangLineY)) 219 | context.strokePath() 220 | 221 | context.restoreGState() 222 | } 223 | 224 | func drawHandCircle() { 225 | 226 | let size = CGSize( 227 | width: getSize(skin.scaling.handCircleRadius) * 2, 228 | height: getSize(skin.scaling.handCircleRadius) * 2 229 | ) 230 | 231 | let rect = newRectCenteredInRect(size, outerRect: clockRect) 232 | 233 | context.saveGState() 234 | 235 | context.setFillColor(skin.color.secondHand) 236 | context.addEllipse(in: rect) 237 | (context).fillPath() 238 | 239 | context.restoreGState() 240 | } 241 | 242 | func getClockRect(_ screenRect: CGRect) -> CGRect { 243 | 244 | let maxClockHeight = min(screenRect.size.width, screenRect.size.height) 245 | let clockHeight = maxClockHeight * skin.scaling.clockFaceHeight 246 | 247 | let size = CGSize(width: clockHeight, height: clockHeight) 248 | let clockRect = newRectCenteredInRect(size, outerRect: screenRect) 249 | 250 | return clockRect 251 | } 252 | 253 | func angleForTimeUnit(_ time: CGFloat, total: Int) -> CGFloat { 254 | let degreesPerTime = 360 / CGFloat(total) 255 | let radians = (degreesPerTime * CGFloat(Double.pi)) / 180 256 | let angle = -(radians * CGFloat(time) - CGFloat(Double.pi/2.0)) 257 | 258 | return CGFloat(angle) 259 | } 260 | 261 | /* 262 | * from ScreenSaverView 263 | */ 264 | 265 | override init(frame: NSRect, isPreview: Bool) { 266 | super.init(frame: frame, isPreview: isPreview)! 267 | 268 | self.animationTimeInterval = TimeInterval(1) 269 | } 270 | 271 | required init?(coder aDecoder: NSCoder) { 272 | super.init(coder: aDecoder) 273 | } 274 | 275 | override func startAnimation() { 276 | super.startAnimation() 277 | } 278 | 279 | override func stopAnimation() { 280 | super.stopAnimation() 281 | } 282 | 283 | override func animateOneFrame() { 284 | needsDisplay = true 285 | } 286 | 287 | override var hasConfigureSheet: Bool { 288 | return false 289 | } 290 | 291 | override var configureSheet: NSWindow? { 292 | return nil 293 | } 294 | } 295 | 296 | func newRectCenteredInRect(_ size: CGSize, outerRect: NSRect) -> CGRect { 297 | 298 | var innerRect = NSRect() 299 | innerRect.size.width = size.width 300 | innerRect.size.height = size.height 301 | 302 | innerRect.origin.x = 303 | floor(outerRect.origin.x + (outerRect.size.width - innerRect.size.width) / 2) 304 | 305 | innerRect.origin.y = 306 | floor(outerRect.origin.y + (outerRect.size.height - innerRect.size.height) / 2) 307 | 308 | return innerRect 309 | } 310 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/AscotClock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PascalAscotClock.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class AscotClock: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.8) 16 | let borderWidth = CGFloat(0.03) 17 | 18 | let majorTickWidth = CGFloat(0.016) 19 | let majorTickHeight = CGFloat(0.14) 20 | 21 | let minorTickWidth = CGFloat(0.012) 22 | let minorTickHeight = CGFloat(0.1) 23 | 24 | let majorTickRadius = CGFloat(0.475) 25 | let minorTickRadius = CGFloat(0.44) 26 | 27 | let secondHandWidth = CGFloat(0.020) 28 | let secondHandHeight = CGFloat(0.475) 29 | let secondHandOverhangWidth = CGFloat(0.02) 30 | let secondHandOverhangHeight = CGFloat(0.1) 31 | 32 | let minuteHandWidth = CGFloat(0.02) 33 | let minuteHandHeight = CGFloat(0.43) 34 | let minuteHandOverhangWidth = CGFloat(0.02) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.02) 38 | let hourHandHeight = CGFloat(0.32) 39 | let hourHandOverhangWidth = CGFloat(0.02) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.02) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 0.6744, green: 0.7857, blue: 0.3298, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 48 | 49 | let border = NSColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 0).cgColor 50 | let majorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 0.8).cgColor 51 | let minorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 0.8).cgColor 52 | 53 | let secondHand = NSColor(red: 0.8987, green: 0.9, blue: 0.8956, alpha: 0).cgColor 54 | let minuteHand = NSColor(red: 0.8987, green: 0.9, blue: 0.8956, alpha: 1.0).cgColor 55 | let hourHand = NSColor(red: 0.8987, green: 0.9, blue: 0.8956, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 12 61 | let majorTickEveryX = 3 62 | let removeTickEveryX = 13 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/BraunBN0032Dark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class BraunBN0032Dark: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.586) 16 | let borderWidth = CGFloat(0.025) 17 | 18 | let majorTickWidth = CGFloat(0.009) 19 | let majorTickHeight = CGFloat(0.045) 20 | 21 | let minorTickWidth = CGFloat(0.0045) 22 | let minorTickHeight = CGFloat(0.045) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.009) 28 | let secondHandHeight = CGFloat(0.37) 29 | let secondHandOverhangWidth = CGFloat(0.025) 30 | let secondHandOverhangHeight = CGFloat(0.07) 31 | 32 | let minuteHandWidth = CGFloat(0.015) 33 | let minuteHandHeight = CGFloat(0.37) 34 | let minuteHandOverhangWidth = CGFloat(0.015) 35 | let minuteHandOverhangHeight = CGFloat(0.01) 36 | 37 | let hourHandWidth = CGFloat(0.022) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.022) 40 | let hourHandOverhangHeight = CGFloat(0.001) 41 | 42 | let handCircleRadius = CGFloat(0.025) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 0.13, green: 0.125, blue: 0.1409, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 0).cgColor 50 | let majorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 51 | let minorTick = NSColor(red: 0.5632, green: 0.5598, blue: 0.5705, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(red: 0.9663, green: 0.7711, blue: 0.1798, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0).cgColor 55 | let hourHand = NSColor(red: 0.7027, green: 0.7027, blue: 0.7027, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.round 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/FiveOClock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class FiveOClock: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.65) 16 | let borderWidth = CGFloat(0.027) 17 | 18 | let majorTickWidth = CGFloat(0.033) 19 | let majorTickHeight = CGFloat(0.11) 20 | 21 | let minorTickWidth = CGFloat(0.014) 22 | let minorTickHeight = CGFloat(0.0340) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.004) 28 | let secondHandHeight = CGFloat(0.345) 29 | let secondHandOverhangWidth = CGFloat(0.015) 30 | let secondHandOverhangHeight = CGFloat(0.15) 31 | 32 | let minuteHandWidth = CGFloat(0.015) 33 | let minuteHandHeight = CGFloat(0.44) 34 | let minuteHandOverhangWidth = CGFloat(0.015) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.015) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.015) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.013) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 50 | let majorTick = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 0).cgColor 51 | let minorTick = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 0.7293, green: 0.1348, blue: 0.1447, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/KundoQuartzRepetitionWestGermanyWecker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 31/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class KundoQuartzRepetitionWestGermanyWecker: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.57) 16 | let borderWidth = CGFloat(0.025) 17 | 18 | let majorTickWidth = CGFloat(0.012) 19 | let majorTickHeight = CGFloat(0.015) 20 | 21 | let minorTickWidth = CGFloat(0.0025) 22 | let minorTickHeight = CGFloat(0.02) 23 | 24 | let majorTickRadius = CGFloat(0.453) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.005) 28 | let secondHandHeight = CGFloat(0.37) 29 | let secondHandOverhangWidth = CGFloat(0.025) 30 | let secondHandOverhangHeight = CGFloat(0.001) 31 | 32 | let minuteHandWidth = CGFloat(0.015) 33 | let minuteHandHeight = CGFloat(0.37) 34 | let minuteHandOverhangWidth = CGFloat(0.015) 35 | let minuteHandOverhangHeight = CGFloat(0.001) 36 | 37 | let hourHandWidth = CGFloat(0.022) 38 | let hourHandHeight = CGFloat(0.275) 39 | let hourHandOverhangWidth = CGFloat(0.022) 40 | let hourHandOverhangHeight = CGFloat(0.001) 41 | 42 | let handCircleRadius = CGFloat(0.03) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(srgbRed: 0.17, green: 0.1671, blue: 0.1846, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 0.9354, green: 0.9354, blue: 0.9354, alpha: 0).cgColor 50 | let majorTick = NSColor(srgbRed: 0.9354, green: 0.9354, blue: 0.9354, alpha: 1.0).cgColor 51 | let minorTick = NSColor(srgbRed: 0.9354, green: 0.9354, blue: 0.9354, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 0.8942, green: 0.3633, blue: 0.2739, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 0.9354, green: 0.9354, blue: 0.9354, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 0.9354, green: 0.9354, blue: 0.9354, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.round 67 | let minorTick = CGLineCap.round 68 | 69 | let secondHand = CGLineCap.round 70 | let secondHandOverhang = CGLineCap.round 71 | 72 | let minuteHand = CGLineCap.round 73 | let minuteHandOverhang = CGLineCap.round 74 | 75 | let hourHand = CGLineCap.round 76 | let hourHandOverhang = CGLineCap.round 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/PunktAC01AlarmClock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PunktAC01AlarmClock.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 03/08/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class PunktAC01AlarmClock: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.65) 16 | let borderWidth = CGFloat(0.027) 17 | 18 | let majorTickWidth = CGFloat(0.033) 19 | let majorTickHeight = CGFloat(0.11) 20 | 21 | let minorTickWidth = CGFloat(0.014) 22 | let minorTickHeight = CGFloat(0.0340) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.004) 28 | let secondHandHeight = CGFloat(0.345) 29 | let secondHandOverhangWidth = CGFloat(0.015) 30 | let secondHandOverhangHeight = CGFloat(0.15) 31 | 32 | let minuteHandWidth = CGFloat(0.015) 33 | let minuteHandHeight = CGFloat(0.44) 34 | let minuteHandOverhangWidth = CGFloat(0.015) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.015) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.015) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.013) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 50 | let majorTick = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 0).cgColor 51 | let minorTick = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 0.7293, green: 0.1348, blue: 0.1447, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 0.1201, green: 0.1201, blue: 0.1201, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SeikoStandardKX308K.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 31/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SeikoStandardKX308K: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.57) 16 | let borderWidth = CGFloat(0.022) 17 | 18 | let majorTickWidth = CGFloat(0.016) 19 | let majorTickHeight = CGFloat(0.104) 20 | 21 | let minorTickWidth = CGFloat(0.004) 22 | let minorTickHeight = CGFloat(0.029) 23 | 24 | let majorTickRadius = CGFloat(0.440) 25 | let minorTickRadius = CGFloat(0.440) 26 | 27 | let secondHandWidth = CGFloat(0.005) 28 | let secondHandHeight = CGFloat(0.390) 29 | let secondHandOverhangWidth = CGFloat(0.005) 30 | let secondHandOverhangHeight = CGFloat(0.0001) 31 | 32 | let minuteHandWidth = CGFloat(0.014) 33 | let minuteHandHeight = CGFloat(0.410) 34 | let minuteHandOverhangWidth = CGFloat(0.014) 35 | let minuteHandOverhangHeight = CGFloat(0.07) 36 | 37 | let hourHandWidth = CGFloat(0.024) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.024) 40 | let hourHandOverhangHeight = CGFloat(0.07) 41 | 42 | let handCircleRadius = CGFloat(0.027) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 50 | let majorTick = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 51 | let minorTick = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SeikoStandardKX308KDark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 31/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SeikoStandardKX308KDark: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.57) 16 | let borderWidth = CGFloat(0.022) 17 | 18 | let majorTickWidth = CGFloat(0.016) 19 | let majorTickHeight = CGFloat(0.104) 20 | 21 | let minorTickWidth = CGFloat(0.004) 22 | let minorTickHeight = CGFloat(0.029) 23 | 24 | let majorTickRadius = CGFloat(0.440) 25 | let minorTickRadius = CGFloat(0.440) 26 | 27 | let secondHandWidth = CGFloat(0.005) 28 | let secondHandHeight = CGFloat(0.390) 29 | let secondHandOverhangWidth = CGFloat(0.005) 30 | let secondHandOverhangHeight = CGFloat(0.0001) 31 | 32 | let minuteHandWidth = CGFloat(0.014) 33 | let minuteHandHeight = CGFloat(0.410) 34 | let minuteHandOverhangWidth = CGFloat(0.014) 35 | let minuteHandOverhangHeight = CGFloat(0.07) 36 | 37 | let hourHandWidth = CGFloat(0.024) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.024) 40 | let hourHandOverhangHeight = CGFloat(0.07) 41 | 42 | let handCircleRadius = CGFloat(0.027) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 50 | let majorTick = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 51 | let minorTick = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 56 | let handShadow = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SeikoStandardKX308W.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 31/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SeikoStandardKX308W: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.57) 16 | let borderWidth = CGFloat(0.022) 17 | 18 | let majorTickWidth = CGFloat(0.016) 19 | let majorTickHeight = CGFloat(0.104) 20 | 21 | let minorTickWidth = CGFloat(0.004) 22 | let minorTickHeight = CGFloat(0.029) 23 | 24 | let majorTickRadius = CGFloat(0.440) 25 | let minorTickRadius = CGFloat(0.440) 26 | 27 | let secondHandWidth = CGFloat(0.005) 28 | let secondHandHeight = CGFloat(0.390) 29 | let secondHandOverhangWidth = CGFloat(0.005) 30 | let secondHandOverhangHeight = CGFloat(0.0001) 31 | 32 | let minuteHandWidth = CGFloat(0.014) 33 | let minuteHandHeight = CGFloat(0.410) 34 | let minuteHandOverhangWidth = CGFloat(0.014) 35 | let minuteHandOverhangHeight = CGFloat(0.07) 36 | 37 | let hourHandWidth = CGFloat(0.024) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.024) 40 | let hourHandOverhangHeight = CGFloat(0.07) 41 | 42 | let handCircleRadius = CGFloat(0.027) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 0).cgColor 50 | let majorTick = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 51 | let minorTick = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SeikoStandardKX308WDark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 31/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SeikoStandardKX308WDark: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.57) 16 | let borderWidth = CGFloat(0.022) 17 | 18 | let majorTickWidth = CGFloat(0.016) 19 | let majorTickHeight = CGFloat(0.104) 20 | 21 | let minorTickWidth = CGFloat(0.004) 22 | let minorTickHeight = CGFloat(0.029) 23 | 24 | let majorTickRadius = CGFloat(0.440) 25 | let minorTickRadius = CGFloat(0.440) 26 | 27 | let secondHandWidth = CGFloat(0.005) 28 | let secondHandHeight = CGFloat(0.390) 29 | let secondHandOverhangWidth = CGFloat(0.005) 30 | let secondHandOverhangHeight = CGFloat(0.0001) 31 | 32 | let minuteHandWidth = CGFloat(0.014) 33 | let minuteHandHeight = CGFloat(0.410) 34 | let minuteHandOverhangWidth = CGFloat(0.014) 35 | let minuteHandOverhangHeight = CGFloat(0.07) 36 | 37 | let hourHandWidth = CGFloat(0.024) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.024) 40 | let hourHandOverhangHeight = CGFloat(0.07) 41 | 42 | let handCircleRadius = CGFloat(0.027) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(srgbRed: 0.0628, green: 0.1178, blue: 0.1187, alpha: 0).cgColor 48 | 49 | let border = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 0).cgColor 50 | let majorTick = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 51 | let minorTick = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 52 | 53 | let secondHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 55 | let hourHand = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 56 | let handShadow = NSColor(srgbRed: 1, green: 1, blue: 1, alpha: 1.0).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SwissRailwayClockDark.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SwissRailwayClockDark: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.7) 16 | let borderWidth = CGFloat(0.025) 17 | 18 | let majorTickWidth = CGFloat(0.033) 19 | let majorTickHeight = CGFloat(0.11) 20 | 21 | let minorTickWidth = CGFloat(0.014) 22 | let minorTickHeight = CGFloat(0.0340) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.015) 28 | let secondHandHeight = CGFloat(0.345) 29 | let secondHandOverhangWidth = CGFloat(0.015) 30 | let secondHandOverhangHeight = CGFloat(0.15) 31 | 32 | let minuteHandWidth = CGFloat(0.04) 33 | let minuteHandHeight = CGFloat(0.44) 34 | let minuteHandOverhangWidth = CGFloat(0.04) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.05) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.05) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.0145) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 0.1486, green: 0.1486, blue: 0.1486, alpha: 1.0).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 0).cgColor 50 | let majorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 51 | let minorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 52 | 53 | let secondHand = NSColor(red: 0.7322, green: 0.0957, blue: 0.0, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 55 | let hourHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/SwissRailwayClockLight.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwissRailwayClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class SwissRailwayClockLight: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.7) 16 | let borderWidth = CGFloat(0.025) 17 | 18 | let majorTickWidth = CGFloat(0.033) 19 | let majorTickHeight = CGFloat(0.11) 20 | 21 | let minorTickWidth = CGFloat(0.014) 22 | let minorTickHeight = CGFloat(0.0340) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.015) 28 | let secondHandHeight = CGFloat(0.345) 29 | let secondHandOverhangWidth = CGFloat(0.015) 30 | let secondHandOverhangHeight = CGFloat(0.15) 31 | 32 | let minuteHandWidth = CGFloat(0.04) 33 | let minuteHandHeight = CGFloat(0.44) 34 | let minuteHandOverhangWidth = CGFloat(0.04) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.05) 38 | let hourHandHeight = CGFloat(0.265) 39 | let hourHandOverhangWidth = CGFloat(0.05) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.0145) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 48 | 49 | let border = NSColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 0).cgColor 50 | let majorTick = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 51 | let minorTick = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 52 | 53 | let secondHand = NSColor(red: 0.7322, green: 0.0957, blue: 0.0, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 55 | let hourHand = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClock/Skins/TimeSaverClock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TimeSaverClockDark.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 08/07/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ScreenSaver 11 | 12 | class TimeSaverClock: ClockSkin { 13 | 14 | class Scaling: NSObject, ClockSkinScaling { 15 | let clockFaceHeight = CGFloat(0.8) 16 | let borderWidth = CGFloat(0.03) 17 | 18 | let majorTickWidth = CGFloat(0.018) 19 | let majorTickHeight = CGFloat(0.04) 20 | 21 | let minorTickWidth = CGFloat(0.006) 22 | let minorTickHeight = CGFloat(0.012) 23 | 24 | let majorTickRadius = CGFloat(0.455) 25 | let minorTickRadius = CGFloat(0.455) 26 | 27 | let secondHandWidth = CGFloat(0.012) 28 | let secondHandHeight = CGFloat(0.455) 29 | let secondHandOverhangWidth = CGFloat(0.012) 30 | let secondHandOverhangHeight = CGFloat(0.1) 31 | 32 | let minuteHandWidth = CGFloat(0.032) 33 | let minuteHandHeight = CGFloat(0.455) 34 | let minuteHandOverhangWidth = CGFloat(0.032) 35 | let minuteHandOverhangHeight = CGFloat(0.1) 36 | 37 | let hourHandWidth = CGFloat(0.04) 38 | let hourHandHeight = CGFloat(0.3) 39 | let hourHandOverhangWidth = CGFloat(0.04) 40 | let hourHandOverhangHeight = CGFloat(0.1) 41 | 42 | let handCircleRadius = CGFloat(0.032) 43 | } 44 | 45 | class Color: NSObject, ClockSkinColor { 46 | let screenBackground = NSColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 1).cgColor 47 | let clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor 48 | 49 | let border = NSColor(red: 1, green: 1, blue: 1, alpha: 0.6).cgColor 50 | let majorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 0.4).cgColor 51 | let minorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 0.4).cgColor 52 | 53 | let secondHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1.0).cgColor 54 | let minuteHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1.0).cgColor 55 | let hourHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1.0).cgColor 56 | let handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 57 | } 58 | 59 | class Tick: NSObject, ClockSkinTick { 60 | let totalTicks = 60 61 | let majorTickEveryX = 5 62 | let removeTickEveryX = 61 63 | } 64 | 65 | class LineCap: NSObject, ClockSkinLineCap { 66 | let majorTick = CGLineCap.butt 67 | let minorTick = CGLineCap.butt 68 | 69 | let secondHand = CGLineCap.butt 70 | let secondHandOverhang = CGLineCap.butt 71 | 72 | let minuteHand = CGLineCap.butt 73 | let minuteHandOverhang = CGLineCap.butt 74 | 75 | let hourHand = CGLineCap.butt 76 | let hourHandOverhang = CGLineCap.butt 77 | } 78 | 79 | let scaling: ClockSkinScaling = Scaling() 80 | let tick: ClockSkinTick = Tick() 81 | let color: ClockSkinColor = Color() 82 | let lineCap: ClockSkinLineCap = LineCap() 83 | } 84 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClockDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SimpleClockDemo 4 | // 5 | // Created by Pascal Wagler on 02/08/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import ScreenSaver 11 | 12 | @NSApplicationMain 13 | class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate { 14 | 15 | func applicationDidFinishLaunching(_ aNotification: Notification) { 16 | 17 | } 18 | 19 | func applicationWillTerminate(_ aNotification: Notification) { 20 | 21 | } 22 | 23 | @objc func applicationShouldTerminateAfterLastWindowClosed(_ theApplication: NSApplication) -> Bool { 24 | return true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClockDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /SimpleClock/SimpleClockDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.1 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2016 - 2018 Pascal Wagler. All rights reserved. 29 | NSMainStoryboardFile 30 | Main 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /SimpleClock/SimpleClockDemo/MainViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainViewController.swift 3 | // SimpleClock 4 | // 5 | // Created by Pascal Wagler on 05/08/16. 6 | // Copyright (c) 2016 - 2018 Pascal Wagler. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class MainViewController: NSViewController { 12 | 13 | @IBOutlet weak var clockView: SimpleClock! 14 | @IBOutlet weak var clockSizeSlider: NSSlider! 15 | @IBOutlet weak var borderSizeSlider: NSSlider! 16 | 17 | @IBOutlet weak var majorTickWidthSlider: NSSlider! 18 | @IBOutlet weak var majorTickHeightSlider: NSSlider! 19 | @IBOutlet weak var majorTickRadiusSlider: NSSlider! 20 | 21 | @IBOutlet weak var minorTickWidthSlider: NSSlider! 22 | @IBOutlet weak var minorTickHeightSlider: NSSlider! 23 | @IBOutlet weak var minorTickRadiusSlider: NSSlider! 24 | 25 | @IBOutlet weak var secondHandWidthSlider: NSSlider! 26 | @IBOutlet weak var secondHandHeightSlider: NSSlider! 27 | @IBOutlet weak var secondHandOverhangWidthSlider: NSSlider! 28 | @IBOutlet weak var secondHandOverhangHeightSlider: NSSlider! 29 | 30 | @IBOutlet weak var minuteHandWidthSlider: NSSlider! 31 | @IBOutlet weak var minuteHandHeightSlider: NSSlider! 32 | @IBOutlet weak var minuteHandOverhangWidthSlider: NSSlider! 33 | @IBOutlet weak var minuteHandOverhangHeightSlider: NSSlider! 34 | 35 | @IBOutlet weak var hourHandWidthSlider: NSSlider! 36 | @IBOutlet weak var hourHandHeightSlider: NSSlider! 37 | @IBOutlet weak var hourHandOverhangWidthSlider: NSSlider! 38 | @IBOutlet weak var hourHandOverhangHeightSlider: NSSlider! 39 | 40 | @IBOutlet weak var skinSelectionButton: NSPopUpButton! 41 | @IBOutlet weak var lineCapButton: NSPopUpButton! 42 | 43 | var liveSkin = LiveSkin() 44 | 45 | let itemTitles = [String](arrayLiteral: 46 | String(describing: AscotClock.self), 47 | String(describing: SwissRailwayClockDark.self), 48 | String(describing: SwissRailwayClockLight.self), 49 | String(describing: TimeSaverClock.self), 50 | String(describing: BraunBN0032Dark.self), 51 | String(describing: KundoQuartzRepetitionWestGermanyWecker.self), 52 | String(describing: SeikoStandardKX308K.self), 53 | String(describing: SeikoStandardKX308KDark.self), 54 | String(describing: SeikoStandardKX308W.self), 55 | String(describing: SeikoStandardKX308WDark.self), 56 | String(describing: FiveOClock.self), 57 | String(describing: PunktAC01AlarmClock.self) 58 | ) 59 | 60 | override func viewDidLoad() { 61 | super.viewDidLoad() 62 | 63 | Swift.print("MainViewController did load.") 64 | 65 | // Setup the clock timer 66 | let timer = Timer.scheduledTimer( 67 | timeInterval: clockView.animationTimeInterval, 68 | target: clockView, 69 | selector: #selector(SimpleClock.animateOneFrame), 70 | userInfo: nil, 71 | repeats: true) 72 | RunLoop.main.add(timer, forMode: RunLoopMode.commonModes) 73 | 74 | // Setup the skin selector 75 | skinSelectionButton.removeAllItems() 76 | skinSelectionButton.addItems(withTitles: itemTitles) 77 | 78 | // Setup the bindings 79 | clockSizeSlider.bind("value", 80 | to: liveSkin.scaling as AnyObject, 81 | withKeyPath: "clockFaceHeight", 82 | options: nil) 83 | borderSizeSlider.bind("value", 84 | to: liveSkin.scaling as AnyObject, 85 | withKeyPath: "borderWidth", 86 | options: nil) 87 | 88 | majorTickWidthSlider.bind("value", 89 | to: liveSkin.scaling as AnyObject, 90 | withKeyPath: "majorTickWidth", 91 | options: nil) 92 | majorTickHeightSlider.bind("value", 93 | to: liveSkin.scaling as AnyObject, 94 | withKeyPath: "majorTickHeight", 95 | options: nil) 96 | majorTickRadiusSlider.bind("value", 97 | to: liveSkin.scaling as AnyObject, 98 | withKeyPath: "majorTickRadius", 99 | options: nil) 100 | 101 | minorTickWidthSlider.bind("value", 102 | to: liveSkin.scaling as AnyObject, 103 | withKeyPath: "minorTickWidth", 104 | options: nil) 105 | minorTickHeightSlider.bind("value", 106 | to: liveSkin.scaling as AnyObject, 107 | withKeyPath: "minorTickHeight", 108 | options: nil) 109 | minorTickRadiusSlider.bind("value", 110 | to: liveSkin.scaling as AnyObject, 111 | withKeyPath: "minorTickRadius", 112 | options: nil) 113 | 114 | secondHandWidthSlider.bind("value", 115 | to: liveSkin.scaling as AnyObject, 116 | withKeyPath: "secondHandWidth", 117 | options: nil) 118 | secondHandHeightSlider.bind("value", 119 | to: liveSkin.scaling as AnyObject, 120 | withKeyPath: "secondHandHeight", 121 | options: nil) 122 | secondHandOverhangWidthSlider.bind("value", 123 | to: liveSkin.scaling as AnyObject, 124 | withKeyPath: "secondHandOverhangWidth", 125 | options: nil) 126 | secondHandOverhangHeightSlider.bind("value", 127 | to: liveSkin.scaling as AnyObject, 128 | withKeyPath: "secondHandOverhangHeight", 129 | options: nil) 130 | 131 | minuteHandWidthSlider.bind("value", 132 | to: liveSkin.scaling as AnyObject, 133 | withKeyPath: "minuteHandWidth", 134 | options: nil) 135 | minuteHandHeightSlider.bind("value", 136 | to: liveSkin.scaling as AnyObject, 137 | withKeyPath: "minuteHandHeight", 138 | options: nil) 139 | minuteHandOverhangWidthSlider.bind("value", 140 | to: liveSkin.scaling as AnyObject, 141 | withKeyPath: "minuteHandOverhangWidth", 142 | options: nil) 143 | minuteHandOverhangHeightSlider.bind("value", 144 | to: liveSkin.scaling as AnyObject, 145 | withKeyPath: "minuteHandOverhangHeight", 146 | options: nil) 147 | 148 | hourHandWidthSlider.bind("value", 149 | to: liveSkin.scaling as AnyObject, 150 | withKeyPath: "hourHandWidth", 151 | options: nil) 152 | hourHandHeightSlider.bind("value", 153 | to: liveSkin.scaling as AnyObject, 154 | withKeyPath: "hourHandHeight", 155 | options: nil) 156 | hourHandOverhangWidthSlider.bind("value", 157 | to: liveSkin.scaling as AnyObject, 158 | withKeyPath: "hourHandOverhangWidth", 159 | options: nil) 160 | hourHandOverhangHeightSlider.bind("value", 161 | to: liveSkin.scaling as AnyObject, 162 | withKeyPath: "hourHandOverhangHeight", 163 | options: nil) 164 | 165 | lineCapButton.bind("selectedIndex", 166 | to: liveSkin.lineCap as AnyObject, 167 | withKeyPath: "minorTick", 168 | options: nil) 169 | 170 | clockView.skin = liveSkin 171 | } 172 | 173 | @IBAction func skinSelectionChange(_ sender: NSPopUpButton) { 174 | Swift.print("Skin change") 175 | 176 | var skin: ClockSkin 177 | 178 | switch sender.titleOfSelectedItem! { 179 | case String(describing: AscotClock.self): 180 | skin = AscotClock() 181 | 182 | case String(describing: SwissRailwayClockDark.self): 183 | skin = SwissRailwayClockDark() 184 | 185 | case String(describing: SwissRailwayClockLight.self): 186 | skin = SwissRailwayClockLight() 187 | 188 | case String(describing: TimeSaverClock.self): 189 | skin = TimeSaverClock() 190 | 191 | case String(describing: BraunBN0032Dark.self): 192 | skin = BraunBN0032Dark() 193 | 194 | case String(describing: KundoQuartzRepetitionWestGermanyWecker.self): 195 | skin = KundoQuartzRepetitionWestGermanyWecker() 196 | 197 | case String(describing: SeikoStandardKX308K.self): 198 | skin = SeikoStandardKX308K() 199 | 200 | case String(describing: SeikoStandardKX308KDark.self): 201 | skin = SeikoStandardKX308KDark() 202 | 203 | case String(describing: SeikoStandardKX308W.self): 204 | skin = SeikoStandardKX308W() 205 | 206 | case String(describing: SeikoStandardKX308WDark.self): 207 | skin = SeikoStandardKX308WDark() 208 | 209 | case String(describing: FiveOClock.self): 210 | skin = FiveOClock() 211 | 212 | case String(describing: PunktAC01AlarmClock.self): 213 | skin = PunktAC01AlarmClock() 214 | 215 | default: 216 | skin = KundoQuartzRepetitionWestGermanyWecker() 217 | } 218 | 219 | clockView.skin = skin 220 | } 221 | } 222 | 223 | class LiveSkin: ClockSkin { 224 | 225 | class Scaling: NSObject, ClockSkinScaling { 226 | 227 | var clockFaceHeight = CGFloat(0.4) 228 | var borderWidth = CGFloat(0.025) 229 | 230 | var majorTickWidth = CGFloat(0.033) 231 | var majorTickHeight = CGFloat(0.11) 232 | 233 | var minorTickWidth = CGFloat(0.014) 234 | var minorTickHeight = CGFloat(0.0340) 235 | 236 | var majorTickRadius = CGFloat(0.455) 237 | var minorTickRadius = CGFloat(0.455) 238 | 239 | var secondHandWidth = CGFloat(0.015) 240 | var secondHandHeight = CGFloat(0.345) 241 | var secondHandOverhangWidth = CGFloat(0.015) 242 | var secondHandOverhangHeight = CGFloat(0.15) 243 | 244 | var minuteHandWidth = CGFloat(0.04) 245 | var minuteHandHeight = CGFloat(0.44) 246 | var minuteHandOverhangWidth = CGFloat(0.04) 247 | var minuteHandOverhangHeight = CGFloat(0.1) 248 | 249 | var hourHandWidth = CGFloat(0.05) 250 | var hourHandHeight = CGFloat(0.265) 251 | var hourHandOverhangWidth = CGFloat(0.05) 252 | var hourHandOverhangHeight = CGFloat(0.1) 253 | 254 | var handCircleRadius = CGFloat(0.0145) 255 | } 256 | 257 | class Color: NSObject, ClockSkinColor { 258 | var screenBackground = NSColor(red: 0.1486, green: 0.1486, blue: 0.1486, alpha: 1.0).cgColor 259 | var clockBackground = NSColor(red: 0, green: 0, blue: 0, alpha: 0).cgColor 260 | 261 | var border = NSColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 1).cgColor 262 | var majorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 263 | var minorTick = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 264 | 265 | var secondHand = NSColor(red: 0.7322, green: 0.0957, blue: 0.0, alpha: 1.0).cgColor 266 | var minuteHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 267 | var hourHand = NSColor(red: 1, green: 1, blue: 1, alpha: 1).cgColor 268 | var handShadow = NSColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 269 | } 270 | 271 | class Tick: NSObject, ClockSkinTick { 272 | var totalTicks = 60 273 | var majorTickEveryX = 5 274 | var removeTickEveryX = 61 275 | } 276 | 277 | class LineCap: NSObject, ClockSkinLineCap { 278 | var majorTick = CGLineCap.butt 279 | var minorTick = CGLineCap.butt 280 | 281 | var secondHand = CGLineCap.butt 282 | var secondHandOverhang = CGLineCap.butt 283 | 284 | var minuteHand = CGLineCap.butt 285 | var minuteHandOverhang = CGLineCap.butt 286 | 287 | var hourHand = CGLineCap.butt 288 | var hourHandOverhang = CGLineCap.butt 289 | } 290 | 291 | let scaling: ClockSkinScaling = Scaling() 292 | let tick: ClockSkinTick = Tick() 293 | let color: ClockSkinColor = Color() 294 | let lineCap: ClockSkinLineCap = LineCap() 295 | } 296 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/icon.png -------------------------------------------------------------------------------- /images/BraunBN0032Dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/BraunBN0032Dark.png -------------------------------------------------------------------------------- /images/FiveOClock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/FiveOClock.png -------------------------------------------------------------------------------- /images/KundoQuartzRepetitionWestGermanyWecker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/KundoQuartzRepetitionWestGermanyWecker.png -------------------------------------------------------------------------------- /images/SeikoStandardKX308K.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/SeikoStandardKX308K.png -------------------------------------------------------------------------------- /images/SwissRailwayClockDark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/SwissRailwayClockDark.png -------------------------------------------------------------------------------- /images/SwissRailwayClockLight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Wandmalfarbe/Simple-Clock-Screensaver/3bba2fc76cf8ffb3d39986836e73d172463c99d4/images/SwissRailwayClockLight.png -------------------------------------------------------------------------------- /scripts/release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | zip -r -X "Simple-Clock-${1}.saver.zip" "SimpleClock.saver" --------------------------------------------------------------------------------